From 9add23e019b25cc721b13075e1733f219f22a78b Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 10 Aug 2026 17:29:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/src/hooks/usePaging.ts | 18 +- admin/src/views/consumer/doctor/paiban.vue | 6 +- .../views/first_visit/conversion/index.vue | 61 +- .../my_patients/components/ProgressPanel.vue | 17 +- admin/tsconfig.tsbuildinfo | 2 +- app/.env.example | 21 + app/.gitignore | 21 + app/Build_DoctorWorkstation.bat | 22 + app/README.md | 126 + app/Run_DoctorWorkstation.bat | 16 + app/SECURITY.md | 14 + .../ui_acceptance/01_login_1280x800.png | Bin 0 -> 64695 bytes .../ui_acceptance/02_reception_1280x800.png | Bin 0 -> 113081 bytes .../03_prescription_library_1280x800.png | Bin 0 -> 84080 bytes .../04_prescriptions_1280x800.png | Bin 0 -> 95924 bytes .../ui_acceptance/05_patients_1280x800.png | Bin 0 -> 108470 bytes .../06_consultations_1280x800.png | Bin 0 -> 75077 bytes .../ui_acceptance/07_demo_video_980x660.png | Bin 0 -> 35303 bytes .../08_shell_compact_1024x640.png | Bin 0 -> 98340 bytes .../08_shell_compact_900x600.png | Bin 0 -> 90864 bytes .../09_consultations_video_error_1280x800.png | Bin 0 -> 79561 bytes ...9_consultations_video_success_1280x800.png | Bin 0 -> 75077 bytes .../10_login_server_settings_1280x800.png | Bin 0 -> 83205 bytes app/main.py | 10 + app/package_macos.command | 5 + app/packaging/README.md | 25 + app/packaging/doctor_workstation.spec | 111 + app/packaging/macos/entitlements.plist | 20 + app/packaging/windows/start_release.bat | 19 + app/packaging/windows/version_info.txt | 31 + app/pyproject.toml | 49 + app/research/admin_audit.md | 820 ++++++ app/research/desktop_architecture.md | 461 +++ app/research/final_parity_audit.md | 320 ++ app/research/integration_review.md | 101 + app/research/parity_patients_permissions.md | 229 ++ app/research/parity_prescriptions.md | 357 +++ .../parity_reception_consultations.md | 267 ++ app/research/tencent_rtc.md | 275 ++ app/research/ui_acceptance.md | 95 + app/resources/icon.svg | 5 + app/run_macos.command | 5 + app/scripts/build_macos.sh | 112 + app/scripts/build_windows.ps1 | 171 ++ app/scripts/check_macos_entrypoints.sh | 74 + app/scripts/macos_helpers.sh | 110 + app/scripts/package_macos.sh | 151 + app/scripts/package_windows.ps1 | 198 ++ app/scripts/run_macos.sh | 34 + app/scripts/run_windows.ps1 | 133 + app/src/doctor_workstation/__init__.py | 5 + app/src/doctor_workstation/__main__.py | 19 + app/src/doctor_workstation/app.py | 716 +++++ app/src/doctor_workstation/config.py | 172 ++ app/src/doctor_workstation/core/__init__.py | 57 + app/src/doctor_workstation/core/errors.py | 93 + app/src/doctor_workstation/core/models.py | 913 ++++++ .../doctor_workstation/core/permissions.py | 152 + app/src/doctor_workstation/core/session.py | 40 + app/src/doctor_workstation/logging_setup.py | 58 + app/src/doctor_workstation/resources.py | 28 + .../doctor_workstation/services/__init__.py | 27 + .../doctor_workstation/services/api_client.py | 348 +++ .../services/demo_repository.py | 5 + .../doctor_workstation/services/factory.py | 46 + .../services/mock_repository.py | 2611 +++++++++++++++++ .../services/remote_repository.py | 17 + .../doctor_workstation/services/repository.py | 2027 +++++++++++++ .../services/token_store.py | 261 ++ app/src/doctor_workstation/ui/__init__.py | 7 + .../doctor_workstation/ui/dialogs/__init__.py | 5 + .../ui/dialogs/diagnosis.py | 920 ++++++ .../ui/dialogs/prescription.py | 2318 +++++++++++++++ app/src/doctor_workstation/ui/login.py | 440 +++ .../doctor_workstation/ui/pages/__init__.py | 15 + .../ui/pages/consultations.py | 1475 ++++++++++ .../doctor_workstation/ui/pages/patients.py | 2610 ++++++++++++++++ .../ui/pages/prescription_library.py | 420 +++ .../ui/pages/prescriptions.py | 933 ++++++ .../doctor_workstation/ui/pages/reception.py | 1772 +++++++++++ app/src/doctor_workstation/ui/shell.py | 521 ++++ app/src/doctor_workstation/ui/theme.py | 298 ++ app/src/doctor_workstation/ui/widgets.py | 687 +++++ app/src/doctor_workstation/video/__init__.py | 23 + app/src/doctor_workstation/video/launcher.py | 405 +++ app/src/doctor_workstation/video/lifecycle.py | 307 ++ app/src/doctor_workstation/video/security.py | 109 + app/src/doctor_workstation/video/window.py | 585 ++++ app/tests/test_api_client.py | 272 ++ app/tests/test_config.py | 50 + app/tests/test_consultations_parity_ui.py | 405 +++ app/tests/test_entrypoint.py | 33 + app/tests/test_logging_setup.py | 23 + app/tests/test_mock_repository.py | 494 ++++ app/tests/test_one_click_entrypoints.py | 55 + app/tests/test_patients_ui.py | 556 ++++ app/tests/test_permissions.py | 52 + app/tests/test_prescription_security_ui.py | 386 +++ app/tests/test_prescription_ui.py | 424 +++ app/tests/test_reception_parity_ui.py | 546 ++++ app/tests/test_repository_parity.py | 358 +++ app/tests/test_ui_contract.py | 229 ++ app/tests/test_video_contract.py | 308 ++ app/uv.lock | 790 +++++ app/video_companion/README.md | 35 + .../dist/assets/index-BuO_uDya.css | 1 + .../dist/assets/index-le5ZH3pL.js | 532 ++++ app/video_companion/dist/index.html | 16 + app/video_companion/index.html | 15 + app/video_companion/package-lock.json | 1604 ++++++++++ app/video_companion/package.json | 24 + app/video_companion/src/App.vue | 33 + app/video_companion/src/env.d.ts | 31 + app/video_companion/src/main.ts | 289 ++ app/video_companion/src/style.css | 127 + app/video_companion/tsconfig.json | 17 + app/video_companion/vite.config.ts | 12 + app/一键打包.command | 5 + app/一键打包_医生工作站.bat | 3 + app/一键运行.command | 5 + app/一键运行_医生工作站.bat | 3 + .../logic/doctor/AppointmentLogic.php | 36 +- .../firstvisit/FirstVisitConversionLogic.php | 17 +- .../app/adminapi/logic/qywx/CustomerLogic.php | 25 +- .../adminapi/logic/stats/ConversionLogic.php | 11 +- .../app/command/QywxBackfillCustomerTags.php | 3 + .../service/qywx/MediaChannelService.php | 249 +- .../add_qywx_active_contact_lookup_index.sql | 19 + .../tests/CurrentTagChannelProjectionTest.php | 166 ++ 129 files changed, 34157 insertions(+), 59 deletions(-) create mode 100644 app/.env.example create mode 100644 app/.gitignore create mode 100644 app/Build_DoctorWorkstation.bat create mode 100644 app/README.md create mode 100644 app/Run_DoctorWorkstation.bat create mode 100644 app/SECURITY.md create mode 100644 app/artifacts/ui_acceptance/01_login_1280x800.png create mode 100644 app/artifacts/ui_acceptance/02_reception_1280x800.png create mode 100644 app/artifacts/ui_acceptance/03_prescription_library_1280x800.png create mode 100644 app/artifacts/ui_acceptance/04_prescriptions_1280x800.png create mode 100644 app/artifacts/ui_acceptance/05_patients_1280x800.png create mode 100644 app/artifacts/ui_acceptance/06_consultations_1280x800.png create mode 100644 app/artifacts/ui_acceptance/07_demo_video_980x660.png create mode 100644 app/artifacts/ui_acceptance/08_shell_compact_1024x640.png create mode 100644 app/artifacts/ui_acceptance/08_shell_compact_900x600.png create mode 100644 app/artifacts/ui_acceptance/09_consultations_video_error_1280x800.png create mode 100644 app/artifacts/ui_acceptance/09_consultations_video_success_1280x800.png create mode 100644 app/artifacts/ui_acceptance/10_login_server_settings_1280x800.png create mode 100644 app/main.py create mode 100644 app/package_macos.command create mode 100644 app/packaging/README.md create mode 100644 app/packaging/doctor_workstation.spec create mode 100644 app/packaging/macos/entitlements.plist create mode 100644 app/packaging/windows/start_release.bat create mode 100644 app/packaging/windows/version_info.txt create mode 100644 app/pyproject.toml create mode 100644 app/research/admin_audit.md create mode 100644 app/research/desktop_architecture.md create mode 100644 app/research/final_parity_audit.md create mode 100644 app/research/integration_review.md create mode 100644 app/research/parity_patients_permissions.md create mode 100644 app/research/parity_prescriptions.md create mode 100644 app/research/parity_reception_consultations.md create mode 100644 app/research/tencent_rtc.md create mode 100644 app/research/ui_acceptance.md create mode 100644 app/resources/icon.svg create mode 100644 app/run_macos.command create mode 100644 app/scripts/build_macos.sh create mode 100644 app/scripts/build_windows.ps1 create mode 100644 app/scripts/check_macos_entrypoints.sh create mode 100644 app/scripts/macos_helpers.sh create mode 100644 app/scripts/package_macos.sh create mode 100644 app/scripts/package_windows.ps1 create mode 100644 app/scripts/run_macos.sh create mode 100644 app/scripts/run_windows.ps1 create mode 100644 app/src/doctor_workstation/__init__.py create mode 100644 app/src/doctor_workstation/__main__.py create mode 100644 app/src/doctor_workstation/app.py create mode 100644 app/src/doctor_workstation/config.py create mode 100644 app/src/doctor_workstation/core/__init__.py create mode 100644 app/src/doctor_workstation/core/errors.py create mode 100644 app/src/doctor_workstation/core/models.py create mode 100644 app/src/doctor_workstation/core/permissions.py create mode 100644 app/src/doctor_workstation/core/session.py create mode 100644 app/src/doctor_workstation/logging_setup.py create mode 100644 app/src/doctor_workstation/resources.py create mode 100644 app/src/doctor_workstation/services/__init__.py create mode 100644 app/src/doctor_workstation/services/api_client.py create mode 100644 app/src/doctor_workstation/services/demo_repository.py create mode 100644 app/src/doctor_workstation/services/factory.py create mode 100644 app/src/doctor_workstation/services/mock_repository.py create mode 100644 app/src/doctor_workstation/services/remote_repository.py create mode 100644 app/src/doctor_workstation/services/repository.py create mode 100644 app/src/doctor_workstation/services/token_store.py create mode 100644 app/src/doctor_workstation/ui/__init__.py create mode 100644 app/src/doctor_workstation/ui/dialogs/__init__.py create mode 100644 app/src/doctor_workstation/ui/dialogs/diagnosis.py create mode 100644 app/src/doctor_workstation/ui/dialogs/prescription.py create mode 100644 app/src/doctor_workstation/ui/login.py create mode 100644 app/src/doctor_workstation/ui/pages/__init__.py create mode 100644 app/src/doctor_workstation/ui/pages/consultations.py create mode 100644 app/src/doctor_workstation/ui/pages/patients.py create mode 100644 app/src/doctor_workstation/ui/pages/prescription_library.py create mode 100644 app/src/doctor_workstation/ui/pages/prescriptions.py create mode 100644 app/src/doctor_workstation/ui/pages/reception.py create mode 100644 app/src/doctor_workstation/ui/shell.py create mode 100644 app/src/doctor_workstation/ui/theme.py create mode 100644 app/src/doctor_workstation/ui/widgets.py create mode 100644 app/src/doctor_workstation/video/__init__.py create mode 100644 app/src/doctor_workstation/video/launcher.py create mode 100644 app/src/doctor_workstation/video/lifecycle.py create mode 100644 app/src/doctor_workstation/video/security.py create mode 100644 app/src/doctor_workstation/video/window.py create mode 100644 app/tests/test_api_client.py create mode 100644 app/tests/test_config.py create mode 100644 app/tests/test_consultations_parity_ui.py create mode 100644 app/tests/test_entrypoint.py create mode 100644 app/tests/test_logging_setup.py create mode 100644 app/tests/test_mock_repository.py create mode 100644 app/tests/test_one_click_entrypoints.py create mode 100644 app/tests/test_patients_ui.py create mode 100644 app/tests/test_permissions.py create mode 100644 app/tests/test_prescription_security_ui.py create mode 100644 app/tests/test_prescription_ui.py create mode 100644 app/tests/test_reception_parity_ui.py create mode 100644 app/tests/test_repository_parity.py create mode 100644 app/tests/test_ui_contract.py create mode 100644 app/tests/test_video_contract.py create mode 100644 app/uv.lock create mode 100644 app/video_companion/README.md create mode 100644 app/video_companion/dist/assets/index-BuO_uDya.css create mode 100644 app/video_companion/dist/assets/index-le5ZH3pL.js create mode 100644 app/video_companion/dist/index.html create mode 100644 app/video_companion/index.html create mode 100644 app/video_companion/package-lock.json create mode 100644 app/video_companion/package.json create mode 100644 app/video_companion/src/App.vue create mode 100644 app/video_companion/src/env.d.ts create mode 100644 app/video_companion/src/main.ts create mode 100644 app/video_companion/src/style.css create mode 100644 app/video_companion/tsconfig.json create mode 100644 app/video_companion/vite.config.ts create mode 100644 app/一键打包.command create mode 100644 app/一键打包_医生工作站.bat create mode 100644 app/一键运行.command create mode 100644 app/一键运行_医生工作站.bat create mode 100644 server/sql/1.9.20260810/add_qywx_active_contact_lookup_index.sql create mode 100644 server/tests/CurrentTagChannelProjectionTest.php diff --git a/admin/src/hooks/usePaging.ts b/admin/src/hooks/usePaging.ts index 2b0665dc5..0703db654 100644 --- a/admin/src/hooks/usePaging.ts +++ b/admin/src/hooks/usePaging.ts @@ -8,6 +8,7 @@ interface Options { params?: Record fixedParams?: Record firstLoading?: boolean + latestOnly?: boolean } export function usePaging(options: Options) { @@ -17,7 +18,8 @@ export function usePaging(options: Options) { fetchFun, params = {}, fixedParams = {}, - firstLoading = false + firstLoading = false, + latestOnly = false } = options // 记录分页初始参数 const paramsInit: Record = Object.assign({}, toRaw(params)) @@ -30,8 +32,10 @@ export function usePaging(options: Options) { lists: [] as any[], extend: {} as Record }) + let latestRequestId = 0 // 请求分页接口;silent: true 时不改 loading(用于定时静默刷新,避免表格闪 loading) const getLists = (opts?: { silent?: boolean }) => { + const requestId = ++latestRequestId const silent = opts?.silent === true if (!silent) { pager.loading = true @@ -43,16 +47,26 @@ export function usePaging(options: Options) { ...fixedParams }) .then((res: any) => { + if (latestOnly && requestId !== latestRequestId) { + return Promise.resolve(res) + } pager.count = res?.count pager.lists = res?.lists pager.extend = res?.extend return Promise.resolve(res) }) .catch((err: any) => { + if (latestOnly && requestId !== latestRequestId) { + return Promise.resolve(undefined) + } return Promise.reject(err) }) .finally(() => { - if (!silent) { + if (latestOnly) { + if (requestId === latestRequestId) { + pager.loading = false + } + } else if (!silent) { pager.loading = false } }) diff --git a/admin/src/views/consumer/doctor/paiban.vue b/admin/src/views/consumer/doctor/paiban.vue index 1620d94a9..151331d9e 100644 --- a/admin/src/views/consumer/doctor/paiban.vue +++ b/admin/src/views/consumer/doctor/paiban.vue @@ -89,7 +89,7 @@ >
{{ slot.time }}
- {{ slot.available ? '可约' : '已约' }} + {{ slot.available ? '可约' : slot.hasAppointment ? '已约' : '空号' }}
@@ -115,6 +115,7 @@ dayjs.extend(isoWeek) interface TimeSlot { time: string available: boolean + hasAppointment: boolean quota: number } @@ -186,7 +187,7 @@ const filteredTimeSlots = computed(() => { const slotDateTime = dayjs(`${form.date} ${slot.time}`) const isPast = slotDateTime.isBefore(now) || slotDateTime.isSame(now, 'minute') - // 如果时间已过,标记为不可用 + // 如果时间已过,标记为不可用;保留原始挂号状态以区分“已约”和“空号” if (isPast) { return { ...slot, @@ -315,6 +316,7 @@ const loadTimeSlots = async (silent = false) => { timeSlots.value = (response?.slots || []).map((slot: any) => ({ time: slot.time, available: slot.available, + hasAppointment: Boolean(slot.has_appointment ?? (slot.available === false)), quota: slot.available ? 1 : 0 })) } catch (error) { diff --git a/admin/src/views/first_visit/conversion/index.vue b/admin/src/views/first_visit/conversion/index.vue index 668c6454d..fe9670dcb 100644 --- a/admin/src/views/first_visit/conversion/index.vue +++ b/admin/src/views/first_visit/conversion/index.vue @@ -61,12 +61,23 @@ class="channel-select" @change="loadDashboard" > - + + + + {{ item.name }} + {{ item.customer_count }} 人 + + + {{ dashboard.meta.start_date }} 至 {{ dashboard.meta.end_date }} @@ -246,6 +257,13 @@ import vCharts from 'vue-echarts' import { firstVisitConversionOverview, type FirstVisitConversionParams } from '@/api/first_visit' type MetricType = 'count' | 'money' | 'ratio' +type MediaChannelOption = { + code: string + name: string + tag_id?: string + group_name?: string + customer_count?: number +} const emptyDashboard = () => ({ meta: { @@ -256,7 +274,7 @@ const emptyDashboard = () => ({ filters: { departments: [] as any[], assistants: [] as Array<{ id: number; name: string }>, - media_channels: [] as Array<{ code: string; name: string }> + media_channels: [] as MediaChannelOption[] }, summary: {} as Record, rankings: { orders: [] as any[], amounts: [] as any[] }, @@ -303,6 +321,23 @@ const scopeDescription = computed(() => { if (dashboard.meta.selected_media_channel_name) parts.push(`渠道:${dashboard.meta.selected_media_channel_name}`) return parts.join(' · ') }) +const mediaChannelGroups = computed(() => { + const groups = new Map() + for (const channel of dashboard.filters.media_channels) { + const groupName = channel.group_name || '' + if (!groups.has(groupName)) { + groups.set(groupName, { group_name: groupName, customer_count: 0, channels: [] }) + } + const group = groups.get(groupName)! + group.channels.push(channel) + group.customer_count = Math.max(group.customer_count, Number(channel.customer_count || 0)) + } + return Array.from(groups.values()) +}) const maxOrderValue = computed(() => Math.max(0, ...dashboard.rankings.orders.map(item => Number(item.value || 0)))) const maxAmountValue = computed(() => Math.max(0, ...dashboard.rankings.amounts.map(item => Number(item.value || 0)))) const targetChartOption = computed(() => ({ @@ -445,6 +480,18 @@ onMounted(loadDashboard) .employee-select { width: 190px; } .dept-select { width: 220px; } .channel-select { width: 180px; } +.channel-option { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + width: 100%; + + span:last-child { + color: #98a2b3; + font-size: 12px; + } +} .metric-grid { display: grid; diff --git a/admin/src/views/first_visit/my_patients/components/ProgressPanel.vue b/admin/src/views/first_visit/my_patients/components/ProgressPanel.vue index 0b76f0667..6810881a8 100644 --- a/admin/src/views/first_visit/my_patients/components/ProgressPanel.vue +++ b/admin/src/views/first_visit/my_patients/components/ProgressPanel.vue @@ -120,7 +120,7 @@
-

候诊列表

+

{{ queueDateLabel }}候诊列表

按医生排队 共 {{ pager.count }} 人
@@ -168,7 +168,7 @@ @@ -196,11 +196,12 @@ const formData = reactive({ end_date: today }) -const { pager, getLists } = usePaging({ +const { pager, getLists, resetPage } = usePaging({ fetchFun: myPatientProgressLists as any, params: formData, size: 15, - firstLoading: true + firstLoading: true, + latestOnly: true }) const todayOverview = computed(() => ({ @@ -259,6 +260,10 @@ const selectedScheduleLabel = computed(() => { const day = selectedScheduleDay.value return `${day.date_text || ''} ${day.weekday || ''} ` }) +const queueDateLabel = computed(() => { + if (selectedScheduleDate.value === today) return '今日' + return selectedScheduleLabel.value.trim() || selectedScheduleDate.value +}) const scopeLabel = computed(() => pager.extend?.scope?.label || '按权限加载') const scheduleRange = computed(() => { @@ -274,7 +279,11 @@ function refreshPanel(options?: { silent?: boolean }) { } function selectScheduleDay(date: string) { + if (!date) return selectedScheduleDate.value = date + formData.start_date = date + formData.end_date = date + resetPage() } function doctorWindows(doctor: Record) { diff --git a/admin/tsconfig.tsbuildinfo b/admin/tsconfig.tsbuildinfo index a5ee26566..2f8d45f86 100644 --- a/admin/tsconfig.tsbuildinfo +++ b/admin/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es5.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.full.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/types/hmrpayload.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/types/customevent.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/types/hot.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/types/importglob.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/types/importmeta.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/client.d.ts","./global.d.ts","./node_modules/.pnpm/@vue+shared@3.5.33/node_modules/@vue/shared/dist/shared.d.ts","./node_modules/.pnpm/@babel+types@7.29.0/node_modules/@babel/types/lib/index.d.ts","./node_modules/.pnpm/@babel+parser@7.29.3/node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/.pnpm/@vue+compiler-core@3.5.33/node_modules/@vue/compiler-core/dist/compiler-core.d.ts","./node_modules/.pnpm/@vue+compiler-dom@3.5.33/node_modules/@vue/compiler-dom/dist/compiler-dom.d.ts","./node_modules/.pnpm/@vue+reactivity@3.5.33/node_modules/@vue/reactivity/dist/reactivity.d.ts","./node_modules/.pnpm/@vue+runtime-core@3.5.33/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","./node_modules/.pnpm/csstype@3.2.3/node_modules/csstype/index.d.ts","./node_modules/.pnpm/@vue+runtime-dom@3.5.33/node_modules/@vue/runtime-dom/dist/runtime-dom.d.ts","./node_modules/.pnpm/vue@3.5.33_typescript@5.7.3/node_modules/vue/dist/vue.d.mts","./node_modules/.pnpm/vue@3.5.33_typescript@5.7.3/node_modules/vue/jsx-runtime/index.d.ts","./node_modules/.vue-global-types/vue_3.5_0_0_0.d.ts","./node_modules/.pnpm/vue-router@4.6.4_vue@3.5.33_typescript@5.7.3_/node_modules/vue-router/dist/router-cwonjprp.d.mts","./node_modules/.pnpm/vue-router@4.6.4_vue@3.5.33_typescript@5.7.3_/node_modules/vue-router/dist/vue-router.d.mts","./node_modules/.pnpm/@vueuse+shared@12.7.0_typescript@5.7.3/node_modules/@vueuse/shared/index.d.mts","./node_modules/.pnpm/@vueuse+core@12.7.0_typescript@5.7.3/node_modules/@vueuse/core/index.d.mts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/zh-cn.d.ts","./src/enums/appenums.ts","./node_modules/.pnpm/vue-demi@0.14.10_vue@3.5.33_typescript@5.7.3_/node_modules/vue-demi/lib/index.d.ts","./node_modules/.pnpm/pinia@2.3.1_typescript@5.7.3_vue@3.5.33_typescript@5.7.3_/node_modules/pinia/dist/pinia.d.ts","./node_modules/.pnpm/axios@1.16.0/node_modules/axios/index.d.ts","./node_modules/@types/lodash/common/common.d.ts","./node_modules/@types/lodash/common/array.d.ts","./node_modules/@types/lodash/common/collection.d.ts","./node_modules/@types/lodash/common/date.d.ts","./node_modules/@types/lodash/common/function.d.ts","./node_modules/@types/lodash/common/lang.d.ts","./node_modules/@types/lodash/common/math.d.ts","./node_modules/@types/lodash/common/number.d.ts","./node_modules/@types/lodash/common/object.d.ts","./node_modules/@types/lodash/common/seq.d.ts","./node_modules/@types/lodash/common/string.d.ts","./node_modules/@types/lodash/common/util.d.ts","./node_modules/@types/lodash/index.d.ts","./src/config/index.ts","./src/enums/pageenum.ts","./src/enums/requestenums.ts","./src/api/user.ts","./src/enums/cacheenums.ts","./src/utils/validate.ts","./src/stores/modules/multipletabs.ts","./src/utils/cache.ts","./src/utils/auth.ts","./src/stores/modules/user.ts","./src/config/setting.ts","./src/utils/theme.ts","./src/stores/modules/setting.ts","./src/layout/default/components/setting/drawer.vue","./src/layout/default/components/setting/index.vue","./src/hooks/usewatchroute.ts","./src/layout/default/components/header/breadcrumb.vue","./src/layout/default/components/header/fold.vue","./src/layout/default/components/header/full-screen.vue","./src/hooks/usemultipletabs.ts","./src/layout/default/components/header/multiple-tabs.vue","./src/layout/default/components/header/refresh.vue","./src/api/setting/system.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/constants/aria.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/constants/date.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/constants/event.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/constants/key.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/constants/size.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/constants/column-alignment.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/constants/form.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/typescript.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/props/util.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/props/runtime.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/props/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/dom/aria.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/dom/event.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/dom/position.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/dom/scroll.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/dom/style.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/dom/element.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/dom/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/global-node.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/add-location.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/aim.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/alarm-clock.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/apple.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/arrow-down-bold.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/arrow-down.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/arrow-left-bold.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/arrow-left.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/arrow-right-bold.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/arrow-right.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/arrow-up-bold.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/arrow-up.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/avatar.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/back.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/baseball.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/basketball.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/bell-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/bell.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/bicycle.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/bottom-left.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/bottom-right.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/bottom.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/bowl.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/box.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/briefcase.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/brush-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/brush.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/burger.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/calendar.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/camera-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/camera.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/caret-bottom.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/caret-left.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/caret-right.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/caret-top.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/cellphone.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/chat-dot-round.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/chat-dot-square.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/chat-line-round.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/chat-line-square.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/chat-round.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/chat-square.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/check.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/checked.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/cherry.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/chicken.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/chrome-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/circle-check-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/circle-check.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/circle-close-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/circle-close.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/circle-plus-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/circle-plus.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/clock.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/close-bold.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/close.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/cloudy.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/coffee-cup.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/coffee.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/coin.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/cold-drink.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/collection-tag.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/collection.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/comment.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/compass.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/connection.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/coordinate.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/copy-document.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/cpu.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/credit-card.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/crop.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/d-arrow-left.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/d-arrow-right.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/d-caret.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/data-analysis.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/data-board.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/data-line.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/delete-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/delete-location.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/delete.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/dessert.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/discount.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/dish-dot.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/dish.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/document-add.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/document-checked.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/document-copy.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/document-delete.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/document-remove.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/document.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/download.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/drizzling.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/edit-pen.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/edit.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/eleme-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/eleme.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/element-plus.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/expand.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/failed.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/female.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/files.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/film.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/filter.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/finished.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/first-aid-kit.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/flag.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/fold.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/folder-add.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/folder-checked.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/folder-delete.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/folder-opened.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/folder-remove.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/folder.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/food.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/football.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/fork-spoon.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/fries.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/full-screen.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/goblet-full.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/goblet-square-full.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/goblet-square.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/goblet.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/gold-medal.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/goods-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/goods.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/grape.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/grid.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/guide.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/handbag.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/headset.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/help-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/help.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/hide.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/histogram.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/home-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/hot-water.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/house.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/ice-cream-round.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/ice-cream-square.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/ice-cream.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/ice-drink.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/ice-tea.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/info-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/iphone.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/key.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/knife-fork.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/lightning.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/link.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/list.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/loading.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/location-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/location-information.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/location.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/lock.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/lollipop.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/magic-stick.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/magnet.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/male.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/management.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/map-location.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/medal.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/memo.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/menu.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/message-box.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/message.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/mic.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/microphone.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/milk-tea.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/minus.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/money.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/monitor.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/moon-night.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/moon.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/more-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/more.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/mostly-cloudy.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/mouse.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/mug.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/mute-notification.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/mute.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/no-smoking.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/notebook.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/notification.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/odometer.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/office-building.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/open.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/operation.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/opportunity.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/orange.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/paperclip.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/partly-cloudy.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/pear.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/phone-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/phone.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/picture-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/picture-rounded.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/picture.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/pie-chart.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/place.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/platform.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/plus.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/pointer.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/position.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/postcard.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/pouring.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/present.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/price-tag.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/printer.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/promotion.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/quartz-watch.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/question-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/rank.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/reading-lamp.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/reading.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/refresh-left.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/refresh-right.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/refresh.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/refrigerator.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/remove-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/remove.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/right.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/scale-to-original.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/school.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/scissor.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/search.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/select.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sell.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/semi-select.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/service.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/set-up.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/setting.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/share.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/ship.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/shop.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/shopping-bag.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/shopping-cart-full.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/shopping-cart.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/shopping-trolley.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/smoking.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/soccer.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sold-out.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sort-down.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sort-up.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sort.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/stamp.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/star-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/star.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/stopwatch.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/success-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sugar.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/suitcase-line.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/suitcase.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sunny.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sunrise.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sunset.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/switch-button.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/switch-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/switch.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/takeaway-box.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/ticket.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/tickets.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/timer.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/toilet-paper.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/tools.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/top-left.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/top-right.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/top.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/trend-charts.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/trophy-base.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/trophy.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/turn-off.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/umbrella.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/unlock.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/upload-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/upload.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/user-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/user.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/van.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/video-camera-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/video-camera.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/video-pause.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/video-play.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/view.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/wallet-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/wallet.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/warn-triangle-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/warning-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/warning.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/watch.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/watermelon.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/wind-power.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/zoom-in.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/zoom-out.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/index.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/icon.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/typescript.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/install.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/refs.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/size.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/validator.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/vnode.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/props/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/index.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/index.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/add.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/after.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/ary.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/assign.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/assignin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/assigninwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/assignwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/at.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/attempt.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/before.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/bind.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/bindall.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/bindkey.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/camelcase.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/capitalize.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/castarray.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/ceil.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/chain.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/chunk.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/clamp.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/clone.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/clonedeep.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/clonedeepwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/clonewith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/compact.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/concat.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/cond.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/conforms.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/conformsto.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/constant.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/countby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/create.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/curry.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/curryright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/debounce.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/deburr.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/defaults.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/defaultsdeep.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/defaultto.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/defer.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/delay.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/difference.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/differenceby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/differencewith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/divide.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/drop.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/dropright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/droprightwhile.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/dropwhile.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/each.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/eachright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/endswith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/entries.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/entriesin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/eq.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/escape.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/escaperegexp.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/every.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/extend.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/extendwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/fill.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/filter.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/find.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/findindex.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/findkey.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/findlast.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/findlastindex.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/findlastkey.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/first.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flatmap.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flatmapdeep.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flatmapdepth.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flatten.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flattendeep.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flattendepth.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flip.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/floor.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flow.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flowright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/foreach.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/foreachright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/forin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/forinright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/forown.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/forownright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/frompairs.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/functions.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/functionsin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/get.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/groupby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/gt.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/gte.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/has.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/hasin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/head.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/identity.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/includes.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/indexof.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/initial.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/inrange.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/intersection.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/intersectionby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/intersectionwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/invert.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/invertby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/invoke.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/invokemap.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isarguments.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isarray.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isarraybuffer.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isarraylike.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isarraylikeobject.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isboolean.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isbuffer.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isdate.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/iselement.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isempty.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isequal.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isequalwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/iserror.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isfinite.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isfunction.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isinteger.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/islength.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/ismap.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/ismatch.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/ismatchwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isnan.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isnative.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isnil.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isnull.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isnumber.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isobject.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isobjectlike.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isplainobject.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isregexp.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/issafeinteger.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isset.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isstring.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/issymbol.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/istypedarray.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isundefined.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isweakmap.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isweakset.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/iteratee.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/join.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/kebabcase.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/keyby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/keys.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/keysin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/last.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/lastindexof.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/lowercase.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/lowerfirst.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/lt.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/lte.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/map.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/mapkeys.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/mapvalues.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/matches.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/matchesproperty.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/max.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/maxby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/mean.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/meanby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/memoize.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/merge.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/mergewith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/method.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/methodof.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/min.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/minby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/mixin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/multiply.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/negate.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/noop.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/now.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/nth.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/ntharg.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/omit.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/omitby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/once.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/orderby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/over.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/overargs.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/overevery.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/oversome.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/pad.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/padend.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/padstart.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/parseint.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/partial.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/partialright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/partition.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/pick.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/pickby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/property.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/propertyof.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/pull.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/pullall.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/pullallby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/pullallwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/pullat.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/random.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/range.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/rangeright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/rearg.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/reduce.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/reduceright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/reject.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/remove.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/repeat.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/replace.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/rest.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/result.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/reverse.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/round.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sample.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/samplesize.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/set.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/setwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/shuffle.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/size.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/slice.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/snakecase.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/some.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sortby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sortedindex.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sortedindexby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sortedindexof.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sortedlastindex.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sortedlastindexby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sortedlastindexof.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sorteduniq.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sorteduniqby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/split.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/spread.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/startcase.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/startswith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/stubarray.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/stubfalse.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/stubobject.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/stubstring.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/stubtrue.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/subtract.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sum.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sumby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tail.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/take.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/takeright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/takerightwhile.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/takewhile.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tap.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/template.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/templatesettings.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/throttle.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/thru.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/times.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/toarray.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tofinite.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tointeger.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tolength.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tolower.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tonumber.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/topairs.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/topairsin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/topath.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/toplainobject.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tosafeinteger.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tostring.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/toupper.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/transform.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/trim.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/trimend.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/trimstart.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/truncate.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/unary.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/unescape.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/union.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/unionby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/unionwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/uniq.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/uniqby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/uniqueid.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/uniqwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/unset.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/unzip.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/unzipwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/update.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/updatewith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/uppercase.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/upperfirst.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/values.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/valuesin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/without.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/words.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/wrap.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/xor.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/xorby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/xorwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/zip.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/zipobject.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/zipobjectdeep.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/zipwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/index.d.ts","./node_modules/.pnpm/lodash-unified@1.0.3_@types_168785b94d783e1b7a7274df40d5f9d9/node_modules/lodash-unified/type.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/arrays.d.ts","./node_modules/.pnpm/@vueuse+shared@12.0.0_typescript@5.7.3/node_modules/@vueuse/shared/index.d.mts","./node_modules/.pnpm/@vueuse+core@12.0.0_typescript@5.7.3/node_modules/@vueuse/core/index.d.mts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/browser.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/error.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/functions.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/i18n.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/objects.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/raf.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/rand.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/strings.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/throttlebyraf.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/easings.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/numbers.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/affix/src/affix.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/affix/src/affix.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/affix/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/alert/src/alert.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/alert/src/alert.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/alert/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/alert/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/anchor/src/anchor.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/anchor/src/anchor.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/anchor/src/anchor-link.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/anchor/src/anchor-link.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/anchor/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input/src/input.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input/src/input.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input/index.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/enums.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/popperoffsets.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/flip.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/hide.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/offset.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/eventlisteners.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/computestyles.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/arrow.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/preventoverflow.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/applystyles.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/types.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/index.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/utils/detectoverflow.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/createpopper.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/popper-lite.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/popper.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/index.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/popper.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/popper.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/arrow.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/trigger.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/trigger.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/avatar/src/avatar.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/avatar/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/arrow.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/content.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/content.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/avatar/src/avatar-group-props.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/avatar/src/avatar.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/avatar/src/avatar-group.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/avatar/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/avatar/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/backtop/src/backtop.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/backtop/src/backtop.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/backtop/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/backtop/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/badge/src/badge.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/badge/src/badge.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/badge/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/badge/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/breadcrumb/src/breadcrumb.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/breadcrumb/src/breadcrumb-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/breadcrumb/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/breadcrumb/src/breadcrumb.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/breadcrumb/src/breadcrumb-item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/breadcrumb/src/instances.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/breadcrumb/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/button/src/button.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/button/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/button/src/button.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/button/src/button-group.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/button/src/button-group.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/button/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/button/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/calendar/src/calendar.d.ts","./node_modules/.pnpm/dayjs@1.11.20/node_modules/dayjs/locale/types.d.ts","./node_modules/.pnpm/dayjs@1.11.20/node_modules/dayjs/locale/index.d.ts","./node_modules/.pnpm/dayjs@1.11.20/node_modules/dayjs/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/calendar/src/calendar.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/calendar/src/date-table.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/calendar/src/date-table.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/calendar/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/calendar/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/card/src/card.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/card/src/card.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/card/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/card/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/carousel/src/carousel.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/carousel/src/carousel-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/carousel/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/carousel/src/carousel.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/carousel/src/carousel-item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/carousel/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/carousel/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader-panel/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader-panel/src/node.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader-panel/src/menu.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader-panel/src/config.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader-panel/src/index.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader-panel/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader-panel/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-attrs/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-calc-input-width/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-deprecated/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-draggable/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-focus/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/en.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/af.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ar-eg.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ar.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/az.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/bg.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/bn.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ca.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ckb.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/cs.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/da.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/de.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/el.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/eo.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/es.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/et.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/eu.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/fa.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/fi.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/fr.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/he.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/hi.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/hr.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/hu.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/hy-am.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/id.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/it.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ja.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/kk.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/km.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ko.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ku.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ky.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/lo.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/lt.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/lv.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/mg.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/mn.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ms.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/my.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/nb-no.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/nl.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/no.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/pa.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/pl.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/pt-br.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/pt.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ro.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ru.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/sk.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/sl.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/sr.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/sv.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/sw.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ta.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/te.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/th.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/tk.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/tr.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ug-cn.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/uk.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/uz-uz.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/vi.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/zh-tw.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/zh-hk.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/zh-mo.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-locale/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-namespace/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-lockscreen/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-modal/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-model-toggle/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-prevent-global/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-prop/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-popper/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-same-target/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-teleport/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-throttle-render/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-timeout/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-transition-fallthrough/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-id/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-escape-keydown/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-popper-container/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-intermediate-render/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-delayed-toggle/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-forward-ref/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-z-index/index.d.ts","./node_modules/.pnpm/@floating-ui+utils@0.2.11/node_modules/@floating-ui/utils/dist/floating-ui.utils.d.mts","./node_modules/.pnpm/@floating-ui+core@1.7.5/node_modules/@floating-ui/core/dist/floating-ui.core.d.mts","./node_modules/.pnpm/@floating-ui+utils@0.2.11/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.d.mts","./node_modules/.pnpm/@floating-ui+dom@1.7.6/node_modules/@floating-ui/dom/dist/floating-ui.dom.d.mts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-floating/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-cursor/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-ordered-children/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-size/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-focus-controller/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-composition/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-empty-values/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-aria/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tag/src/tag.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tag/src/tag.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tag/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader/src/cascader.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader/src/cascader.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader/src/instances.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/check-tag/src/check-tag.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/check-tag/src/check-tag.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/check-tag/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/checkbox/src/checkbox.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/checkbox/src/checkbox.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/checkbox/src/checkbox-group.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/checkbox/src/checkbox-group.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/checkbox/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/checkbox/src/checkbox-button.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/checkbox/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/col/src/col.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/col/src/col.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/col/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse/src/collapse.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse/src/collapse-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse/src/collapse.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse/src/collapse-item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse-transition/src/collapse-transition.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse-transition/index.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/interfaces.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/index.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/css-color-names.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/readability.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/to-ms-filter.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/from-ratio.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/format-input.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/random.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/conversion.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/public_api.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/color-picker-panel/src/utils/color.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/color-picker-panel/src/color-picker-panel.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/color-picker-panel/src/color-picker-panel.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/color-picker-panel/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tooltip/src/trigger.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tooltip/src/content.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tooltip/src/content.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tooltip/src/tooltip.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tooltip/src/tooltip.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tooltip/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tooltip/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/color-picker/src/color-picker.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/color-picker/src/color-picker.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/color-picker/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dialog/src/dialog-content.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dialog/src/dialog.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dialog/src/dialog.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dialog/src/use-dialog.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dialog/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dialog/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/message/src/message.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/message/src/message.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/message/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/link/src/link.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/link/src/link.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/link/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/store/tree.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/store/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/table-header/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/table-layout.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/table/defaults.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/util.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/table-column/defaults.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/scrollbar/src/scrollbar.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/scrollbar/src/scrollbar.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/scrollbar/src/thumb.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/scrollbar/src/thumb.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/scrollbar/src/util.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/scrollbar/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/scrollbar/index.d.ts","./node_modules/.pnpm/normalize-wheel-es@1.2.0/node_modules/normalize-wheel-es/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/directives/mousewheel/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/table-body/defaults.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/table-footer/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/h-helper.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/table.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/table-column/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/tablecolumn.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/config-provider/src/config-provider-props.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/config-provider/src/config-provider.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/config-provider/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/config-provider/src/hooks/use-global-config.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/config-provider/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/container/src/container.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/container/src/aside.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/container/src/footer.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/container/src/header.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/container/src/main.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/container/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/countdown/src/countdown.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/countdown/src/countdown.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/countdown/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-picker/src/common/props.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-picker/src/common/picker.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-picker/src/time-picker-com/panel-time-pick.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-picker/src/utils.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-picker/src/composables/use-common-picker.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-picker/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-picker/src/time-picker.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-picker/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker-panel/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker-panel/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker-panel/src/props/date-picker-panel.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker-panel/src/date-picker-panel.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker-panel/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker-panel/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker/src/props.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker/src/date-picker.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/descriptions/src/description.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/descriptions/src/description.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/descriptions/src/description-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/descriptions/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/divider/src/divider.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/divider/src/divider.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/divider/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/drawer/src/drawer.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/drawer/src/drawer.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/drawer/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/icon/src/icon.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/icon/src/icon.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/icon/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dropdown/src/dropdown.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dropdown/src/dropdown.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dropdown/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dropdown/src/tokens.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dropdown/src/dropdown-item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dropdown/src/dropdown-menu.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dropdown/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/empty/src/empty.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/empty/src/empty.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/empty/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/empty/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/utils.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/form.d.ts","./node_modules/.pnpm/async-validator@4.2.5/node_modules/async-validator/dist-types/interface.d.ts","./node_modules/.pnpm/async-validator@4.2.5/node_modules/async-validator/dist-types/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/form-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/hooks/use-form-common-props.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/hooks/use-form-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/form.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/form-item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/hooks/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/image-viewer/src/image-viewer.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/image-viewer/src/image-viewer.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/image-viewer/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/image/src/image.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/image/src/image.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/image/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-number/src/input-number.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-number/src/input-number.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-number/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-tag/src/input-tag.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-tag/src/input-tag.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-tag/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-tag/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/menu.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/menu-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/menu-item-group.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/sub-menu.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/menu-item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/menu-item-group.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/tokens.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/overlay/src/overlay.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/overlay/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/page-header/src/page-header.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/page-header/src/page-header.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/page-header/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/pagination/src/pagination.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/pagination/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/pagination/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popconfirm/src/popconfirm.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popconfirm/src/popconfirm.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popconfirm/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/progress/src/progress.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/progress/src/progress.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/progress/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/radio/src/radio.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/radio/src/radio.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/radio/src/radio-button.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/radio/src/radio-button.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/radio/src/radio-group.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/radio/src/radio-group.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/radio/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/radio/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/rate/src/rate.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/rate/src/rate.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/rate/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/result/src/result.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/result/src/result.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/result/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/row/src/row.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/row/src/row.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/row/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/row/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/defaults.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/components/fixed-size-list.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/components/dynamic-size-list.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/components/fixed-size-grid.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/props.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/hooks/use-cache.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/builders/build-grid.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/components/dynamic-size-grid.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select-v2/src/select.types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select-v2/src/select-dropdown.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select-v2/src/token.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select-v2/src/useprops.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select-v2/src/select.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select-v2/src/defaults.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select/src/option.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select/src/type.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select/src/select.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select/src/select.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select/src/token.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select/src/option.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select/src/option-group.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select-v2/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/skeleton/src/skeleton.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/skeleton/src/skeleton.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/skeleton/src/skeleton-item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/skeleton/src/skeleton-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/skeleton/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/slider/src/slider.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/slider/src/marker.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/slider/src/slider.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/slider/src/composables/use-marks.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/slider/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/slider/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/space/src/space.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/space/src/item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/space/src/use-space.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/space/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/statistic/src/statistic.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/statistic/src/statistic.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/statistic/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/steps/src/steps.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/steps/src/steps.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/steps/src/item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/steps/src/item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/steps/src/tokens.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/steps/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/switch/src/switch.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/switch/src/switch.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/switch/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/common.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/row.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/grid.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/table.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/table-grid.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/composables/use-scrollbar.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/header-row.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/header-row.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/row.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/cell.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/cell.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/header-cell.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/header-cell.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/header.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/composables/use-columns.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/header.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/sort-icon.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/expand-icon.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/table-v2.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/auto-resizer.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/private.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/composables/use-row.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/composables/use-data.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/composables/use-styles.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/composables/use-auto-resize.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/composables/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/use-table.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/renderers/header-cell.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/auto-resizer.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/src/tab-pane.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/src/tab-pane.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/src/tab-bar.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/src/tab-bar.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/src/tab-nav.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/src/tabs.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/text/src/text.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/text/src/text.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/text/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-select/src/time-select.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-select/src/time-select.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-select/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/timeline/src/timeline.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/timeline/src/timeline-item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/timeline/src/timeline-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/timeline/src/tokens.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/timeline/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/transfer/src/transfer-panel.vue.d.ts","./node_modules/.pnpm/vue-component-type-helpers@3.2.8/node_modules/vue-component-type-helpers/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/transfer/src/transfer-panel.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/transfer/src/transfer.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/transfer/src/transfer.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/transfer/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/src/model/usedragnode.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/src/tree.type.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/src/model/tree-store.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/src/model/node.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/src/tree.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/src/tree.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/src/tokens.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-select/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-select/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-v2/src/virtual-tree.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-v2/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-v2/src/tree.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-v2/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-v2/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/ajax.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/upload.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/upload.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/upload-content.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/upload-content.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/upload-list.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/upload-list.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/upload-dragger.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/upload-dragger.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/watermark/src/watermark.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/watermark/src/watermark.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/watermark/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tour/src/content.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tour/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tour/src/tour.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tour/src/tour.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tour/src/step.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tour/src/step.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tour/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/segmented/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/segmented/src/segmented.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/segmented/src/segmented.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/segmented/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/mention/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/mention/src/helper.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/mention/src/mention.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/mention/src/mention.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/mention/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/splitter/src/type.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/splitter/src/splitter.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/splitter/src/splitter.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/splitter/src/split-panel.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/splitter/src/split-panel.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/splitter/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/infinite-scroll/src/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/infinite-scroll/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/loading/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/loading/src/loading.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/loading/src/service.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/loading/src/directive.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/loading/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/message-box/src/message-box.type.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/message-box/src/messagebox.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/message-box/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/notification/src/notification.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/notification/src/notification.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/notification/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popover/src/popover.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popover/src/popover.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popover/src/directive.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popover/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/autocomplete/src/autocomplete.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/autocomplete/src/autocomplete.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/autocomplete/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/defaults.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/directives/click-outside/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/directives/repeat-click/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/directives/trap-focus/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/directives/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/make-installer.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/index.d.ts","./src/utils/feedback.ts","./src/layout/default/components/header/user-drop-down.vue","./src/layout/default/components/header/index.vue","./src/layout/default/components/main.vue","./src/layout/default/components/sidebar/logo.vue","./src/utils/util.ts","./src/layout/default/components/sidebar/menu-item.vue","./src/layout/default/components/sidebar/menu.vue","./src/layout/default/components/sidebar/side.vue","./src/layout/default/components/sidebar/index.vue","./src/layout/default/index.vue","./src/views/error/components/error.vue","./src/views/error/404.vue","./src/views/error/403.vue","./src/hooks/uselockfn.ts","./src/layout/components/footer.vue","./src/views/account/login.vue","./src/views/account/change-password.vue","./src/utils/wecomoauthpostmessage.ts","./src/views/account/bind-work-wechat.vue","./src/views/user/setting.vue","./node_modules/dayjs/locale/types.d.ts","./node_modules/dayjs/locale/index.d.ts","./node_modules/dayjs/index.d.ts","./src/api/doctor.ts","./src/views/doctor/progress.vue","./src/api/decoration.ts","./src/views/decoration/component/widgets/index.ts","./src/views/decoration/component/pages/preview-pc.vue","./src/views/decoration/pc_details.vue","./src/api/fans.ts","./src/views/fans/h5.vue","./src/api/tcm.ts","./src/api/order.ts","./src/api/channel/weapp.ts","./src/hooks/usepaging.ts","./src/utils/perm.ts","./node_modules/.pnpm/vue-demi@0.13.11_vue@3.5.33_typescript@5.7.3_/node_modules/vue-demi/lib/index.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/types/dist/shared.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/types/dist/core.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/core.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/types/dist/echarts.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/index.d.ts","./node_modules/.pnpm/vue-echarts@6.7.3_@vue+runt_9e349b8fe817591c55152dc2c2ed6abf/node_modules/vue-echarts/dist/index.d.ts","./src/views/tcm/diagnosis/components/diagnosistodolist.vue","./src/utils/blood-thresholds.ts","./src/views/tcm/diagnosis/components/dailymatrix.vue","./src/views/tcm/diagnosis/components/caserecordlist.vue","./node_modules/.pnpm/hls.js@1.6.17/node_modules/hls.js/dist/hls.d.mts","./src/views/tcm/diagnosis/components/recordingvideoplayer.vue","./src/views/tcm/diagnosis/components/recordingplaybackblock.vue","./node_modules/.pnpm/cos-js-sdk-v5@1.10.1/node_modules/cos-js-sdk-v5/index.d.ts","./src/api/file.ts","./src/utils/oss-direct-upload.ts","./src/components/upload/index.vue","./src/views/tcm/diagnosis/components/callrecordpanel.vue","./src/utils/im-business-message-parse.ts","./src/views/tcm/diagnosis/components/imchatrecordpanel.vue","./src/views/tcm/diagnosis/components/assignlogpanel.vue","./src/views/tcm/diagnosis/components/appointmentrecordpanel.vue","./src/api/patient.ts","./src/views/patient/reception/components/notetimeline.vue","./src/views/tcm/diagnosis/components/trackingnotetimeline.vue","./src/views/consumer/prescription/components/prescription-order-utils.ts","./src/views/consumer/prescription/components/prescriptionorderdetaildrawer.vue","./src/views/tcm/diagnosis/components/patientorderlist.vue","./src/api/medicine.ts","./src/components/medicine-name-select/index.vue","./src/utils/diabetes-discovery-display.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/core/logger.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/core/cache-storage.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/core/context.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/layout/bounds.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/dom/document-cloner.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/syntax/tokenizer.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/syntax/parser.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/types/index.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/ipropertydescriptor.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/background-clip.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/itypedescriptor.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/types/color.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/types/length-percentage.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/types/image.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/background-image.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/background-origin.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/background-position.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/background-repeat.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/background-size.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/border-radius.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/border-style.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/border-width.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/direction.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/display.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/float.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/letter-spacing.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/line-break.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/list-style-image.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/list-style-position.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/list-style-type.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/overflow.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/overflow-wrap.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/text-align.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/position.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/types/length.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/text-shadow.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/text-transform.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/transform.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/transform-origin.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/visibility.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/word-break.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/z-index.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/opacity.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/text-decoration-line.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/font-family.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/font-weight.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/font-variant.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/font-style.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/content.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/counter-increment.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/counter-reset.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/duration.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/quotes.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/box-shadow.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/paint-order.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/webkit-text-stroke-width.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/index.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/layout/text.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/dom/text-container.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/dom/element-container.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/render/vector.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/render/bezier-curve.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/render/path.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/render/bound-curves.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/render/effects.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/render/stacking-context.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/dom/replaced-elements/canvas-element-container.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/dom/replaced-elements/image-element-container.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/dom/replaced-elements/svg-element-container.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/dom/replaced-elements/index.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/render/renderer.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/render/canvas/canvas-renderer.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/index.d.ts","./node_modules/.pnpm/jspdf@2.5.2/node_modules/jspdf/types/index.d.ts","./src/components/tcm-prescription/index.vue","./src/views/tcm/diagnosis/edit.vue","./src/views/tcm/diagnosis/detail.vue","./node_modules/dayjs/plugin/isoweek.d.ts","./src/api/first_visit.ts","./src/views/tcm/diagnosis/appointment.vue","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/cdn-streaming/cdn-streaming.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/device-detector/device-detector.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/video-effect/virtual-background/virtual-background.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/video-effect/watermark/watermark.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/video-effect/beauty/beauty.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/video-effect/basic-beauty/basic-beauty.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/cross-room/cross-room.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/custom-encryption/custom-encryption.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/video-effect/video-mixer/video-mixer.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/small-stream-auto-switcher/small-stream-auto-switcher.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/chorus/chorus.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/lebplayer/lebplayer.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/realtime-transcriber/realtime-transcriber.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/index.d.ts","./src/views/tcm/diagnosis/components/assistantwatchcalldialog.vue","./src/views/tcm/diagnosis/index_h5.vue","./src/utils/diag-display.ts","./src/views/tcm/diagnosis/components/patientinfocard.vue","./src/views/tcm/diagnosis/components/patientcasecard.vue","./src/views/tcm/diagnosis/readonly.vue","./src/router/routes.ts","./src/router/index.ts","./src/utils/request/cancel.ts","./src/utils/request/type.d.ts","./src/utils/request/axios.ts","./src/utils/wecombindguard.ts","./src/utils/request/index.ts","./src/api/app.ts","./src/stores/modules/app.ts","./src/api/chat.ts","./src/components/chat-notify-toast/index.vue","./src/app.vue","./src/permission.ts","./src/install/index.ts","./src/main.ts","./src/api/article.ts","./src/api/asset.ts","./src/api/consumer.ts","./src/api/finance.ts","./src/api/message.ts","./src/api/pharmacy.ts","./src/api/qywx-msg.ts","./src/api/qywx.ts","./src/api/self_input_stats.ts","./src/api/stats.ts","./src/api/app/recharge.ts","./src/api/channel/h5.ts","./src/api/channel/open_setting.ts","./src/api/channel/wx_oa.ts","./src/api/org/department.ts","./src/api/org/post.ts","./src/api/perms/admin.ts","./src/api/perms/menu.ts","./src/api/perms/role.ts","./src/api/setting/dict.ts","./src/api/setting/pay.ts","./src/api/setting/search.ts","./src/api/setting/storage.ts","./src/api/setting/user.ts","./src/api/setting/website.ts","./src/api/tools/code.ts","./node_modules/.pnpm/@tencentcloud+chat-uikit-vu_f78cbc43da431f244e6b6d27ca79f135/node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chat/chat.vue.d.ts","./node_modules/.pnpm/@tencentcloud+chat-uikit-vu_f78cbc43da431f244e6b6d27ca79f135/node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chat/index.d.ts","./node_modules/.pnpm/@tencentcloud+chat-uikit-vu_f78cbc43da431f244e6b6d27ca79f135/node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chatheader/chatheader.vue.d.ts","./node_modules/.pnpm/@tencentcloud+chat-uikit-vu_f78cbc43da431f244e6b6d27ca79f135/node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chatheader/hooks/usechatheader.d.ts","./node_modules/.pnpm/@tencentcloud+chat-uikit-vu_f78cbc43da431f244e6b6d27ca79f135/node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chatheader/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/login.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/loginstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/avatar/avatar.vue.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/avatar/constants/avatar.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/avatar/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/userpicker/type.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/userpicker/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/basecomp/view/view.vue.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/basecomp/view/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/chatsetting/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/uikitmodalstate/uikitmodalstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/uikitmodalstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/uikitmodal/type.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/uikitmodal/uikitmodal.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/uikitmodal/useroommodal/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/uikitmodal/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/subentry/common/base.d.ts","./node_modules/.pnpm/@tencentcloud+chat@3.5.9/node_modules/@tencentcloud/chat/index.d.ts","./node_modules/.pnpm/@tencentcloud+tuiroom-engine-js@3.5.2/node_modules/@tencentcloud/tuiroom-engine-js/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/device.d.ts","./node_modules/.pnpm/@tencentcloud+chat@3.6.6/node_modules/@tencentcloud/chat/index.d.ts","./node_modules/.pnpm/@tencentcloud+chat-uikit-engine@2.5.8/node_modules/@tencentcloud/chat-uikit-engine/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/message.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/hooks/useofflinepushinfo/types.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/hooks/useofflinepushinfo/useofflinepushinfo.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/hooks/useofflinepushinfo/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/engine.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/search.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/contact.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/conversation.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/call.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/groupsettingstate/types.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/chatsetting.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/types.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/live.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/stream.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/videomixer.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/audience.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/seat.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/monitor.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/coguest.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/cohost.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/battle.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/barrage.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/room.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/participant.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/beauty.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/virtualbackground.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/user.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/devicestate/devicestate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/devicestate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/hooks/useroomengine.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/audiosettingpanel/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/videosettingpanel/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/subentry/common/rtc.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/subentry/common/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/barragestate/barragestate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/barragestate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/battlestate/battlestate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/battlestate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/cogueststate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/cohoststate/cohoststate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/cohoststate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/liveaudiencestate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/liveliststate/liveliststate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/liveliststate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/livemonitorstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/utils/eventcenter.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/liveseatstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/videomixerstate/videomixerstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/videomixerstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/barrageinput/barrageinputh5.vue.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/barrageinput/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/barragelist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/camerabutton/index.vue.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/camerabutton/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/coguestpanel/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/cohostpanel/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/liveaudiencelist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/livelist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/livemonitorview/livemonitorview.vue.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/livemonitorview/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/livescenepanel/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/liveview/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/micbutton/index.vue.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/micbutton/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/streammixer/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/subentry/live/live.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/asr.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/asrstate/asrstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/freebeautystate/freebeautystate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/freebeautystate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/roomparticipantstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/roomstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/virtualbackgroundstate/virtualbackgroundstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/virtualbackgroundstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/roomparticipantlist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/roomparticipantview/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/roomview/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/scheduleroompanel/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/virtualbackgroundpanel/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/freebeautypanel/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/subentry/room/room.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/i18n/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/contactlist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/conversationlist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/messageinput/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/hooks/usemessageactions.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/messagelist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/search/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/c2csettingstate/c2csettingstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/c2csettingstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/contactliststate/contactliststate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/contactliststate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/conversationliststate/conversationliststate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/conversationliststate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/groupsettingstate/groupsettingstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/groupsettingstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/messageactionstate/messageactionstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/messageactionstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/messageinputstate/type.d.ts","./node_modules/.pnpm/orderedmap@2.1.1/node_modules/orderedmap/dist/index.d.ts","./node_modules/.pnpm/prosemirror-model@1.25.4/node_modules/prosemirror-model/dist/index.d.ts","./node_modules/.pnpm/prosemirror-transform@1.12.0/node_modules/prosemirror-transform/dist/index.d.ts","./node_modules/.pnpm/prosemirror-view@1.41.8/node_modules/prosemirror-view/dist/index.d.ts","./node_modules/.pnpm/prosemirror-state@1.4.4/node_modules/prosemirror-state/dist/index.d.ts","./node_modules/.pnpm/@tiptap+pm@2.27.2/node_modules/@tiptap/pm/state/dist/index.d.ts","./node_modules/.pnpm/@tiptap+pm@2.27.2/node_modules/@tiptap/pm/model/dist/index.d.ts","./node_modules/.pnpm/@tiptap+pm@2.27.2/node_modules/@tiptap/pm/view/dist/index.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/eventemitter.d.ts","./node_modules/.pnpm/@tiptap+pm@2.27.2/node_modules/@tiptap/pm/transform/dist/index.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/inputrule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/pasterule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/node.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/mark.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extension.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/types.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensionmanager.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/nodepos.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/clipboardtextserializer.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/blur.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/clearcontent.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/clearnodes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/command.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/createparagraphnear.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/cut.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/deletecurrentnode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/deletenode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/deleterange.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/deleteselection.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/enter.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/exitcode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/extendmarkrange.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/first.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/focus.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/foreach.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/insertcontent.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/insertcontentat.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/join.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/joinitembackward.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/joinitemforward.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/jointextblockbackward.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/jointextblockforward.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/keyboardshortcut.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/lift.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/liftemptyblock.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/liftlistitem.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/newlineincode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/resetattributes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/scrollintoview.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/selectall.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/selectnodebackward.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/selectnodeforward.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/selectparentnode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/selecttextblockend.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/selecttextblockstart.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/setcontent.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/setmark.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/setmeta.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/setnode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/setnodeselection.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/settextselection.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/sinklistitem.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/splitblock.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/splitlistitem.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/togglelist.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/togglemark.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/togglenode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/togglewrap.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/undoinputrule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/unsetallmarks.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/unsetmark.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/updateattributes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/wrapin.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/wrapinlist.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/index.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/commands.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/drop.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/editable.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/focusevents.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/keymap.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/paste.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/tabindex.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/index.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/editor.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commandmanager.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/combinetransactionsteps.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/createchainablestate.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/createdocument.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/createnodefromcontent.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/defaultblockat.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/findchildren.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/findchildreninrange.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/findparentnode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/findparentnodeclosesttopos.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/generatehtml.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/generatejson.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/generatetext.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getattributes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getattributesfromextensions.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getchangedranges.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getdebugjson.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getextensionfield.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/gethtmlfromfragment.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getmarkattributes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getmarkrange.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getmarksbetween.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getmarktype.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getnodeatposition.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getnodeattributes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getnodetype.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getrenderedattributes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getschema.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getschemabyresolvedextensions.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getschematypebyname.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getschematypenamebyname.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getsplittedattributes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/gettext.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/gettextbetween.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/gettextcontentfromnodes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/gettextserializersfromschema.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/injectextensionattributestoparserule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/isactive.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/isatendofnode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/isatstartofnode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/isextensionrulesenabled.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/islist.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/ismarkactive.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/isnodeactive.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/isnodeempty.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/isnodeselection.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/istextselection.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/postodomrect.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/resolvefocusposition.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/rewriteunknowncontent.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/selectiontoinsertionend.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/splitextensions.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/index.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/inputrules/markinputrule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/inputrules/nodeinputrule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/inputrules/textblocktypeinputrule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/inputrules/textinputrule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/inputrules/wrappinginputrule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/inputrules/index.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/nodeview.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/pasterules/markpasterule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/pasterules/nodepasterule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/pasterules/textpasterule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/pasterules/index.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/tracker.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/callorreturn.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/caninsertnode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/createstyletag.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/deleteprops.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/elementfromstring.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/escapeforregex.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/findduplicates.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/fromstring.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/isemptyobject.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/isfunction.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/isios.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/ismacos.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/isnumber.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/isplainobject.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/isregexp.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/issafari.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/isstring.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/mergeattributes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/mergedeep.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/minmax.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/objectincludes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/removeduplicates.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/index.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/index.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/enums.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/popperoffsets.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/flip.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/hide.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/offset.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/eventlisteners.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/computestyles.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/arrow.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/preventoverflow.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/applystyles.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/types.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/index.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/detectoverflow.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/createpopper.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/popper-lite.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/popper.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/index.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/index.d.ts","./node_modules/.pnpm/tippy.js@6.3.7/node_modules/tippy.js/index.d.ts","./node_modules/.pnpm/@tiptap+extension-bubble-me_cb4d88b0b911ecd5388577427968ef89/node_modules/@tiptap/extension-bubble-menu/dist/bubble-menu-plugin.d.ts","./node_modules/.pnpm/@tiptap+extension-bubble-me_cb4d88b0b911ecd5388577427968ef89/node_modules/@tiptap/extension-bubble-menu/dist/bubble-menu.d.ts","./node_modules/.pnpm/@tiptap+extension-bubble-me_cb4d88b0b911ecd5388577427968ef89/node_modules/@tiptap/extension-bubble-menu/dist/index.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/bubblemenu.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/editor.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/editorcontent.d.ts","./node_modules/.pnpm/@tiptap+extension-floating-_8ade271869755387a8482cceb81d75f6/node_modules/@tiptap/extension-floating-menu/dist/floating-menu-plugin.d.ts","./node_modules/.pnpm/@tiptap+extension-floating-_8ade271869755387a8482cceb81d75f6/node_modules/@tiptap/extension-floating-menu/dist/floating-menu.d.ts","./node_modules/.pnpm/@tiptap+extension-floating-_8ade271869755387a8482cceb81d75f6/node_modules/@tiptap/extension-floating-menu/dist/index.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/floatingmenu.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/nodeviewcontent.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/nodeviewwrapper.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/useeditor.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/vuenodeviewrenderer.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/vuerenderer.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/messageinputstate/messageinputstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/messageinputstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/messageliststate/messageliststate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/messageliststate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/subentry/chat/chat.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/subentry/chat/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/constants/interface.d.ts","./node_modules/.pnpm/i18next@23.15.1/node_modules/i18next/typescript/helpers.d.ts","./node_modules/.pnpm/i18next@23.15.1/node_modules/i18next/typescript/options.d.ts","./node_modules/.pnpm/i18next@23.15.1/node_modules/i18next/typescript/t.d.ts","./node_modules/.pnpm/i18next@23.15.1/node_modules/i18next/index.d.ts","./node_modules/.pnpm/i18next@23.15.1/node_modules/i18next/index.d.mts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/i18n/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/uselanguageprovider.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/languageprovider.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/stylepresetprovider/interface.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/stylepresetprovider/stylepresetprovider.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/stylepresetprovider/usestylepresetprovider.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/stylepresetprovider/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/uikitprovider/uikitprovider.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/uikitprovider/useuikitprovider.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/button/types.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/button/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/type.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/dialog.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/drawer/types.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/drawer/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/types.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/index.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/dropdownitem.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/icon/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/en-us/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/zh-cn/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/type.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/types.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/index.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/input/types.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/input/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/select/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/option/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/switch/types.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/switch/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/slider/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/type.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/index.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/swiperitem.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/toast/type.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/toast/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/watermark/index.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/watermark/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/type.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/index.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/hooks/usecomponent.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/hooks/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/utils/utils.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/directives/loading/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/directives/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/index.d.ts","./node_modules/.pnpm/@tencentcloud+chat-uikit-vu_f78cbc43da431f244e6b6d27ca79f135/node_modules/@tencentcloud/chat-uikit-vue3/dist/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/constants/interface.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/typescript/helpers.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/typescript/options.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/typescript/t.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/index.d.mts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/i18n/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/uselanguageprovider.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/languageprovider.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/uikitprovider/uikitprovider.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/uikitprovider/useuikitprovider.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/button/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/button/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/dialog.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/drawer/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/drawer/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/dropdownitem.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/icon/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/en-us/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/zh-cn/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/input/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/input/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/select/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/option/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/switch/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/switch/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/slider/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/swiperitem.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/toast/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/toast/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/watermark/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/watermark/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/hooks/usecomponent.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/hooks/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/utils/utils.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/directives/loading/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/directives/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/index.d.ts","./src/components/sidetab.vue","./src/components/app-link/index.vue","./src/components/chat-dialog/chatmessageitem.vue","./src/utils/call-local-recorder.ts","./src/utils/call-video-screenshot.ts","./src/utils/tuicall-error.ts","./node_modules/@tencentcloud/chat/index.d.ts","./node_modules/@tencentcloud/chat-uikit-engine/index.d.ts","./src/utils/im-call-hangup-detect.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/const/call.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/const/error.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/const/log.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/const/index.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/icallservice.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/icallstore.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/ituiglobal.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/ituistore.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/index.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/callservice/uidesign.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/callservice/index.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/locales/index.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/index.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/index.d.ts","./node_modules/@tencentcloud/call-engine-js/index.d.ts","./src/components/chat-dialog/index.vue","./src/components/color-picker/index.vue","./src/components/daterange-picker/index.vue","./src/components/del-wrap/index.vue","./src/components/dict-value/index.vue","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/utils/browser-polyfill.d.ts","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/utils/node-polyfill.d.ts","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/locale/index.d.ts","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/register-builtin-modules/index.d.ts","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/init-default-config/index.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/create-editor.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/element.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/node.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/editor.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/location.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/operation.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/path.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/path-ref.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/point.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/point-ref.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/range.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/range-ref.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/custom-types.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/text.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/transforms/general.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/transforms/node.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/transforms/selection.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/transforms/text.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/transforms/index.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/index.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/htmldomapi.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/helpers/attachto.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/modules/style.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/modules/eventlisteners.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/modules/attributes.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/modules/class.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/modules/props.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/modules/dataset.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/vnode.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/hooks.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/modules/module.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/init.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/thunk.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/is.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/tovnode.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/h.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/jsx.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/index.d.ts","./node_modules/.pnpm/@types+event-emitter@0.3.5/node_modules/@types/event-emitter/index.d.ts","./node_modules/.pnpm/dom7@3.0.0/node_modules/dom7/dom7.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/utils/dom.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/menus/interface.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/config/interface.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/editor/interface.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/render/index.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/to-html/index.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/parse-html/index.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/menus/bar/toolbar.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/menus/register.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/menus/panel-and-modal/baseclass.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/menus/panel-and-modal/modal.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/menus/index.d.ts","./node_modules/.pnpm/slate-history@0.66.0_slate@0.72.0/node_modules/slate-history/dist/history.d.ts","./node_modules/.pnpm/slate-history@0.66.0_slate@0.72.0/node_modules/slate-history/dist/history-editor.d.ts","./node_modules/.pnpm/slate-history@0.66.0_slate@0.72.0/node_modules/slate-history/dist/with-history.d.ts","./node_modules/.pnpm/slate-history@0.66.0_slate@0.72.0/node_modules/slate-history/dist/index.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/create/create-editor.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/create/create-toolbar.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/create/index.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/utils/key.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/text-area/textarea.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/menus/bar/hoverbar.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/editor/dom-editor.d.ts","./node_modules/.pnpm/@uppy+utils@4.1.3/node_modules/@uppy/utils/types/index.d.ts","./node_modules/.pnpm/@uppy+core@2.3.4/node_modules/@uppy/core/types/index.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/upload/interface.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/upload/createuploader.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/upload/index.d.ts","./node_modules/.pnpm/i18next@20.4.0/node_modules/i18next/index.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/i18n/index.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/index.d.ts","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/boot.d.ts","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/utils/dom.d.ts","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/create.d.ts","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/index.d.ts","./node_modules/.pnpm/vuedraggable@4.1.0_vue@3.5.33_typescript@5.7.3_/node_modules/vuedraggable/src/vuedraggable.d.ts","./src/components/popup/index.vue","./src/components/material/file.vue","./src/components/material/hook.ts","./src/components/material/preview.vue","./src/components/material/index.vue","./src/components/material/picker.vue","./src/components/editor/index.vue","./src/components/export-data/index.vue","./src/components/footer-btns/index.vue","./src/components/icon/index.ts","./src/components/icon/svg-icon.vue","./src/components/icon/index.vue","./src/components/icon/picker.vue","./src/components/image-contain/index.vue","./src/components/link/index.ts","./src/components/link/article-list.vue","./src/components/link/custom-link.vue","./src/components/link/mini-program.vue","./src/components/link/shop-pages.vue","./src/components/link/index.vue","./src/components/link/picker.vue","./src/hooks/uselisttimefilter.ts","./src/components/list-time-filter/index.vue","./src/components/overflow-tooltip/index.vue","./src/components/pagination/index.vue","./src/components/popover-input/index.vue","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/const/call.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/const/error.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/const/log.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/const/index.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/icallservice.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/icallstore.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/ituiglobal.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/ituistore.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/index.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/callservice/uidesign.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/callservice/index.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/locales/index.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/index.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/index.d.ts","./src/components/video-call/index.vue","./src/hooks/usedictoptions.ts","./node_modules/.pnpm/vue-clipboard3@2.0.0/node_modules/vue-clipboard3/dist/esm/index.d.ts","./src/install/directives/copy.ts","./src/install/directives/perms.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/types/dist/charts.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/charts.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/types/dist/components.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/components.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/types/dist/features.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/features.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/types/dist/renderers.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/renderers.d.ts","./src/install/plugins/echart.ts","./src/install/plugins/element.ts","./node_modules/.pnpm/@highlightjs+vue-plugin@2.1_297347e077cdaa3fb4c77d862f4e02c2/node_modules/@highlightjs/vue-plugin/dist/vue.d.ts","./node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/types/index.d.ts","./src/install/plugins/hljs.ts","./src/stores/index.ts","./src/install/plugins/pinia.ts","./src/router/guard/index.ts","./src/install/plugins/router.ts","./src/install/plugins/tuikit.ts","./src/router/guard/init.ts","./src/utils/checkhttps.ts","./src/utils/env.ts","./src/utils/getexposetype.ts","./src/views/app/recharge/index.vue","./src/views/article/column/edit.vue","./src/views/article/column/index.vue","./src/views/article/lists/edit.vue","./src/views/article/lists/index.vue","./src/views/asset/resource/index.vue","./src/views/asset/user/index.vue","./src/views/channel/h5.vue","./src/views/channel/open_setting.vue","./src/views/channel/weapp.vue","./src/views/channel/wx_oa/config.vue","./src/views/channel/wx_oa/menu_com/usemenuoa.ts","./src/views/channel/wx_oa/menu_com/oa-menu-form.vue","./src/views/channel/wx_oa/menu_com/oa-menu-form-edit.vue","./src/views/channel/wx_oa/menu_com/oa-attr.vue","./src/views/channel/wx_oa/menu_com/oa-phone.vue","./src/views/channel/wx_oa/menu.vue","./src/views/channel/wx_oa/reply/edit.vue","./src/views/channel/wx_oa/reply/default_reply.vue","./src/views/channel/wx_oa/reply/follow_reply.vue","./src/views/channel/wx_oa/reply/keyword_reply.vue","./src/views/chat/components/messagebubble.vue","./src/views/chat/components/sendpanel.vue","./src/views/chat/index.vue","./src/views/consumer/assistant/edit.vue","./src/views/consumer/assistant/index.vue","./src/views/consumer/components/account-adjust.vue","./src/views/consumer/doctor/edit.vue","./src/views/consumer/doctor/index.vue","./src/views/consumer/doctor/paiban.vue","./src/views/consumer/lists/detail.vue","./src/views/consumer/lists/index.vue","./src/views/consumer/prescription/guahao.vue","./src/views/consumer/prescription/index.vue","./src/views/consumer/prescription/list.vue","./src/views/consumer/prescription/components/gancaosubmissionreconcilebutton.vue","./src/views/consumer/prescription/order_list.vue","./src/views/consumer/prescription/order_list_h5.vue","./src/views/decoration/pc.vue","./src/views/decoration/component/pages/menu.vue","./src/views/decoration/component/tabbar/mobile/attr.vue","./src/views/decoration/component/decoration-img.vue","./src/views/decoration/component/tabbar/mobile/content.vue","./src/views/decoration/component/tabbar/mobile/index.ts","./src/views/decoration/tabbar.vue","./src/views/decoration/component/add-nav.vue","./src/views/decoration/component/pages/attr-setting.vue","./src/views/decoration/component/pages/preview.vue","./src/views/decoration/component/tabbar/pc/menu-set.vue","./src/views/decoration/component/tabbar/pc/attr.vue","./src/views/decoration/component/tabbar/pc/content.vue","./src/views/decoration/component/tabbar/pc/index.ts","./src/views/decoration/component/widgets/banner/options.ts","./src/views/decoration/component/widgets/banner/attr.vue","./src/views/decoration/component/widgets/banner/content.vue","./src/views/decoration/component/widgets/banner/index.ts","./src/views/decoration/component/widgets/customer-service/options.ts","./src/views/decoration/component/widgets/customer-service/attr.vue","./src/views/decoration/component/widgets/customer-service/content.vue","./src/views/decoration/component/widgets/customer-service/index.ts","./src/views/decoration/component/widgets/middle-banner/options.ts","./src/views/decoration/component/widgets/middle-banner/attr.vue","./src/views/decoration/component/widgets/middle-banner/content.vue","./src/views/decoration/component/widgets/middle-banner/index.ts","./src/views/decoration/component/widgets/my-service/options.ts","./src/views/decoration/component/widgets/my-service/attr.vue","./src/views/decoration/component/widgets/my-service/content.vue","./src/views/decoration/component/widgets/my-service/index.ts","./src/views/decoration/component/widgets/nav/options.ts","./src/views/decoration/component/widgets/nav/attr.vue","./src/views/decoration/component/widgets/nav/content.vue","./src/views/decoration/component/widgets/nav/index.ts","./src/views/decoration/component/widgets/news/options.ts","./src/views/decoration/component/widgets/news/attr.vue","./src/views/decoration/component/widgets/news/content.vue","./src/views/decoration/component/widgets/news/index.ts","./src/views/decoration/component/widgets/page-meta/options.ts","./src/views/decoration/component/widgets/page-meta/attr.vue","./src/views/decoration/component/widgets/page-meta/content.vue","./src/views/decoration/component/widgets/page-meta/index.ts","./src/views/decoration/component/widgets/pc-banner/options.ts","./src/views/decoration/component/widgets/pc-banner/content.vue","./src/views/decoration/component/widgets/pc-banner/index.ts","./src/views/decoration/component/widgets/search/options.ts","./src/views/decoration/component/widgets/search/attr.vue","./src/views/decoration/component/widgets/search/content.vue","./src/views/decoration/component/widgets/search/index.ts","./src/views/decoration/component/widgets/user-banner/options.ts","./src/views/decoration/component/widgets/user-banner/attr.vue","./src/views/decoration/component/widgets/user-banner/content.vue","./src/views/decoration/component/widgets/user-banner/index.ts","./src/views/decoration/component/widgets/user-info/options.ts","./src/views/decoration/component/widgets/user-info/attr.vue","./src/views/decoration/component/widgets/user-info/content.vue","./src/views/decoration/component/widgets/user-info/index.ts","./src/views/decoration/pages/index.vue","./src/views/decoration/style/components/theme-picker.vue","./src/views/decoration/style/components/mobile-style.vue","./src/views/decoration/style/style.vue","./src/views/dev_tools/components/relations-add.vue","./src/views/dev_tools/code/edit.vue","./src/views/dev_tools/components/code-preview.vue","./src/views/dev_tools/components/data-table.vue","./src/views/dev_tools/code/index.vue","./src/views/doctor/dept-tongji.vue","./src/views/doctor/medicine.vue","./src/views/doctor/roster.vue","./src/views/doctor/tongji.vue","./src/views/fans/commission-settlement.vue","./src/views/fans/index.vue","./src/views/fans/qywx.vue","./src/views/fans/yeji.vue","./src/views/finance/balance_details.vue","./src/views/finance/mubiao-dept-node.vue","./src/views/finance/mubiao-dept-card.vue","./src/views/finance/mubiao.vue","./src/views/finance/recharge_record.vue","./src/views/finance/component/refund-log.vue","./src/views/finance/refund_record.vue","./src/views/finance/account_cost/edit.vue","./src/views/finance/account_cost/index.vue","./src/views/first_visit/conversion/index.vue","./src/views/first_visit/doctor_dashboard/index.vue","./src/views/first_visit/my_patients/components/order-actions.ts","./src/views/first_visit/my_patients/components/orderactionhost.vue","./src/views/first_visit/my_patients/components/orderpanel.vue","./src/views/first_visit/my_patients/components/progresspanel.vue","./src/views/first_visit/my_patients/index.vue","./src/views/first_visit/registration_stats/index.vue","./src/views/first_visit/wecom_promotion/components/wecom-widget-templates.ts","./src/views/first_visit/wecom_promotion/components/wecomfloatingwidgetbuilder.vue","./src/views/first_visit/wecom_promotion/index.vue","./src/views/material/index.vue","./src/views/message/notice/edit.vue","./src/views/message/notice/index.vue","./src/views/message/short_letter/edit.vue","./src/views/message/short_letter/index.vue","./src/views/order/index.vue","./src/views/organization/department/edit.vue","./src/views/organization/department/index.vue","./src/views/organization/post/edit.vue","./src/views/organization/post/index.vue","./src/views/patient/reception/index.vue","./src/views/permission/admin/edit.vue","./src/views/permission/admin/index.vue","./src/views/permission/menu/edit.vue","./src/views/permission/menu/index.vue","./src/views/permission/role/auth.vue","./src/views/permission/role/edit.vue","./src/views/permission/role/index.vue","./src/views/pharmacy/medicine_mapping/latest-request.d.mts","./src/views/pharmacy/medicine_mapping/index.vue","./src/views/setting/dict/data/edit.vue","./src/views/setting/dict/data/index.vue","./src/views/setting/dict/type/edit.vue","./src/views/setting/dict/type/index.vue","./src/views/setting/pay/config/edit.vue","./src/views/setting/pay/config/index.vue","./src/views/setting/pay/method/index.vue","./src/views/setting/search/index.vue","./src/views/setting/storage/edit.vue","./src/views/setting/storage/index.vue","./src/views/setting/system/cache.vue","./src/views/setting/system/environment.vue","./src/views/setting/system/journal.vue","./src/views/setting/system/scheduled_task/edit.vue","./src/views/setting/system/scheduled_task/index.vue","./src/views/setting/user/login_register.vue","./src/views/setting/user/setup.vue","./src/views/setting/website/filing.vue","./src/views/setting/website/information.vue","./src/views/setting/website/protocol.vue","./src/views/setting/website/statistics.vue","./src/views/stats/assistant-performance/index.vue","./src/views/stats/auto_assign_log/index.vue","./src/views/stats/conversion/index.vue","./src/views/stats/performance-dashboard/index.vue","./src/views/stats/revisit_rate/index.vue","./src/views/stats/self_input/mediasourceselect.vue","./src/views/stats/self_input/usemediasourceoptions.ts","./src/views/stats/self_input/cost-edit.vue","./src/views/stats/self_input/account_cost.vue","./src/views/stats/self_input/yeji-edit.vue","./src/views/stats/self_input/index.vue","./src/views/tcm/appointment/list.vue","./src/views/tcm/appointment/list_h5.vue","./src/views/tcm/appointment/components/prescription-drawer.vue","./src/views/tcm/diagnosis/add.vue","./src/views/tcm/diagnosis/index.vue","./src/views/tcm/diagnosis/components/bloodrecordlist.vue","./src/views/tcm/diagnosis/components/dietrecordlist.vue","./src/views/tcm/diagnosis/components/exerciserecordlist.vue","./src/views/tcm/diagnosis/components/trackingmatrix.vue","./src/views/tcm/follow/index.vue","./src/views/template/component/file.vue","./src/views/template/component/icon.vue","./src/views/template/component/link.vue","./src/views/template/component/overflow.vue","./src/views/template/component/popover_input.vue","./src/views/template/component/rich_text.vue","./src/views/template/component/upload.vue","./src/views/test/patient-call.vue","./src/views/workbench/index.vue","./components.d.ts","./auto-imports.d.ts","./typings/index.d.ts","./typings/router.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/compatibility/index.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/globals.typedarray.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/buffer.buffer.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/globals.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/events.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/storage.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/assert.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/assert/strict.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/async_hooks.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/buffer.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/child_process.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/cluster.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/console.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/constants.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/crypto.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/dgram.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/dns.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/dns/promises.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/domain.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/events.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/fs.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/fs/promises.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/http.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/http2.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/https.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/inspector.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/inspector.generated.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/module.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/net.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/os.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/path.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/perf_hooks.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/process.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/punycode.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/querystring.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/readline.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/readline/promises.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/repl.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/sea.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/sqlite.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/stream.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/stream/promises.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/stream/consumers.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/stream/web.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/string_decoder.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/test.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/timers.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/timers/promises.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/tls.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/trace_events.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/tty.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/url.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/util.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/v8.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/vm.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/wasi.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/worker_threads.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/zlib.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/index.d.ts","./node_modules/.pnpm/@types+estree@1.0.8/node_modules/@types/estree/index.d.ts","./node_modules/.pnpm/rollup@4.60.3/node_modules/rollup/dist/rollup.d.ts","./node_modules/.pnpm/rollup@4.60.3/node_modules/rollup/dist/parseast.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/dist/node/modulerunnertransport.d-dj_me5sf.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/dist/node/module-runner.d.ts","./node_modules/.pnpm/esbuild@0.25.0/node_modules/esbuild/lib/main.d.ts","./node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/source-map.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/previous-map.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/input.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/declaration.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/root.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/warning.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/lazy-result.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/no-work-result.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/processor.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/result.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/document.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/rule.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/node.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/comment.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/container.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/at-rule.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/list.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/postcss.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/postcss.d.mts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/types/internal/lightningcssoptions.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/deprecations.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/util/promise_or.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/importer.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/logger/source_location.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/logger/source_span.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/logger/index.d.ts","./node_modules/.pnpm/immutable@4.3.8/node_modules/immutable/dist/immutable.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/boolean.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/calculation.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/color.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/function.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/list.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/map.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/mixin.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/number.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/string.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/argument_list.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/index.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/options.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/compile.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/exception.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/legacy/exception.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/legacy/plugin_this.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/legacy/function.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/legacy/importer.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/legacy/options.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/legacy/render.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/index.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/types/internal/csspreprocessoroptions.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/types/metadata.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/dist/node/index.d.ts","./node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.d.mts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/typescript.d.ts","./node_modules/.pnpm/@vue+compiler-sfc@3.5.33/node_modules/@vue/compiler-sfc/dist/compiler-sfc.d.ts","./node_modules/.pnpm/vue@3.5.33_typescript@5.7.3/node_modules/vue/compiler-sfc/index.d.mts","./node_modules/.pnpm/@vitejs+plugin-vue@5.2.1_vi_26ff37bca32818ba6abc2479b735c8c5/node_modules/@vitejs/plugin-vue/dist/index.d.mts","./node_modules/.pnpm/@vue+babel-plugin-resolve-type@1.5.0_@babel+core@7.29.0/node_modules/@vue/babel-plugin-resolve-type/dist/index.d.mts","./node_modules/.pnpm/@vue+babel-plugin-jsx@1.5.0_@babel+core@7.29.0/node_modules/@vue/babel-plugin-jsx/dist/index.d.mts","./node_modules/.pnpm/@vitejs+plugin-vue-jsx@4.1._15604a3242b44866a4c8e668a8c2b0af/node_modules/@vitejs/plugin-vue-jsx/dist/index.d.mts","./node_modules/.pnpm/mlly@1.8.2/node_modules/mlly/dist/index.d.ts","./node_modules/.pnpm/unimport@4.1.1/node_modules/unimport/dist/shared/unimport.cavrr9sh.d.mts","./node_modules/.pnpm/unimport@4.1.1/node_modules/unimport/dist/shared/unimport.czoa5cgj.d.mts","./node_modules/.pnpm/js-tokens@9.0.1/node_modules/js-tokens/index.d.ts","./node_modules/.pnpm/strip-literal@3.1.0/node_modules/strip-literal/dist/index.d.mts","./node_modules/.pnpm/unimport@4.1.1/node_modules/unimport/dist/index.d.mts","./node_modules/.pnpm/unplugin-utils@0.2.5/node_modules/unplugin-utils/dist/index.d.ts","./node_modules/.pnpm/unplugin-auto-import@19.1.0_6f0c1011f66a70c739aaa005d5971cab/node_modules/unplugin-auto-import/dist/types.d.ts","./node_modules/.pnpm/unplugin-auto-import@19.1.0_6f0c1011f66a70c739aaa005d5971cab/node_modules/unplugin-auto-import/dist/vite.d.ts","./node_modules/.pnpm/webpack-virtual-modules@0.6.2/node_modules/webpack-virtual-modules/lib/index.d.ts","./node_modules/.pnpm/unplugin@2.2.0/node_modules/unplugin/dist/index.d.ts","./node_modules/.pnpm/unplugin-vue-components@28._94a912e1594e219e37a7871a02240417/node_modules/unplugin-vue-components/dist/types.d.ts","./node_modules/.pnpm/unplugin-vue-components@28._94a912e1594e219e37a7871a02240417/node_modules/unplugin-vue-components/dist/resolvers.d.ts","./node_modules/.pnpm/unplugin-vue-components@28._94a912e1594e219e37a7871a02240417/node_modules/unplugin-vue-components/dist/vite.d.ts","./node_modules/.pnpm/vite-plugin-style-import@2._963cef04d855493cf45de9418d5fb104/node_modules/vite-plugin-style-import/dist/index.d.ts","./node_modules/.pnpm/@types+svgo@2.6.4/node_modules/@types/svgo/index.d.ts","./node_modules/.pnpm/vite-plugin-svg-icons@2.0.1_832c8c32224a985848ba91788e93a372/node_modules/vite-plugin-svg-icons/dist/index.d.ts","./node_modules/.pnpm/vite-plugin-vue-setup-exten_dfd817fabadf21a508603ce199129005/node_modules/vite-plugin-vue-setup-extend/dist/index.d.ts","./vite.config.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/common.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/array.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/collection.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/date.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/function.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/lang.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/math.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/number.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/object.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/seq.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/string.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/util.d.ts"],"fileIdsList":[[99,103,109,868,1400,1423,2454,2457,2463,2511,2528,2529],[99,103,109,868,1400,1423,1455,1468,1544,1580,2074,2075,2076,2098,2099,2100,2101,2102,2184,2185,2187,2188,2189,2190,2191,2192,2194,2195,2196,2197,2199,2200,2201,2202,2203,2204,2206,2207,2208,2209,2224,2457,2463,2511,2528,2529],[88,868,1423,2463,2511,2528,2529],[91,868,1423,2463,2511,2528,2529],[868,1423,2463,2511,2528,2529],[868,1027,1423,2463,2511,2528,2529],[868,1028,1423,2463,2511,2528,2529],[868,1027,1028,1029,1030,1031,1032,1033,1034,1035,1423,2463,2511,2528,2529],[99,103,109,868,1423,2454,2463,2511,2528,2529],[166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,868,1423,2463,2511,2528,2529],[459,868,1423,2463,2511,2528,2529],[868,985,1423,2463,2511,2528,2529],[868,986,987,1423,2463,2511,2528,2529],[868,1423,1928,2463,2511,2528,2529],[868,1423,1922,1924,2463,2511,2528,2529],[868,1423,1912,1922,1923,1925,1926,1927,2463,2511,2528,2529],[868,1423,1922,2463,2511,2528,2529],[868,1423,1912,1922,2463,2511,2528,2529],[868,1423,1913,1914,1915,1916,1917,1918,1919,1920,1921,2463,2511,2528,2529],[868,1423,1913,1917,1918,1921,1922,1925,2463,2511,2528,2529],[868,1423,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1925,1926,2463,2511,2528,2529],[868,1423,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,2463,2511,2528,2529],[825,868,1423,2463,2511,2528,2529],[819,821,868,1423,2463,2511,2528,2529],[809,819,820,822,823,824,868,1423,2463,2511,2528,2529],[819,868,1423,2463,2511,2528,2529],[809,819,868,1423,2463,2511,2528,2529],[810,811,812,813,814,815,816,817,818,868,1423,2463,2511,2528,2529],[810,814,815,818,819,822,868,1423,2463,2511,2528,2529],[810,811,812,813,814,815,816,817,818,819,820,822,823,868,1423,2463,2511,2528,2529],[809,810,811,812,813,814,815,816,817,818,868,1423,2463,2511,2528,2529],[868,1423,2095,2463,2511,2528,2529],[868,1423,2086,2087,2091,2092,2463,2511,2528,2529],[868,1423,2086,2463,2511,2528,2529],[868,1423,2083,2084,2085,2463,2511,2528,2529],[868,1423,2086,2093,2094,2463,2511,2528,2529],[868,1423,2086,2091,2463,2511,2528,2529],[868,1423,2087,2088,2089,2090,2463,2511,2528,2529],[868,1423,1636,2463,2511,2528,2529],[868,1423,1611,2463,2511,2528,2529],[868,1423,1613,1614,2463,2511,2528,2529],[868,1423,1612,1615,1952,2014,2463,2511,2528,2529],[868,1423,1633,2463,2511,2528,2529],[99,103,109,868,1423,1987,1988,2454,2463,2511,2528,2529],[99,103,109,868,1423,1987,2454,2463,2511,2528,2529],[99,103,109,868,1423,1970,2454,2463,2511,2528,2529],[99,103,109,868,1423,1972,2454,2463,2511,2528,2529],[99,103,109,868,1423,1972,1973,2454,2463,2511,2528,2529],[868,1423,1970,2463,2511,2528,2529],[99,103,109,868,1423,1975,2454,2463,2511,2528,2529],[99,103,109,868,1423,1977,2454,2463,2511,2528,2529],[99,103,109,868,1423,1977,1978,1979,2454,2463,2511,2528,2529],[868,1423,2008,2463,2511,2528,2529],[868,1423,1971,1974,1976,1980,1981,1986,1989,1991,1992,1993,1995,1996,2000,2002,2004,2007,2009,2010,2463,2511,2528,2529],[99,103,109,868,1423,1990,2454,2463,2511,2528,2529],[868,1423,1982,1983,2463,2511,2528,2529],[868,1423,1984,1985,2463,2511,2528,2529],[868,1423,2005,2006,2463,2511,2528,2529],[99,103,109,868,1423,2005,2454,2463,2511,2528,2529],[868,1423,1997,1998,1999,2463,2511,2528,2529],[99,103,109,868,1423,1997,2454,2463,2511,2528,2529],[99,103,109,868,1423,1994,2454,2463,2511,2528,2529],[99,103,109,868,1423,2001,2454,2463,2511,2528,2529],[99,103,109,868,1423,2003,2454,2463,2511,2528,2529],[99,103,109,868,1423,2012,2454,2463,2511,2528,2529],[868,1423,1959,1969,2011,2013,2463,2511,2528,2529],[868,1423,1960,1961,2463,2511,2528,2529],[99,103,109,868,1423,1960,2454,2463,2511,2528,2529],[99,103,109,868,1423,1958,1959,2454,2463,2511,2528,2529],[868,1423,1963,1964,1965,2463,2511,2528,2529],[99,103,109,868,1423,1963,2454,2463,2511,2528,2529],[99,103,109,868,1423,1953,1962,1966,2454,2463,2511,2528,2529],[99,103,109,868,1423,1953,1958,1965,2454,2463,2511,2528,2529],[868,1423,1958,2463,2511,2528,2529],[868,1423,1966,1967,1968,2463,2511,2528,2529],[868,1423,1744,1754,1822,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1744,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1911,2463,2511,2528,2529],[868,1423,1744,1745,1746,1747,1754,1755,1756,1821,2463,2511,2528,2529],[868,1423,1744,1749,1750,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1822,1911,2463,2511,2528,2529],[868,1423,1744,1745,1746,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1822,1911,2463,2511,2528,2529],[868,1423,1753,2463,2511,2528,2529],[868,1423,1753,1813,2463,2511,2528,2529],[868,1423,1744,1753,2463,2511,2528,2529],[868,1423,1757,1814,1815,1816,1817,1818,1819,1820,2463,2511,2528,2529],[868,1423,1744,1745,1748,2463,2511,2528,2529],[868,1423,1744,2463,2511,2528,2529],[868,1423,1745,1754,2463,2511,2528,2529],[868,1423,1745,2463,2511,2528,2529],[868,1423,1740,1744,1754,2463,2511,2528,2529],[868,1423,1754,2463,2511,2528,2529],[868,1423,1744,1745,2463,2511,2528,2529],[868,1423,1748,1754,2463,2511,2528,2529],[868,1423,1745,1754,1822,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,2463,2511,2528,2529],[868,1423,1746,2463,2511,2528,2529],[868,1423,1744,1745,1754,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,2463,2511,2528,2529],[868,1423,1749,1750,1751,1752,1753,1754,1756,1821,1822,1823,1875,1881,1882,1886,1887,1910,2463,2511,2528,2529],[868,1423,1876,1877,1878,1879,1880,2463,2511,2528,2529],[868,1423,1745,1749,1754,2463,2511,2528,2529],[868,1423,1749,2463,2511,2528,2529],[868,1423,1745,1749,1754,1822,2463,2511,2528,2529],[868,1423,1744,1745,1749,1750,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1822,1911,2463,2511,2528,2529],[868,1423,1746,1754,1822,2463,2511,2528,2529],[868,1423,1883,1884,1885,2463,2511,2528,2529],[868,1423,1745,1750,1754,2463,2511,2528,2529],[868,1423,1750,2463,2511,2528,2529],[868,1423,1744,1745,1746,1748,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1822,1911,2463,2511,2528,2529],[868,1423,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,2463,2511,2528,2529],[868,1423,1744,1746,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,1930,2463,2511,2528,2529],[868,1423,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,1931,2463,2511,2528,2529],[868,1423,1931,1932,2463,2511,2528,2529],[868,1423,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,1937,2463,2511,2528,2529],[868,1423,1937,1938,2463,2511,2528,2529],[868,1423,1740,2463,2511,2528,2529],[868,1423,1743,2463,2511,2528,2529],[868,1423,1741,2463,2511,2528,2529],[868,1423,1742,2463,2511,2528,2529],[99,103,109,868,1423,1742,1743,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,1930,1933,2454,2463,2511,2528,2529],[99,103,109,868,1423,1744,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2454,2463,2511,2528,2529],[99,103,109,868,1423,1935,2454,2463,2511,2528,2529],[99,103,109,868,1423,1742,1743,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,1930,1939,2454,2463,2511,2528,2529],[868,1423,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,1934,1935,1936,1940,1941,1942,1943,1944,1945,2463,2511,2528,2529],[99,103,109,868,1423,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,1935,2454,2463,2511,2528,2529],[99,103,109,868,1423,1745,1746,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2454,2463,2511,2528,2529],[868,1423,2222,2463,2511,2528,2529],[868,1423,2213,2214,2218,2219,2463,2511,2528,2529],[868,1423,2213,2463,2511,2528,2529],[868,1423,2210,2211,2212,2463,2511,2528,2529],[868,1423,2213,2220,2221,2463,2511,2528,2529],[868,1423,2213,2218,2463,2511,2528,2529],[868,1423,2214,2215,2216,2217,2463,2511,2528,2529],[123,868,1423,2463,2511,2528,2529],[471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,868,1423,2463,2511,2528,2529],[868,1423,2463,2511,2528,2529,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658],[868,1423,2463,2508,2509,2511,2528,2529],[868,1423,2463,2510,2511,2528,2529],[868,1423,2511,2528,2529],[868,1423,2463,2511,2516,2528,2529,2546],[868,1423,2463,2511,2512,2517,2522,2528,2529,2531,2543,2554],[868,1423,2463,2511,2512,2513,2522,2528,2529,2531],[868,1423,2458,2459,2460,2463,2511,2528,2529],[868,1423,2463,2511,2514,2528,2529,2555],[868,1423,2463,2511,2515,2516,2523,2528,2529,2532],[868,1423,2463,2511,2516,2528,2529,2543,2551],[868,1423,2463,2511,2517,2519,2522,2528,2529,2531],[868,1423,2463,2510,2511,2518,2528,2529],[868,1423,2463,2511,2519,2520,2528,2529],[868,1423,2463,2511,2521,2522,2528,2529],[868,1423,2463,2510,2511,2522,2528,2529],[868,1423,2463,2511,2522,2523,2524,2528,2529,2543,2554],[868,1423,2463,2511,2522,2523,2524,2528,2529,2538,2543,2546],[868,1423,2463,2504,2511,2519,2522,2525,2528,2529,2531,2543,2554],[868,1423,2463,2511,2522,2523,2525,2526,2528,2529,2531,2543,2551,2554],[868,1423,2463,2511,2525,2527,2528,2529,2543,2551,2554],[868,1423,2461,2462,2463,2464,2465,2466,2467,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560],[868,1423,2463,2511,2522,2528,2529],[868,1423,2463,2511,2528,2529,2530,2554],[868,1423,2463,2511,2519,2522,2528,2529,2531,2543],[868,1423,2463,2511,2528,2529,2532],[868,1423,2463,2511,2528,2529,2533],[868,1423,2463,2510,2511,2528,2529,2534],[868,1423,2463,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560],[868,1423,2463,2511,2528,2529,2536],[868,1423,2463,2511,2528,2529,2537],[868,1423,2463,2511,2522,2528,2529,2538,2539],[868,1423,2463,2511,2528,2529,2538,2540,2555,2557],[868,1423,2463,2511,2523,2528,2529],[868,1423,2463,2511,2522,2528,2529,2543,2544,2546],[868,1423,2463,2511,2528,2529,2545,2546],[868,1423,2463,2511,2528,2529,2543,2544],[868,1423,2463,2511,2528,2529,2546],[868,1423,2463,2511,2528,2529,2547],[868,1423,2463,2508,2511,2528,2529,2543,2548,2554],[868,1423,2463,2511,2522,2528,2529,2549,2550],[868,1423,2463,2511,2528,2529,2549,2550],[868,1423,2463,2511,2516,2528,2529,2531,2543,2551],[868,1423,2463,2511,2528,2529,2552],[868,1423,2463,2511,2528,2529,2531,2553],[868,1423,2463,2511,2525,2528,2529,2537,2554],[868,1423,2463,2511,2516,2528,2529,2555],[868,1423,2463,2511,2528,2529,2543,2556],[868,1423,2463,2511,2528,2529,2530,2557],[868,1423,2463,2511,2528,2529,2558],[868,1423,2463,2504,2511,2528,2529],[868,1423,2463,2504,2511,2522,2524,2528,2529,2534,2543,2546,2554,2556,2557,2559],[868,1423,2463,2511,2528,2529,2543,2560],[868,1423,2463,2511,2528,2529,2561],[868,1423,2171,2463,2511,2528,2529],[868,1423,2463,2511,2528,2529,2619,2626],[868,1423,2463,2511,2528,2529,2619,2623],[91,868,1423,2463,2511,2528,2529,2625],[868,1423,2463,2511,2528,2529,2622],[90,91,92,868,1423,2463,2511,2528,2529],[93,868,1423,2463,2511,2528,2529],[91,92,93,868,1423,2463,2511,2528,2529,2587,2620,2621],[90,868,1423,2463,2511,2528,2529],[90,95,96,98,868,1423,2463,2511,2528,2529],[95,96,97,98,868,1423,2463,2511,2528,2529],[99,103,109,778,868,1423,2454,2463,2511,2528,2529],[99,103,104,109,868,1423,2454,2463,2511,2528,2529],[868,1423,2127,2149,2151,2463,2511,2528,2529],[868,1423,2127,2148,2150,2151,2163,2463,2511,2528,2529],[868,1423,2148,2150,2151,2155,2463,2511,2528,2529],[868,1423,2164,2165,2463,2511,2528,2529],[868,1423,2127,2148,2151,2155,2167,2168,2169,2463,2511,2528,2529],[868,1423,2127,2146,2148,2149,2150,2463,2511,2528,2529],[868,1423,2176,2463,2511,2528,2529],[88,868,1423,2150,2151,2152,2153,2154,2159,2166,2170,2175,2177,2463,2511,2528,2529],[868,1423,2149,2463,2511,2528,2529],[868,1423,2148,2149,2150,2463,2511,2528,2529],[868,1423,2149,2155,2156,2158,2463,2511,2528,2529],[868,1423,2127,2148,2151,2463,2511,2528,2529],[868,1423,2148,2151,2463,2511,2528,2529],[868,1423,2148,2149,2151,2157,2463,2511,2528,2529],[868,1423,2127,2145,2151,2463,2511,2528,2529],[868,1423,2148,2463,2511,2528,2529],[868,1423,2127,2151,2463,2511,2528,2529],[868,1423,2172,2173,2463,2511,2528,2529],[868,1423,2173,2174,2463,2511,2528,2529],[868,1423,2172,2463,2511,2528,2529],[868,1423,2147,2463,2511,2528,2529],[868,1423,2178,2463,2511,2528,2529],[868,1423,2127,2178,2180,2463,2511,2528,2529],[88,868,1423,2105,2106,2107,2127,2178,2179,2181,2463,2511,2528,2529],[868,1144,1423,2463,2511,2528,2529],[867,1423,2463,2511,2528,2529],[868,1423,2229,2463,2511,2528,2529],[868,1423,2231,2463,2511,2528,2529],[868,1423,1440,2463,2511,2528,2529],[868,1423,2233,2463,2511,2528,2529],[868,1423,1442,2463,2511,2528,2529],[868,1423,2235,2463,2511,2528,2529],[868,1423,1439,2463,2511,2528,2529],[462,792,793,794,868,1423,2463,2511,2528,2529],[97,99,103,109,154,157,792,793,868,1423,2454,2463,2511,2528,2529],[97,99,103,109,794,868,1423,2454,2463,2511,2528,2529],[462,792,796,797,798,868,1423,2463,2511,2528,2529],[99,103,109,157,461,792,868,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,796,868,1423,2454,2463,2511,2528,2529],[797,868,1423,2463,2511,2528,2529],[462,792,800,801,803,868,1423,2463,2511,2528,2529],[99,103,109,802,868,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,800,868,1423,2454,2463,2511,2528,2529],[99,103,109,801,868,1423,2454,2463,2511,2528,2529],[462,792,868,1390,1391,1423,2463,2511,2528,2529],[99,103,109,154,157,792,805,808,838,868,1043,1047,1315,1390,1423,2454,2463,2511,2528,2529],[99,103,109,807,808,868,1045,1047,1391,1423,2454,2463,2511,2528,2529],[462,792,833,834,839,840,841,842,868,1423,2463,2511,2528,2529],[99,103,109,157,792,829,838,868,1423,2454,2463,2511,2528,2529],[99,100,103,109,157,792,829,838,868,1400,1423,2454,2463,2511,2528,2529],[97,99,103,109,151,154,157,461,792,868,1423,2454,2463,2511,2528,2529],[97,99,103,109,833,868,1423,2454,2463,2511,2528,2529],[99,103,109,833,868,1423,2454,2463,2511,2528,2529],[840,841,868,1423,2463,2511,2528,2529],[462,792,844,845,846,868,1423,2463,2511,2528,2529],[99,103,109,844,868,1423,2454,2463,2511,2528,2529],[845,868,1423,2463,2511,2528,2529],[462,792,848,849,850,868,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1423,2454,2463,2511,2528,2529],[99,103,109,848,868,1423,2454,2463,2511,2528,2529],[849,868,1423,2463,2511,2528,2529],[462,792,852,853,854,855,856,857,868,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1423,2454,2457,2463,2511,2528,2529],[99,103,109,853,868,1423,2454,2457,2463,2511,2528,2529],[99,103,109,852,868,1423,2454,2463,2511,2528,2529],[855,856,868,1423,2463,2511,2528,2529],[462,792,859,860,861,863,864,868,1423,2463,2511,2528,2529],[99,103,109,792,859,868,1423,2454,2463,2511,2528,2529],[99,103,109,862,868,1423,2454,2463,2511,2528,2529],[99,103,109,151,157,461,792,868,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,859,868,1423,2454,2463,2511,2528,2529],[99,103,109,859,868,1423,2454,2463,2511,2528,2529],[861,863,868,1423,2463,2511,2528,2529],[462,792,866,868,870,873,1423,2463,2511,2528,2529],[99,103,109,866,868,869,1423,2454,2463,2511,2528,2529],[99,103,109,792,868,869,1423,2454,2463,2511,2528,2529],[99,103,109,868,869,871,1423,2454,2463,2511,2528,2529],[868,870,872,1423,2463,2511,2528,2529],[462,792,868,875,876,877,1423,2463,2511,2528,2529],[99,103,109,868,875,1423,2454,2463,2511,2528,2529],[868,876,1423,2463,2511,2528,2529],[462,792,868,879,880,881,882,883,884,1423,2463,2511,2528,2529],[99,103,109,868,880,1423,2454,2463,2511,2528,2529],[99,103,109,868,879,1423,2454,2463,2511,2528,2529],[868,882,883,1423,2463,2511,2528,2529],[154,462,792,868,886,887,889,890,891,1423,2463,2511,2528,2529],[99,103,109,157,792,868,886,1423,2454,2463,2511,2528,2529],[99,103,109,868,886,887,889,891,1423,2454,2463,2511,2528,2529],[868,888,890,1423,2463,2511,2528,2529],[99,103,109,868,886,887,1423,2454,2463,2511,2528,2529],[868,886,1423,2463,2511,2528,2529],[99,103,109,154,792,868,887,1423,2454,2463,2511,2528,2529],[462,792,868,1001,1002,1003,1423,2463,2511,2528,2529],[99,103,109,151,157,461,792,829,838,868,886,887,889,892,995,997,999,1000,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,829,838,868,886,887,891,892,1001,1423,2454,2463,2511,2528,2529],[868,1002,1423,2463,2511,2528,2529],[462,792,868,1005,1006,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1005,1423,2454,2463,2511,2528,2529],[99,103,109,868,1006,1423,2454,2463,2511,2528,2529],[462,792,868,1008,1009,1010,1011,1012,1013,1423,2463,2511,2528,2529],[99,103,109,868,1009,1423,2454,2463,2511,2528,2529],[99,103,109,151,157,792,868,996,997,1009,1010,1423,2454,2463,2511,2528,2529],[99,103,109,868,1009,1011,1400,1423,2454,2463,2511,2528,2529],[99,103,109,151,157,792,868,996,997,1008,1423,2454,2463,2511,2528,2529],[99,103,109,868,1011,1423,2454,2463,2511,2528,2529],[462,792,868,1015,1016,1423,2463,2511,2528,2529],[99,103,109,154,157,792,868,1015,1423,2454,2463,2511,2528,2529],[99,103,109,868,1016,1423,2454,2463,2511,2528,2529],[462,792,868,1025,1423,2463,2511,2528,2529],[462,792,868,1018,1019,1020,1021,1022,1023,1423,2463,2511,2528,2529],[99,103,109,157,461,792,868,1018,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,868,1019,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,868,1423,2454,2463,2511,2528,2529],[99,103,109,868,1018,1423,2454,2463,2511,2528,2529],[868,1021,1022,1423,2463,2511,2528,2529],[462,792,868,1038,1039,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1036,1037,1038,1423,2454,2463,2511,2528,2529],[99,103,109,807,808,868,1037,1039,1423,2454,2463,2511,2528,2529],[868,1036,1423,2463,2511,2528,2529],[462,792,868,1048,1049,1423,2463,2511,2528,2529],[99,103,109,151,157,792,868,995,996,997,1036,1043,1047,1048,1423,2454,2463,2511,2528,2529],[99,103,109,868,1037,1049,1423,2454,2463,2511,2528,2529],[462,792,868,1086,1087,1088,1089,1423,2463,2511,2528,2529],[99,103,109,157,792,859,865,868,875,878,964,1053,1056,1058,1059,1061,1062,1067,1085,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,859,868,875,964,1053,1058,1059,1061,1067,1086,1400,1423,2454,2463,2511,2528,2529],[99,103,109,868,1086,1423,2454,2463,2511,2528,2529],[99,103,109,779,868,965,997,1086,1088,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1091,1092,1093,1094,1095,1423,2463,2511,2528,2529],[462,792,868,1097,1098,1423,2463,2511,2528,2529],[99,103,109,157,792,868,869,1097,1423,2454,2463,2511,2528,2529],[99,103,109,868,869,1098,1423,2454,2463,2511,2528,2529],[462,792,868,1108,1109,1110,1111,1112,1423,2463,2511,2528,2529],[99,103,109,868,966,997,1423,2454,2463,2511,2528,2529],[99,100,103,109,157,792,868,1100,1107,1109,1400,1423,2454,2463,2511,2528,2529],[868,1111,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1100,1107,1109,1423,2454,2463,2511,2528,2529],[868,869,1423,2463,2511,2528,2529],[462,792,868,1114,1115,1116,1423,2463,2511,2528,2529],[99,100,103,109,157,792,838,868,1100,1107,1109,1113,1400,1423,2454,2463,2511,2528,2529],[868,1115,1423,2463,2511,2528,2529],[99,103,109,157,792,838,868,1100,1107,1109,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1118,1119,1120,1423,2463,2511,2528,2529],[99,103,109,151,157,792,868,1118,1423,2454,2463,2511,2528,2529],[99,103,109,868,1119,1423,2454,2463,2511,2528,2529],[462,792,868,1052,1053,1054,1055,1423,2463,2511,2528,2529],[99,103,109,461,792,868,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1051,1052,1423,2454,2463,2511,2528,2529],[99,103,109,868,1053,1423,2454,2463,2511,2528,2529],[462,792,868,1122,1123,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1122,1423,2454,2463,2511,2528,2529],[99,103,109,868,1123,1423,2454,2463,2511,2528,2529],[462,792,868,1125,1126,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1053,1056,1125,1423,2454,2463,2511,2528,2529],[99,103,109,868,1053,1056,1126,1423,2454,2463,2511,2528,2529],[462,792,868,1131,1132,1133,1134,1135,1136,1423,2463,2511,2528,2529],[99,103,109,157,462,792,868,1129,1400,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,826,827,829,838,859,865,868,1423,2454,2463,2511,2528,2529],[99,103,109,151,154,157,461,462,792,827,829,838,859,862,863,865,868,965,997,1041,1043,1045,1047,1071,1076,1129,1130,1400,1423,2454,2463,2511,2528,2529],[868,1132,1423,2463,2511,2528,2529],[99,103,109,829,838,868,1423,2454,2463,2511,2528,2529],[462,792,868,1138,1139,1140,1423,2463,2511,2528,2529],[99,103,109,868,1138,1423,2454,2463,2511,2528,2529],[868,1139,1423,2463,2511,2528,2529],[462,792,868,1143,1146,1147,1148,1149,1150,1151,1152,1153,1423,2463,2511,2528,2529],[99,103,109,868,1146,1423,2454,2463,2511,2528,2529],[99,103,109,151,154,157,792,868,1146,1423,2454,2463,2511,2528,2529],[99,103,109,868,1146,1147,1423,2454,2463,2511,2528,2529],[99,103,109,151,154,157,792,868,1146,1147,1423,2454,2463,2511,2528,2529],[99,103,109,154,792,868,1143,1146,1147,1423,2454,2463,2511,2528,2529],[868,1149,1150,1423,2463,2511,2528,2529],[99,103,109,151,779,868,1423,2454,2463,2511,2528,2529],[99,103,109,151,154,779,792,868,1142,1143,1145,1147,1423,2454,2463,2511,2528,2529],[99,103,109,792,868,1146,1147,1423,2454,2463,2511,2528,2529],[462,792,868,1128,1129,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1128,1423,2454,2463,2511,2528,2529],[99,103,109,868,1129,1423,2454,2463,2511,2528,2529],[462,792,868,1155,1156,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1155,1423,2454,2463,2511,2528,2529],[99,103,109,868,1156,1423,2454,2463,2511,2528,2529],[462,792,868,1158,1159,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1158,1423,2454,2463,2511,2528,2529],[99,103,109,868,1156,1157,1159,1423,2454,2463,2511,2528,2529],[154,794,795,796,798,799,801,804,805,807,808,827,829,830,831,832,833,834,835,836,837,838,839,842,843,844,846,847,848,850,851,852,853,854,857,858,859,860,864,865,866,868,873,874,875,877,878,879,880,881,884,885,886,887,889,891,892,999,1000,1001,1003,1004,1006,1007,1009,1011,1012,1014,1016,1017,1018,1019,1020,1023,1024,1026,1039,1040,1041,1043,1045,1046,1047,1049,1050,1053,1054,1055,1056,1058,1059,1061,1062,1067,1069,1071,1073,1074,1075,1076,1085,1086,1087,1088,1089,1090,1096,1098,1099,1100,1101,1102,1103,1105,1107,1108,1109,1110,1112,1113,1114,1116,1117,1119,1120,1121,1123,1124,1126,1127,1129,1130,1131,1133,1134,1137,1138,1140,1141,1143,1146,1147,1148,1149,1150,1154,1156,1157,1159,1160,1162,1163,1164,1166,1167,1168,1169,1170,1171,1172,1175,1176,1177,1178,1179,1181,1182,1183,1184,1185,1187,1188,1190,1191,1193,1195,1197,1198,1199,1201,1202,1204,1205,1207,1208,1209,1211,1212,1213,1214,1215,1217,1218,1220,1222,1225,1227,1229,1230,1233,1234,1236,1238,1239,1242,1244,1245,1246,1247,1248,1249,1251,1252,1254,1256,1257,1258,1260,1261,1262,1263,1265,1267,1283,1284,1285,1292,1294,1296,1298,1299,1300,1301,1302,1303,1305,1307,1308,1309,1311,1312,1313,1318,1319,1320,1321,1324,1326,1327,1328,1329,1331,1335,1336,1339,1341,1343,1345,1346,1347,1349,1350,1351,1352,1354,1355,1357,1360,1361,1362,1365,1366,1369,1371,1372,1374,1375,1376,1377,1378,1379,1380,1382,1384,1385,1387,1389,1391,1392,1423,2463,2511,2528,2529],[99,103,109,462,792,868,1373,1423,2454,2463,2511,2528,2529],[462,792,868,1161,1162,1423,2463,2511,2528,2529],[99,103,109,151,157,792,868,1161,1423,2454,2463,2511,2528,2529],[99,103,109,868,1162,1423,2454,2463,2511,2528,2529],[462,792,868,1164,1165,1166,1423,2463,2511,2528,2529],[99,103,109,151,157,461,792,829,838,868,999,1000,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,829,868,1164,1400,1423,2454,2463,2511,2528,2529],[868,1165,1423,2463,2511,2528,2529],[462,792,805,806,807,868,1423,2463,2511,2528,2529],[99,103,109,151,154,157,461,792,868,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,805,868,1423,2454,2463,2511,2528,2529],[806,868,1423,2463,2511,2528,2529],[462,792,868,1060,1061,1423,2463,2511,2528,2529],[99,103,109,157,461,792,868,1060,1423,2454,2463,2511,2528,2529],[99,103,109,868,1061,1423,2454,2463,2511,2528,2529],[99,103,109,868,1375,1376,1377,1378,1423,2454,2463,2511,2528,2529],[99,103,109,868,1375,1376,1423,2454,2463,2511,2528,2529],[99,103,109,868,1375,1423,2454,2463,2511,2528,2529],[99,103,109,779,868,1423,2454,2463,2511,2528,2529],[462,792,868,1362,1364,1365,1423,2463,2511,2528,2529],[868,1362,1423,2463,2511,2528,2529],[99,103,109,154,157,792,805,808,838,868,1043,1047,1315,1362,1363,1364,1423,2454,2463,2511,2528,2529],[99,103,109,807,808,868,1045,1047,1362,1365,1423,2454,2463,2511,2528,2529],[462,792,868,1168,1169,1170,1171,1172,1173,1174,1175,1176,1423,2463,2511,2528,2529],[868,1168,1172,1173,1174,1423,2463,2511,2528,2529],[99,103,109,868,1171,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1169,1423,2454,2457,2463,2511,2528,2529],[99,103,109,868,1169,1170,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,829,838,868,1169,1423,2454,2457,2463,2511,2528,2529],[99,103,109,868,1168,1423,2454,2457,2463,2511,2528,2529],[462,792,868,1380,1381,1423,2463,2511,2528,2529],[99,103,109,151,154,792,805,859,865,868,1423,2454,2463,2511,2528,2529],[868,1380,1423,2463,2511,2528,2529],[462,792,868,1058,1423,2463,2511,2528,2529],[99,103,109,154,157,461,792,868,1057,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,868,1058,1423,2454,2463,2511,2528,2529],[462,792,868,1384,1423,2463,2511,2528,2529],[99,103,109,157,461,792,868,1383,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,868,1384,1423,2454,2463,2511,2528,2529],[97,99,103,109,157,792,868,1178,1423,2454,2463,2511,2528,2529],[97,99,103,109,157,792,868,1423,2454,2463,2511,2528,2529],[462,792,868,1180,1181,1423,2463,2511,2528,2529],[99,103,109,157,461,792,868,1180,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,868,1181,1423,2454,2463,2511,2528,2529],[462,792,868,1183,1184,1423,2463,2511,2528,2529],[462,792,868,1186,1187,1423,2463,2511,2528,2529],[99,103,109,157,461,792,827,829,859,865,868,1041,1043,1047,1186,1400,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,829,859,865,868,1187,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1386,1387,1388,1423,2463,2511,2528,2529],[99,103,109,154,157,792,826,829,838,868,1041,1043,1047,1386,1423,2454,2463,2511,2528,2529],[99,103,109,154,792,829,838,868,1041,1047,1387,1400,1423,2454,2463,2511,2528,2529],[462,792,826,827,828,829,830,831,832,835,836,837,868,1423,2463,2511,2528,2529],[99,103,109,157,792,830,868,1423,2454,2463,2511,2528,2529],[99,103,109,826,868,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,826,827,829,835,836,868,1423,2454,2463,2511,2528,2529],[99,103,109,826,829,837,838,868,1400,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,828,868,1423,2454,2463,2511,2528,2529],[99,103,109,827,829,868,1423,2454,2463,2511,2528,2529],[99,103,109,827,831,868,1423,2454,2463,2511,2528,2529],[99,103,109,827,832,868,1423,2454,2463,2511,2528,2529],[462,792,868,1189,1190,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1189,1423,2454,2463,2511,2528,2529],[99,103,109,868,1190,1423,2454,2463,2511,2528,2529],[462,792,868,1192,1193,1194,1195,1196,1197,1198,1423,2463,2511,2528,2529],[99,103,109,868,1197,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1193,1194,1423,2454,2463,2511,2528,2529],[99,103,109,868,1195,1423,2454,2463,2511,2528,2529],[99,103,109,151,157,792,868,1196,1423,2454,2463,2511,2528,2529],[99,103,109,151,157,792,868,1192,1423,2454,2463,2511,2528,2529],[99,103,109,868,1193,1423,2454,2463,2511,2528,2529],[462,792,868,1200,1201,1423,2463,2511,2528,2529],[99,103,109,151,157,461,792,868,1200,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,868,1201,1423,2454,2463,2511,2528,2529],[462,792,868,1203,1204,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1203,1423,2454,2463,2511,2528,2529],[99,103,109,868,1204,1423,2454,2463,2511,2528,2529],[462,792,868,1206,1207,1208,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1206,1423,2454,2463,2511,2528,2529],[99,103,109,868,1207,1423,2454,2463,2511,2528,2529],[462,792,868,1070,1071,1073,1074,1075,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1070,1423,2454,2463,2511,2528,2529],[99,103,109,868,1071,1423,2454,2463,2511,2528,2529],[99,103,109,868,1072,1423,2454,2463,2511,2528,2529],[99,103,109,868,1073,1423,2454,2463,2511,2528,2529],[99,103,109,151,868,1358,1360,1400,1423,2454,2463,2511,2528,2529],[99,103,109,151,157,792,868,1315,1358,1359,1423,2454,2463,2511,2528,2529],[99,103,109,868,1358,1360,1423,2454,2463,2511,2528,2529],[462,792,868,1222,1224,1225,1423,2463,2511,2528,2529],[99,103,109,157,462,792,829,838,868,1219,1223,1224,1423,2454,2463,2511,2528,2529],[99,100,103,109,868,1212,1213,1219,1220,1423,2454,2463,2511,2528,2529],[99,100,103,109,154,157,462,779,792,829,838,868,999,1000,1041,1043,1045,1047,1129,1130,1219,1221,1223,1225,1400,1423,2454,2463,2511,2528,2529],[99,103,109,868,1045,1047,1219,1225,1423,2454,2463,2511,2528,2529],[99,103,109,868,1222,1423,2454,2463,2511,2528,2529],[462,792,868,1227,1228,1229,1230,1231,1232,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1227,1423,2454,2463,2511,2528,2529],[99,103,109,157,462,792,829,838,868,1223,1228,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,462,779,792,829,838,868,999,1000,1041,1043,1045,1047,1071,1076,1129,1130,1219,1223,1227,1229,1400,1423,2454,2463,2511,2528,2529],[99,103,109,868,1227,1423,2454,2463,2511,2528,2529],[99,103,109,868,1226,1229,1423,2454,2463,2511,2528,2529],[462,792,868,1235,1236,1237,1238,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1237,1423,2454,2463,2511,2528,2529],[99,103,109,868,1238,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,975,997,1235,1423,2454,2463,2511,2528,2529],[99,103,109,868,1236,1423,2454,2463,2511,2528,2529],[462,792,868,1240,1242,1244,1423,2463,2511,2528,2529],[99,103,109,868,1241,1242,1423,2454,2463,2511,2528,2529],[99,103,109,868,1242,1243,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,826,868,1240,1241,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,838,868,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1246,1247,1248,1423,2463,2511,2528,2529],[97,99,103,109,154,157,792,868,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,868,1246,1423,2454,2463,2511,2528,2529],[462,792,868,1368,1369,1370,1371,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1370,1423,2454,2463,2511,2528,2529],[99,103,109,868,1371,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1367,1368,1423,2454,2463,2511,2528,2529],[99,103,109,868,1367,1369,1423,2454,2463,2511,2528,2529],[462,792,868,1250,1251,1423,2463,2511,2528,2529],[99,103,109,157,792,868,869,1250,1423,2454,2463,2511,2528,2529],[99,103,109,868,869,1251,1423,2454,2463,2511,2528,2529],[462,792,868,1253,1254,1255,1256,1257,1423,2463,2511,2528,2529],[99,103,109,157,461,792,868,1255,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,868,1254,1256,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1253,1423,2454,2463,2511,2528,2529],[99,103,109,868,1254,1423,2454,2463,2511,2528,2529],[462,792,868,1259,1260,1423,2463,2511,2528,2529],[99,103,109,151,157,461,792,868,1259,1423,2454,2463,2511,2528,2529],[99,103,109,868,1260,1423,2454,2463,2511,2528,2529],[462,792,868,1262,1263,1265,1267,1283,1284,1285,1292,1293,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1264,1423,2454,2463,2511,2528,2529],[99,103,109,868,1263,1423,2454,2463,2511,2528,2529],[99,100,103,109,868,1423,2454,2463,2511,2528,2529],[99,103,109,868,1273,1423,2454,2463,2511,2528,2529],[99,100,103,109,868,1272,1423,2454,2463,2511,2528,2529],[99,103,109,868,1275,1423,2454,2463,2511,2528,2529],[99,100,103,109,868,1263,1264,1270,1423,2454,2463,2511,2528,2529],[99,100,103,109,157,792,868,1264,1277,1278,1423,2454,2463,2511,2528,2529],[868,1271,1272,1274,1276,1279,1280,1281,1423,2463,2511,2528,2529],[99,100,103,109,157,792,868,1263,1264,1265,1423,2454,2463,2511,2528,2529],[99,103,109,868,1262,1423,2454,2463,2511,2528,2529],[868,1211,1269,1278,1286,1287,1288,1289,1423,2463,2511,2528,2529],[99,103,109,868,1284,1423,2454,2463,2511,2528,2529],[99,103,109,868,1263,1267,1423,2454,2463,2511,2528,2529],[99,103,109,868,1263,1267,1286,1423,2454,2463,2511,2528,2529],[99,103,109,868,966,997,1263,1265,1266,1267,1268,1423,2454,2463,2511,2528,2529],[99,103,109,868,1211,1220,1267,1268,1423,2454,2463,2511,2528,2529],[99,103,109,868,1267,1278,1423,2454,2463,2511,2528,2529],[99,103,109,792,868,1220,1263,1264,1423,2454,2463,2511,2528,2529],[99,103,109,868,1264,1423,2454,2463,2511,2528,2529],[99,103,109,868,1263,1264,1423,2454,2463,2511,2528,2529],[99,103,109,868,965,966,997,1267,1271,1282,1291,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1263,1264,1423,2454,2463,2511,2528,2529],[99,100,103,109,157,792,868,1211,1218,1220,1263,1264,1266,1423,2454,2463,2511,2528,2529],[99,100,103,109,157,792,868,1211,1262,1263,1264,1265,1266,1267,1269,1271,1272,1282,1400,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1262,1263,1264,1265,1266,1423,2454,2463,2511,2528,2529],[99,103,109,152,868,1262,1423,2454,2463,2511,2528,2529],[99,103,109,868,1211,1263,1265,1266,1267,1268,1269,1290,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1067,1069,1082,1083,1084,1423,2463,2511,2528,2529],[99,103,109,868,1067,1069,1423,2454,2463,2511,2528,2529],[99,103,109,868,965,997,1063,1067,1069,1423,2454,2463,2511,2528,2529],[99,103,109,868,1064,1067,1423,2454,2463,2511,2528,2529],[99,103,109,868,1064,1067,1068,1423,2454,2463,2511,2528,2529],[99,103,109,151,868,1009,1010,1013,1014,1045,1067,1069,1400,1423,2454,2463,2511,2528,2529],[99,103,109,868,1064,1066,1067,1069,1423,2454,2463,2511,2528,2529],[99,103,109,151,868,965,997,1009,1010,1013,1014,1064,1066,1067,1069,1400,1423,2454,2463,2511,2528,2529],[99,103,109,868,1064,1065,1067,1069,1423,2454,2463,2511,2528,2529],[99,103,109,151,157,462,776,792,868,965,997,1009,1010,1013,1045,1063,1064,1065,1066,1067,1069,1071,1076,1078,1079,1080,1081,1400,1423,2454,2463,2511,2528,2529],[99,103,109,151,154,792,868,1064,1066,1068,1069,1423,2454,2463,2511,2528,2529],[868,1083,1423,2463,2511,2528,2529],[99,103,109,868,1045,1047,1067,1069,1423,2454,2463,2511,2528,2529],[462,792,868,1295,1296,1298,1299,1300,1301,1423,2463,2511,2528,2529],[99,103,109,868,1296,1299,1300,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,868,1297,1301,1423,2454,2463,2511,2528,2529],[99,103,109,868,1298,1301,1423,2454,2463,2511,2528,2529],[99,100,103,109,157,792,868,1298,1301,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1295,1423,2454,2463,2511,2528,2529],[99,103,109,868,1296,1423,2454,2463,2511,2528,2529],[99,100,103,109,154,157,792,868,1299,1301,1423,2454,2463,2511,2528,2529],[462,792,868,998,999,1423,2463,2511,2528,2529],[99,103,109,151,157,792,868,998,1423,2454,2463,2511,2528,2529],[99,103,109,868,999,1423,2454,2463,2511,2528,2529],[462,792,868,1303,1304,1423,2463,2511,2528,2529],[99,103,109,151,157,792,868,1423,2454,2463,2511,2528,2529],[99,103,109,151,868,1303,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1100,1101,1102,1103,1105,1106,1423,2463,2511,2528,2529],[99,103,109,157,792,826,868,869,1100,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,826,838,868,869,1423,2454,2463,2511,2528,2529],[99,103,109,868,869,1100,1423,2454,2463,2511,2528,2529],[99,103,109,868,1104,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,869,1423,2454,2463,2511,2528,2529],[99,100,103,109,157,792,838,868,1100,1400,1423,2454,2463,2511,2528,2529],[868,869,1100,1423,2463,2511,2528,2529],[462,792,868,1306,1307,1423,2463,2511,2528,2529],[99,103,109,151,157,461,792,829,838,868,995,997,1306,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,829,868,1307,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1309,1310,1311,1312,1423,2463,2511,2528,2529],[99,103,109,157,461,792,868,1310,1423,2454,2463,2511,2528,2529],[99,103,109,868,1311,1423,2454,2463,2511,2528,2529],[99,103,109,868,1309,1423,2454,2463,2511,2528,2529],[462,792,868,1041,1043,1044,1045,1046,1423,2463,2511,2528,2529],[99,103,109,154,792,868,1041,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,829,837,838,868,982,996,997,1042,1423,2454,2463,2511,2528,2529],[99,103,109,829,837,838,868,1043,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,827,829,835,838,868,969,997,1041,1043,1044,1423,2454,2463,2511,2528,2529],[99,103,109,154,792,829,838,868,1041,1043,1045,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,827,832,838,868,1423,2454,2463,2511,2528,2529],[462,792,868,1351,1352,1353,1354,1355,1356,1423,2463,2511,2528,2529],[99,103,109,157,792,868,988,1423,2454,2463,2511,2528,2529],[99,103,109,157,461,792,868,988,1351,1352,1423,2454,2463,2511,2528,2529],[99,103,109,868,988,1352,1355,1423,2454,2463,2511,2528,2529],[99,103,109,157,461,792,868,988,1351,1352,1353,1423,2454,2463,2511,2528,2529],[99,103,109,868,988,1352,1354,1400,1423,2454,2463,2511,2528,2529],[99,103,109,859,865,868,1423,2454,2463,2511,2528,2529],[462,792,868,1317,1318,1423,2463,2511,2528,2529],[99,103,109,792,868,1314,1315,1318,1423,2454,2463,2511,2528,2529],[99,103,109,868,1316,1318,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,868,1315,1317,1423,2454,2463,2511,2528,2529],[462,792,868,1329,1330,1423,2463,2511,2528,2529],[868,1229,1233,1326,1328,1423,2463,2511,2528,2529],[99,103,109,157,792,829,838,868,1229,1233,1321,1328,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1334,1335,1423,2463,2511,2528,2529],[868,1334,1423,2463,2511,2528,2529],[99,103,109,868,1009,1211,1220,1321,1333,1400,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,868,1332,1423,2454,2463,2511,2528,2529],[99,103,109,792,868,1014,1321,1333,1423,2454,2463,2511,2528,2529],[462,792,868,1320,1321,1324,1325,1326,1327,1423,2463,2511,2528,2529],[868,1325,1423,2463,2511,2528,2529],[154,792,868,1321,1322,1423,2463,2511,2528,2529],[868,1321,1323,1423,2463,2511,2528,2529],[99,103,109,868,1321,1322,1323,1324,1423,2454,2463,2511,2528,2529],[99,103,109,157,462,792,868,1321,1323,1423,2454,2463,2511,2528,2529],[99,103,109,868,1320,1322,1323,1324,1423,2454,2463,2511,2528,2529],[99,103,109,151,154,157,462,792,868,965,997,1009,1010,1013,1129,1320,1321,1322,1323,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1338,1339,1341,1343,1345,1346,1423,2463,2511,2528,2529],[868,1339,1423,2463,2511,2528,2529],[99,103,109,154,157,792,868,1337,1339,1340,1423,2454,2463,2511,2528,2529],[99,103,109,154,792,868,1337,1339,1341,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1344,1423,2454,2463,2511,2528,2529],[99,103,109,868,1345,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1339,1342,1423,2454,2463,2511,2528,2529],[99,103,109,868,1339,1343,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,868,1337,1338,1423,2454,2463,2511,2528,2529],[99,103,109,154,792,868,1339,1423,2454,2463,2511,2528,2529],[868,1211,1212,1213,1214,1215,1217,1218,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1211,1215,1216,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1211,1217,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1211,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1211,1400,1423,2454,2463,2511,2528,2529],[99,103,109,868,1210,1423,2454,2463,2511,2528,2529],[462,792,868,1348,1349,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1348,1423,2454,2463,2511,2528,2529],[99,103,109,868,1349,1423,2454,2463,2511,2528,2529],[99,103,109,868,1088,1393,1423,2454,2463,2511,2528,2529],[868,1078,1395,1396,1397,1423,2463,2511,2528,2529],[99,103,109,868,1077,1423,2454,2463,2511,2528,2529],[868,893,894,895,896,897,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,989,990,991,992,993,994,995,996,1423,2463,2511,2528,2529],[779,868,1423,2463,2511,2528,2529],[99,103,109,868,988,1423,2454,2463,2511,2528,2529],[99,103,109,154,779,792,868,898,964,1423,2454,2463,2511,2528,2529],[99,103,109,868,966,1423,2454,2463,2511,2528,2529],[99,103,109,147,148,149,150,151,152,153,154,794,795,796,798,799,801,804,805,807,808,827,829,830,831,832,833,834,835,836,837,838,839,842,843,844,846,847,848,850,851,852,853,854,857,858,859,860,864,865,866,868,869,873,874,875,877,878,879,880,881,884,885,886,887,889,891,892,893,894,895,896,897,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,989,990,991,992,993,994,995,996,997,999,1000,1001,1003,1004,1006,1007,1009,1011,1012,1014,1016,1017,1018,1019,1020,1023,1024,1026,1039,1040,1041,1043,1045,1046,1047,1049,1050,1053,1054,1055,1056,1058,1059,1061,1062,1067,1069,1071,1073,1074,1075,1076,1078,1085,1086,1087,1088,1089,1090,1096,1098,1099,1100,1101,1102,1103,1105,1107,1108,1109,1110,1112,1113,1114,1116,1117,1119,1120,1121,1123,1124,1126,1127,1129,1130,1131,1133,1134,1137,1138,1140,1141,1143,1146,1147,1148,1149,1150,1154,1156,1157,1159,1160,1162,1163,1164,1166,1167,1168,1169,1170,1171,1172,1175,1176,1177,1178,1179,1181,1182,1183,1184,1185,1187,1188,1190,1191,1193,1195,1197,1198,1199,1201,1202,1204,1205,1207,1208,1209,1211,1212,1213,1214,1215,1217,1218,1222,1225,1227,1229,1230,1233,1234,1236,1238,1239,1242,1244,1245,1246,1247,1248,1249,1251,1252,1254,1256,1257,1258,1260,1261,1262,1263,1265,1267,1283,1284,1285,1292,1294,1296,1298,1299,1300,1301,1302,1303,1305,1307,1308,1309,1311,1312,1313,1318,1319,1320,1321,1324,1326,1327,1328,1329,1331,1335,1336,1339,1341,1343,1345,1346,1347,1349,1350,1351,1352,1354,1355,1357,1360,1361,1362,1365,1366,1369,1371,1372,1374,1375,1376,1377,1378,1379,1380,1382,1384,1385,1387,1389,1391,1392,1393,1394,1395,1396,1397,1398,1399,1423,2454,2463,2511,2528,2529],[106,868,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,1423,2463,2511,2528,2529],[99,103,109,868,1088,1090,1423,2454,2463,2511,2528,2529],[776,868,1423,2463,2511,2528,2529],[158,159,160,161,162,163,868,1423,2463,2511,2528,2529],[154,155,156,157,158,159,160,161,162,163,164,165,461,462,463,464,465,466,467,469,777,780,781,782,783,784,785,786,787,788,789,790,791,868,1423,2463,2511,2528,2529],[90,154,792,868,1423,2463,2511,2528,2529],[97,868,1423,2463,2511,2528,2529],[99,103,109,460,868,1423,2454,2463,2511,2528,2529],[155,156,157,165,461,462,463,464,465,466,467,468,868,1423,2463,2511,2528,2529],[99,103,109,462,868,1423,2454,2463,2511,2528,2529],[155,156,157,868,1423,2463,2511,2528,2529],[99,103,109,157,868,1423,2454,2463,2511,2528,2529],[99,103,109,155,156,868,1423,2454,2463,2511,2528,2529],[151,868,1423,2463,2511,2528,2529],[148,151,868,1423,2463,2511,2528,2529],[868,1423,2240,2463,2511,2528,2529],[868,1423,1472,2463,2511,2528,2529],[868,1423,1470,1471,1473,2463,2511,2528,2529],[868,1423,1472,1476,1479,1481,1482,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,2463,2511,2528,2529],[868,1423,1472,1476,1477,2463,2511,2528,2529],[868,1423,1472,1476,2463,2511,2528,2529],[868,1423,1472,1473,1526,2463,2511,2528,2529],[868,1423,1478,2463,2511,2528,2529],[868,1423,1478,1483,2463,2511,2528,2529],[868,1423,1478,1482,2463,2511,2528,2529],[868,1423,1475,1478,1482,2463,2511,2528,2529],[868,1423,1478,1481,1504,2463,2511,2528,2529],[868,1423,1476,1478,2463,2511,2528,2529],[868,1423,1475,2463,2511,2528,2529],[868,1423,1472,1480,2463,2511,2528,2529],[868,1423,1476,1480,1481,1482,2463,2511,2528,2529],[868,1423,1475,1476,2463,2511,2528,2529],[868,1423,1472,1473,2463,2511,2528,2529],[868,1423,1472,1473,1526,1528,2463,2511,2528,2529],[868,1423,1472,1529,2463,2511,2528,2529],[868,1423,1536,1537,1538,2463,2511,2528,2529],[868,1423,1472,1526,1527,2463,2511,2528,2529],[868,1423,1472,1474,1541,2463,2511,2528,2529],[868,1423,1530,1532,2463,2511,2528,2529],[868,1423,1529,1532,2463,2511,2528,2529],[868,1423,1472,1481,1490,1526,1527,1528,1529,1532,1533,1534,1535,1539,1540,2463,2511,2528,2529],[868,1423,1507,1532,2463,2511,2528,2529],[868,1423,1530,1531,2463,2511,2528,2529],[868,1423,1472,1541,2463,2511,2528,2529],[868,1423,1529,1533,1534,2463,2511,2528,2529],[868,1423,1532,2463,2511,2528,2529],[868,1423,1954,1955,1956,1957,2463,2511,2528,2529],[868,1423,1954,1955,1956,2463,2511,2528,2529],[868,1423,1954,2463,2511,2528,2529],[868,1423,1954,1955,2463,2511,2528,2529],[775,868,1423,2463,2511,2528,2529],[99,103,108,868,1423,2454,2463,2511,2528,2529],[868,1423,2463,2511,2528,2529,2583],[868,1423,2463,2511,2528,2529,2581,2583],[868,1423,2463,2511,2528,2529,2572,2580,2581,2582,2584,2586],[868,1423,2463,2511,2528,2529,2570],[868,1423,2463,2511,2528,2529,2573,2578,2583,2586],[868,1423,2463,2511,2528,2529,2569,2586],[868,1423,2463,2511,2528,2529,2573,2574,2577,2578,2579,2586],[868,1423,2463,2511,2528,2529,2573,2574,2575,2577,2578,2586],[868,1423,2463,2511,2528,2529,2570,2571,2572,2573,2574,2578,2579,2580,2582,2583,2584,2586],[868,1423,2463,2511,2528,2529,2586],[868,1423,2463,2511,2528,2529,2568,2570,2571,2572,2573,2574,2575,2577,2578,2579,2580,2581,2582,2583,2584,2585],[868,1423,2463,2511,2528,2529,2568,2586],[868,1423,2463,2511,2528,2529,2573,2575,2576,2578,2579,2586],[868,1423,2463,2511,2528,2529,2577,2586],[868,1423,2463,2511,2528,2529,2578,2579,2583,2586],[868,1423,2463,2511,2528,2529,2571,2581],[868,1423,1739,2463,2511,2528,2529],[868,1423,1740,1741,1742,2463,2511,2528,2529],[868,1423,1740,1741,1743,2463,2511,2528,2529],[868,1423,2463,2511,2528,2529,2563,2618,2619],[868,1423,2463,2511,2528,2529,2562,2563],[868,1423,2463,2511,2528,2529,2568,2607],[868,1423,2463,2511,2528,2529,2594],[868,1423,2463,2511,2528,2529,2590,2607],[868,1423,2463,2511,2528,2529,2589,2590,2591,2594,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615],[868,1423,2463,2511,2528,2529,2611],[868,1423,2463,2511,2528,2529,2589,2591,2594,2612,2613],[868,1423,2463,2511,2528,2529,2610,2614],[868,1423,2463,2511,2528,2529,2589,2592,2593],[868,1423,2463,2511,2528,2529,2592],[868,1423,2463,2511,2528,2529,2589,2590,2591,2594,2606],[868,1423,2463,2511,2528,2529,2595,2600,2606],[868,1423,2463,2511,2528,2529,2606],[868,1423,2463,2511,2528,2529,2595,2606],[868,1423,2463,2511,2528,2529,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605],[868,1423,2127,2160,2463,2511,2528,2529],[868,1423,2127,2463,2511,2528,2529],[868,1423,2160,2161,2162,2463,2511,2528,2529],[868,1423,2127,2161,2463,2511,2528,2529],[868,1423,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2126,2463,2511,2528,2529],[868,1423,2109,2110,2127,2463,2511,2528,2529],[868,1423,2109,2127,2463,2511,2528,2529],[868,1423,2120,2127,2463,2511,2528,2529],[868,1423,2122,2123,2124,2125,2463,2511,2528,2529],[868,1423,2111,2127,2463,2511,2528,2529],[868,1423,2136,2463,2511,2528,2529],[868,1423,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2463,2511,2528,2529],[868,1423,2128,2136,2138,2463,2511,2528,2529],[868,1423,2134,2136,2143,2463,2511,2528,2529],[868,1423,2138,2463,2511,2528,2529],[868,1423,2136,2138,2463,2511,2528,2529],[868,1423,2137,2463,2511,2528,2529],[868,1423,2128,2136,2463,2511,2528,2529],[868,1423,2129,2130,2131,2132,2133,2134,2135,2137,2463,2511,2528,2529],[868,1423,2463,2511,2528,2529,2631],[868,1423,1929,2463,2511,2528,2529],[868,1423,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,2463,2511,2528,2529],[868,1423,1563,2463,2511,2528,2529],[868,1423,1623,2463,2511,2528,2529],[868,1423,1618,1619,2463,2511,2528,2529],[99,103,109,868,1423,1688,2454,2463,2511,2528,2529],[868,1423,1691,2463,2511,2528,2529],[99,103,109,868,1423,1637,1721,2454,2463,2511,2528,2529],[99,103,109,868,1423,1620,1637,1721,2454,2463,2511,2528,2529],[99,103,109,868,1423,1721,2454,2463,2511,2528,2529],[868,1423,1697,2463,2511,2528,2529],[99,103,109,868,1423,1665,2454,2463,2511,2528,2529],[99,103,109,868,1423,1721,1725,2454,2463,2511,2528,2529],[868,1423,1701,2463,2511,2528,2529],[868,1423,1629,1630,2463,2511,2528,2529],[868,1423,1628,2463,2511,2528,2529],[99,103,109,868,1423,1621,2454,2463,2511,2528,2529],[99,103,109,868,1423,1642,2454,2463,2511,2528,2529],[868,1423,1639,1640,2463,2511,2528,2529],[868,1423,1642,2463,2511,2528,2529],[868,1423,1639,2463,2511,2528,2529],[868,1423,1634,2463,2511,2528,2529],[868,1423,1665,1672,1704,1719,1720,1951,2463,2511,2528,2529],[99,103,109,868,1423,1705,2454,2463,2511,2528,2529],[99,103,109,868,1423,1634,1659,2454,2463,2511,2528,2529],[868,1423,1673,2463,2511,2528,2529],[868,1423,1675,2463,2511,2528,2529],[868,1423,1728,2463,2511,2528,2529],[99,103,109,868,1423,1634,1665,2454,2463,2511,2528,2529],[868,1423,1678,2463,2511,2528,2529],[868,1423,1730,2463,2511,2528,2529],[99,103,109,868,1423,1637,1665,2454,2463,2511,2528,2529],[868,1423,1732,2463,2511,2528,2529],[99,103,109,868,1423,1634,1635,1665,2454,2463,2511,2528,2529],[868,1423,1666,2463,2511,2528,2529],[868,1423,1707,2463,2511,2528,2529],[868,1423,1647,2463,2511,2528,2529],[868,1423,1734,2463,2511,2528,2529],[868,1423,1681,2463,2511,2528,2529],[99,103,109,868,1423,1665,1721,2454,2463,2511,2528,2529],[99,103,109,868,1423,1634,1654,1684,1721,2454,2463,2511,2528,2529],[99,103,109,868,1423,1616,2454,2463,2511,2528,2529],[868,1423,1736,2463,2511,2528,2529],[99,103,109,868,1423,1639,1642,2454,2463,2511,2528,2529],[868,1423,1947,2463,2511,2528,2529],[99,103,109,868,1423,1641,1642,1738,1946,2454,2463,2511,2528,2529],[868,1423,1949,2463,2511,2528,2529],[868,1423,1661,2463,2511,2528,2529],[868,1423,1660,2463,2511,2528,2529],[868,1423,1626,2463,2511,2528,2529],[868,1423,1686,2463,2511,2528,2529],[868,1423,1711,2463,2511,2528,2529],[99,103,109,868,1423,1663,2454,2463,2511,2528,2529],[868,1423,1624,1625,1638,1642,1643,1644,1645,1646,1648,1722,1723,1724,1725,1726,1727,1729,1731,1733,1735,1737,1948,1950,2463,2511,2528,2529],[868,1423,1617,1620,1622,1638,1642,1643,1644,1645,1646,1648,1951,2463,2511,2528,2529],[868,1423,1617,1620,1622,1627,1631,2463,2511,2528,2529],[868,1423,1632,1671,2463,2511,2528,2529],[868,1423,1667,1668,1669,1670,2463,2511,2528,2529],[868,1423,1674,1676,1677,1679,1680,1682,1683,1685,1687,1689,1690,1692,1693,1694,1695,1696,1698,1699,1700,1702,1703,2463,2511,2528,2529],[868,1423,1706,1708,1709,1710,1712,1713,1714,1715,1716,1717,1718,2463,2511,2528,2529],[868,1423,1654,2463,2511,2528,2529],[868,1423,1653,2463,2511,2528,2529],[99,103,109,868,1423,1637,1642,2454,2463,2511,2528,2529],[99,103,109,868,1423,1620,1637,1642,1644,2454,2463,2511,2528,2529],[868,1423,1637,1641,2463,2511,2528,2529],[868,1423,1616,1635,1638,1642,1643,1644,1645,1646,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,2463,2511,2528,2529],[868,1423,1649,2463,2511,2528,2529],[868,1423,1637,2463,2511,2528,2529],[99,103,109,868,1423,1635,1660,2454,2463,2511,2528,2529],[868,1423,1635,2463,2511,2528,2529],[99,103,109,868,1423,1635,1649,2454,2463,2511,2528,2529],[868,1423,2463,2476,2480,2511,2528,2529,2554],[868,1423,2463,2476,2511,2528,2529,2543,2554],[868,1423,2463,2471,2511,2528,2529],[868,1423,2463,2473,2476,2511,2528,2529,2551,2554],[868,1423,2463,2511,2528,2529,2531,2551],[868,1423,2463,2471,2511,2528,2529,2561],[868,1423,2463,2473,2476,2511,2528,2529,2531,2554],[868,1423,2463,2468,2469,2472,2475,2511,2522,2528,2529,2543,2554],[868,1423,2463,2476,2483,2511,2528,2529],[868,1423,2463,2468,2474,2511,2528,2529],[868,1423,2463,2476,2497,2498,2511,2528,2529],[868,1423,2463,2472,2476,2511,2528,2529,2546,2554,2561],[868,1423,2463,2497,2511,2528,2529,2561],[868,1423,2463,2470,2471,2511,2528,2529,2561],[868,1423,2463,2476,2511,2528,2529],[868,1423,2463,2470,2471,2472,2473,2474,2475,2476,2477,2478,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2498,2499,2500,2501,2502,2503,2511,2528,2529],[868,1423,2463,2476,2491,2511,2528,2529],[868,1423,2463,2476,2483,2484,2511,2528,2529],[868,1423,2463,2474,2476,2484,2485,2511,2528,2529],[868,1423,2463,2475,2511,2528,2529],[868,1423,2463,2468,2471,2476,2511,2528,2529],[868,1423,2463,2476,2480,2484,2485,2511,2528,2529],[868,1423,2463,2480,2511,2528,2529],[868,1423,2463,2474,2476,2479,2511,2528,2529,2554],[868,1423,2463,2468,2473,2476,2483,2511,2528,2529],[868,1423,2463,2511,2528,2529,2543],[868,1423,2463,2471,2476,2497,2511,2528,2529,2559,2561],[868,1423,2463,2511,2528,2529,2620,2628,2629,2630,2632],[868,1423,2463,2511,2528,2529,2620,2628],[868,1423,2463,2511,2528,2529,2629],[868,1423,2463,2511,2528,2529,2633,2634],[868,1423,2463,2511,2528,2529,2633,2634,2635],[868,1423,2463,2511,2528,2529,2634,2638,2639],[868,1423,2463,2511,2528,2529,2634,2638],[868,1423,2463,2511,2528,2529,2619,2634,2638,2639],[868,1423,2463,2511,2528,2529,2563,2567,2618,2619,2637],[868,1423,2463,2511,2528,2529,2619],[868,1423,2463,2511,2528,2529,2619,2643],[87,868,1423,2463,2511,2528,2529],[83,84,86,868,1423,2463,2511,2522,2523,2525,2526,2527,2528,2529,2531,2543,2551,2554,2560,2561,2563,2564,2565,2566,2567,2587,2588,2617,2618,2619],[83,84,85,868,1423,2463,2511,2528,2529,2565],[83,868,1423,2463,2511,2528,2529],[84,868,1423,2463,2511,2528,2529],[85,86,868,1423,2463,2511,2528,2529],[868,1423,2463,2511,2528,2529,2616],[868,1423,2463,2511,2528,2529,2563,2619],[99,103,109,868,1423,1438,1439,1441,1442,1443,2454,2463,2511,2528,2529],[99,102,103,109,868,1423,2454,2463,2511,2528,2529],[94,98,868,1423,2463,2511,2528,2529],[98,868,1423,2463,2511,2528,2529],[99,103,109,868,1423,2046,2047,2454,2463,2511,2528,2529],[99,103,109,868,1423,2046,2454,2463,2511,2528,2529],[99,103,109,868,1423,2029,2454,2463,2511,2528,2529],[99,103,109,868,1423,2031,2454,2463,2511,2528,2529],[99,103,109,868,1423,2031,2032,2454,2463,2511,2528,2529],[868,1423,2029,2463,2511,2528,2529],[99,103,109,868,1423,2034,2454,2463,2511,2528,2529],[99,103,109,868,1423,2036,2454,2463,2511,2528,2529],[99,103,109,868,1423,2036,2037,2038,2454,2463,2511,2528,2529],[868,1423,2067,2463,2511,2528,2529],[868,1423,2030,2033,2035,2039,2040,2045,2048,2050,2051,2052,2054,2055,2059,2061,2063,2066,2068,2069,2463,2511,2528,2529],[99,103,109,868,1423,2049,2454,2463,2511,2528,2529],[868,1423,2041,2042,2463,2511,2528,2529],[868,1423,2043,2044,2463,2511,2528,2529],[868,1423,2064,2065,2463,2511,2528,2529],[99,103,109,868,1423,2064,2454,2463,2511,2528,2529],[868,1423,2056,2057,2058,2463,2511,2528,2529],[99,103,109,868,1423,2056,2454,2463,2511,2528,2529],[99,103,109,868,1423,2053,2454,2463,2511,2528,2529],[99,103,109,868,1423,2060,2454,2463,2511,2528,2529],[99,103,109,868,1423,2062,2454,2463,2511,2528,2529],[99,103,109,868,1423,2071,2454,2463,2511,2528,2529],[868,1423,2022,2028,2070,2072,2463,2511,2528,2529],[868,1423,2023,2024,2463,2511,2528,2529],[99,103,109,868,1423,2023,2454,2463,2511,2528,2529],[99,103,109,868,1423,2021,2022,2454,2463,2511,2528,2529],[99,103,109,868,1423,2016,2025,2454,2463,2511,2528,2529],[99,103,109,868,1423,2016,2021,2454,2463,2511,2528,2529],[868,1423,2021,2463,2511,2528,2529],[868,1423,2026,2027,2463,2511,2528,2529],[868,1423,2017,2018,2019,2020,2463,2511,2528,2529],[868,1423,2017,2018,2019,2463,2511,2528,2529],[868,1423,2017,2463,2511,2528,2529],[868,1423,2017,2018,2463,2511,2528,2529],[111,113,114,115,116,117,118,119,120,121,122,123,868,1423,2463,2511,2528,2529],[111,112,114,115,116,117,118,119,120,121,122,123,868,1423,2463,2511,2528,2529],[112,113,114,115,116,117,118,119,120,121,122,123,868,1423,2463,2511,2528,2529],[111,112,113,115,116,117,118,119,120,121,122,123,868,1423,2463,2511,2528,2529],[111,112,113,114,116,117,118,119,120,121,122,123,868,1423,2463,2511,2528,2529],[111,112,113,114,115,117,118,119,120,121,122,123,868,1423,2463,2511,2528,2529],[111,112,113,114,115,116,118,119,120,121,122,123,868,1423,2463,2511,2528,2529],[111,112,113,114,115,116,117,119,120,121,122,123,868,1423,2463,2511,2528,2529],[111,112,113,114,115,116,117,118,120,121,122,123,868,1423,2463,2511,2528,2529],[111,112,113,114,115,116,117,118,119,121,122,123,868,1423,2463,2511,2528,2529],[111,112,113,114,115,116,117,118,119,120,122,123,868,1423,2463,2511,2528,2529],[111,112,113,114,115,116,117,118,119,120,121,123,868,1423,2463,2511,2528,2529],[111,112,113,114,115,116,117,118,119,120,121,122,868,1423,2463,2511,2528,2529],[868,1422,2463,2511,2528,2529],[868,1423,1424,2463,2511,2528,2529],[100,868,1423,1576,2463,2511,2528,2529],[100,124,126,132,868,1423,1576,1578,2463,2511,2528,2529],[100,124,868,1423,1576,2463,2511,2528,2529],[99,100,101,103,105,106,107,109,133,136,868,1423,1578,1580,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,129,868,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1457,2015,2454,2463,2511,2528,2529],[88,99,100,101,103,109,133,460,868,1401,1423,1433,1453,1461,1636,1637,2015,2076,2077,2078,2079,2082,2096,2097,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1579,2454,2457,2463,2511,2528,2529],[99,100,101,103,105,109,868,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2101,2454,2463,2511,2528,2529],[88,99,100,101,103,109,868,1406,1423,2182,2189,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1401,1423,2184,2454,2463,2511,2528,2529],[100,460,868,1423,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,2193,2194,2195,2454,2463,2511,2528,2529],[99,100,101,103,105,109,868,1400,1423,2193,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1406,1423,2194,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1406,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1436,1585,2198,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2198,2454,2463,2511,2528,2529],[100,868,1423,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2198,2199,2200,2201,2202,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2184,2198,2203,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2205,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2185,2454,2463,2511,2528,2529],[99,100,103,109,868,1400,1401,1423,1436,1453,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,2185,2186,2187,2454,2463,2511,2528,2529],[99,100,101,103,105,109,868,1401,1423,1453,1578,2183,2184,2185,2187,2188,2189,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1467,2454,2463,2511,2528,2529],[99,100,101,103,105,109,868,1400,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2015,2073,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1401,1423,1433,1467,1468,1469,1542,1543,1577,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,124,126,133,868,1400,1401,1423,1454,1455,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1433,2079,2223,2454,2463,2511,2528,2529],[99,100,103,109,868,1423,1577,2454,2463,2511,2528,2529],[100,130,136,868,1423,2463,2511,2528,2529],[100,103,868,1423,2457,2463,2511,2528,2529],[100,868,1401,1423,2226,2463,2511,2528,2529],[99,100,103,109,133,868,1423,2454,2463,2511,2528,2529],[100,868,1423,1441,2230,2232,2234,2236,2463,2511,2528,2529],[99,100,103,109,460,868,1423,2454,2463,2511,2528,2529],[88,99,100,103,109,868,1423,2239,2240,2454,2463,2511,2528,2529],[99,100,103,109,868,1423,2242,2454,2463,2511,2528,2529],[99,100,103,109,868,1423,1571,2244,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,139,868,1423,2454,2457,2463,2511,2528,2529],[99,100,101,103,105,109,136,138,140,141,142,144,145,868,1402,1423,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,130,139,143,868,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,133,146,868,1401,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,130,136,868,1423,1578,2454,2463,2511,2528,2529],[88,99,100,101,103,105,109,136,868,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,136,137,868,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,136,868,1409,1423,1578,2454,2463,2511,2528,2529],[99,100,101,103,107,109,868,1423,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,129,868,1406,1423,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,868,1407,1423,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,133,136,868,1405,1408,1423,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1403,1404,1410,1423,2454,2463,2511,2528,2529],[88,99,100,103,109,868,1423,1577,1581,1582,1583,2454,2463,2511,2528,2529],[100,103,124,125,129,130,132,133,868,1423,1570,1571,2457,2463,2511,2528,2529],[100,103,868,1423,1578,2457,2463,2511,2528,2529],[100,103,107,129,133,868,1423,1570,2457,2463,2511,2528,2529],[100,103,125,868,1411,1413,1414,1417,1418,1420,1421,1423,1426,1430,1432,1565,1569,2457,2463,2511,2528,2529],[100,109,868,1423,2463,2511,2528,2529],[100,109,124,868,1423,1577,2463,2511,2528,2529],[100,103,109,125,129,868,1423,2457,2463,2511,2528,2529],[90,100,109,128,131,134,135,868,1423,2463,2511,2528,2529],[100,103,109,125,127,128,131,132,868,1423,1571,2457,2463,2511,2528,2529],[100,128,130,131,133,868,1423,1571,2463,2511,2528,2529],[100,868,1376,1400,1423,2463,2511,2528,2529],[100,868,1423,1424,2463,2511,2528,2529],[100,868,1423,1452,1453,2463,2511,2528,2529],[100,133,868,1423,2463,2511,2528,2529],[100,110,123,126,868,1423,1572,1573,2463,2511,2528,2529],[100,110,868,1423,1573,2463,2511,2528,2529],[100,110,123,124,125,126,132,868,1401,1423,1571,1573,1574,1575,2463,2511,2528,2529],[110,868,1423,1573,2463,2511,2528,2529],[100,868,1423,2456,2463,2511,2528,2529],[90,100,123,868,1423,2463,2511,2528,2529],[99,100,101,103,109,125,127,132,133,460,868,1400,1416,1419,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,125,127,132,133,868,1400,1415,1416,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,125,127,128,131,133,460,868,1400,1415,1416,1423,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1595,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1585,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1585,2252,2454,2463,2511,2528,2529],[99,100,101,103,109,143,868,1400,1423,1585,2225,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1571,1585,2225,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1455,1586,2189,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1423,1586,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1596,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1597,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1435,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1578,1598,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2262,2265,2266,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2262,2263,2264,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2263,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,2262,2454,2463,2511,2528,2529],[99,100,101,103,109,136,868,1423,2262,2454,2463,2511,2528,2529],[99,100,103,109,868,1400,1401,1423,1598,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1598,2268,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1598,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1406,1423,1591,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1453,1591,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1406,1423,1436,1591,2272,2273,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1401,1423,1577,1599,1600,1601,2225,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1601,2275,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1601,2278,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1424,1425,1433,1547,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1406,1423,1587,2277,2454,2463,2511,2528,2529],[99,100,101,103,107,109,868,1423,1436,1571,1587,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1433,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1400,1401,1423,1433,1464,1577,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1425,1433,1436,1577,2100,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1400,1401,1423,1433,1436,1437,1467,1468,1542,1543,1545,1577,1603,2100,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,133,868,1400,1401,1423,1433,1436,1468,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1400,1401,1423,1433,1436,1464,1465,1542,1543,1545,1577,1599,2205,2206,2286,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1400,1401,1423,1433,1436,1464,1542,1543,1545,1577,1599,2205,2206,2286,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,2183,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1406,1423,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1428,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1428,2454,2463,2511,2528,2529],[99,100,101,103,109,460,775,868,1423,1428,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2292,2454,2463,2511,2528,2529],[100,868,1423,2291,2293,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2299,2454,2463,2511,2528,2529],[100,868,1423,2300,2301,2463,2511,2528,2529],[99,100,101,103,109,775,868,1401,1423,2183,2454,2463,2511,2528,2529],[99,100,101,103,109,775,868,1401,1423,2183,2303,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2292,2303,2454,2463,2511,2528,2529],[100,868,1423,2303,2304,2305,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2307,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2292,2307,2454,2463,2511,2528,2529],[100,868,1423,2307,2308,2309,2463,2511,2528,2529],[99,100,101,103,109,775,868,1401,1423,2183,2311,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2292,2311,2454,2463,2511,2528,2529],[100,868,1423,2311,2312,2313,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2296,2315,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2292,2315,2454,2463,2511,2528,2529],[100,868,1423,2315,2316,2317,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2296,2319,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2292,2319,2454,2463,2511,2528,2529],[100,868,1423,2319,2320,2321,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2323,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1427,2323,2454,2463,2511,2528,2529],[100,868,1423,2323,2324,2325,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2327,2454,2463,2511,2528,2529],[100,868,1423,2327,2328,2329,2463,2511,2528,2529],[99,100,101,103,109,775,868,1401,1423,2184,2331,2454,2463,2511,2528,2529],[100,868,1423,2331,2332,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2334,2454,2463,2511,2528,2529],[100,868,1423,2334,2335,2336,2463,2511,2528,2529],[99,100,101,103,109,775,868,1401,1423,2183,2338,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2292,2338,2454,2463,2511,2528,2529],[100,868,1423,2338,2339,2340,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2342,2454,2463,2511,2528,2529],[100,868,1423,2342,2343,2344,2463,2511,2528,2529],[99,100,101,103,109,868,1406,1423,1427,1428,2290,2297,2298,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1427,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1427,1429,2454,2463,2511,2528,2529],[99,100,101,103,105,109,868,1423,2347,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1427,2348,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1427,2290,2294,2454,2463,2511,2528,2529],[99,100,101,103,109,123,868,1400,1401,1423,1602,1604,1610,2225,2350,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1571,1610,2249,2352,2353,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,2226,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1610,2184,2208,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1610,2184,2225,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1425,2454,2463,2511,2528,2529],[99,100,101,103,109,132,460,868,1400,1401,1423,1467,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1423,1424,1425,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1401,1423,1424,1425,1547,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1412,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1423,1594,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1401,1423,1424,1431,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1401,1423,1424,1431,1436,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1436,1592,2454,2463,2511,2528,2529],[99,100,101,103,109,110,460,868,1400,1423,1433,1437,1444,1573,1588,1594,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1588,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1588,2205,2206,2370,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1436,1588,2225,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1588,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,2364,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1588,2364,2365,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1588,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1588,2368,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1423,1444,1548,2454,2463,2511,2528,2529],[100,868,1423,1437,1464,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1401,1423,1465,1548,2374,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1436,1548,2374,2375,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1424,1436,1548,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1401,1423,1424,1433,1435,1436,1437,1545,1548,1549,2376,2377,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1423,1548,2380,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1423,1548,2381,2454,2463,2511,2528,2529],[99,100,101,103,109,123,143,868,1400,1401,1423,1589,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1436,1571,1589,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1589,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1589,2386,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1433,1434,1436,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1599,2184,2225,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1401,1423,1599,2389,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1600,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1600,2391,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1401,1423,1437,1461,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1425,1433,1447,1461,1462,1469,1545,1566,1567,1568,2098,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1599,1600,1601,1603,2184,2225,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1601,1603,2225,2394,2454,2463,2511,2528,2529],[99,100,101,103,107,109,868,1400,1406,1423,1571,1602,2184,2454,2463,2511,2528,2529],[99,100,101,103,107,109,868,1400,1401,1423,1436,1602,2396,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1406,1423,1602,1603,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1603,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1603,2398,2399,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1401,1423,1590,2401,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1604,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1604,2403,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1571,1604,2405,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1415,1423,1605,2250,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1605,2250,2407,2454,2463,2511,2528,2529],[99,100,101,103,109,123,868,1423,1605,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1606,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1607,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1607,2411,2454,2463,2511,2528,2529],[99,100,101,103,109,146,868,1401,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,146,868,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,146,868,1423,1436,2454,2463,2511,2528,2529],[99,100,101,103,109,143,146,868,1400,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,146,868,1401,1423,1436,1571,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1608,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1608,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1609,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1578,1609,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1609,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1609,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1444,1594,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1594,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1423,1436,1444,1594,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1444,1594,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1437,1465,1545,1594,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1571,1593,1599,2205,2206,2429,2430,2431,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1593,2184,2429,2430,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1571,1593,1599,2429,2430,2433,2454,2463,2511,2528,2529],[100,868,1423,1593,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1401,1423,1433,1468,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1401,1423,1425,1433,1435,1436,1437,1461,1469,1544,1545,1577,1599,2098,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1401,1423,1425,1433,1435,1436,1437,1461,1469,1544,1545,1577,2098,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1401,1423,1433,1577,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1424,1425,1433,1547,1548,1577,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1425,1577,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1433,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1433,1563,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1433,1443,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1433,1451,1455,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1433,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1433,1437,1444,1445,1446,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1401,1423,1433,1437,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1423,1424,1433,1457,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1446,1469,1566,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1566,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1433,1436,1464,1465,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1450,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1449,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1433,1446,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1433,1577,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1400,1401,1423,1433,1437,1447,1448,1456,1458,1459,1460,1461,1462,1463,1466,1544,1577,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1401,1423,1424,1425,1433,1434,1435,1436,1437,1544,1545,1546,1549,1564,1577,2100,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1401,1423,1424,1425,1433,1434,1435,1436,1437,1544,1545,1546,1549,1564,1577,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1433,1437,1447,1456,1458,1459,1460,1461,1462,1466,1566,1567,1568,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1401,1423,1424,1425,1433,1434,1435,1436,1437,1545,1546,1549,1564,1577,1599,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2193,2195,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1455,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1400,1423,1576,2096,2454,2463,2511,2528,2529],[99,100,101,103,109,127,133,460,868,1400,1401,1419,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,136,460,868,1406,1423,1433,1434,1444,1577,2250,2454,2463,2511,2528,2529],[103,868,1423,2457,2463,2511,2528,2529],[100,868,1423,2463,2511,2523,2528,2529,2533,2554,2619,2624,2627,2636,2640,2641,2642,2644,2645]],"fileInfos":[{"version":"e41c290ef7dd7dab3493e6cbe5909e0148edf4a8dad0271be08edec368a0f7b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"e12a46ce14b817d4c9e6b2b478956452330bf00c9801b79de46f7a1815b5bd40","impliedFormat":1},{"version":"4fd3f3422b2d2a3dfd5cdd0f387b3a8ec45f006c6ea896a4cb41264c2100bb2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"69e65d976bf166ce4a9e6f6c18f94d2424bf116e90837ace179610dbccad9b42","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"62bb211266ee48b2d0edf0d8d1b191f0c24fc379a82bd4c1692a082c540bc6b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1e2a172204962276504466a6393426d2ca9c54894b1ad0a6c9dad867a65f876","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"bab26767638ab3557de12c900f0b91f710c7dc40ee9793d5a27d32c04f0bf646","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"61d6a2092f48af66dbfb220e31eea8b10bc02b6932d6e529005fd2d7b3281290","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"bde31fd423cd93b0eff97197a3f66df7c93e8c0c335cbeb113b7ff1ac35c23f4","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"11443a1dcfaaa404c68d53368b5b818712b95dd19f188cab1669c39bee8b84b3","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"7f698624bbbb060ece7c0e51b7236520ebada74b747d7523c7df376453ed6fea","impliedFormat":1},{"version":"19efad8495a7a6b064483fccd1d2b427403dd84e67819f86d1c6ee3d7abf749c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1eef826bc4a19de22155487984e345a34c9cd511dd1170edc7a447cb8231dd4a","affectsGlobalScope":true,"impliedFormat":99},"424faf9241dd699dda995b367ed36665732da1e6ec1f33b2fd40394488ecac92",{"version":"f468b74459f1ad4473b36a36d49f2b255f3c6b5d536c81239c2b2971df089eaf","impliedFormat":1},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"524a409ad72186b7f6cb16898c349465cfa876f641d6cb6137b3123d5cfca619","impliedFormat":1},{"version":"ebe84ad8344962b7117a3b95065f47383215020eaf1b626463863b45b4d16e62","impliedFormat":1},{"version":"dc0c80f91a4d46c5c4f625a35601ff3c815e2395e6680bacfa12970fc6d49c93","impliedFormat":1},{"version":"3e74c6f34a28b7c948bfdaf19172000d589093660b3605f8c21c1b30173c729b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"88ad1af02cacc61bf79683b021d326eeafc91231660a06495c5046d4649ec3a2","impliedFormat":1},{"version":"c0191592be8eb7906f99ac4b8798d80a585b94001ea1a5f50d6ce5b0d13a5c62","impliedFormat":99},{"version":"318d19118bf6bf8d088441c948990f53cafc79ed581b78f3d41a0f7a3f5f145c","impliedFormat":1},{"version":"549d2a340dc2ac41cf361e10d14d3a2cecd425ffd6fc6f764964c5c4ee0b63d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"860814185d89237c84a6bd1e4f108c2c0b2401609a74a33bc7cab14ea4ee9f21","impliedFormat":99},{"version":"e1ddcbacb7658bf0683bca4ebd31bd05f64823712651263bfc75128a45f00ff7","impliedFormat":99},{"version":"cd0e1f0599b6d8fdd60dc96fdc8527cc60d903e8dffe0b93b7a3527e09e23d49","impliedFormat":99},{"version":"4d643a0df06c8a561870a279ccf6ff9d29a1f04e2c9378eba501eb0e058e13fa","impliedFormat":99},{"version":"e3a0a9032e3ce3945446b33b6329405565aaf5d0e7c115250b972f02dc64d0ae","impliedFormat":1},"6ef27fa41da37327fdb938f081d14851cc26dda0ea642190a0c5f9577a9f1edf",{"version":"52f5c39e78a90c1d8ed7db18f39d890b2e8464a3f44d4233617893f6648e317d","impliedFormat":1},{"version":"a69e8bce30aea7ec98f3b6ddfbc378c92826fede01aafbaec703057c2503ea51","impliedFormat":1},{"version":"b7e91960129ba8a3c22f2402dc8d901b07a44fd11085309ba4780ea044f08323","impliedFormat":99},{"version":"380b919bfa0516118edaf25b99e45f855e7bc3fd75ce4163a1cfe4a666388804","impliedFormat":1},{"version":"40de86ced5175a6ffe84a52abe6ac59ac0efbc604a5975a8c6476c3ddc682ff1","impliedFormat":1},{"version":"fcf79300e5257a23ed3bacaa6861d7c645139c6f7ece134d15e6669447e5e6db","impliedFormat":1},{"version":"187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","impliedFormat":1},{"version":"aa2c18a1b5a086bbcaae10a4efba409cc95ba7287d8cf8f2591b53704fea3dea","impliedFormat":1},{"version":"5a0b15210129310cee9fa6af9200714bb4b12af4a04d890e15f34dbea1cf1852","impliedFormat":1},{"version":"0244119dbcbcf34faf3ffdae72dab1e9bc2bc9efc3c477b2240ffa94af3bca56","impliedFormat":1},{"version":"00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","impliedFormat":1},{"version":"a873c50d3e47c21aa09fbe1e2023d9a44efb07cc0cb8c72f418bf301b0771fd3","impliedFormat":1},{"version":"7c14ccd2eaa82619fffc1bfa877eb68a012e9fb723d07ee98db451fadb618906","impliedFormat":1},{"version":"49c36529ee09ea9ce19525af5bb84985ea8e782cb7ee8c493d9e36d027a3d019","impliedFormat":1},{"version":"df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","impliedFormat":1},{"version":"4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd","impliedFormat":1},"e0f525d113db44555dd40d6e1fd5e2708f6626c28ed93fa5a3e7864343a4e0b9","d6d50f70ef4224b378ff4a44a6772a5d6c71185869a1dca5dd69198552e33c38","4d85921513f6d9f0e98515890c56d6f150d1caa17cf2cdab54fa0837fa48be58","d287164f84628dcbf023783cfbaccecc0277307f30884afd734c778aaff927c0","56c90889c4d093f8a990ccd3f941cf0bd6b78404aa181416c6d856e3b70115f2","8fe156b1d07c194843a01048c28f920fb155943097eec7b3e06c23fa238cf29f","1249c8a45fe697d72e57c06af96b5b1b1fd02fe0ecdeaa24b5e42676e1686b39","d25f406cdc96422dc6e297a4fc1ea5f08a64ac5f917a70d634bb336e9faf2bd4","c066f545f56d4a7ceb40c7ba6f65af579295560016fd32cef080ac44e9a1437f","fef37fa42bdf34c9082bbdc575cc7e6f13eb9bb57752aa627aad29a648a540c8","7cac9e7dc9264c05eb8b8bd22289f2a4452f97a06daf49b306b76d3106b523c8","fe33311e48e4bcfb8618123fb0134917d3e5f282de6febbfb711c91a2af4f8e0","138ce2f3a7361fe0151dc4fa5720981e62631e3a6503f18d8f4adec58be90da7","fcd22ca9951b617db6b7e805e4dd290a925da6df49e8cbe4818b557bc4ba72c8","41c71bd48f563ed0c2643897c7580c3473a2c45de816131c7f497ada25aa4aca","d3bd74d3efb3eedf8ef3202bd4633e0078a2f0c071347b84ee5e9655c72ec842","396cba6f686e1e46bab41d2796f030d2005694313bd86b0199711eb811661237","3227f8860dca1346c30b08a6b2d66749d65f6ffaab10bc1f1bbad9db23583ac5","1e6bcca7dec48f12c2eb622d3e75a503abd1a8786b28e4c5ab9aeeabaa4db520","817f82dc697d9df3ad46d5790d6fffa3fa490c77a88488f64ab6cad508d5a94f","e18396704db58a17a9b6bc0203e69648d35e23bcb5d654183ff5aa3ebe0cfcc7","c73047306842c0bf13cd3f7b3be3af76e8d58ad16ab549a8812c4f51e4b7f76f","7faca21e2c4e0119f1386f27695516fabc4bceca350e96f6e5c37a45605779bf",{"version":"922d92b500c5359d96b1eff81fe281d1f5350120db253773a3f1c85985c4a9bf","impliedFormat":1},{"version":"ac4efaa37cc9798679da23050bd4e374affb69acda810572d73b11fce731308a","impliedFormat":1},{"version":"c477f69ebfcd6153946ce95799cf49b1c7bce11cec250dab336516b5ad27d72b","impliedFormat":1},{"version":"6355649c4afa3e56a8dd808c3330952154d900bdab5a078dbaffe3974c7baab2","impliedFormat":1},{"version":"5e7185c89a21a5406274b1f010bdce770ad45e7cf09a8b8b346bac352939164a","impliedFormat":1},{"version":"9e9df7677da806cf5eabc7899cb66f6eb075f6c20ed1761a2e882c46883d1ce6","impliedFormat":1},{"version":"633a12dbfb5225a7284b1fa29993f681edf1fe4b36178650d6b4ea1962307f07","impliedFormat":1},{"version":"31ba0d4593007ba73ea1cff32896f6ba551a5794a880c032df2d10aecbc82fe6","impliedFormat":1},{"version":"b4f9fb54a352a0319f6de11eb784b8c9be6aa7b0c65e2fbc8e6822c8f4622ec5","impliedFormat":1},{"version":"24fd9b011d5f800715009959e4c9fcf8dc8a458d4d72e762380e8031f16be8cc","impliedFormat":1},{"version":"bd9462141e563c72110be58bc0e62ca260a62abe07cb4c951d64e636eee9fa60","impliedFormat":1},{"version":"1147ac71b3cfc8d6e9ebf4bf06435bd0a5b6d72a5457b7b00428f218bd01c2e7","impliedFormat":1},{"version":"9a643956e978408cff58f04e3001a41384ed0b4b6f43eeb2a9f91a70f56d2131","impliedFormat":1},{"version":"94d96cc9eb83bf3f3b67497f77d53298fed988c2a00899ba18bc23a8455a6064","impliedFormat":1},{"version":"446d5326728f7110b6180431f407bd8a8344129621fb22130cfdb618aa62e514","impliedFormat":1},{"version":"025b16217c6d980741432fc156bdcbe22b1084f8d1f3f472f6601f09f7853415","impliedFormat":1},{"version":"afb4fe76ed12d1b7b8724321e0f13aab912e633899f7c3e37074035ee9cff91e","impliedFormat":1},{"version":"490621c395bfa973fa6a8c4afc16ccb196a5aac60b55c61d98050ce4990520a5","impliedFormat":1},{"version":"c38e7e1b936c9a8e3f01e291dbc228232c9b61ce96bdfeb78dbc3b74f987c49c","impliedFormat":1},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"e720c8a37b87f5713093ed04015dbc647996545ffc0fdf07885f444af738dcff","impliedFormat":99},{"version":"f73b596cb4b4860fd0a3ea8cab67a42ad344d95a392ca986ca4588f59ea8c2cf","impliedFormat":99},{"version":"29b9ed9e1bccc6eff19b59c3f361ee102d8a77f4409fdb56a642a09cd4142d80","impliedFormat":1},{"version":"219afaff7dd670d2b610e23f8ea09d4982a947516074fb55b7f8f2f218f8da31","impliedFormat":1},{"version":"f3233f848276835085121850b21375b1ae23b1d558e12b520c42e99f19517b05","impliedFormat":1},{"version":"12395b35d56e3162be3e6ff07945f8c385351af536c735958eba430c387fbb3f","impliedFormat":1},{"version":"9bb4778628c37e1e4f0f8379339dcd75bfae5d47fc1fb96673b4fe3f8b328197","impliedFormat":1},{"version":"73a4f0c06fbb2a75e748dae42517c062ad303b0a43d302e8fc2ff89e92f0ecde","impliedFormat":1},{"version":"1f8cd888d94150cec2d0c3b5c734caaabaa418cd10d25463c82718979ec3bec8","impliedFormat":1},{"version":"c6a6c807ba136407c33e425c37a02550b3d729deb0a4a5bb8e7cdef29eea6814","impliedFormat":1},{"version":"ddd271c30afbb3ad41466f9dd0702c868ef992912684162952b976f436dde50c","impliedFormat":1},{"version":"4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd","impliedFormat":1},{"version":"cf93e7b09b66e142429611c27ba2cbf330826057e3c793e1e2861e976fae3940","impliedFormat":99},{"version":"90e727d145feb03695693fdc9f165a4dc10684713ee5f6aa81e97a6086faa0f8","impliedFormat":99},{"version":"ee2c6ec73c636c9da5ab4ce9227e5197f55a57241d66ea5828f94b69a4a09a2d","impliedFormat":99},{"version":"afaf64477630c7297e3733765046c95640ab1c63f0dfb3c624691c8445bc3b08","impliedFormat":99},{"version":"5aa03223a53ad03171988820b81a6cae9647eabcebcb987d1284799de978d8e3","impliedFormat":99},{"version":"7f50c8914983009c2b940923d891e621db624ba32968a51db46e0bf480e4e1cb","impliedFormat":99},{"version":"90fc18234b7d2e19d18ac026361aaf2f49d27c98dc30d9f01e033a9c2b01c765","impliedFormat":99},{"version":"a980e4d46239f344eb4d5442b69dcf1d46bd2acac8d908574b5a507181f7e2a1","impliedFormat":99},{"version":"bbbfa4c51cdaa6e2ef7f7be3ae199b319de6b31e3b5afa7e5a2229c14bb2568a","impliedFormat":99},{"version":"bc7bfe8f48fa3067deb3b37d4b511588b01831ba123a785ea81320fe74dd9540","impliedFormat":99},{"version":"fd60c0aaf7c52115f0e7f367d794657ac18dbb257255777406829ab65ca85746","impliedFormat":99},{"version":"15c17866d58a19f4a01a125f3f511567bd1c22235b4fd77bf90c793bf28388c3","impliedFormat":99},{"version":"51301a76264b1e1b4046f803bda44307fba403183bc274fe9e7227252d7315cb","impliedFormat":99},{"version":"ddef23e8ace6c2b2ddf8d8092d30b1dd313743f7ff47b2cbb43f36c395896008","impliedFormat":99},{"version":"9e42df47111429042b5e22561849a512ad5871668097664b8fb06a11640140ac","impliedFormat":99},{"version":"391fcc749c6f94c6c4b7f017c6a6f63296c1c9ae03fa639f99337dddb9cc33fe","impliedFormat":99},{"version":"ac4706eb1fb167b19f336a93989763ab175cd7cc6227b0dcbfa6a7824c6ba59a","impliedFormat":99},{"version":"633220dc1e1a5d0ccf11d3c3e8cadc9124daf80fef468f2ff8186a2775229de3","impliedFormat":99},{"version":"6de22ad73e332e513454f0292275155d6cb77f2f695b73f0744928c4ebb3a128","impliedFormat":99},{"version":"ebe0e3c77f5114b656d857213698fade968cff1b3a681d1868f3cfdd09d63b75","impliedFormat":99},{"version":"22c27a87488a0625657b52b9750122814c2f5582cac971484cda0dcd7a46dc3b","impliedFormat":99},{"version":"7e7a817c8ec57035b2b74df8d5dbcc376a4a60ad870b27ec35463536158e1156","impliedFormat":99},{"version":"0e2061f86ca739f34feae42fd7cce27cc171788d251a587215b33eaec456e786","impliedFormat":99},{"version":"91659b2b090cadffdb593736210910508fc5b77046d4ce180b52580b14b075ec","impliedFormat":99},{"version":"d0f6c657c45faaf576ca1a1dc64484534a8dc74ada36fd57008edc1aab65a02b","impliedFormat":99},{"version":"ce0c52b1ebc023b71d3c1fe974804a2422cf1d85d4af74bb1bced36ff3bff8b5","impliedFormat":99},{"version":"9c6acb4a388887f9a5552eda68987ee5d607152163d72f123193a984c48157c9","impliedFormat":99},{"version":"90d0a9968cbb7048015736299f96a0cceb01cf583fd2e9a9edbc632ac4c81b01","impliedFormat":99},{"version":"49abec0571c941ab6f095885a76828d50498511c03bb326eec62a852e58000c5","impliedFormat":99},{"version":"8eeb4a4ff94460051173d561749539bca870422a6400108903af2fb7a1ffe3d7","impliedFormat":99},{"version":"49e39b284b87452fed1e27ac0748ba698f5a27debe05084bc5066b3ecf4ed762","impliedFormat":99},{"version":"59dcf835762f8df90fba5a3f8ba87941467604041cf127fb456543c793b71456","impliedFormat":99},{"version":"33e0c4c683dcaeb66bedf5bb6cc35798d00ac58d7f3bc82aadb50fa475781d60","impliedFormat":99},{"version":"605839abb6d150b0d83ed3712e1b3ffbeb309e382770e7754085d36bc2d84a4c","impliedFormat":99},{"version":"a862dcb740371257e3dae1ab379b0859edcb5119484f8359a5e6fb405db9e12e","impliedFormat":99},{"version":"0f0a16a0e8037c17e28f537028215e87db047eba52281bd33484d5395402f3c1","impliedFormat":99},{"version":"cf533aed4c455b526ddccbb10dae7cc77e9269c3d7862f9e5cedbd4f5c92e05e","impliedFormat":99},{"version":"f8a60ca31702a0209ef217f8f3b4b32f498813927df2304787ac968c78d8560d","impliedFormat":99},{"version":"530192961885d3ddad87bf9c4390e12689fa29ff515df57f17a57c9125fc77c3","impliedFormat":99},{"version":"165ba9e775dd769749e2177c383d24578e3b212e4774b0a72ad0f6faee103b68","impliedFormat":99},{"version":"61448f238fdfa94e5ccce1f43a7cced5e548b1ea2d957bec5259a6e719378381","impliedFormat":99},{"version":"69fa523e48131ced0a52ab1af36c3a922c5fd7a25e474d82117329fe051f5b85","impliedFormat":99},{"version":"fa10b79cd06f5dd03435e184fb05cc5f0d02713bfb4ee9d343db527501be334c","impliedFormat":99},{"version":"c6fb591e363ee4dea2b102bb721c0921485459df23a2d2171af8354cacef4bce","impliedFormat":99},{"version":"ea7e1f1097c2e61ed6e56fa04a9d7beae9d276d87ac6edb0cd39a3ee649cddfe","impliedFormat":99},{"version":"e8cf2659d87462aae9c7647e2a256ac7dcaf2a565a9681bfb49328a8a52861e8","impliedFormat":99},{"version":"7e374cb98b705d35369b3c15444ef2ff5ff983bd2fbb77a287f7e3240abf208c","impliedFormat":99},{"version":"ca75ba1519f9a426b8c512046ebbad58231d8627678d054008c93c51bc0f3fa5","impliedFormat":99},{"version":"ff63760147d7a60dcfc4ac16e40aa2696d016b9ffe27e296b43655dfa869d66b","impliedFormat":99},{"version":"4d434123b16f46b290982907a4d24675442eb651ca95a5e98e4c274be16f1220","impliedFormat":99},{"version":"57263d6ba38046e85f499f3c0ab518cfaf0a5f5d4f53bdae896d045209ab4aff","impliedFormat":99},{"version":"d3a535f2cd5d17f12b1abf0b19a64e816b90c8c10a030b58f308c0f7f2acfe2c","impliedFormat":99},{"version":"be26d49bb713c13bd737d00ae8a61aa394f0b76bc2d5a1c93c74f59402eb8db3","impliedFormat":99},{"version":"c7012003ac0c9e6c9d3a6418128ddebf6219d904095180d4502b19c42f46a186","impliedFormat":99},{"version":"d58c55750756bcf73f474344e6b4a9376e5381e4ba7d834dc352264b491423b6","impliedFormat":99},{"version":"01e2aabfabe22b4bf6d715fc54d72d32fa860a3bd1faa8974e0d672c4b565dfe","impliedFormat":99},{"version":"ba2c489bb2566c16d28f0500b3d98013917e471c40a4417c03991460cb248e88","impliedFormat":99},{"version":"39f94b619f0844c454a6f912e5d6868d0beb32752587b134c3c858b10ecd7056","impliedFormat":99},{"version":"0d2d8b0477b1cf16b34088e786e9745c3e8145bc8eea5919b700ad054e70a095","impliedFormat":99},{"version":"2a5e963b2b8f33a50bb516215ba54a20801cb379a8e9b1ae0b311e900dc7254c","impliedFormat":99},{"version":"d8307f62b55feeb5858529314761089746dce957d2b8fd919673a4985fa4342a","impliedFormat":99},{"version":"bf449ec80fc692b2703ad03e64ae007b3513ecd507dc2ab77f39be6f578e6f5c","impliedFormat":99},{"version":"f780213dd78998daf2511385dd51abf72905f709c839a9457b6ba2a55df57be7","impliedFormat":99},{"version":"2b7843e8a9a50bdf511de24350b6d429a3ee28430f5e8af7d3599b1e9aa7057f","impliedFormat":99},{"version":"05d95be6e25b4118c2eb28667e784f0b25882f6a8486147788df675c85391ab7","impliedFormat":99},{"version":"62d2721e9f2c9197c3e2e5cffeb2f76c6412121ae155153179049890011eb785","impliedFormat":99},{"version":"ff5668fb7594c02aca5e7ba7be6c238676226e450681ca96b457f4a84898b2d9","impliedFormat":99},{"version":"59fd37ea08657fef36c55ddea879eae550ffe21d7e3a1f8699314a85a30d8ae9","impliedFormat":99},{"version":"84e23663776e080e18b25052eb3459b1a0486b5b19f674d59b96347c0cb7312a","impliedFormat":99},{"version":"43e5934c7355731eec20c5a2aa7a859086f19f60a4e5fcd80e6684228f6fb767","impliedFormat":99},{"version":"a49c210c136c518a7c08325f6058fc648f59f911c41c93de2026db692bba0e47","impliedFormat":99},{"version":"1a92f93597ebc451e9ef4b158653c8d31902de5e6c8a574470ecb6da64932df4","impliedFormat":99},{"version":"256513ad066ac9898a70ca01e6fbdb3898a4e0fe408fbf70608fdc28ac1af224","impliedFormat":99},{"version":"d9835850b6cc05c21e8d85692a8071ebcf167a4382e5e39bf700c4a1e816437e","impliedFormat":99},{"version":"e5ab7190f818442e958d0322191c24c2447ddceae393c4e811e79cda6bd49836","impliedFormat":99},{"version":"91b4b77ef81466ce894f1aade7d35d3589ddd5c9981109d1dea11f55a4b807a0","impliedFormat":99},{"version":"03abb209bed94c8c893d9872639e3789f0282061c7aa6917888965e4047a8b5f","impliedFormat":99},{"version":"e97a07901de562219f5cba545b0945a1540d9663bd9abce66495721af3903eec","impliedFormat":99},{"version":"bf39ed1fdf29bc8178055ec4ff32be6725c1de9f29c252e31bdc71baf5c227e6","impliedFormat":99},{"version":"985eabf06dac7288fc355435b18641282f86107e48334a83605739a1fe82ac15","impliedFormat":99},{"version":"6112d33bcf51e3e6f6a81e419f29580e2f8e773529d53958c7c1c99728d4fb2e","impliedFormat":99},{"version":"89e9f7e87a573504acc2e7e5ad727a110b960330657d1b9a6d3526e77c83d8be","impliedFormat":99},{"version":"44bbb88abe9958c7c417e8687abf65820385191685009cc4b739c2d270cb02e9","impliedFormat":99},{"version":"ab4b506b53d2c4aec4cc00452740c540a0e6abe7778063e95c81a5cd557c19eb","impliedFormat":99},{"version":"858757bde6d615d0d1ee474c972131c6d79c37b0b61897da7fbd7110beb8af12","impliedFormat":99},{"version":"60b9dea33807b086a1b4b4b89f72d5da27ad0dd36d6436a6e306600c47438ac4","impliedFormat":99},{"version":"409c963b1166d0c1d49fdad1dfeb4de27fd2d6662d699009857de9baf43ca7c3","impliedFormat":99},{"version":"b7674ecfeb5753e965404f7b3d31eec8450857d1a23770cb867c82f264f546ab","impliedFormat":99},{"version":"c9800b9a9ad7fcdf74ed8972a5928b66f0e4ff674d55fd038a3b1c076911dcbe","impliedFormat":99},{"version":"99864433e35b24c61f8790d2224428e3b920624c01a6d26ea8b27ee1f62836bb","impliedFormat":99},{"version":"c391317b9ff8f87d28c6bfe4e50ed92e8f8bfab1bb8a03cd1fe104ff13186f83","impliedFormat":99},{"version":"42bdc3c98446fdd528e2591213f71ce6f7008fb9bb12413bd57df60d892a3fb5","impliedFormat":99},{"version":"542d2d689b58c25d39a76312ccaea2fcd10a45fb27b890e18015399c8032e2d9","impliedFormat":99},{"version":"97d1656f0a563dbb361d22b3d7c2487427b0998f347123abd1c69a4991326c96","impliedFormat":99},{"version":"d4f53ed7960c9fba8378af3fa28e3cc483d6c0b48e4a152a83ff0973d507307d","impliedFormat":99},{"version":"0665de5280d65ec32776dc55fb37128e259e60f389cde5b9803cf9e81ad23ce0","impliedFormat":99},{"version":"b6dc8fd1c6092da86725c338ca6c263d1c6dd3073046d3ec4eb2d68515062da2","impliedFormat":99},{"version":"d9198a0f01f00870653347560e10494efeca0bfa2de0988bd5d883a9d2c47edb","impliedFormat":99},{"version":"d4279865b926d7e2cfe8863b2eae270c4c035b6e923af8f9d7e6462d68679e07","impliedFormat":99},{"version":"73b6945448bb3425b764cfe7b1c4b0b56c010cc66e5f438ef320c53e469797eb","impliedFormat":99},{"version":"cf72fd8ffa5395f4f1a26be60246ec79c5a9ad201579c9ba63fd2607b5daf184","impliedFormat":99},{"version":"301a458744666096f84580a78cc3f6e8411f8bab92608cdaa33707546ca2906f","impliedFormat":99},{"version":"711e70c0916ff5f821ea208043ecd3e67ed09434b8a31d5616286802b58ebebe","impliedFormat":99},{"version":"e1f2fd9f88dd0e40c358fbf8c8f992211ab00a699e7d6823579b615b874a8453","impliedFormat":99},{"version":"17db3a9dcb2e1689ff7ace9c94fa110c88da64d69f01dc2f3cec698e4fc7e29e","impliedFormat":99},{"version":"73fb07305106bb18c2230890fcacf910fd1a7a77d93ac12ec40bc04c49ee5b8e","impliedFormat":99},{"version":"2c5f341625a45530b040d59a4bc2bc83824d258985ede10c67005be72d3e21d0","impliedFormat":99},{"version":"c4a262730d4277ecaaf6f6553dabecc84dcca8decaebbf2e16f1df8bbd996397","impliedFormat":99},{"version":"c23c533d85518f3358c55a7f19ab1a05aad290251e8bba0947bd19ea3c259467","impliedFormat":99},{"version":"5d0322a0b8cdc67b8c71e4ccaa30286b0c8453211d4c955a217ac2d3590e911f","impliedFormat":99},{"version":"f5e4032b6e4e116e7fec5b2620a2a35d0b6b8b4a1cc9b94a8e5ee76190153110","impliedFormat":99},{"version":"9ab26cb62a0e86ab7f669c311eb0c4d665457eb70a103508aa39da6ccee663da","impliedFormat":99},{"version":"5f64d1a11d8d4ce2c7ee3b72471df76b82d178a48964a14cdfdc7c5ef7276d70","impliedFormat":99},{"version":"24e2fbc48f65814e691d9377399807b9ec22cd54b51d631ba9e48ee18c5939dd","impliedFormat":99},{"version":"bfa2648b2ee90268c6b6f19e84da3176b4d46329c9ec0555d470e647d0568dfb","impliedFormat":99},{"version":"75ef3cb4e7b3583ba268a094c1bd16ce31023f2c3d1ac36e75ca65aca9721534","impliedFormat":99},{"version":"3be6b3304a81d0301838860fd3b4536c2b93390e785808a1f1a30e4135501514","impliedFormat":99},{"version":"da66c1b3e50ef9908e31ce7a281b137b2db41423c2b143c62524f97a536a53d9","impliedFormat":99},{"version":"3ada1b216e45bb9e32e30d8179a0a95870576fe949c33d9767823ccf4f4f4c97","impliedFormat":99},{"version":"1ace2885dffab849f7c98bffe3d1233260fbf07ee62cb58130167fd67a376a65","impliedFormat":99},{"version":"2126e5989c0ca5194d883cf9e9c10fe3e5224fbd3e4a4a6267677544e8be0aae","impliedFormat":99},{"version":"41a6738cf3c756af74753c5033e95c5b33dfc1f6e1287fa769a1ac4027335bf5","impliedFormat":99},{"version":"6e8630be5b0166cbc9f359b9f9e42801626d64ff1702dcb691af811149766154","impliedFormat":99},{"version":"e36b77c04e00b4a0bb4e1364f2646618a54910c27f6dc3fc558ca2ced8ca5bc5","impliedFormat":99},{"version":"2c4ea7e9f95a558f46c89726d1fedcb525ef649eb755a3d7d5055e22b80c2904","impliedFormat":99},{"version":"4875d65190e789fad05e73abd178297b386806b88b624328222d82e455c0f2e7","impliedFormat":99},{"version":"bf5302ecfaacee37c2316e33703723d62e66590093738c8921773ee30f2ecc38","impliedFormat":99},{"version":"62684064fe034d54b87f62ad416f41b98a405dee4146d0ec03b198c3634ea93c","impliedFormat":99},{"version":"be02cbdb1688c8387f8a76a9c6ed9d75d8bb794ec5b9b1d2ba3339a952a00614","impliedFormat":99},{"version":"cefaff060473a5dbf4939ee1b52eb900f215f8d6249dc7c058d6b869d599983c","impliedFormat":99},{"version":"b2797235a4c1a7442a6f326f28ffb966226c3419399dbb33634b8159af2c712f","impliedFormat":99},{"version":"164d633bbd4329794d329219fc173c3de85d5ad866d44e5b5f0fb60c140e98f2","impliedFormat":99},{"version":"b74300dd0a52eaf564b3757c07d07e1d92def4e3b8708f12eedb40033e4cafe9","impliedFormat":99},{"version":"a792f80b1e265b06dce1783992dbee2b45815a7bdc030782464b8cf982337cf2","impliedFormat":99},{"version":"8816b4b3a87d9b77f0355e616b38ed5054f993cc4c141101297f1914976a94b1","impliedFormat":99},{"version":"0f35e4da974793534c4ca1cdd9491eab6993f8cf47103dadfc048b899ed9b511","impliedFormat":99},{"version":"0ccdfcaebf297ec7b9dde20bbbc8539d5951a3d8aaa40665ca469da27f5a86e1","impliedFormat":99},{"version":"7fcb05c8ce81f05499c7b0488ae02a0a1ac6aebc78c01e9f8c42d98f7ba68140","impliedFormat":99},{"version":"81c376c9e4d227a4629c7fca9dde3bbdfa44bd5bd281aee0ed03801182368dc5","impliedFormat":99},{"version":"0f2448f95110c3714797e4c043bbc539368e9c4c33586d03ecda166aa9908843","impliedFormat":99},{"version":"b2f1a443f7f3982d7325775906b51665fe875c82a62be3528a36184852faa0bb","impliedFormat":99},{"version":"7568ff1f23363d7ee349105eb936e156d61aea8864187a4c5d85c60594b44a25","impliedFormat":99},{"version":"8c4d1d9a4eba4eac69e6da0f599a424b2689aee55a455f0b5a7f27a807e064db","impliedFormat":99},{"version":"e1beb9077c100bdd0fc8e727615f5dae2c6e1207de224569421907072f4ec885","impliedFormat":99},{"version":"3dda13836320ec71b95a68cd3d91a27118b34c05a2bfda3e7e51f1d8ca9b960b","impliedFormat":99},{"version":"fedc79cb91f2b3a14e832d7a8e3d58eb02b5d5411c843fcbdc79e35041316b36","impliedFormat":99},{"version":"99f395322ffae908dcdfbaa2624cc7a2a2cb7b0fbf1a1274aca506f7b57ebcb5","impliedFormat":99},{"version":"5e1f7c43e8d45f2222a5c61cbc88b074f4aaf1ca4b118ac6d6123c858efdcd71","impliedFormat":99},{"version":"7388273ab71cb8f22b3f25ffd8d44a37d5740077c4d87023da25575204d57872","impliedFormat":99},{"version":"0a48ceb01a0fdfc506aa20dfd8a3563edbdeaa53a8333ddf261d2ee87669ea7b","impliedFormat":99},{"version":"3182d06b874f31e8e55f91ea706c85d5f207f16273480f46438781d0bd2a46a1","impliedFormat":99},{"version":"ccd47cab635e8f71693fa4e2bbb7969f559972dae97bd5dbd1bbfee77a63b410","impliedFormat":99},{"version":"89770fa14c037f3dc3882e6c56be1c01bb495c81dec96fa29f868185d9555a5d","impliedFormat":99},{"version":"7048c397f08c54099c52e6b9d90623dc9dc6811ea142f8af3200e40d66a972e1","impliedFormat":99},{"version":"512120cd6f026ce1d3cf686c6ab5da80caa40ef92aa47466ec60ba61a48b5551","impliedFormat":99},{"version":"6cd0cb7f999f221e984157a7640e7871960131f6b221d67e4fdc2a53937c6770","impliedFormat":99},{"version":"f48b84a0884776f1bc5bf0fcf3f69832e97b97dc55d79d7557f344de900d259b","impliedFormat":99},{"version":"dca490d986411644b0f9edf6ea701016836558e8677c150dca8ad315178ec735","impliedFormat":99},{"version":"a028a04948cf98c1233166b48887dad324e8fe424a4be368a287c706d9ccd491","impliedFormat":99},{"version":"3046ed22c701f24272534b293c10cfd17b0f6a89c2ec6014c9a44a90963dfa06","impliedFormat":99},{"version":"394da10397d272f19a324c95bea7492faadf2263da157831e02ae1107bd410f5","impliedFormat":99},{"version":"0580595a99248b2d30d03f2307c50f14eb21716a55beb84dd09d240b1b087a42","impliedFormat":99},{"version":"a7da9510150f36a9bea61513b107b59a423fdff54429ad38547c7475cd390e95","impliedFormat":99},{"version":"659615f96e64361af7127645bb91f287f7b46c5d03bea7371e6e02099226d818","impliedFormat":99},{"version":"1f2a42974920476ce46bb666cd9b3c1b82b2072b66ccd0d775aa960532d78176","impliedFormat":99},{"version":"500b3ae6095cbab92d81de0b40c9129f5524d10ad955643f81fc07d726c5a667","impliedFormat":99},{"version":"a957ad4bd562be0662fb99599dbcf0e16d1631f857e5e1a83a3f3afb6c226059","impliedFormat":99},{"version":"e57a4915266a6a751c6c172e8f30f6df44a495608613e1f1c410196207da9641","impliedFormat":99},{"version":"7a12e57143b7bc5a52a41a8c4e6283a8f8d59a5e302478185fb623a7157fff5e","impliedFormat":99},{"version":"17b3426162e1d9cb0a843e8d04212aabe461d53548e671236de957ed3ae9471b","impliedFormat":99},{"version":"f38e86eb00398d63180210c5090ef6ed065004474361146573f98b3c8a96477d","impliedFormat":99},{"version":"231d9e32382d3971f58325e5a85ba283a2021243651cb650f82f87a1bf62d649","impliedFormat":99},{"version":"6532e3e87b87c95f0771611afce929b5bad9d2c94855b19b29b3246937c9840b","impliedFormat":99},{"version":"65704bbb8f0b55c73871335edd3c9cead7c9f0d4b21f64f5d22d0987c45687f0","impliedFormat":99},{"version":"787232f574af2253ac860f22a445c755d57c73a69a402823ae81ba0dfdd1ce23","impliedFormat":99},{"version":"5e63903cd5ebce02486b91647d951d61a16ad80d65f9c56581cd624f39a66007","impliedFormat":99},{"version":"bcc89a120d8f3c02411f4df6b1d989143c01369314e9b0e04794441e6b078d22","impliedFormat":99},{"version":"d17531ef42b7c76d953f63bd5c5cd927c4723e62a7e0b2badf812d5f35f784eb","impliedFormat":99},{"version":"6d4ee1a8e3a97168ea4c4cc1c68bb61a3fd77134f15c71bb9f3f63df3d26b54c","impliedFormat":99},{"version":"1eb04fea6b47b16922ed79625d90431a8b2fc7ba9d5768b255e62df0c96f1e3a","impliedFormat":99},{"version":"de0c2eece83bd81b8682f4496f558beb728263e17e74cbc4910e5c9ce7bef689","impliedFormat":99},{"version":"98866542d45306dab48ecc3ddd98ee54fa983353bc3139dfbc619df882f54d90","impliedFormat":99},{"version":"9e04c7708917af428c165f1e38536ddb2e8ecd576f55ed11a97442dc34b6b010","impliedFormat":99},{"version":"31fe6f6d02b53c1a7c34b8d8f8c87ee9b6dd4b67f158cbfff3034b4f3f69c409","impliedFormat":99},{"version":"2e1d853f84188e8e002361f4bfdd892ac31c68acaeac426a63cd4ff7abf150d0","impliedFormat":99},{"version":"666b5289ec8a01c4cc0977c62e3fd32e89a8e3fd9e97c8d8fd646f632e63c055","impliedFormat":99},{"version":"a1107bbb2b10982dba1f7958a6a5cf841e1a19d6976d0ecdc4c43269c7b0eaf2","impliedFormat":99},{"version":"07fa6122f7495331f39167ec9e4ebd990146a20f99c16c17bc0a98aa81f63b27","impliedFormat":99},{"version":"39c1483481b35c2123eaab5094a8b548a0c3f1e483ab7338102c3291f1ab18bf","impliedFormat":99},{"version":"b73e6242c13796e7d5fba225bf1c07c8ee66d31b7bb65f45be14226a9ae492d2","impliedFormat":99},{"version":"f2931608d541145d189390d6cfb74e1b1e88f73c0b9a80c4356a4daa7fa5e005","impliedFormat":99},{"version":"8684656fe3bf1425a91bd62b8b455a1c7ec18b074fd695793cfae44ae02e381a","impliedFormat":99},{"version":"ccf0b9057dd65c7fb5e237de34f706966ebc30c6d3669715ed05e76225f54fbd","impliedFormat":99},{"version":"d930f077da575e8ea761e3d644d4c6279e2d847bae2b3ea893bbd572315acc21","impliedFormat":99},{"version":"19b0616946cb615abde72c6d69049f136cc4821b784634771c1d73bec8005f73","impliedFormat":99},{"version":"553312560ad0ef97b344b653931935d6e80840c2de6ab90b8be43cbacf0d04cf","impliedFormat":99},{"version":"1225cf1910667bfd52b4daa9974197c3485f21fe631c3ce9db3b733334199faa","impliedFormat":99},{"version":"f7cb9e46bd6ab9d620d68257b525dbbbbc9b0b148adf500b819d756ebc339de0","impliedFormat":99},{"version":"e46d6c3120aca07ae8ec3189edf518c667d027478810ca67a62431a0fa545434","impliedFormat":99},{"version":"9d234b7d2f662a135d430d3190fc21074325f296273125244b2bf8328b5839a0","impliedFormat":99},{"version":"0554ef14d10acea403348c53436b1dd8d61e7c73ef5872e2fe69cc1c433b02f8","impliedFormat":99},{"version":"2f6ae5538090db60514336bd1441ca208a8fab13108cfa4b311e61eaca5ff716","impliedFormat":99},{"version":"17bf4ce505a4cff88fb56177a8f7eb48aa55c22ccc4cce3e49cc5c8ddc54b07d","impliedFormat":99},{"version":"3d735f493d7da48156b79b4d8a406bf2bbf7e3fe379210d8f7c085028143ee40","impliedFormat":99},{"version":"41de1b3ddd71bd0d9ed7ac217ca1b15b177dd731d5251cde094945c20a715d03","impliedFormat":99},{"version":"17d9c562a46c6a25bc2f317c9b06dd4e8e0368cbe9bdf89be6117aeafd577b36","impliedFormat":99},{"version":"ded799031fe18a0bb5e78be38a6ae168458ff41b6c6542392b009d2abe6a6f32","impliedFormat":99},{"version":"ed48d467a7b25ee1a2769adebc198b647a820e242c96a5f96c1e6c27a40ab131","impliedFormat":99},{"version":"b914114df05f286897a1ae85d2df39cfd98ed8da68754d73cf830159e85ddd15","impliedFormat":99},{"version":"73881e647da3c226f21e0b80e216feaf14a5541a861494c744e9fbe1c3b3a6af","impliedFormat":99},{"version":"d79e1d31b939fa99694f2d6fbdd19870147401dbb3f42214e84c011e7ec359ab","impliedFormat":99},{"version":"4f71097eae7aa37941bab39beb2e53e624321fd341c12cc1d400eb7a805691ff","impliedFormat":99},{"version":"58ebb4f21f3a90dda31a01764462aa617849fdb1b592f3a8d875c85019956aff","impliedFormat":99},{"version":"a8e8d0e6efff70f3c28d3e384f9d64530c7a7596a201e4879a7fd75c7d55cbb5","impliedFormat":99},{"version":"df5cbb80d8353bf0511a4047cc7b8434b0be12e280b6cf3de919d5a3380912c0","impliedFormat":99},{"version":"256eb0520e822b56f720962edd7807ed36abdf7ea23bcadf4a25929a3317c8cf","impliedFormat":99},{"version":"9cf2cbc9ceb5f718c1705f37ce5454f14d3b89f690d9864394963567673c1b5c","impliedFormat":99},{"version":"07d3dd790cf1e66bb6fc9806d014dd40bb2055f8d6ca3811cf0e12f92ba4cb9a","impliedFormat":99},{"version":"1f99fd62e9cff9b50c36f368caf3b9fb79fc6f6c75ca5d3c2ec4afaea08d9109","impliedFormat":99},{"version":"6558faaacba5622ef7f1fdfb843cd967af2c105469b9ff5c18a81ce85178fca7","impliedFormat":99},{"version":"34e7f17ae9395b0269cd3f2f0af10709e6dc975c5b44a36b6b70442dc5e25a38","impliedFormat":99},{"version":"a4295111b54f84c02c27e46b0855b02fad3421ae1d2d7e67ecf16cb49538280a","impliedFormat":99},{"version":"ce9746b2ceae2388b7be9fe1f009dcecbc65f0bdbc16f40c0027fab0fb848c3b","impliedFormat":99},{"version":"35ce823a59f397f0e85295387778f51467cea137d787df385be57a2099752bfb","impliedFormat":99},{"version":"2e5acd3ec67bc309e4f679a70c894f809863c33b9572a8da0b78db403edfa106","impliedFormat":99},{"version":"1872f3fcea0643d5e03b19a19d777704320f857d1be0eb4ee372681357e20c88","impliedFormat":99},{"version":"9689628941205e40dcbb2706d1833bd00ce7510d333b2ef08be24ecbf3eb1a37","impliedFormat":99},{"version":"0317a72a0b63094781476cf1d2d27585d00eb2b0ca62b5287124735912f3d048","impliedFormat":99},{"version":"6ce4c0ab3450a4fff25d60a058a25039cffd03141549589689f5a17055ad0545","impliedFormat":99},{"version":"9153ec7b0577ae77349d2c5e8c5dd57163f41853b80c4fb5ce342c7a431cbe1e","impliedFormat":99},{"version":"f490dfa4619e48edd594a36079950c9fca1230efb3a82aaf325047262ba07379","impliedFormat":99},{"version":"674f00085caff46d2cbc76fc74740fd31f49d53396804558573421e138be0c12","impliedFormat":99},{"version":"41d029194c4811f09b350a1e858143c191073007a9ee836061090ed0143ad94f","impliedFormat":99},{"version":"44a6259ffd6febd8510b9a9b13a700e1d022530d8b33663f0735dbb3bee67b3d","impliedFormat":99},{"version":"6f4322500aff8676d9b8eef7711c7166708d4a0686b792aa4b158e276ed946a7","impliedFormat":99},{"version":"e829ff9ecffa3510d3a4d2c3e4e9b54d4a4ccfef004bacbb1d6919ce3ccca01f","impliedFormat":99},{"version":"62e6fec9dbd012460b47af7e727ec4cd34345b6e4311e781f040e6b640d7f93e","impliedFormat":99},{"version":"4d180dd4d0785f2cd140bc069d56285d0121d95b53e4348feb4f62db2d7035d3","impliedFormat":99},{"version":"f1142cbba31d7f492d2e7c91d82211a8334e6642efe52b71d9a82cb95ba4e8ae","impliedFormat":99},{"version":"279cac827be5d48c0f69fe319dc38c876fdd076b66995d9779c43558552d8a50","impliedFormat":99},{"version":"a70ff3c65dc0e7213bfe0d81c072951db9f5b1e640eb66c1eaed0737879c797b","impliedFormat":99},{"version":"f75d3303c1750f4fdacd23354657eca09aae16122c344e65b8c14c570ff67df5","impliedFormat":99},{"version":"3ebae6a418229d4b303f8e0fdb14de83f39fba9f57b39d5f213398bca72137c7","impliedFormat":99},{"version":"21ba07e33265f59d52dece5ac44f933b2b464059514587e64ad5182ddf34a9b0","impliedFormat":99},{"version":"2d3d96efba00493059c460fd55e6206b0667fc2e73215c4f1a9eb559b550021f","impliedFormat":99},{"version":"d23d4a57fff5cec5607521ba3b72f372e3d735d0f6b11a4681655b0bdd0505f4","impliedFormat":99},{"version":"395c1f3da7e9c87097c8095acbb361541480bf5fd7fa92523985019fef7761dd","impliedFormat":99},{"version":"d61f3d719293c2f92a04ba73d08536940805938ecab89ac35ceabc8a48ccb648","impliedFormat":99},{"version":"ca693235a1242bcd97254f43a17592aa84af66ccb7497333ccfea54842fde648","impliedFormat":99},{"version":"cd41cf040b2e368382f2382ec9145824777233730e3965e9a7ba4523a6a4698e","impliedFormat":99},{"version":"2e7a9dba6512b0310c037a28d27330520904cf5063ca19f034b74ad280dbfe71","impliedFormat":99},{"version":"9f2a38baf702e6cb98e0392fa39d25a64c41457a827b935b366c5e0980a6a667","impliedFormat":99},{"version":"c1dc37f0e7252928f73d03b0d6b46feb26dea3d8737a531ca4c0ec4105e33120","impliedFormat":99},{"version":"25126b80243fb499517e94fc5afe5c9c5df3a0105618e33581fb5b2f2622f342","impliedFormat":99},{"version":"d332c2ddcb64012290eb14753c1b49fe3eee9ca067204efba1cf31c1ce1ee020","impliedFormat":99},{"version":"1be8da453470021f6fe936ba19ee0bfebc7cfa2406953fa56e78940467c90769","impliedFormat":99},{"version":"7c9f2d62d83f1292a183a44fb7fb1f16eb9037deb05691d307d4017ac8af850a","impliedFormat":99},{"version":"d0163ab7b0de6e23b8562af8b5b4adea4182884ca7543488f7ac2a3478f3ae6e","impliedFormat":99},{"version":"05224e15c6e51c4c6cd08c65f0766723f6b39165534b67546076c226661db691","impliedFormat":99},{"version":"a5f7158823c7700dd9fc1843a94b9edc309180c969fbfa6d591aeb0b33d3b514","impliedFormat":99},{"version":"7d30937f8cf9bb0d4b2c2a8fb56a415d7ef393f6252b24e4863f3d7b84285724","impliedFormat":99},{"version":"e04d074584483dc9c59341f9f36c7220f16eed09f7af1fa3ef9c64c26095faec","impliedFormat":99},{"version":"619697e06cbc2c77edda949a83a62047e777efacde1433e895b904fe4877c650","impliedFormat":99},{"version":"88d9a8593d2e6aee67f7b15a25bda62652c77be72b79afbee52bea61d5ffb39e","impliedFormat":99},{"version":"044d7acfc9bd1af21951e32252cf8f3a11c8b35a704169115ddcbde9fd717de2","impliedFormat":99},{"version":"a4ca8f13a91bd80e6d7a4f013b8a9e156fbf579bbec981fe724dad38719cfe01","impliedFormat":99},{"version":"5a216426a68418e37e55c7a4366bc50efc99bda9dc361eae94d7e336da96c027","impliedFormat":99},{"version":"13b65b640306755096d304e76d4a237d21103de88b474634f7ae13a2fac722d5","impliedFormat":99},{"version":"7478bd43e449d3ce4e94f3ed1105c65007b21f078b3a791ea5d2c47b30ea6962","impliedFormat":99},{"version":"601d3e8e71b7d6a24fc003aca9989a6c25fa2b3755df196fd0aaee709d190303","impliedFormat":99},{"version":"168e0850fcc94011e4477e31eca81a8a8a71e1aed66d056b7b50196b877e86c8","impliedFormat":99},{"version":"37ba82d63f5f8c6b4fc9b756f24902e47f62ea66aae07e89ace445a54190a86e","impliedFormat":99},{"version":"f5b66b855f0496bc05f1cd9ba51a6a9de3d989b24aa36f6017257f01c8b65a9f","impliedFormat":99},{"version":"823b16d378e8456fcc5503d6253c8b13659be44435151c6b9f140c4a38ec98c1","impliedFormat":99},{"version":"b58b254bf1b586222844c04b3cdec396e16c811463bf187615bb0a1584beb100","impliedFormat":99},{"version":"a367c2ccfb2460e222c5d10d304e980bd172dd668bcc02f6c2ff626e71e90d75","impliedFormat":99},{"version":"0718623262ac94b016cb0cfd8d54e4d5b7b1d3941c01d85cf95c25ec1ba5ed8d","impliedFormat":99},{"version":"d4f3c9a0bd129e9c7cbfac02b6647e34718a2b81a414d914e8bd6b76341172e0","impliedFormat":99},{"version":"824306df6196f1e0222ff775c8023d399091ada2f10f2995ce53f5e3d4aff7a4","impliedFormat":99},{"version":"84ca07a8d57f1a6ba8c0cf264180d681f7afae995631c6ca9f2b85ec6ee06c0f","impliedFormat":99},{"version":"35755e61e9f4ec82d059efdbe3d1abcccc97a8a839f1dbf2e73ac1965f266847","impliedFormat":99},{"version":"64a918a5aa97a37400ec085ffeea12a14211aa799cd34e5dc828beb1806e95bb","impliedFormat":99},{"version":"0c8f5489ba6af02a4b1d5ba280e7badd58f30dc8eb716113b679e9d7c31185e5","impliedFormat":99},{"version":"7b574ca9ae0417203cdfa621ab1585de5b90c4bc6eea77a465b2eb8b92aa5380","impliedFormat":99},{"version":"3334c03c15102700973e3e334954ac1dffb7be7704c67cc272822d5895215c93","impliedFormat":99},{"version":"aabcb169451df7f78eb43567fab877a74d134a0a6d9850aa58b38321374ab7c0","impliedFormat":99},{"version":"1b5effdd8b4e8d9897fc34ab4cd708a446bf79db4cb9a3467e4a30d55b502e14","impliedFormat":99},{"version":"d772776a7aea246fd72c5818de72c3654f556b2cf0d73b90930c9c187cc055fc","impliedFormat":99},{"version":"dbd4bd62f433f14a419e4c6130075199eb15f2812d2d8e7c9e1f297f4daac788","impliedFormat":99},{"version":"427df949f5f10c73bcc77b2999893bc66c17579ad073ee5f5270a2b30651c873","impliedFormat":99},{"version":"c4c1a5565b9b85abfa1d663ca386d959d55361e801e8d49155a14dd6ca41abe1","impliedFormat":99},{"version":"7a45a45c277686aaff716db75a8157d0458a0d854bacf072c47fee3d499d7a99","impliedFormat":99},{"version":"57005b72bce2dc26293e8924f9c6be7ee3a2c1b71028a680f329762fa4439354","impliedFormat":99},{"version":"8f53b1f97c53c3573c16d0225ee3187d22f14f01421e3c6da1a26a1aace32356","impliedFormat":99},{"version":"810fdc0e554ed7315c723b91f6fa6ef3a6859b943b4cd82879641563b0e6c390","impliedFormat":99},{"version":"87a36b177b04d23214aa4502a0011cd65079e208cd60654aefc47d0d65da68ea","impliedFormat":99},{"version":"28a1c17fcbb9e66d7193caca68bbd12115518f186d90fc729a71869f96e2c07b","impliedFormat":99},{"version":"cc2d2abbb1cc7d6453c6fee760b04a516aa425187d65e296a8aacff66a49598a","impliedFormat":99},{"version":"d2413645bc4ab9c3f3688c5281232e6538684e84b49a57d8a1a8b2e5cf9f2041","impliedFormat":99},{"version":"4e6e21a0f9718282d342e66c83b2cd9aa7cd777dfcf2abd93552da694103b3dc","impliedFormat":99},{"version":"9006cc15c3a35e49508598a51664aa34ae59fc7ab32d6cc6ea2ec68d1c39448e","impliedFormat":99},{"version":"74467b184eadee6186a17cac579938d62eceb6d89c923ae67d058e2bcded254e","impliedFormat":99},{"version":"4169b96bb6309a2619f16d17307da341758da2917ff40c615568217b14357f5e","impliedFormat":99},{"version":"4a94d6146b38050de0830019a1c6a7820c2e2b90eba1a5ee4e4ab3bc30a72036","impliedFormat":99},{"version":"48a35ece156203abf19864daa984475055bbed4dc9049d07f4462100363f1e85","impliedFormat":99},{"version":"2a80ab285da5ec06299594edb456abd51ee69a7506278cca24e1ab494a86952b","impliedFormat":99},{"version":"5cd9fd926e2034c7eeec3de6138e18bafe092e0672f8bccdc1a0669393af60db","impliedFormat":1},{"version":"13d7630be2b4951d99f5ac0bd83e07b4ab9e8b4f3a97e9ad5210ea6eed86fd82","impliedFormat":99},{"version":"a8edf6901be3952dd6ce40004267994165eeb9a51dd48363f43f206a5afc4547","impliedFormat":99},{"version":"865e26608ad2160d9ffcb981dc4649119471855f0467893934e3ab7c22b132e9","impliedFormat":1},{"version":"2bf40a9b2a42dc6f0e2a740fbc1c88c1998d25727b87ed0cf885284cb1e16c44","impliedFormat":1},{"version":"678ce9e1aaba570c9e5bcb5ecfac009720a60ec616bbbc9825fd04d63b53b751","impliedFormat":1},{"version":"b79cc2fb1ad4a842bbb8eecdc632a7f18ee303bd3fa58e972fa3720189859132","impliedFormat":1},{"version":"44338602a65a3e3fc8dfb35b09e6116d05d2c8019e90c8d0237b203cb3b5beb6","impliedFormat":1},{"version":"b2af1e9faa4f6750ca01407fadd7a90eac3f4615df984170cc53f6d7902d3250","impliedFormat":1},{"version":"690872b554003d24a4f905afd2a7bdd6ca9e3f1ea3276eb3dfa43290e7fa57c5","impliedFormat":1},{"version":"20b1ec36566c5915f77b422691e3ce8e467c195af9c9fe2adee1b9f95cfe59ff","impliedFormat":1},{"version":"54e9dbc82c0d74af574f927f8cd1b567be6d275b23984bd1ac602b3f0d385a63","impliedFormat":1},{"version":"ad53bd475d89e449c6539258e64745d35a8ad4eb75ed20c52b2979ba27eb799d","impliedFormat":1},{"version":"fa46c917a8cd50fe346b4646a7b52d9d9223b1d746056bfdac0153f4ea7c62e3","impliedFormat":1},{"version":"95bb7829186cdf1f69e548c9a5cdfa7776e85322ead227812293702128b7e45b","impliedFormat":1},{"version":"fe656648cc1b58e401fa0d0492bf16c0883663c82a819feef879483d20a04da7","impliedFormat":1},{"version":"dae408255bd416b2717a0be18188a64a4530a9440a662b9b470b0a136c75965b","impliedFormat":1},{"version":"1180af664bda92e8c27b788976e0b3c7483201b27efe6f64300c8fd5dfdb7089","impliedFormat":1},{"version":"6d0a1eb807e4f7c63f42c1b164d2c44f7ded4b058ae9232221f14af24869a5d2","impliedFormat":1},{"version":"2b6891c13b74886d1bb32cae8b8531997717eb279cbb147932bf204220db1f69","impliedFormat":1},{"version":"7a7cf51c1625984c330021ca597a88cbf727ab2643f7db8a3bfe22aa84084942","impliedFormat":1},{"version":"ff4b5d69e379c7d2763d952ffcd1e38d95c697658224c7f612735c0c67811834","impliedFormat":1},{"version":"513299726fe81a4e8b949fc555495cc40808bbfa84cde96534773cfdcf459ba7","impliedFormat":1},{"version":"33a29f53161aa4d0778b333128b8687b743fc77173f8ade3f73c13659cf14134","impliedFormat":1},{"version":"98b9efc8d590ecc3762c6c93735bf24266c7f1bfc06f983b5098578352075b64","impliedFormat":1},{"version":"748bc14a2fb8c21ff58b57c87a21bdb9d049bb0266525050d35384c30c44bbde","impliedFormat":1},{"version":"59ee3a45a164d5c29d135c8e713c484f154f421141c614b72b3c8103bff2f816","impliedFormat":1},{"version":"de346ee3e7c0e57a62ee18acd9b9cda57c596eca1fd7162cee0323f55366c0fb","impliedFormat":1},{"version":"df6163feb8cc511ace0d25009ed44f526e91f74b8eac78986bf3a56fccbdadac","impliedFormat":1},{"version":"d559cc752ef17b882fef1b5a2cf5cef76669620f28a0d6098e57b4b5da5eb6de","impliedFormat":1},{"version":"752c7d54e9d328c8aa47c89520fdb38c99ef0132e089cb7bde73bbcddc0b48ed","impliedFormat":1},{"version":"731160a68d1380ca76430a673f064d1b9b567524807f6015b477cd64d36c51fe","impliedFormat":1},{"version":"70a29119482d358ab4f28d28ee2dcd05d6cbf8e678068855d016e10a9256ec12","impliedFormat":1},{"version":"869ac759ae8f304536d609082732cb025a08dcc38237fe619caf3fcdd41dde6f","impliedFormat":1},{"version":"0ea900fe6565f9133e06bce92e3e9a4b5a69234e83d40b7df2e1752b8d2b5002","impliedFormat":1},{"version":"e5408f95ca9ac5997c0fea772d68b1bf390e16c2a8cad62858553409f2b12412","impliedFormat":1},{"version":"3c1332a48695617fc5c8a1aead8f09758c2e73018bd139882283fb5a5b8536a6","impliedFormat":1},{"version":"9260b03453970e98ce9b1ad851275acd9c7d213c26c7d86bae096e8e9db4e62b","impliedFormat":1},{"version":"083838d2f5fea0c28f02ce67087101f43bd6e8697c51fd48029261653095080c","impliedFormat":1},{"version":"969132719f0f5822e669f6da7bd58ea0eb47f7899c1db854f8f06379f753b365","impliedFormat":1},{"version":"94ca5d43ff6f9dc8b1812b0770b761392e6eac1948d99d2da443dc63c32b2ec1","impliedFormat":1},{"version":"2cbc88cf54c50e74ee5642c12217e6fd5415e1b35232d5666d53418bae210b3b","impliedFormat":1},{"version":"ccb226557417c606f8b1bba85d178f4bcea3f8ae67b0e86292709a634a1d389d","impliedFormat":1},{"version":"5ea98f44cc9de1fe05d037afe4813f3dcd3a8c5de43bdd7db24624a364fad8e6","impliedFormat":1},{"version":"5260a62a7d326565c7b42293ed427e4186b9d43d6f160f50e134a18385970d02","impliedFormat":1},{"version":"0b3fc2d2d41ad187962c43cb38117d0aee0d3d515c8a6750aaea467da76b42aa","impliedFormat":1},{"version":"ed219f328224100dad91505388453a8c24a97367d1bc13dcec82c72ab13012b7","impliedFormat":1},{"version":"6847b17c96eb44634daa112849db0c9ade344fe23e6ced190b7eeb862beca9f4","impliedFormat":1},{"version":"d479a5128f27f63b58d57a61e062bd68fa43b684271449a73a4d3e3666a599a7","impliedFormat":1},{"version":"6f308b141358ac799edc3e83e887441852205dc1348310d30b62c69438b93ca0","impliedFormat":1},{"version":"486ce5135771d0b249145f0a1560d8766b35e5e215c0be86eff8b41f80bbcb9e","impliedFormat":1},{"version":"53c917a6d42ee959dfa8f842d612b59f5ac03a72905371fbd5371b1131d7d48d","impliedFormat":1},{"version":"2dc807c070380e3e5402f2f5ff635482e6f9fb43c244bd3a66c682a4aab7a2f8","impliedFormat":1},{"version":"39b4475e6e998885a7a0e69dc1c67ee6facced3ec7234109cefadfc7ef31e276","impliedFormat":1},{"version":"7f4bc4c6f05fa992e11f8b335db63589c556cf683a822f071c01a46d59912e49","impliedFormat":1},{"version":"b38cfb3dc5ce58b0993a9686064c31ca5b8ced1781043249089d171fa1c4fd70","impliedFormat":1},{"version":"e787c7a8b0854d8cb32d48450f95b3737b61a8be697c65d1241ba445b4261e70","impliedFormat":1},{"version":"61359565523e1c4e5b7f8af67e9a69ef177aae2903fc55db2029efa71c42f295","impliedFormat":1},{"version":"973fa3744879daa9ed6a4095b8da2cdd2bc4acd6007aaa87be9b2eab1d6ddc15","impliedFormat":1},{"version":"5cdecf081bf87b64f0afc929d9bf6ddd8731e550f6eb1846dd4513b441301890","impliedFormat":1},{"version":"65d5005eae8ea5af10b8416979cb6fcaaca374d3bc753fefb2aa0ad951e2351f","impliedFormat":1},{"version":"86feb3cb6b01919550f5c846eeae1b36707fe420d16ff7b603d27e53af450e70","impliedFormat":1},{"version":"115619837222e0263791637a3bf476060a93c7236c2b00109b0f0ab33cd6c7c8","impliedFormat":1},{"version":"e4b7cc0c48b817e78119edc65f0607d535bd537ba8a77a2937405f86393b08bd","impliedFormat":1},{"version":"6af30731a08e7b04632d135097de6b5e180bbc447d21771208415fab7489e4e4","impliedFormat":1},{"version":"12388dc354e536eba298cb55914496c389ef554ea1ab749e6b7aa6f39c74bb94","impliedFormat":1},{"version":"d1980619beb34b5b0fd0cdd3cd98c32fd38035127b4c2720b43b002a3377a842","impliedFormat":1},{"version":"46a7f13ac080593e33d76cf5de4fc9db639a9122a6a085bd12d2f3e61c9c46cd","impliedFormat":1},{"version":"efd20c2f4fe04f9965905ad50fd35e5ab0d3611ab9a077bfc1b12eab6f9cb9a3","impliedFormat":1},{"version":"316edc2773a5c40f66de00cca4f35ba671206988e31ea8c1df8e8ff871973917","impliedFormat":1},{"version":"2ae22d6b87836aeb67c823c619e0c66403ae028651f14f34d3cf0430f8fa9ec3","impliedFormat":1},{"version":"c2641eef9519484b19625ff9b9e71310da39600963da25dc0f0de11a8073612e","impliedFormat":1},{"version":"00d2e6fca85d766650ff9de68c0306afa4964823912a4dccc8e7bec80f38fd58","impliedFormat":1},{"version":"d2889f3ed0406f47012b39d59f2a9872b65465d0168f240296a6aaa23ba0e14e","impliedFormat":1},{"version":"99fcc7416501b8dca3e40581e320ef4c72e173317a539d895a2e8cf2640987b7","impliedFormat":1},{"version":"31dea6e70acd25ff078d08104eb2ae41eac598dcc305f7aeac2fbc7859246fff","impliedFormat":1},{"version":"3e3f11e1874771d8d75b18b9bbffffd2b464d2a44b3dcff3325041a7001ff62a","impliedFormat":1},{"version":"b53b302fd7ec7c441269b5cfd4a58de0bdf0e2847c9f8292b133c7c6dbecffee","impliedFormat":1},{"version":"3354fb95230a3d2f23bb4e086ab9fa29bb1fd4ade71ed7e4e15bd7fd175f08da","impliedFormat":1},{"version":"db03c5d3709cbc3f89024de53d0319e49fab02a016c9d3aef5308b44041afc77","impliedFormat":1},{"version":"5c2ebf20d132caae1c4b35d28bacf76384275937924cf72e4efbc2bcbba3cad3","impliedFormat":1},{"version":"054790666d9ed7c5a3cf292503e6a61780f7169fe3863e970d35702cb428e501","impliedFormat":1},{"version":"3095e62f6d48235298dcb23cda5fce12ac58d636b0f7d4ffbc80c84f694c5d70","impliedFormat":1},{"version":"25df3178f9bac06afb08eb57b6bc94989f5354f4ff4d1c43afc3627864446247","impliedFormat":1},{"version":"e3b4b27ff971ec37a4c0a6e1c9c044c206d68f57dabffffa71f2df80b5c8daa0","impliedFormat":1},{"version":"bed7c28681ba3141a429aa0d2660fbb6449f9bf4d7bf368efd4137a8c538c7f3","impliedFormat":1},{"version":"236c2a6aee18331ff39e29a6285aec02350cb1bddf3ca5d1e1235d6b0f059ac9","impliedFormat":1},{"version":"aa192bb83edaae4348184eaf12294dd4c1ed228cbad6da008a01369a557b097a","impliedFormat":1},{"version":"d6eeac6c763ef772e8626bc335568c325851afe57f9674c153046103d13e8569","impliedFormat":1},{"version":"5926e2e5298a0746ce33aa7c33200cf089e684b277f3e3b75cc190d145d3b78f","impliedFormat":1},{"version":"73a0ee6395819b063df4b148211985f2e1442945c1a057204cf4cf6281760dc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"d05d8c67116dceafc62e691c47ac89f8f10cf7313cd1b2fb4fe801c2bf1bb1a7","impliedFormat":1},{"version":"3c5bb5207df7095882400323d692957e90ec17323ccff5fd5f29a1ecf3b165d0","impliedFormat":1},{"version":"49a9fbfd1234674cb80daec73633a563d386b24af63e5297974cc2837a99e49b","impliedFormat":1},{"version":"293c077ae541a6628006aa6f6c2b31738387c4e8d033df81835656ed86655127","impliedFormat":1},{"version":"02e07de42da88aa986b2f47e9e0bd4573133a2240d42817f307440c700a7f04f","impliedFormat":1},{"version":"a5ecc724406ce58a8cf1dd766a2b75ac198730611a909374828fee9ca2c03b24","impliedFormat":1},{"version":"0f3b25a4a58bfbc81497a2560835ba48eb0e0d2cd00d976ac10cefb2214bcb2d","impliedFormat":1},{"version":"1c39cded7dede5be5fe3450179489d7e892e5e81590f5ca0305b063f85b04b8c","impliedFormat":1},{"version":"c94cd94329d2283c7ffaee91f3f9da4789060bfd12c18b1c87ca502dfe2e7e04","impliedFormat":1},{"version":"f82b4c8ad1a1bbad19bd2efefc6a4d80546f7ef1ea4500f2981e3d33a8844cf7","impliedFormat":1},{"version":"b15ae6501af260d0300f8148d9f6e356b16e72aad494b4d90817a60f794099dc","impliedFormat":1},{"version":"e689c521980a119665fbc52e3e9cebf182d76ba18f437710f421252b3f5d39db","impliedFormat":1},{"version":"575e8d070210e93cbb4ac3c18cea6d48b54d64aa8f658496296622d199c34e9a","impliedFormat":1},{"version":"ccfcb0348e378f0423e3b5b74eb23fea9893f9ed5396477a7f6b970c5c627063","impliedFormat":1},{"version":"171effe51e3f90facef73d7d9f3c43fb6723bf44df01740dc4d52c83a47fb70f","impliedFormat":1},{"version":"78d8ce9cc33fc80ba9339bf8018f282e1162d7bb8fd834ad4255cd111c208b4b","impliedFormat":1},{"version":"35a89ca4a11a983694a529c3c8bca9b2604dd39f1ce3be5812760c5d6bca4fcd","impliedFormat":1},{"version":"3343e2df866cc321345b51d3befd4f292fb00450f2e4cd530e6d979af1d3eae3","impliedFormat":1},{"version":"f02cac4bb6d304ead3570c7f78264af2d1fc2a5282fc8b4042dc1c1a8d0f4e61","impliedFormat":1},{"version":"cbc65ab4e61043907dc08a4062423da6e7d33109fda8a219ceda2ec98d0580e8","impliedFormat":1},{"version":"b22c5a59fad638037971add23c11d5b3fcb20b73b7687b595d57cb7c6c858c48","impliedFormat":1},{"version":"a36113daf1c07c21a0978bf3ea716d258eb8d13887c9a3bb394b4042989c1440","impliedFormat":1},{"version":"dfb8609c400499e11485d5933bb6a94029faa73626456f15b137d672f7ed3f0f","impliedFormat":1},{"version":"a1c564e2773dfb7d3bec40de87407ef36af9614ab36c23a2b20e9d07b175484c","impliedFormat":1},{"version":"974a296ae48132c94b948fefc6c41e766e75331f460fff1cac13fca48560f4da","impliedFormat":1},{"version":"8ed68c18be279b40d265f023f989dfe9bcd6334f65d5c35d15dc32e8929cfaa7","impliedFormat":1},{"version":"877353a33cf7651621d4a8d59b0e5d42745dffaa86f863fbad84a3afd3d0353b","impliedFormat":1},{"version":"6a6125d9da9c3516e5cdf26aa7e846ebbbd49cd7a964521074f85902f8df7d45","impliedFormat":1},{"version":"0462b4ed0e09fdb48ff4a70e895b563d75b413ba024f4479ef87760281b81830","impliedFormat":1},{"version":"23ace85c3d01c7d82bedd8fb95b7a7902237929b72a2a1b767fb563a24f2a323","impliedFormat":1},{"version":"53c8221dd71e9c0799e47a7b05bef62baba100e956d4e777c9617afae447aae7","impliedFormat":1},{"version":"f1361e3ed8ce7c3ed2aa9c9d0760a76a35391047e48e98685b04cbcf3d050c42","impliedFormat":1},{"version":"9f213f9495ee1bcbc95691a30711bc2274bb8b6407d55e139f7b551906de54c6","impliedFormat":1},{"version":"61d402fd5dc33411646456348996cd7d608ecf4e696c3a43ef476e64bc41d003","impliedFormat":1},{"version":"5f3f8d803300ea21de99a4e84c60af1ff808dabd9c7feffac2f0093fad064bc8","impliedFormat":1},{"version":"dbf286c3bf2c1ea48dd3d97d3d3265c36c51fd7fcef8fdc52624e5c4162d6ee6","impliedFormat":1},{"version":"e403a118d7064bd836299d296df2a1d4fdb3d35afcabc9c3e6ea9a5151b47afd","impliedFormat":1},{"version":"fd9e3764702b2863636ff175122790c065e39449fd2d2ab66c05c2452a444447","impliedFormat":1},{"version":"a2788a6aef1c55e94d8a3a51c53be474f7f766c3c3e4856940be9e689e7845da","impliedFormat":1},{"version":"57acd378108b9b4ed2a50beb0068a4ec6548a44284e2431f529225fe1c119568","impliedFormat":1},{"version":"ec4fb6bada4aa2161e89b82f1d19c23c9069a0967b3e41469b60fb1ef2a947b9","impliedFormat":1},{"version":"47ca5f288b6d09c737f95e75c952ec80601e425eb5e32a51cff2ec2b235025ed","impliedFormat":1},{"version":"3d53fcdcfc5e04cdc803c4f652f1ed7cadabccbf70b13c6f248da3ddd1fb588b","impliedFormat":1},{"version":"f6384fbd628e78839ed1d4eac7d30c438490e8501fce2671461101dc08cfb561","impliedFormat":1},{"version":"b48fe4141f082032b504b0bbf90e90200e72d26e130acdac7d4728b6d5cf9927","impliedFormat":1},{"version":"ceb82c3f651bbd2e8112df5c9101d18ecd81110157540b729f2d91fd2476af22","impliedFormat":1},{"version":"56dd0a3de5847ec09014c58e99e85b110730e9359a2927a543976625aa521ee2","impliedFormat":1},{"version":"1a996dbaf0bdd2acfeac97fbac98dba2046ec5692326099a51460c4d0f5ae9a1","impliedFormat":1},{"version":"cfc287e2eab581b5aef74288ab12a38dfedad4c7f86da8f9de05866b971260d4","impliedFormat":1},{"version":"b55a10a07d9e89f3fbc84f5adf660106de38c1632187ee89ce4722e3114bab1e","impliedFormat":1},{"version":"b76aa5f6ae4f664f6698f457d512a43424d0b89ecfae92f3862b11a59c356c96","impliedFormat":1},{"version":"7aeadcd6f891a60cbd7398d4efa6bfa8c6abf0d0d3b1c0957271b14835223add","impliedFormat":1},{"version":"ef808080f524a438cee5c18a3037659f772d77d868184073536ee14e505cfefd","impliedFormat":1},{"version":"789e37de9d9be63d4a831c44e1872c0d9973969710622c73e85e5ee488e46bc1","impliedFormat":1},{"version":"aa59e48528cf4a7f0de9db27f8fb1279a57831c87db377494dfd9909d5edd460","impliedFormat":1},{"version":"a7e9abded6309efc8a2dcad525ad862570a55344dcd96bf0e75726139ea46371","impliedFormat":1},{"version":"94095684562e04c69a3c508c15a4e379910a38781301bd05a098f563d1b2077f","impliedFormat":1},{"version":"b909d40ae0a49dc8cf12bef3675e7540f74eaf0f19a9b2fc310b91d0ac95b003","impliedFormat":1},{"version":"18517e95a9b285fa18c0218a1a6dce13c1e02584c4315710f4c29a36a87a4984","impliedFormat":1},{"version":"1554b903cb17787aed9b5dcea80358d6ea248c58933ee515aeb98c830b566347","impliedFormat":1},{"version":"758463ca4e500e663796adbf74833192d3b7b8de4854b63f45bd008f8a85e5a4","impliedFormat":1},{"version":"7731e44e65a7b3e20f506f6342e873ccae6129eecc0cbc02d1b3d30510642981","impliedFormat":1},{"version":"cb13dff5aa56155ed496db2cf084fc6a6e062d33fb0a8b72f2606e12cc3b1bba","impliedFormat":1},{"version":"dedbbcaff7747f2ea2677450351d36e7cfa30a56960a7fd261667eea2d4531aa","impliedFormat":1},{"version":"49620a7bb5ead5e646a697e4ab417a540a57b150efb8a107629eac48b13eb161","impliedFormat":1},{"version":"f07d892242e5d82ac0ed9a58ffe4056cdfbbfe8c4eebd2580e27635d7be65f66","impliedFormat":1},{"version":"2d48cb08bb8a13dc0fb00c829dae31d3ebe48bb060cdcc99a0079b4ac05c673e","impliedFormat":1},{"version":"8ad7581069b5fea9c14f35fa273b79c1eeed3248c15d8e3b3cc3014a60990622","impliedFormat":1},{"version":"96d049cb9f1a5fa296e00be2680394ac6ae91bcc848d98cfc374a469852ec23b","impliedFormat":1},{"version":"554dc5a72dea714b595395a4c12d519efccef1ce0dd5d7f41ae484401e50ff37","impliedFormat":1},{"version":"59dfd66db064bdc4a8167a4d5e6cba56213e94157fa89071f0289f07e3d95b5b","impliedFormat":1},{"version":"d69d5cbcb746e136acdd8e81ccfe00182dd9617bfd6c6c344e09a895e09eeed6","impliedFormat":1},{"version":"0a6182ba6bcbced44384aad64ced03428a44068db6e396627902d55452b63a14","impliedFormat":1},{"version":"f636e08e2de274463127a2adc5e8ca24304a2cd6ee5fe9483e35c8164bf35712","impliedFormat":1},{"version":"437f4518a56c655ee150fb75f821fd0684be16e6459204907fe8eb80ccc48cb2","impliedFormat":1},{"version":"dae796cfb059d6636e718f5e326c8f6243050c6d13f02b30e89522a05798dc96","impliedFormat":1},{"version":"852919a8c9f948a1120e26665877f445c5e979229cd9690926a4c1056ecb67ae","impliedFormat":1},{"version":"a533a88c900177a8bd724a8716d902609e7ab790e77afcdae1043ce882d6214c","impliedFormat":1},{"version":"61921a01ae678fc55f80344dc8770e257e8c3574abf42d94a0fb114439a360b6","impliedFormat":1},{"version":"620d192a20a0fdbb5f75562b2fb174e0df6762c53e0b3f3f9a905000983770f0","impliedFormat":1},{"version":"0d3d5ad7978ea95c0329ace8fc70d541f115393631c56b89b094edf9cc0e0267","impliedFormat":1},{"version":"9c4ff4b26953272dfd3fd9e37d46dbc5a1efa4ded8626b8f0bc79fafe2dcfc98","impliedFormat":1},{"version":"feb35d74e120494bfbc4c4c823da971a5b4b96e663513f68fe3c349fb8a592bc","impliedFormat":1},{"version":"c121aa1a348e834f829fd317dc6944f98169e0698c15f7db107798be1e0da78f","impliedFormat":1},{"version":"e751b5fdb543639ac55a0ad688e74c82ef24b9e712c9f1000399b63d7fc284bb","impliedFormat":1},{"version":"a3f6163afb8f4458c2a935747b1dfb384fa03f4f399a46b162e48d8b92aeb369","impliedFormat":1},{"version":"115dc68151cc74405c37a5199c2d42e5592d594c4788663c74bda8fc5bf0730a","impliedFormat":1},{"version":"d0c62b638bbf6104e0d50483239e212601576e246030b01d1b4b40918e7febab","impliedFormat":1},{"version":"de4227d3f974cb37120411c592819624c9da2bcabbb58082cde7df8dce2a89d7","impliedFormat":1},{"version":"a5c48a6fbf1358a5fe9b947a525fb353498792caa599ef33cb618b92eadcaf86","impliedFormat":1},{"version":"eafa5d831783eb6262f72363582b5a6f0e3a5ce7bcefcdafdaf372b54edcde3c","impliedFormat":1},{"version":"33d2092b9488d738d8c7a733d63affa819fb02773ba3212cf3426f4513e91eed","impliedFormat":1},{"version":"3a81f7ba793511be763ef2fc529b0779ad68aa1a4d8ff061f5b31ffe5338ade9","impliedFormat":1},{"version":"db92169fcf279dc7b08bafe78bbcffc4fe4e5e0fc66d00ea403b740e7a81b46b","impliedFormat":1},{"version":"11916ebd92fb285e5aaa3ad36c3df329057b53097370d884729507ebff0f8332","impliedFormat":1},{"version":"2ed240886fdad836469258df5fecc174ccc8823d619a07b0b0dbbc1a1616e48f","impliedFormat":1},{"version":"0b9214f3b1fe766c6e8ac26c685f5cd54155619f0e163c4e1a60118a7fc3419f","impliedFormat":1},{"version":"69b78d12bbf6f3f26065075189308104c8987988bf9ee57118670ef23c91c0a1","impliedFormat":1},{"version":"b11ec773a6f06effa0e041aec31cace90f3ed3f952d031a3f4e654bf8a313636","impliedFormat":1},{"version":"a9df4cac8ad59067b0bcf991f48ef9dd98f7fc3e7d1e3a36c3fb58073e1eac4c","impliedFormat":1},{"version":"f7e0529012b0baf35c8864fd60994e829a60acf05fb8a206deb405815a731b40","impliedFormat":1},{"version":"17831f179acf5e3b1a81da11b9b6fbae22e0f4eb996ffbac6667bac607fcd121","impliedFormat":1},{"version":"6a312ba9dcdcc637b946bb3d0ba6cc34b26cdc36f582167241e66a15a155512d","impliedFormat":1},{"version":"d10f6923085f763958dbfcedfbee643dd784a2a1489adab40825b7336d095d1a","impliedFormat":1},{"version":"1bb4ddb08f558faa5ada460dc8456be86a1f1e922a680fa37320ea24486a30e3","impliedFormat":1},{"version":"04b1eee9cd36515fc7e7c5ea54086c335c752c110f52e4f73e4f0cdde2cc3087","impliedFormat":1},{"version":"a236a69e4c0d1447040588861899788c718b4cf7d6254a3120a2ebcee95fb3d3","impliedFormat":1},{"version":"44a4531588aecec33f47aa6006da8a679340937d96e03013d05fdee5d8c2e81d","impliedFormat":1},{"version":"5ddef1c7f4524767aeeeda30bf8280d4b01d2c24c87735d0e8fc51455cef3c5e","impliedFormat":1},{"version":"dc31857a04afe1b49ff3fb722e8b4678210a1357003b626b9318448edf8f4880","impliedFormat":1},{"version":"00f09f305a5c82ff104a1b3c58360b4cd2557cff9ff37cfee6d5ed718a2077eb","impliedFormat":1},{"version":"ab57460a0acaa740c9a47c8fd19f22406eaab943992bdb27008eeb819da32d89","impliedFormat":1},{"version":"8776163e9a5556d318fe81de8cf8bb892e4b74d433ebd04edb8ca4856dda236a","impliedFormat":1},{"version":"2414ffd43aa41911f4a88803340a55bfd0e124a13a1a2d7dbe8eb3c619aa904d","impliedFormat":1},{"version":"163f6c701bb1665196f3b4cf5e3d1ca719f35e359c2812f186f3c86e495a13fc","impliedFormat":1},{"version":"4a1d0b807917c0c94767c261008fa1913304cbe959f44bba375dc1e60a74e7a1","impliedFormat":1},{"version":"90d3fc3f0fb18babdf4de1451ca218e36b30edb3105a58700954e33568075dd1","impliedFormat":1},{"version":"2b4276dde46aa2faf0dd86119999c76b81e6488cd6b0d0fcf9fb985769cd11c0","impliedFormat":99},{"version":"38d4cff03e87dc58bfd50ffe5a3fb25e6e6d4136a1282883285baf71d35967c5","impliedFormat":99},{"version":"5ecea63968444d55f7c3cf677cbec9525db9229953b34f06be0386a24b0fffd2","impliedFormat":99},{"version":"6ea9c8bf2ae4d47a0dbc2a1f9ac1e36c639b2ac9225c4d271c2f63a2faf24831","impliedFormat":99},{"version":"a2a6960ef524509846b1ad24f36f6d9ea7e5ec7f0e55f943f8db09a598d99391","impliedFormat":1},{"version":"3d76957cf49167aaf2df848fcb2d95db411523d0025e9bc414006f641f407e17","impliedFormat":1},{"version":"594895eb74bdfe0a5174b5fd7811a8c912f2121347d773e56c28b7fb98642610","impliedFormat":1},{"version":"cf39c3aa36608091ba07df403bfb6fe43265a10b6ca43237ca5cd8dc2215c50b","impliedFormat":1},{"version":"ba7c1fd630f5175e41e24b44e2510aac50e98a2605d55bb4727e52c8bbc61505","impliedFormat":1},{"version":"a1c8b811348d3806581f7c5830d0d663eb910a828a69b5f49b7e3d219f6f200d","impliedFormat":1},{"version":"5fc020e4d3e29a0158977caa3b4ada841116bca7e95f1e3bd81972a973fa3e52","impliedFormat":1},{"version":"2a1f679af017f22773696f5f8a50be7889a256796e1e9c4639bb9683b85eee94","impliedFormat":1},{"version":"5c0896b0a5d08e905ebf5e5d644fcfceeef6b981864241ce87ad44c6d38b7037","impliedFormat":1},{"version":"33082e49dfc7aa882cac44fc860c9a0df4e71b869cdea78920a87c5f9ada3f35","impliedFormat":1},{"version":"37c9b58a44c587bba5fb17937cc009f7c8b11c5e1d034adbb6149fc7edf8f194","impliedFormat":1},{"version":"7a591b347f2956a5fdff47763b18e81f199d59ac4214a0eb10b527f668af3a14","impliedFormat":1},{"version":"18f8fbcb5964b00f0b9a59b9a20818140d256a0c13c40b27a84cf45039cd7ae3","impliedFormat":1},{"version":"7ca3766a7b61700680621bcaddd75095b2f6f1d5fd54054d455963e0b01a5271","impliedFormat":1},{"version":"3c210d785849c58fe7876040224d842318acc311170b36fa1fdecf6705e90b2e","impliedFormat":1},{"version":"931d881e641f8c6205ce766b5b0f4c334b4e44b400ddbd58a65f4225d6e55ae5","impliedFormat":1},{"version":"10b5802a62730e203b023f17e4aa7db9c8bac2fa557c0284362eeb85dd3db33c","impliedFormat":1},{"version":"ac6eb3be3381810472a2fc7056a9f736288f4492acb5e245804ee5275e12fa9e","impliedFormat":1},{"version":"1c7ddf03f8b22aafca004e06eb11ef870c6c48bb210cddf8f723dd634fc4b82b","impliedFormat":1},{"version":"8a62958b8a7962aa876a6554db15b6a40491e28b9772fd939254756dbd69d600","impliedFormat":1},{"version":"9354e4dbaf9540cfffa55762429274f2491c52780856a69df5f2bf1953638a7b","impliedFormat":1},{"version":"597d714b88fb4838f4eaf380e288889686168d0eb4335b03084fed54d71717ea","impliedFormat":1},{"version":"be7f71bc32c002bb28c81860665ac30fdafd9bf8631d3110f2ed5e9cf64806dd","impliedFormat":1},{"version":"ab5265c757bf45df980370183488884c0e6b04ecafd4476d07336fbbfff4a3c0","impliedFormat":1},{"version":"1b95d53b3cf18c5cb3998105b4e2d2db7f786406e194a935f7a4be03e3c98b3b","impliedFormat":1},{"version":"8dcacb13baeb9e2b3f548b81493d484f2bb95a6384e6aa311ead14fb87a7b14c","impliedFormat":1},{"version":"2b924655747dc77d6173bb706d427b89233969c68886301b97f0ec22d38cb948","impliedFormat":1},{"version":"cd532224c54d4c8df7e7fe6df04b9db97bba3c764ec06307f8063923d0ada85b","impliedFormat":1},{"version":"5ab9aca80383397243ab240ebc38ccadf85b566f670b980aed6e777eb3bab1e2","impliedFormat":1},{"version":"1a8452dc75d92ee4fa82455bdecede05171b837b023f374052f58f1bcf5b4da1","impliedFormat":1},{"version":"5290bcde06d2a1d393225c2464ef8a7cf6e3b68ae3ece13c4a48c10f0dbac1c0","impliedFormat":1},{"version":"9dc2e706663c027d2047a7371608bd1aaa0f76a974940f85e101a9f3dcf77f99","impliedFormat":1},{"version":"1a2f03003d76f913c21a1105408fb3af3184ab55dacdd7866e1fb5eb1f4a2934","impliedFormat":1},{"version":"25fed060cca7fcb097bc0a62dc5a71f60ccfbd3efa1bb3584e4b38d441ec9ac1","impliedFormat":1},{"version":"b636d739980b2e9a24b4e73251adf464e2ec0457ba998007b89ce7977ac2ce7b","impliedFormat":1},{"version":"411ed25e4d8e230ee295227a763e32a395bf1eb250e20af71a9c06a7e96a5ceb","impliedFormat":1},{"version":"8fb43d72aa54443abd069be799aec92b354ad28990f5f5f1acd7857773b54bd7","impliedFormat":1},{"version":"fe8e8c8df9218e3e0a418ddb058a81e895bc2ea5b548571b79594eec7d573628","impliedFormat":1},{"version":"2070abe224a2071f224fd7783212d020ee6d3f71c6f48405070a0b2fd9bfe479","impliedFormat":1},{"version":"a18875ee326a56d20c87ea0e86ff11a9d767cdee9cd5feaf60dd61c5b64caae6","impliedFormat":1},{"version":"df9d5f06a1692717762ca9f368917924fdaccfdfced152804d768eff9baeb352","impliedFormat":1},{"version":"34fec0d3b9abe499f5d53f1ae7a6c28d34ac289e5cff6f17587da846823cecb0","impliedFormat":1},{"version":"9ea3742314159f08b93e3dccb7fdba67637ba75736c12923d4df3ec9f40590ab","impliedFormat":1},{"version":"bc55f374f2b27277afd0ebdf0e503faa20ac18e81d15ac106e443ab354d3e892","impliedFormat":1},{"version":"ffc7343ac667843634241465fd8bb2fe5000964873434558f82c0e670d2b7d1b","impliedFormat":1},{"version":"e35562032ca67f79d83bb8e2b86b61dfcbac6a914ce15b0e2235e6626dbd49f7","impliedFormat":1},{"version":"0810fe9c952efed2e4372b734baaaa946c975c7e3114b9cb1e31179bca9662f2","impliedFormat":1},{"version":"18b2b9e3a3c86ebd23ac27a8f966b1870b8ab29a2857dc1c524a08a49b3aedf4","impliedFormat":1},{"version":"7078f3696ec34e21ccdddfd668eb9f679478964b739082f1d2f4ec286e27e324","impliedFormat":1},{"version":"2ef538c8ab12d795cfb3759aab16593d97bf8d1f491ce4a7cec2f452c30d312e","impliedFormat":1},{"version":"7ffbadcb4cd98d917e23f35a803795404e302f2e5ed3c69fbdddcbbd0190d2eb","impliedFormat":1},{"version":"8de84288a2bb7428bb031ba2a5b6ccf5415a06826b902f704dbfe0fbd8c60745","impliedFormat":1},{"version":"d5da81f56f3189ba0a2f7fc2c38915b741a5d4f9c1d56749bae3cd821eb11dbf","impliedFormat":1},{"version":"ba6514678ba39cd24e45efb38e18d25274787fb031b49b7f9dc2ef5857330ecd","impliedFormat":1},{"version":"2dd0a4aeef324625f4ff674e2cfa14e0e3a45202ae2d2c2ab882ec164589ecb1","impliedFormat":1},{"version":"6c9e1fdd65d24d365a746e8a47f8f367650dac5e9436ef0c0f20237e204e072d","impliedFormat":1},{"version":"7f79adbfc34dc2e7fdbb76ed579a4e1944076baa68b62cab9c05a81780088c36","impliedFormat":1},{"version":"b5979ba9077be6b986d0a6c8b6904fb32ebacf0d58fe66f5595a83af055c9f23","impliedFormat":1},{"version":"a883088486a65513998935f6444e0448820478b0f4783171138e3b8d3e92ed9a","impliedFormat":1},{"version":"1a09ea0b80210733d1c5fc284ab10291e9cc2d6c4b70764d05cfdfbe4116e71a","impliedFormat":1},{"version":"3da00f0c6f5f4bca013ced5172164a08e83f33ddf969b893c9cca734f97abfca","impliedFormat":1},{"version":"2ee1fb806f0b0f44313b46de861b55649634ebd9757c5514c3ea93cf1255d45f","impliedFormat":1},{"version":"580f7dd2752bb6468e1eae47c8465d681e8016614cd2d20bad21680401381560","impliedFormat":1},{"version":"3e6c1a8e7d9a2fa9e6e515cbf2eac07eee953a6ecc134e8fc565ed914d288a05","impliedFormat":1},{"version":"aefc07a7a75a93e46eabf563f85ccf13fc5674fb2575433dced13d86cce102d6","impliedFormat":1},{"version":"39593c50b59d3f35738f1d04978755d746aafd90d90f2f088ae072e38c98d753","impliedFormat":1},{"version":"e09e37a97deb2318bcc307e56eec9e74307bf4e185c5028cd61fb7b7a415091e","impliedFormat":1},{"version":"d58164beed48baed6bd4e8b4f1d6d35379bdcb50d79874efc906db8177e99dcc","impliedFormat":1},{"version":"fd4d66024e28ba8eac39b0d79e9932c1e7ab2cce39c3c8d776a10c2d8d550c95","impliedFormat":1},{"version":"0bf65d13cc32a5456a5983b40038f2df29676c568219ed7a173d322a7a7a1046","impliedFormat":1},{"version":"0e174986b721b6f8e0ae71473e8ecabcd27a72a1eb0c6a5b245641c92eb1f548","impliedFormat":1},{"version":"5195fba3a9190c1ab07ebdce0c43ef1215513fceee989230ba26b560db68b9b1","impliedFormat":1},{"version":"6e888892c110c9d9f5dea5cea9d73a7ffdc9539ef33e2c909c71aedb89ad6306","impliedFormat":1},{"version":"e98b949511cf978e1416c23635e4a7af49fb7e906a3aaad78639d0354ca3f91f","impliedFormat":1},{"version":"9fb0f57f4aaa5a7f6f47999bfc60d46fc8624174e5ec1db2eee681e7a7c5b7ac","impliedFormat":1},{"version":"6e5f47bfa10432c13f71a1f65d4c22fdac37f5b466250b200be575b044e466a0","impliedFormat":1},{"version":"9f902e8b6ab7cf1195f7dfd4ba76ab1761d27dde27140d8e4334d664ff5095a1","impliedFormat":1},{"version":"b6597583353a27878d178eff7cef1df25cd47b52318fc8c1df887778f39fb5b3","impliedFormat":1},{"version":"89499fdc926291e337e6befdfd4b3796a5090c8f7d88f670186a3478f287e049","impliedFormat":1},{"version":"f90e0e3dd84b892c1166fee0c4d07fefe1c975aa335249369198e9e303150c8c","impliedFormat":1},{"version":"0dfb0943c928ae130a9b563a0d95d19a654149c63afc5eaeb0bdab22a2e4cf92","impliedFormat":1},{"version":"f1acea90ee99fa895bfc2be16d42d010afccf581f0a4fd81af05c1e33ba52d30","impliedFormat":1},{"version":"eb7f78707b148715913878ab073771c2711636f81d9edacdc23741c5c4676409","impliedFormat":1},{"version":"69b302f58e27871aa18c35c9f6e54e182c7b5e093d680e90dcb271ac206f65b1","impliedFormat":1},{"version":"6bbdaf306a56f31d1780c457a169c54856444cd0e38bea9302ee7f719216320c","impliedFormat":1},{"version":"3764e1710ae3be641878c48688a6064b50f88bdfab8270477421e0ed0370c20e","impliedFormat":1},{"version":"b4039afc53de6f76bfe17e9667c52903e2c3522cf7e2adb48bdb0e9801c53ae2","impliedFormat":1},{"version":"0097a7bca0c500ea9ea03fbe979b864aba32f8add469ab5755f9ca20bffe146b","impliedFormat":1},{"version":"e4128e408464f38961eb93e466b10f0b70a5347bed31a306567de8a9d2cfa2e2","impliedFormat":1},{"version":"6c2913d56a401a786605facc3696159a4334fdde5e3cf3cc99606d63eacfd77f","impliedFormat":1},{"version":"ba9d942ce82486a429051ed695bbdc82922154b1867968bc3cd528fef4b1db0d","impliedFormat":1},{"version":"5065d8794b4d58da06eba6c467c5ce628227fcee5b378bcb513928e5f4351d3d","impliedFormat":1},{"version":"d96916253cf5b59873d497bda35bf1f60ca574a7611c288416903f6da67dadbe","impliedFormat":1},{"version":"1f08d836cb44ad9eb02e5437333eea1422bec0fbeedbe2ee637ba5f85c776df9","impliedFormat":1},{"version":"747978ad044367d203290e385379ba6fa13094707cdf93e7c46a28b557d5ec55","impliedFormat":1},{"version":"085986a624337952d77da5b7f4606715ff736293c0cd1ab2bd3bcaad20948100","impliedFormat":1},{"version":"42052a992a6973092850f23f4010d7137d202c1f56a8e8c515afa5de03b38506","impliedFormat":1},{"version":"80aa8bd81499eeab329bf5cd4cdb47cb6a1e55ce8c381c73ca0b34504dc98c31","impliedFormat":1},{"version":"73041c005eaace48167bab34c90c22873c23cfe7143a8a1e4830325611b8a432","impliedFormat":1},{"version":"1b8e481079ddfa96fa74e13195d09a3042427deeaef5e489c6953d033790e0c8","impliedFormat":1},{"version":"fd8c6a9b6efe0982844a362276267f4a8a0d0eac3f6c0105e07ae448baa089b2","impliedFormat":1},{"version":"671375a441525dfd1dd0d6205596b89cd5e36e43f5d5bd55241a5ebb1f9f8536","impliedFormat":1},{"version":"0ddf0a53aac62bec6bfbb70acd8ec414e4cd406e456d90b927d68589a1bc11fa","impliedFormat":1},{"version":"6b67e49174c6d0b293d10173bd4a1cc03006e5e34982a27e411474d6ad4ab08b","impliedFormat":1},{"version":"bbe077c6b64b00be512cf103a2b162d07e062bd192d27a80e6af5e640883efa2","impliedFormat":1},{"version":"6d8c163fa3b2767df0be2f34a5766f2f84400f855004dee35978668ea8c643d6","impliedFormat":1},{"version":"67901cbfa0e5b836fff44d6433d388ee08d49e861dce861c46089e85db76d1b8","impliedFormat":1},{"version":"cd3637aed7763ba22d12a386349eaa3ac394187d7e62ac5ac2f2b21959f2c92e","impliedFormat":1},{"version":"182e6dc43d9db5b02d97da9ad1a1f33511698690d075aa094a323e5596ee4151","impliedFormat":1},{"version":"03daceaa4fc85ddb4578c3e00c76d06b08354f67d3488fc0d3ba70f5b7bebe5b","impliedFormat":1},{"version":"a61a2b837dd119f4bb6328ddc2a75d2991268ad3f3c7fb057f5647659e8f7a0d","impliedFormat":1},{"version":"1d56fda4de62aa710b03933ed8886600db20fed547fc82fdb1e3172890b911fa","impliedFormat":1},{"version":"cdda9aef8ea456f57dbc7a1dbc992775635f35d1f16bc6ba5eec62582eb95c97","impliedFormat":1},{"version":"809f7de42db29764819db01936dd61260c36bb46da14a2dfd0d9cff433119c97","impliedFormat":1},{"version":"5f5a37e3d8f88da4365d633ba046b4a6fb20295417527e553f64a4b09e3fe7c3","impliedFormat":1},{"version":"5b76ebb3f054e884e915f113277a51baf59e648c63704aecd893b03d59f1a1c7","impliedFormat":1},{"version":"94db31e5feb97be7603749e699e2c7a149c1757ef3a7f9409527a11be2886780","impliedFormat":1},{"version":"80bd39fb5dac4905e90d9d2d2ec1bba058e4c5e65606263d76fbcef5499745fc","impliedFormat":1},{"version":"c814167f5da5cf413798dd7364096bdc04e1880118cd0d6fc7b1c8a13cdade31","impliedFormat":1},{"version":"ddca3180cc80853cbd1fd0ff049b4c174243110a4a2f231ac52f808369e10fb0","impliedFormat":1},{"version":"fdbff9f09e335506a85070891d2a7d370c151b50733742e4d2a7fc16900e4a95","impliedFormat":1},{"version":"b2b44b7e7d9e497466c0af940cb970eeca779ab831550078a0520aedc0ac3460","impliedFormat":1},{"version":"86dc4fb96df154d94b170e083ca293c38c12b9db881d04a4da308b7116fb75df","impliedFormat":1},{"version":"964e5c21c9795282e320431952f8399a76cc9c680516bc05940f6521f82c8495","impliedFormat":1},{"version":"35c15cf54be7051ef44f508d9da9c27c547f6e81d52bf477b0f809e2327ee8d9","impliedFormat":1},{"version":"b8d0deccc242126e1550a2ea3cc2661d7b174ea120559e1918e06b9270285ba6","impliedFormat":1},{"version":"2e52952ef8cf48a372827fa45cdc5fb094c91421f4feab9c803129ee078edb8f","impliedFormat":1},{"version":"a9337ad54903029d34c273ee605be5716e7832e281f6fb66715f661a93c10776","impliedFormat":1},{"version":"d907dd40369128bd18eee0e92d883b919aae330aef5edad23b8bc267c46e1ecb","impliedFormat":1},{"version":"7b877947ac19bfe5039233596c2a10b10f773acbf9857c8354e47e16b319e1c2","impliedFormat":1},{"version":"73ebc746aa0a19fe29c826702d37419fba934262c4c1a3b04d37ed2a20fc15b5","impliedFormat":1},{"version":"a7a1e121728c2e212f90d8d2f305f472b5a88c30dedfdef781ed9c75f2c8b3a4","impliedFormat":1},{"version":"e5531569cb6d4fc5ba2eccbb67ce8f8bca6f569c6f0702a625d5bfd0ef364854","impliedFormat":1},{"version":"5fcb4b897e8ea1ef4d40a6f42a93c329685f29b4c6a3639a02176d9ca9cb4686","impliedFormat":1},{"version":"e8dc672b15bf2e1e35a81e45140d830be8c98111325530e5f0eb7c5863245e82","impliedFormat":1},{"version":"9e8fd5b597e56e984d9ace2f8b5036c52ce3db8bd99c9d0a0e2a6be437eadc85","impliedFormat":1},{"version":"5a4a8f7317fc4821e7a46178c217733bdcf29c915a4919289292438e15de4607","impliedFormat":1},{"version":"5e238dda917cd2472b4f01de26b108974e55284bb214a4bfad978a5be34be7cc","impliedFormat":1},{"version":"5125b5b048d60035522ae201ccf7525e2f6a2ac5b2e68b6607ae54c715c66900","impliedFormat":1},{"version":"f55b6c21681fb9bb17f61ff9368fbd4e71a79693ce295a14151b4f325413b0a4","impliedFormat":1},{"version":"a5b2f909b4117accaca01cabe73871cb9077b9f93d292dd232f10892d146de43","impliedFormat":1},{"version":"9618adb3ebc25306662e030f883eba7057eaf4bb2c6d5879dfd6676129815c02","impliedFormat":1},{"version":"01270a9f63529e308eddd085993c4f25c1cb594e69f47ed3b289fb097af55a6d","impliedFormat":1},{"version":"d92d2527e59d91387d208c266a49524fc263cda8f6d54beb9b85f98b75493617","impliedFormat":1},{"version":"de0d38c21863792de0659e01e8e76615be53fa586ac1dd5b54f6042ec6348feb","impliedFormat":1},{"version":"a55439c4098a852a7dff67fcc3309065f8bf6009e02273e0cf7f6e165fc959c7","impliedFormat":1},{"version":"3e2f969b9fae540fcefdbdd76fd18c9743a369759730c66c775bd7dea5c151e9","impliedFormat":1},{"version":"fd1aa5b5f3c10cb19d3e0ead864d193a5fcc7efb837e47212255bcab2847a173","impliedFormat":1},{"version":"3abe9c7635bdd2ddbbd9f1a4d98ff44c2ebf780e13e17187adc98ec82ad0c7fb","impliedFormat":1},{"version":"ba6fdc7d3a3d6fc4236d491103cdb8b132c151b2dda4b06fbd38698ac0e3d2e4","impliedFormat":1},{"version":"32a3a19d049ef0b2539e525c862760158d6d16345835f2bd541e8f9a45380b50","impliedFormat":1},{"version":"7fa7fb68cea5734bfe2091ff218d302f0a3066f4a78ba26078322358765cca8e","impliedFormat":1},{"version":"11248c1e632fadd67c22d561754c30265e785edd66cdbfbecb227c3a9b1ebf99","impliedFormat":1},{"version":"93b6da74507103bee98e39f0d02cf6849c0cadbfc813f26804bf9ae5d0d3f75c","impliedFormat":1},{"version":"29675992f9e94f7f721674c8d07bc2042ea7a6bb8cf602b0ded185edd0c557a5","impliedFormat":1},{"version":"daec5d2d52be233262c80013e18d57be920152412de99ddb637700410ee7fa7d","impliedFormat":1},{"version":"e1e1837b07bbeb81a00d1b0b7edebf8f3e2b44ad148d5faff905ba17a0005813","impliedFormat":1},{"version":"c01d685b9634c875d18f81b643cc1fa5c01a1c740ad19a2578811aaa8f12f414","impliedFormat":1},{"version":"a896dd450b58d96d34a2b565c4d0db365eebd39cebe6e34fffbb2e01065d3013","impliedFormat":1},{"version":"7fc08eaeb2ac34f87eb2336270f2368e66eb83796d5bee2a96438f01d088cf68","impliedFormat":1},{"version":"d6d4654b5db43b43d857d245c054f359b8aaccf6004bbc4324f320ff2a507a87","impliedFormat":1},{"version":"628cc9debf7b2c1828d01d134506fae17eb26b0196d82184df3b6d9494b43ca1","impliedFormat":1},{"version":"a3d8178c385250d74effd5936477f4d5d2ebb9afb5a342bae1b928f621af63b1","impliedFormat":1},{"version":"02124f773917b14404ea6b1c87bd84e701136ecf91ea1a447cf93ede4bf04983","impliedFormat":1},{"version":"e4d4ed8aab4e61f8ed7656baa565ef07cb0e6f8418d81766721cf2b591845243","impliedFormat":1},{"version":"e2a7ef3681c1d61e11203e8dbfd77e25f23d7560c8fcdfa37490899d037c0ee7","impliedFormat":1},{"version":"8bcac2d5ace8feaeba195f476351a0f09841ba69a1b6175ab6574300fd70c9d0","impliedFormat":1},{"version":"53ccb10a74e6de7b5ee83cb44a12834f823fb78ea0ab3ce51475cee1779a8d9a","impliedFormat":1},{"version":"88751f9db85c13a404f3fd8348ba1ffd606715ac60572aa7b20de442049b0fff","impliedFormat":1},{"version":"d82aa6e7f1decca5179d57d12f94a9ca9b3f7f77048aa20ca98e154c3019c1fc","impliedFormat":1},{"version":"444a93f528d1b023dd00c1b46dd3d474a0339b50599b2e819ab13fb6b2c915cb","impliedFormat":1},{"version":"70c415e2ed25afac403f2828c67743154a8252945ef24e9343e6a3a55431de7a","impliedFormat":1},{"version":"86add54a494cb66d630e4554b9a2552fa2488b491549cbc2a7ca0e538e1d9f1d","impliedFormat":1},{"version":"3039c7975bb1035041e6abac5c71cfd0c2531ac20f8a3c521891d18d21b831ac","impliedFormat":1},{"version":"6a8111e8e43cffcaf41372315ae6cbc11d8596cec0cff4c6c70b27da75cbdd25","impliedFormat":1},{"version":"e75a6771bec31aeb2e8258df9f6c6652d1659648eb53dea7773562660a6fb5ca","impliedFormat":1},{"version":"4c3438e7cc5515323f5846d72b84fec9fe2e6d5fef50a517542c7a9bdc51dbf0","impliedFormat":1},{"version":"1d86876dc1a10218bcc482d392b3b86a61ebd4ae5f591a4755beb074099e4e95","impliedFormat":1},{"version":"80ca9dfd51ef8727912344fa6dceb3ffbda52c4a2ffb2182b704480a5fd7ee8c","impliedFormat":1},{"version":"770c2dd0ac11667883a3ebc682899c068c48ebd57663e4c50949e5652dad80fa","impliedFormat":1},{"version":"feb908fca7ebf8a474b20dcd1aee71d49ecde939d2f9d6dc9e8c9de589cfcfca","impliedFormat":1},{"version":"50849d34df4de824de2907e963279d49ab22f1914d47135cbca6fcb5685d49e8","impliedFormat":1},{"version":"7dc02705f75ddc71b0e2f18351d3696e41f6e07d790c18afe5b78c89e67ad387","impliedFormat":1},{"version":"79ca6338c68397a7e0f0b7ddaa3350c9764b8a2c4f4638251d316f72cccdf1cc","impliedFormat":1},{"version":"d4268aa638387a5d8219b3f8ebf0973ecaa4b2814f4e036248bd189654e510dc","impliedFormat":1},{"version":"7e6aa259bd4b2bfea6fbee6aad9811aa9b0c40ba71cd53e9db77073f41ff3aeb","impliedFormat":1},{"version":"4d19bf8ff0030c8c06c5b006baf9f7627e9f76216138eb45966583d0d5724b13","impliedFormat":1},{"version":"59a25169e290be34736885c06d5e29b2c2af1d6bb0afda1c3126a57a87c0dc4c","impliedFormat":1},{"version":"16adda3678b1f885104505504ff3f705f92cb071152b6826143a6578b18a12da","impliedFormat":1},{"version":"b773a29e6618e4ece53d0984eb455fca116799a6f658f4ab9de40c58d71f2dcd","impliedFormat":1},{"version":"f3b403e6482d63c3f00d1a5e77f8dc02c85bb324fbc35689f94f657ff678cf3e","impliedFormat":1},{"version":"eb1dc31de2323373220ddaa9e35f12eb2e2528ba2ddba760496b5e02f94e83fa","impliedFormat":1},{"version":"80d5e377dbe2d879fd58b903c81cf8051794a2457346783ccc5219088af95229","impliedFormat":1},{"version":"2f011e16e37f62fd4a7a00986fe5678fd7318af48b733274adebc2a1096f4701","impliedFormat":1},{"version":"7af34691e03a05e1cc3ab659fa0eb97df924dc12219b9e0d42df1b1b4944556b","impliedFormat":1},{"version":"d179af5c4c1785302bdf44967a0298b40a055290cbdf49b8b1f6821b5ac45d13","impliedFormat":1},{"version":"715c6cfb5c918ebaf7a4ac12fe7036354c7737ee53f27e953b0c6b32ea5c7fed","impliedFormat":1},{"version":"c14033543f143ff973b992b5cc84a8ec179fbb26c55d021625400bce08693062","impliedFormat":1},{"version":"e0b68ef2073c5ca07054a7569bd426b18eba0a13bfeebd987edbc1c08e9858ef","impliedFormat":1},{"version":"79122f57117b9579f963bf6db860c90f43c61fb3695b7b9709733dd36caacb53","impliedFormat":1},{"version":"4f1ac03c089109e65116ab3c7d6cab25fdb6a39de4261276224e87daad49a416","impliedFormat":1},{"version":"668f9948d2ac4073c890e9085c0a0121e91829b12e7dfff1bc97c2b22febab66","impliedFormat":1},{"version":"95d3f7dbf440ee15105ed62b06ffeece7c6b2e9c8d7cafcf926a02732b0651bb","impliedFormat":1},{"version":"08c35dd9786948e567228b7981fd7fa898635f0ad07dd474d19315a4e4cf8752","impliedFormat":1},{"version":"7c95d753ce060546ccb96db36e36bdc1ee5527a99b81deae23537cc059b728b9","impliedFormat":1},{"version":"f02a70ce1d93ea668934465feb287fdae9fb9fd89ffb175e3641b505d123f1b4","impliedFormat":1},{"version":"ecfa1490baf58bb547cbffd35055a8d37350e5a4555541ef9ca594f296adf0e6","impliedFormat":1},{"version":"17fc7881515e746d2d626fe263fc89224c51c87d12cdd1de0ea18faf297b29b6","impliedFormat":1},{"version":"2676d7da626cfa5bd5c71bb1bebc049e6f2a2b68aeaa3759e052dacaddec2e7a","impliedFormat":1},{"version":"1f252a0e6a399dfcb9c151462a942d3c3640aa024748e2357bc2e50b525dc66c","impliedFormat":1},{"version":"76163722f8e959ab91ff15bec1df8b2af77e12c975a41fe696f3a14fd3850da6","impliedFormat":1},{"version":"121237ae57eaac5ebf646f81cde270eb093e12ee4d3954f9d8595eacdcfd9cb6","impliedFormat":1},{"version":"9a84eebd6e526afc2fc38392b0c507b9c373159bf9565b5a192d53abe9cca1ba","impliedFormat":1},{"version":"1745ce89aa62ddb61b342a63c563575d750207b9951f256c42c15cb825e5df99","impliedFormat":1},{"version":"6762da06aef84aee250f90a6e8d65ffa470c6b5bf7c7a2d4de68077858605417","impliedFormat":1},{"version":"88782e4ead68723b1353d3cbd8eeecb2b88577809d6920714ca3d61f755b6e14","impliedFormat":1},{"version":"95448492f7f7db2368809190d29c7472ed3f6f898614360ec2ded6cd710c5bf6","impliedFormat":1},{"version":"638fd06e4ac9a0f7f80cb59b2acb9ad82d90d4595b791576078500da430cd691","impliedFormat":1},{"version":"532fbe381f6980f5f96c526f5fbb6e2393093ec4a6947af24b2ce4f0c64d464d","impliedFormat":1},{"version":"59262b81348ab6c3b8648eb84d869d359ae5c2ad69a4e0022fd917e936389f9a","impliedFormat":1},{"version":"980bc0f948c0b2cdcdcfce30cb6a67ac7357e9a04a5a5377a4b603ec5ff3ed44","impliedFormat":1},{"version":"08dfa3925bcaf3217ad1cb48e967b334371258446f410a2bfc0647ead3b53958","impliedFormat":1},{"version":"c4de9078f00e95ecf7eae1756d21022683889dc2f7dc359ac1a401eebbccfca5","impliedFormat":1},{"version":"cc0a459bdc4e9cd5fe034a62fa83a8737486b0bf40b11190e82ed4a0d803cd55","impliedFormat":1},{"version":"e159fd8868a308bda44f504d5804f730bbc7f35c7c163c9d3f04d36a1f3eccd5","impliedFormat":1},{"version":"48c16c377d293408b0b9f8ad3822c543728924dc82caaad11d271cb5a43c8b0d","impliedFormat":1},{"version":"a35768b4aa61e5cd551016c91f2da9666c485fd32cb85063a395f55a74932df5","impliedFormat":1},{"version":"60c94b45d32c09deec9a19ba3f7d8f680767992c1724e20386d786ded16668a5","impliedFormat":1},{"version":"d8815d7ac98bac1d4d476b6de5c837913368a909f1d417738c621be550483037","impliedFormat":1},{"version":"efe5226c10cdbdf02bcccdd55ab7eaa546d9d20f8631b71eac14a171b6856115","impliedFormat":1},{"version":"25182a16410182f105e3d4f7ce47704868692d82b810145a1fd9214dd68e39fc","impliedFormat":1},{"version":"5d802fdd246b92e92cceae486384778d2e70099364e3060458ebca3db6c9537d","impliedFormat":1},{"version":"25911651d3fd103da84f2da6089c5796c2cd3bc9b885de8d518538ee0b2502d7","impliedFormat":1},{"version":"b1d4486f4041635f978e24b6aa7aa26a8b1df81ff6d7fe82e8315d436ce4ea4a","impliedFormat":1},{"version":"697ee35ed13099d7b2a3bb7828a581d2b6d1b23574a4213802620429c973ec27","impliedFormat":1},{"version":"595c172dc0edb928be05bac0fc3010d9fe5da4fa92e404083f2749e693138882","impliedFormat":1},{"version":"573082b6780a37ef0f3c4507fa954e09f748f710bc50754437f0394639402520","impliedFormat":1},{"version":"7ae49abce785a8816bbb49dd5fb301ee5522f02014aad1095639a342a4aabb26","impliedFormat":1},{"version":"c8ea14372521ab27bcc17db148bad457dc802b6a7aa95a3e67efabe67831143b","impliedFormat":1},{"version":"8e4209d2c93131a8ea06006841fb7c08043a444071f094927b2e160d67ed3ecc","impliedFormat":1},{"version":"72618877b1e15de4275dfda49102c6240811bcec30e4c9f8bfce889edf18187e","impliedFormat":1},{"version":"3a699715c6b195cd9b7fe96bc4c6482710c5026380ec32ddd49e60a42cd8b9a1","impliedFormat":1},{"version":"13e631d64e1710522bd93bb90235dfbae228d2b6fb762dcf9cba641bd748829b","impliedFormat":1},{"version":"e965e9e03bcb2366b03337dcb8c82a7217eab605f3db90ee942302bf98db340a","impliedFormat":1},{"version":"e384122e4fb7bd3ca8e36b92825508beb73784446e40adc1f747dd331074c35a","impliedFormat":1},{"version":"b331bafdaccff6ab5ea40b3526457cf25f80e3a418958f8b8737450df8ac95cc","impliedFormat":1},{"version":"bc756ad9380c772b2a0090e370516abc6566781684d87560fdc69fd746a22eac","impliedFormat":1},{"version":"8acf5e34281b6896a32f263576144711a1e0c5aec82deb593d8675c18147f546","impliedFormat":1},{"version":"b9876d7df3a4ec58dafa1eeb1e5ae104d3326e5d0ea50fd34e8e67b58e52e98b","impliedFormat":1},{"version":"213891ead7f95efed458988204d6d328fbfa6680dbd071a833e8e8ece091c162","impliedFormat":1},{"version":"42ded6282e32871a3f09fb7a75c5a4fe7b15b567ed26240a9423a66d4b86d208","impliedFormat":1},{"version":"e96ca53a2b2ad48b5bf88acae2eca9b0abc169fc5247ff50b859bcbb1decf17d","impliedFormat":1},{"version":"e498682b4351711ddaef48cf3188cfdecc0283f4f5f73bffdb9cf362a3e7e050","impliedFormat":1},{"version":"ca483bc36f5d4562f841c69ef35ffd4aea406b4279ed20731f09585610e0a802","impliedFormat":1},{"version":"60481d85fed75823dda60351102d97dc8a9da90fa02e3d0a99b87a0bab04e435","impliedFormat":1},{"version":"ee3ed2930c509a2c67f2d5cf2674d4a6492bc76732b3fc68fa7130685e9c8b01","impliedFormat":1},{"version":"321df1633735c87d46c5eff22d8088cff4bc306d1d2ed4ad4dc7a86da66f58ec","impliedFormat":1},{"version":"0d88fdcd81ecbe69ca9653d9d539cdbdb9149c581a21b4baf57de562f8cbecc8","impliedFormat":1},{"version":"fd5dbcb25c0b40f7cef69a0978cb5d0dd024354e8563fbc99ad60ff022b40737","impliedFormat":1},{"version":"0d9e9751713270c684dfd3d0f60d4fb5903ae06ddf5bdfa0f2661b37093f8bee","impliedFormat":1},{"version":"1275c436f0b1b256189ce3a87019fee89f1c7c6194df24f25658ef92d2a75727","impliedFormat":1},{"version":"37fd9ef1c7c0650bf00c918fcee22d682ef3c6976edd858d63d74309afb37f3d","impliedFormat":1},{"version":"ac14166d41facb50f3ef111f7b9e66a5fbb2010724d8bacc3aef62d28c1c981b","impliedFormat":1},{"version":"1b542dc311c5c6c197920545b5d997095d4f81f41fedbab1658ab244db05410e","impliedFormat":1},{"version":"39bb8abea90bd4f0e0f196b26fce0fa7dad2e84d09ebd55cf26f66ed085d4c1e","impliedFormat":1},{"version":"15c3d2438362bc387bc7d7d4f8465d12b292d59d4ae45eb6a5f3a3714aca0533","impliedFormat":1},{"version":"98c26ed17796f720fd2ae16640a41139d13989848387eb78dc1dd4b3fd0c732c","impliedFormat":1},{"version":"1e875cc927e244f0c29c70bab63d90f20e71064565049b8ebffc90552f12776e","impliedFormat":1},{"version":"6129817d361cd2300a08ee34f5fa2b777a4fc90c3febb79c918ed1c40f7a25b1","impliedFormat":1},{"version":"d62158cb30f91935a8d0a410a869a70a6a0940cc2e98177616d74f037688bf92","impliedFormat":1},{"version":"427ffa97d275e77497fad3d24fa95fab369c2cf4709f27620a8673c22d0c151e","impliedFormat":1},{"version":"1a6b8d2e110bc4f4589963c97a3dc4a08b662e59738d59dca2565f7c3b35dd9b","impliedFormat":1},{"version":"451554fa5b756b144bedd2950aef7795728c37e619b141f18ba5efe721aa34fa","impliedFormat":1},{"version":"f63e5fffe7540b043e714c2d9cc1be520fb6fe5b9f8b709eac7523af40195186","impliedFormat":1},{"version":"0315812a5654097cc200625d27fa287f9447b750075cc2d33705198a14066e3e","impliedFormat":1},{"version":"8d0abb60d6f019de7726b136a8276990dbed686409953ad2cf6d79ee8b90d3b2","impliedFormat":1},{"version":"56badaca43104914e6e299612de820bc66a69e43ca7fafd1f340ed70c09cfdbb","impliedFormat":1},{"version":"203d186ddc779e35e7dfa7193735254529d252ef7f52e813f259e6ed479e9507","impliedFormat":1},{"version":"4386fccebced3e526ea7e601e54cfd712b1ad1ac40c21158d053d4bb1e55b951","impliedFormat":1},{"version":"cd965101939d557c184a81cf8e773e31146873382cf1547d035cb5e6cb57dff9","impliedFormat":1},{"version":"c037102606e032569c026474a95c31a63f7d752cfe6d5123e71c09b9fa636d56","impliedFormat":1},{"version":"77588f8d6566b6bac03479322cf55570e8f9eeb8f27ba8b5af2ab907b573fc45","impliedFormat":1},{"version":"522129a86f52ecd6236a4e59be4542a8b2c6a452ec6317e53c82b6ef5840ba89","impliedFormat":1},{"version":"4d1fef84811f86e8ba66ee6af1c97ec67a94d9b74e7e1e8f21a23e47f65b56af","impliedFormat":1},{"version":"3ae84bacbf3da888f2e9faeeec5b1adb9755acaed2a4cde11f2ed34b64201864","impliedFormat":1},{"version":"6df7a162ffc842b6695684de0ee5184aa970fb570a38e702d200df659808fa66","impliedFormat":1},{"version":"7557a2a4e6b0b6a6545d5d65284ebb38bb67d53bd2c0f5e99ad54dea57f67500","impliedFormat":1},{"version":"0d93012bbf9e0a40727e36369752819c387f0a32f30e863c727e9da25b773f6a","impliedFormat":1},{"version":"ed6f91479c0538f25686a80ac97d4b485a3f0f8b06937dcdbd85d458f183db4a","impliedFormat":1},{"version":"84e25d7608672366e55fe39acb592e228f6819686c208a7cb4dfe46ebdb1d6be","impliedFormat":1},{"version":"949ccaac85986e407f0fb6f02519070804470897d50f4c29fdea344f714acfe1","impliedFormat":1},{"version":"5e63b02f4474647dc7bc40d809695e3812af40a0a05b72f23729983d97d91c91","impliedFormat":1},{"version":"86e11b587490cd8365421eca18966a59d89cd4846d5a84a6a0572ee283513902","impliedFormat":1},{"version":"c3dc0d9cff2d4456c574888110720b7a9582282971b907865e323356786cfb42","impliedFormat":1},{"version":"952fcddfcc7b49df167140b9f81b7c62cc6ef29dcd4fa5f12dc0f4f13ae98240","impliedFormat":1},{"version":"e93d9a364b61d50b9ee14554b5f48ea46dd8c557b94bdd637b196afce4fb3e69","impliedFormat":1},{"version":"9d6b766c92985ca30cfc521ca650d1007c9986f8fb8b9dae720d9f55a0f3d351","impliedFormat":1},{"version":"7bf52da3f2b777152c701a9b4dc97008ab0a0f9db3311a2057fe041e021f5f35","impliedFormat":1},{"version":"42feeb1901957dfa282e8c1fe359fb42376abb894e609628dd9cb1edbcef7b5b","impliedFormat":1},{"version":"2e0840eadf33be01dc61f4f62887a8ebced1b8008610885b777265cd09b5a22c","impliedFormat":1},{"version":"f1bacabb70c87fe9d05595db6ec80afb0c16f0437e9b3c01c8e860e3de342a81","impliedFormat":1},{"version":"a82fcd992077e23a2b8f34a245a5785eae074a4c4cf00e295ffcc7e6fbf2b18e","impliedFormat":1},{"version":"7e847c37d924926f5540e2db0362e46e520334823cf889557d2c9a5c7fc7dde0","impliedFormat":1},{"version":"42738fe88686c67006137210788ff9013bcd961e494f015f3aef70ea663bd6e1","impliedFormat":1},{"version":"76703404ab0c7442e3e1920476f9540fd66c1367cde3e98bee8773d20e14d214","impliedFormat":1},{"version":"848670bf9aedb7ed67960ead4edb7a422a9add15e0f18ad3fbdfefbb47500d84","impliedFormat":1},{"version":"168150c074102ffe35603b43705a4dea7660cf01c88dd88740686b943a61acb0","impliedFormat":1},{"version":"900f3e87a9e7270634bbaadf57ec15dc3f02db69d25f9bb325c7c8f99303880e","impliedFormat":1},{"version":"aec5946f6fbf0fe023537cdf7f4f904ea76ffc8976d508d8409da52d0ba6e1fe","impliedFormat":1},{"version":"5b51d210d61b20c944cec24254d20110ef279b79c5e457c16d35395e979aa371","impliedFormat":1},{"version":"547bbc28cbca3e4e26af6b00ac131fad91fd0bef3ecd56e204ba1c66277a27f4","impliedFormat":1},{"version":"88730dd27c119094a269b3319036c4d60adacb10f819e9f0817ff1826709a42e","impliedFormat":1},{"version":"09efdecdb0a3f448be675d83b687d2f6e1d0f6bd756ec36fbf430b2c6840ee70","impliedFormat":1},{"version":"46a4c5544edc93b22ec2d704197c5cd684e6ac5ea491dd9b33ba531867e94e4a","impliedFormat":1},{"version":"a40299fb32c3e734190df64c5e577983616d988f9a0661d2d8092fd66db53634","impliedFormat":1},{"version":"5c568ac086f9156633b8fe8c85366e2d90de49914c81fecc8f0409605459a22e","impliedFormat":1},{"version":"072edfb9947a2eeaba872bea4a2b22a73ea932d51f8c9b19c71c7345a2a636dc","impliedFormat":1},{"version":"a88c164bbd33edea01c4934613ef625f946be8fb7e7df876c7518e8d8b258b11","impliedFormat":1},{"version":"11967bc391eb0ec437202643f3f8cbcdf5e97439cfb4af8ab5215f9be37abaac","impliedFormat":1},{"version":"cdd01be7d5d7cd2388607e6e89bad1dea3bd6d5024f67dd03bc9eabb8f8cc7b2","impliedFormat":1},{"version":"b0417940c1c63dca7f33dee7c7c0851b3443f0b5a12d385b562f1cb5c39720d1","impliedFormat":1},{"version":"cdcf2268514c3b52d909f39fea338b3d670b9b2145b66306e362e59ce921394f","impliedFormat":1},{"version":"0dc8fe7d045ef79a8d61e221b76dc5db793cfedeadaf8fa8bdbb4a717a6b978f","impliedFormat":1},{"version":"bc12f789eea7c7667dc8c1a6664600c696783cbfc854480db157d2b6b9ecdb59","impliedFormat":1},{"version":"75b4143645ee1d64a23f9d18a3ab534ff6682379dc2c239c947f0f83c0e45012","impliedFormat":1},{"version":"fd745003aebb0f7b47e684ba22a118e0d59cffffa86a097714933b4f613aa08f","impliedFormat":1},{"version":"0971815c5614f9c4d36d55a3d1d4a45f062e78cc9a3d97ef6a3b23c86b665475","impliedFormat":1},{"version":"76728d3561f3d4f3e8810fad1178ad402023d55e8a5c5da872303bc8e9c4d79a","impliedFormat":1},{"version":"4acb6230f22875f6defa3584d10c817831affb136ae94f5d2c0d9457b7050936","impliedFormat":1},{"version":"f4e5b51de3c73f0f093739ad5b4a1214d9d8ad3b3d6d01522f1ad6831d60f80b","impliedFormat":1},{"version":"4ade309af02a50dc157394ee7162c88476980b5efb0aa7304d6c618a0112a89e","impliedFormat":1},{"version":"2d3516a828f8ef63b2f2eb3ae1f0570265744df44d6eb9fbe8352bd5ab7f2a62","impliedFormat":1},{"version":"f78edac82d00a3d169adcf1fc70c705be387dd2c18be7d6a7c1e54ef084cd641","impliedFormat":1},{"version":"1f11139bcbbebe3283f0a33b647aafbf272afe86163d9554fad80f6c040b64bc","impliedFormat":1},{"version":"ee0fc780ee45cff7ee13c49ed43d4875c0155da4cd17735113611db6a1665b1b","impliedFormat":1},{"version":"b9e1050114f422013d0f534b4475cdab7126b7217af20f15bdf83cc734d1ead7","impliedFormat":1},{"version":"e231c9fb03ca8893b43f055c5d651d55e189b48ad9351bd2729720671790cd83","impliedFormat":1},{"version":"a97a804c84d0cb7b1c015bc06a005613e1ab5ce58c27528dc9f00fa6a8655f28","impliedFormat":1},{"version":"090eb938f60728f4bbb7f94f6ef48ce4481bf9205aee390c4223ea9acef7a780","impliedFormat":1},{"version":"2348b5c42c8dc9255e5ed9029c102c3f37d25f8289d84b4c711d6fcd3548a05a","impliedFormat":1},{"version":"3bf3b2e2a29b895dfb42b380f61bb60419ce9f733eb26f61809b589de790fe49","impliedFormat":1},{"version":"c8d3fc06cc42c173a363bbad4e392a325867812b47387d1dc2940ab555bfdadc","impliedFormat":1},{"version":"f8890f41d665b98dbc2cfce66719aa64c358af705b183a7f682a5229520e0fde","impliedFormat":1},{"version":"9cd88c0017d85f46e694a13c201bd75d7c404c5b07615b2de57739d645988618","impliedFormat":1},{"version":"f8dc4c538eff6d92330223253dbd66c4354324f411b39de2b7fa520fe41b658f","impliedFormat":1},{"version":"2407b5c4ed19bf2edb4a7459c672627003236d0912947e2a0b03a7fe353c85d9","impliedFormat":1},{"version":"506e91ebd08f2cc0b49a69568329a51bedb0d9bfe2a9417ed1a9b3481841ddac","impliedFormat":1},{"version":"f63da73a8d858871cc7aafaf3146347de5a3504ab99667324172edf79622ad45","impliedFormat":1},{"version":"b877adbe66d8db5350fd60ba62ffb7f9f1e185709f41cc6c79e26314656e7966","impliedFormat":1},{"version":"ff3d1594665d0ea1e8e3367ca1be065cb29e56b544a98ae990150806381e26e0","impliedFormat":1},{"version":"24dcc6ab1b47dbef6db80f0d0406029fe49a5803e6b3a6a2733ca097164839cc","impliedFormat":1},{"version":"76ee5e01370001a08093cb98e98beba007176e5c8c0af5b3b17ad1b8470d3c87","impliedFormat":1},{"version":"1f8822081ce52fdcf13d2ab47d840ff28216abc2ecdd8b3892b3d8dcb66ddf4c","impliedFormat":1},{"version":"e266998f32d1e7bb4127d9e87d48c84d6aa5200df46e1266065f54d969cfa699","impliedFormat":1},{"version":"742ec7d93e66311678aa6f558561245b2e12399fe6a98d849944f161ec6a857a","impliedFormat":1},{"version":"c953ca81f374296b0e0ad9307f854aec1cbd22240bd7676e852c31bbf84d33ab","impliedFormat":1},{"version":"d2380b72ed2f0e19af8291a6e1ac6aa7a60e6ad455d838705ee3b4bf667840b9","impliedFormat":1},{"version":"25d84120721134c846a8733a46e05903f3b109937dd819e5ec41ac8af893899b","impliedFormat":1},{"version":"09870b1892653e3854208cc345b6a7f055a875a06fafbff9a1888abc2ba1a404","impliedFormat":1},{"version":"437c2c7fb5da8738335aa9a739ff4e797039504fa6c5cd10664dcd1f30577095","impliedFormat":1},{"version":"a9d20cf42a783baf00f171b23f89bbc28e5101c2eba461f54708e16ee20a3d4d","impliedFormat":1},{"version":"e54407eec308c19f8e3992c66bcfc893f4b1f5aa478f05a55de3e348ee015c69","impliedFormat":1},{"version":"815a703ea91f25df5ea36696478f59b242f625f45fad37c6873c28c1591dc031","impliedFormat":1},{"version":"07af686616d30fe4caecd19ba83f2b5830e3633f5994e027de90daed22e07319","impliedFormat":1},{"version":"d476ad2c31b6a37660a3b0d90cdafa6cc70e6da342f70f92c8b8994da9606153","impliedFormat":1},{"version":"c601ed82e8c11c2d98fc04da79201eeeb8c6f95927e348d5497bc0c2ad85c6b5","impliedFormat":1},{"version":"7803117fcb92af605e9d0bf5aab04f8fd5959381e0b826ebb05365ece4868ae1","impliedFormat":1},{"version":"025a8cef62e0fdfa4c32995a93e3ddd4f9d6e726477e753781e99179662b6c58","impliedFormat":1},{"version":"dac9e0310cac6c0d3815208ed585b6ebb2a19ed44536d04ca5a2cb81188906d5","impliedFormat":1},{"version":"329dbb853695003974005f642063d2ab083d8c06f7d8f3bb2cbb15f68c892487","impliedFormat":1},{"version":"c1cbd9cd690158fefa1c7b8b285c1862d4064cc61eac7226d937e62ed01db785","impliedFormat":1},{"version":"1804788ef733867ea378a6e571eb60d92ea9ba87ce23f9aed8a6cc5a174f5471","impliedFormat":1},{"version":"d5c6618af14518cfeba225d4dc6180271a423e24bee7ab64eaef5c70bfe63992","impliedFormat":1},{"version":"2abd00c6b8e284cb92d2caf3f93f3170729d68cf4a51fb53ff92078b1455bfb9","impliedFormat":1},{"version":"c388233f176333d0ba84350a79cf88f1724bddd685b2eb9fd9d62533f39850a7","impliedFormat":1},{"version":"85388e4257101bfe0f0e5ffbba40fadea704e576d64f2e83ac1e8f042ec521ba","impliedFormat":1},{"version":"7ffec597c82ed1cfb06d7ffdc36d71d77a564bd55eee6a2cf9c72384736e3726","impliedFormat":1},{"version":"6d72cd0e28e6b157b2b21131891ba29ef596f9d3d0463316955a1ffc4a5c89dc","impliedFormat":1},{"version":"72037f13e369d619e0842119af97d6f6905fc470124ba627c44773aaacae9ba7","impliedFormat":1},{"version":"bf8c812958db10404d946309002674de28f9e300416d7b39a773c98bc51c7475","impliedFormat":1},{"version":"94f3baf5e3e2bacc4d21f9308045913aefa2ef87b44153422057d074d5f7084a","impliedFormat":1},{"version":"293d1aa6c28408e0bde5e4d0b55b9be782e00e2f702d4044530220314e382685","impliedFormat":1},{"version":"e79c77ecfd439075c20dcf9785bb7255706dee26ff6431673932309a2ae624a0","impliedFormat":1},{"version":"f18ba2828d2c1bfaedbcb734d561604784d65fda9d290fb93bdf71015549b920","impliedFormat":1},{"version":"eadc908b2f4e6e8edeaf0970ec92a47129c289d5b4e19bdbafd6d6f70bdc907c","impliedFormat":1},{"version":"407a11241e9056524e24ffb7899d73e819f8d44010db091d473acb4348a82cb7","impliedFormat":1},{"version":"60f9fe665ff16131a8f07a38d2b4277e96a7b11049deaa1c2ff85b8b2cb08abd","impliedFormat":1},{"version":"121ca5c164ad18f6fccd49dc61333dd06ee8e4984c4b127c59744c2d6ac953fa","impliedFormat":1},{"version":"da883f2b97696813d06993a22351cf2f402fcaa29dc446f62fd09b05bf12fef5","impliedFormat":1},{"version":"48964bec72afdd3809f8bc1d5df95f3270e29e03c8d315685db3636535e6d3d8","impliedFormat":1},{"version":"6e13dd30ba8a2a783d41ff51896cbf8a310ebad22d06b9206ebc8ea814d1c440","impliedFormat":1},{"version":"1174c675811ff10caaab514bfd3a7720bdc8cfba524a0eba62d8c1c9563adf80","impliedFormat":1},{"version":"2066017f176fb877854da8afa1585591c67963597af3bfb828974547894e850b","impliedFormat":1},{"version":"0fb7ade7ade491a02022472999f472f84f304f4738a19f2efccea1551a13101b","impliedFormat":1},{"version":"b38bfb03cc99b72e403ce60382cb45bc9467641181a1dc775ee4238dea847b5b","impliedFormat":1},{"version":"f0c93c00af504f52e837bdae5c8d0dd16eb0358372a90bc03fcd2096f22e1e93","impliedFormat":1},{"version":"89e015b6421345ff59eaeabd2ddfdf4d4efc53fadddd0dfa6fb08791d4bc5396","impliedFormat":1},{"version":"275c59e7cc724033d8d962a68b604a827ca1d93ca63da907622ba4cdfdd138d0","impliedFormat":1},{"version":"6529e78e442adf060c2bbc460d4c585d8fff553eb06a09b6b9d4defba6a3e4bc","impliedFormat":1},{"version":"64ccb0668db4982770ccd3eae9982e9236d997f7848549968a59c06cfb2a8c85","impliedFormat":1},{"version":"15f4992579aef55c498805517266560cae989c94570067eb6f0bb1fda8db3e1a","impliedFormat":1},{"version":"1a5cb4225b0e5e65222f89d3ac4f11e1341c84362c34f64573e59aafdec65232","impliedFormat":1},{"version":"85280c9fd80e289ca3fb7cc176e7c56bd1b59cc87153e35b4ad67343a16963e7","impliedFormat":1},{"version":"69ec7481d640752a71598ad9e0cc9c28fcaaf3128a8e56e9f22d09aa75e48aba","impliedFormat":1},{"version":"f1c203586ed60b44b1b54f2d3d6d5489a32a3d08cd9b8430c804edb09374e29d","impliedFormat":1},{"version":"396b9cfbf84f6d62c56eb78313118d33b2b4b112c65452856049b234e91ea782","impliedFormat":1},{"version":"beeb53644fb37efb6c8fc859d7df72d7bf9df52b027169ce087f8ddb8fe43c5e","impliedFormat":1},{"version":"0b10af13b23b16a86decbf9dced96c5412e742f1e1cbbc7e38521f3272699a18","impliedFormat":1},{"version":"5d8912088adc90f54b80df0454cd6b67c1a4a5c08b45e42f6306414f92179e58","impliedFormat":1},{"version":"2bf6f81bff3aec45692cf7df2ec4f6bb955c15db4d7a0b16f5fc0aca638642f0","impliedFormat":1},{"version":"5e1ac93dd33dabf032ae7d26e7d376e25dcff407b285ebed3f08bb440b5a21ca","impliedFormat":1},{"version":"9cfa1b7b61b310b77c8291afc7567f0269982273f5c1c056ea2a6594cc966d74","impliedFormat":1},"34a34be82c301bd36b11967f64793e25c452f683f66eb63a2c9b9382291013cb","212f48de57c8459697680ebcd00c6f6e3b4938a5868e0ee67d16120c06005fab","7a25c2a8996260ae0959bc33b7311de3a098a4e4c250b213ec425d1d038b6280","67faf30978b58f810624c8e9b2fa1e5758fe9b5b400f2419f166721b16e3282c","4d5e09bf879145dadc2707ff2c877c702cad5de8ea5b6e0eb4ec29d4fe9bd3f4","f489209d1449424ca707ef2852f4c732cf3e568c5aeab21cc37c67f4c401ef1f","34c2a35ec8db5ff54fa86d806b8540cd330792a1a977942ae2c203df2411ee44","e878d835f888a25df33826880ab51b23dc0f3a145ff522dcb6df86c19749b479","cea4f6104c14a2de217034c55d5e0c5d108800b8776791277bec0f3a491d6c7d","5d59f5b83155be3893bb5b8f6bd3df7a85157dc2184b21442b5c104603149ea1","aac543d234cd796c6a6ae3a76cd9961480d5b22cd00dc1a64c4a56025310c212","437755bf7362625845340e775422362c249132b5ce85bad8e0863de1442c1ea6","a2325ec154d19da8a7231b9bc4c615650417258d2f887edc0c91f9d9dbc255bb","b8e0a9ce934b5cbdaf505c3028677700753443e9766ff07734db197abf42200b","cee3a191eb553499713a69f5f4728d3b1e917ec9423ad976b4bb576dca530245","29771068febe7e8f360713fbb4f2d0142b7220f099a328759f3f5339dddc460b","100ebc14d3b3f2d9437681da4e37ce15eecf8d0bc50c562f61d43cbedfe9dd89","89e8081e7bb10a1985583264b6772b401c888f0da9efb63deb3dc671bc730900","83b2471c82779e1444b63942a2469bf40a155ed4e646dfc9e1583772ef1cf554","7121f8a3d7143ca81e758e5f4924bb60730a03268151ddc0688f144b03d427d2","df1170274f174c97b713e922dc2b14bd41978f0b128108c4f1d8b52c5ad750f9",{"version":"73a0ee6395819b063df4b148211985f2e1442945c1a057204cf4cf6281760dc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"d05d8c67116dceafc62e691c47ac89f8f10cf7313cd1b2fb4fe801c2bf1bb1a7","impliedFormat":1},{"version":"3c5bb5207df7095882400323d692957e90ec17323ccff5fd5f29a1ecf3b165d0","impliedFormat":1},"242d2da324880332769e3302925f3db9ae112f1fbee32b877f48ee86ad030891","fb402f271e513395909e4074fc569d1b15d1e06f343af3ee9571ffc25a3f047b","cf6141331e337e09f4fd6cd8297af4a54e606a9f9f26945a09302b335b03c2e1","0b5086f10b4c808eb6d57ffc8e682c7093b3b5172854fe2ca7497b48ad85b769","679a0f3e894d5d408147a6bf9e2112d47312b7d303d0dd27b403c62dc24ccac3","22544b339213bdd7af6899eee2730a28850900acec2117e7d237149d9cf45a6c","384d53819d8764fcf034acb61dd5e0b882a508a4be079e78a25622ef25c62f97","cca8499d96e4f5780d93adc94af96c4b5ae79e427ba0a9116a10a8ea00273562","e1bf802ca7e71ed86729c08ae0bdee184247ef7733c03211e6161e1e7e604bfb","a28136f26720706488db65c5c52f3645079dd581645d3ca810ea3072b6e6b6ab","99b36a6ea4e3ca84501d637d622a29a910ce014d8297be057c560557e128ba8c","b2ef51f383a2363e3d66d715c0f9bb84249becf53629f26486d418c8cb6b5aa3","9ddc3dab94e0287994822df05f09bd9cf417563fe24b290decad01c0d2eb80ca",{"version":"52f5c39e78a90c1d8ed7db18f39d890b2e8464a3f44d4233617893f6648e317d","impliedFormat":1},{"version":"9891b4e49d435c7ac14fb3cc769e97077bbd946100c952df08eda117c3b5b68d","impliedFormat":99},{"version":"2d45f7ff55036e74513af142af1f414924ad337cc00e612bb37bb55473c70b30","impliedFormat":99},{"version":"3a6b10911970b0588c5a287642e4c6be91c16b96407a499c6dc81a96daf1085a","impliedFormat":99},{"version":"6392353adcff7db02a3f5dcacb5637b791dbbcb76125aac3075da2519af9785a","impliedFormat":99},{"version":"1f3952b74b8c766a2e602a0ba2db19d3d872d00bab4e01746c6b7229c585086c","impliedFormat":99},{"version":"19726a169a4000cba269c284b97043faa0593de45865c43553c233f6825af0fb","impliedFormat":1},"92f966f8184f9cc5f531fdaae3caeabde238a82d783e50713eb015d70e187914","9f44604e67cab8b4618fb0743d41ba9aceb886285f0fadf7fd6c6ef2f3ab913a","19e1a22fe32da3d48906bc7b8c517ada6b58ee44a030331d469155a8af66b348","23154637425b907a992c377203f4c618eee4d12421ac52cec263a83b8173572b",{"version":"1c97ee9a298f6c15c3e637015ee8ce3020a07329105d430d4ec45a5b6cecbb3c","impliedFormat":99},{"version":"f136e76a35d7b96a3f826ba6250b2dcf984aab4583006014e9e091d36fca490f","signature":"d2022ef4d860a53606f63435b93c0a7547990e8d8b88862bd2eee8ee9a4ace0c"},"aa0e467a4a77ca517ff1ae8282f91f4ddb28c3acd441f93eedf1aabd07b68b41",{"version":"adf20cc38eff5b498d071cb684fef03bd46a419c65cd33ce39a2308e33cd84ca","impliedFormat":1},"31a5ddda427bd1fbb2c7fe1ca559db8bc393d7f42592452f29f4928603d6bd92","6020c483cbe9b111c42dc146f31f3c269fa44f9666a7bb289f33d4e1d415a5f4","c9d1b88aa2c8cb759d8592fa78e56015a156cc8fcef9acf694d49c646076eda0","a58068f7fc51a4d70f59eaa8d9f6b79440f71287c3988707f6d82e8493cd8c47","baf0f41a91dece70a701d19fd82b1b54c48a22eb94807f9bb0718f0252764aff","579b34fdf9e3f0a6229729e86cefa990d4c9653025a9260ba0b029d04e28696f","79acf870259d9ea9915fd272eb3ca5709361e8a86f80551588c1c97da9dd33b3","a4e143cf77873e6c0ae83b4015a892684338bacaf91ec384803fea0de1c8917b","a98f4bbc7a5f4f4f7df0f1f7cba27eedc34d3852bc4c8d6eaead40a106341848","9c3d1ca00d7911dcd4ad62ca95be97bc253099773a23f452d2f215d235c2a18f","08c8705cd2aba74079347b327a048c0f427024789f41cd6bf732a636f95d11e1","f4a266cbe60a450d84f26445962f7a62e52e73e2c82bfd2e642ebd07cc97f426","f1c8cbd870edf8abf542d3a9eaaf15540a37e9248e4ff06eb0643986e0f4d82c","de454fe663b6815d06e3512a1ca1af2a1f28a2534aa8a997b0ed2b5217dbe836","6fd221dedf75176a02b338de6a8bb4ec34ef023d84d5d95a534ae6d68b4c70d7","d5f00e1719ac4c6ec915553af50c4ceeaee17e76113d763efee65cfacfde01ac","edb9845bc23f34e9718510206fed90eb7e010633a08e91bf92323d5c938435ee",{"version":"c9c42d5948aa033c444cb6a3c188bcd925997bcc2bd8e97928af480ee356417f","impliedFormat":1},{"version":"f4bb2d3708ccd853dac13f97ede135d721bf5c2586f73ab8f1170f439e44b5b4","impliedFormat":1},{"version":"fd5649816766f52b1f86aa290fd07802d26cbb3b66df8ed788a0381494ebd5ed","impliedFormat":1},{"version":"269a13226bf6847c953f01ada5aefe59a3963a3a74f98c866ccbf08679d16b86","impliedFormat":1},{"version":"b769494ac41040c4c26eb6b268d519db4cc8853523d9d6863bee472a08f77f80","impliedFormat":1},{"version":"2fe42f88e2d318ede2a2f84283e36fdb9bd1448cd36b4a66f4ead846c48c1a33","impliedFormat":1},{"version":"cb403dfd16fdbdfd38aa13527bcbb7d15445374bc1c947cfcc3a9e6b514418ab","impliedFormat":1},{"version":"60810cf2adc328fa95c85a0ce2fd10842b8985c97a2832802656166950f8d164","impliedFormat":1},{"version":"de54c75cad3c584e18a8392a9a7e0668b735cd6b81a3f8433e18b5507fd68049","impliedFormat":1},{"version":"c477e5c4e8a805010af88a67996440ba61f826b1ced55e05423ad1b026338582","impliedFormat":1},{"version":"6b419ab45dc8cb943a1da4259a65f203b4bd1d4b67ac4522e43b40d2e424bdd6","impliedFormat":1},{"version":"a364ff73bf9b7b301c73730130aed0b3ca51454a4690922fc4ce0975b6e20a33","impliedFormat":1},{"version":"ef113fa4d5404c269863879ff8c9790aa238e577477d53c781cdae1e4552a0cf","impliedFormat":1},{"version":"5bfa561404d8a4b72b3ab8f2a9e218ab3ebb92a552811c88c878465751b72005","impliedFormat":1},{"version":"45a384db52cf8656860fc79ca496377b60ae93c0966ea65c7b1021d1d196d552","impliedFormat":1},{"version":"b2db0d237108fa98b859197d9fb1e9204915971239edbf63ed418b210e318fb8","impliedFormat":1},{"version":"93470daf956b2faa5f470b910d18b0876cfa3d1f5d7184e9aeafd8de86a30229","impliedFormat":1},{"version":"d472c153510dc0fd95624ad22711d264097ff0518059764981736f7aa94d0fa6","impliedFormat":1},{"version":"01fdef99a0d07e88a5f79d67e0142fc399302a8d679997aac07a901d4cf0fc83","impliedFormat":1},{"version":"ffcbdda683402303fa8845faf9a8fbb068723e08862b9689fc5a37c70ef989b8","impliedFormat":1},{"version":"208c5d0173b66b96c87c659d2decb774be70fb7a5d5af599a5d05f842b2e8d74","impliedFormat":1},{"version":"ec3b09b073a5e8a14fd5932cc4c33efaa0280c967d15bbc4c0c5b73a0d2f1a68","impliedFormat":1},{"version":"4b4c884e11985025294a651092f55dcbf588646d704e339674dfe51bdeead853","impliedFormat":1},{"version":"78c8b34f69c45078c6a3a3f10a24f1a03ea98495b6d75b945c1a3408a3ce5a26","impliedFormat":1},{"version":"0b1a08da571520eb288eb75843aad95d07fed423aba18b1149b5a0c767baf688","impliedFormat":1},{"version":"9c4708e703c8deb525e95946b3fdd8d5caaf724b3ac4a1cd6c2cab759b53f76f","impliedFormat":1},{"version":"ed14fb238769ed0b0dff6b78bef5263f0f50f403878ecd609fc71774b2113b12","impliedFormat":1},{"version":"59405847661d05bec9243efe9498211cb7e66d2620fe946e40750ffcb9e7d56a","impliedFormat":1},{"version":"ef95961bc90e8972bc9d88bee5264544d916929c0240e8c3c8ae220568b26ead","impliedFormat":1},{"version":"3f64230713c989e5f2d1d46c13fc8b2d9193b5dd59d393d5e70098c221894b1e","impliedFormat":1},{"version":"e49eeb0f93ea6a311a22f5b66a155c368e9cdb3585695fd951945df1a4192eb7","impliedFormat":1},{"version":"6f704837b406e4ac6ec5942018691ecc10e2d079cd64706d8ed1e86826d0671e","impliedFormat":1},{"version":"ee2229f4fc2d2306c864e5c2399aaa5958e4b3e1c964701fb8a84709237c9f47","impliedFormat":1},{"version":"6e5563614d424223f4748c6b714e1e197c8422824ff42fdc16f64484e1a863a6","impliedFormat":1},{"version":"8f31673ebf988cfc4b7ce2adb6a6c489dd748025600d8e2b7d922f952d7d21af","impliedFormat":1},{"version":"fd3715f87964b5fc26f4c333422969da8ca45e69e3fb6973ba6c806f437eb012","impliedFormat":1},{"version":"97b1e695f57dd56a6495f7bdca876981cc8db1cc4a555c3964aa14ce26e0f4de","impliedFormat":1},{"version":"cf32c06d23f373f81db3e93d47b7006f5bfc005df4d92bf5407b7792adcb3c47","impliedFormat":1},{"version":"eacc624e44f4b61dae0502e59ca5c0307dee65e7c257ee3eab4b2c8c6f156cd9","impliedFormat":1},{"version":"6041c1c22cb701abf3d98f153f878b12280f3b2213144588209b66ad5f5915dd","impliedFormat":1},{"version":"d95c6fb6552ca855ed11cdcaa5c68ad484bdc6325fd86fbadccdebfe57ed841b","impliedFormat":1},{"version":"0063b3ff097c4542be10322c67ca804e9e4504545b46ae8d620ceab59349ee84","impliedFormat":1},{"version":"9ff44b788f5d8d86f6fa34abf3faec8c425ecf1838248318acb0c5a4c88e62e7","impliedFormat":1},{"version":"4169cb216a6b361ba3caadf4a13670354e2a68ce055f4ec77ae7688902d2ab2d","impliedFormat":1},{"version":"e642a86d8e0956bb7c76aec21b83bde20409b19eb22786ed72ac5515aa9268c8","impliedFormat":1},{"version":"879e2a34d0139f04a32974fdfa44c5720619afd28f8bde0e5860f371d5f65d34","impliedFormat":1},{"version":"8e04860bdf072d4270b09b33b2b91ec4545297f23cc580041cad3e738f58d92c","impliedFormat":1},{"version":"bff595611ce25571f0cb50a83b7dcd7599559d6d3e98bf4fe87ad77b9c347664","impliedFormat":1},{"version":"2eced6af832d4e69811e353c7751f73bba07dc3b63189e0fa963e8264f341c12","impliedFormat":1},{"version":"a884b3560c8a29e5cb7f1263d880ff5c8b017991009edc20f450027c4a112b3f","impliedFormat":1},{"version":"6775c3e28d13ee126ec2c2e0827ec76422b0e11d9d5c2cfdfa7b982d48455fff","impliedFormat":1},{"version":"2ab0ffd4cdaff94c5cb8701f34442f8a018a2b62623528a66ad1ad8172ac6626","impliedFormat":1},{"version":"ea8215cf7cab1015579eac88e2f16fa1fabbe9f84ce4d2848c10f36d7df8ca1d","impliedFormat":1},{"version":"cc894fd562a73055ff72dcb7821729cef909b85bca4d0e2e2cbd0c1a2ecadeba","impliedFormat":1},{"version":"ab058bf3dbdbde6571f97a57a3b52b14be9d7e19f23190e9a551d5d6f6b6563f","impliedFormat":1},{"version":"142892cddebce23312318d79014de94e64a1085b8b0d73b942b4a6ce40a1b18d","impliedFormat":1},{"version":"db84257986e870ab22b304a80b02ea5e079c13a7f7be7891c0950bfd9e33f915","impliedFormat":1},{"version":"24cb43d567d33ac17daaad4e86cd52aba2bb8ff2196d8e1e7f0802faeeb39e95","impliedFormat":1},{"version":"dc6e0137694a7048ceba1ce02e6a57ab77573c38b1d41b36ae8e2e092b04ced2","impliedFormat":1},{"version":"aca624f59f59e63a55f8a5743f02fffc81dd270916e65fcd0edb3d4839641fbe","impliedFormat":1},{"version":"ce47b859c7ada1fbb72b66078a0cade8a234c7ae2ee966f39a21aada85b69dc0","impliedFormat":1},{"version":"389afe4c6734c505044a3a35477b118de0c54a1ae945ad454a065dc9446130a4","impliedFormat":1},{"version":"a44e6996f02661be9aa5c08bce6c2117b675211e92b6e552293e0682325f303e","impliedFormat":1},{"version":"b674f6631098d532a779f21fa6e9bdfca23718614f51d212089c355f27eea479","impliedFormat":1},{"version":"9dbc2b9b24df7b3a609c746eaada8bbc8a49a228d8801e076628d5a067ff3cc3","impliedFormat":1},{"version":"d6ea60339acf1584f623c91f5214be0ac654c0692c0c3abd69a601fe0ff0e165","impliedFormat":1},{"version":"d08badb0bbee55e449ea9ea7e7978cc94859804c49bdc7dc73e25d348337c0da","impliedFormat":1},{"version":"b116a03deacf70767f572c96a833e3c1adf01fff5c47f6c23e7bcb60c71359ba","impliedFormat":1},{"version":"023aedd02204fce1597fd16d7c0f1d7be13fcf4bc1ed28fb30a39587715ea000","impliedFormat":1},{"version":"b18adf3f8103e0711fbe633893cfbce2897f745554058cffa9273348366304d2","impliedFormat":1},{"version":"f41fbddb4a2c67dbf13863507b50f416c2645e7440895ea698605541d5038754","impliedFormat":1},{"version":"636a0fc7a5ee207de956241b8cc821305c8cc72b9f0bec69b9c9de15a9eafcfe","impliedFormat":1},{"version":"c326f85f762b14708a25b9f5c84691562f5cf39ae9148c00f990b8b4a2a4461a","impliedFormat":1},{"version":"caef5b191982cd88619282b10e1c52c3cde8c81d4eaf4650b4e62d73f77483d4","impliedFormat":1},"275fff84ef0f8d1ac70e0fb88edccc29e56397cf1ecc07e988987ac2b619cf97","4e8edf729e0c2a04169b79534daf9b66f9976173a12c8f5339c80b9bc23367ff","d2a8f67c03a19b1a2756a9203f0f4b37cac1cb53800cd6c8153780f2ffcb837c",{"version":"9ff194a196707954313c197ff74831edf396ee89f6b6e50cd5fe9e07b8d7d46b","impliedFormat":1},{"version":"5c744b1c4ab4cc215e7021244a9f34d2c84119af2e368648df49e9c91dc74256","signature":"1c686cdb2de566a5905d2dff9919c880c4c9e0241af5155073d868834d5cbe6e"},"7e02783dd585896e4d934743044105b4bf7d98fe9ea128b3b2be8e7862cadb7e",{"version":"3312f7d9eb01483f9e392733e461f06755fdc624b5f2318e01f686a6a036ed7b","impliedFormat":1},{"version":"34491a67ae33c8bdacec1f4c07008f01d2ebe588ed8b7b1bd8f940f5fe953f2a","impliedFormat":1},{"version":"cc0e6f2705c8fd9eb831790840c08be6a3d3108d7c7043c4a1c0a97e3e9e289e","impliedFormat":1},{"version":"273928f388427cb6d6859c6b29d760de7612a110f8a50afe092d3a6440ed0cd3","impliedFormat":1},{"version":"54db43f6a831781a4587d81802277a9686bf34680c586fc0496e32088f2d8942","impliedFormat":1},{"version":"0f53259dab3f0531bfefb89211d4be171821c855980a843b396e9dcf06ab23a3","impliedFormat":1},{"version":"b1b1faeb576467d84ffaab5942f6bd5a024bb715dae28aaeeb22b37cc0f17030","impliedFormat":1},{"version":"a7380d88b8153951784d10b663b949986aa02c238d7aba129d378bc8f0bd2900","impliedFormat":1},{"version":"2110f6c3b26b0d0af8f4d0d7bf8fe89cafbe2a200cc2187db2e446c57628b67f","impliedFormat":1},{"version":"b2d0ca3686d89f74053a1d0d90e8088b9d48869c9814db2cce4554585c83094a","impliedFormat":1},{"version":"6491db94d895853640fd0c6814aa5decc2458a6085193abbd7a83a0a65736a30","impliedFormat":1},{"version":"ce8cd3fcda8947836cb52af1f9a5958fb9cea1ed5eb53466227a82c079ba5622","impliedFormat":1},{"version":"5a081b7e2596e450b5bbcd5c5556806b85bf2c0bdb6b7fbcd640dfa6339a0bb3","impliedFormat":1},{"version":"36022f5544b27ac66385e56350834423923403574cbe6efe1c982649f9452c54","impliedFormat":1},"bba6cfc527c19857aa23b84e8a2046f44b996307563a7ecc22a92fbf20010a14","62c0acd226346f4a785c9193c6c45545ec3fff1979ee8df3f588846f6d19c861","80053711b514e246668987e2ecf81e0d07cac02d4df0fca9349d93a8524c6eaa","e0eb841ca5a2734b2dca0fd51b36db487be2bcb099a86026c7618eb198b4428b","56795690506e9f971e99867981d6d70728826072ac326b5b42a84b32e83b7be3","b0cb22b5146d40d089e9237e00d20889285581a146d11b1673ff0477801f4250","22725615aa6f29bc460cf104925d37da934ce0a070a75ec2f27bfb904e44a42b","63847c8863d58d05b6de39372b3286da63c1848d142966fa4fae49a494b273bd","c8f48ba45f7cc5d21200a73e2299637e9a132be97fe32b5420b41c9083da8f26","5765ff58850bc8f51c7480818910df84df56d86c80a036e347d0d9a169a0be97","069f758baf9f6d57335d108a40043d61cfeb8258a68b1a9d9b9bc5923f26a95c","4dfe1b2c2c969247671df680b24a9c967a241ba8efb8f560d38efbaa68b69dcb","297ba6d7e4e8c638f366363cb8d85141fdb1c2daaa6b06ba257eac005ac978fb","a55b60d594c2c7ca9c2ec78557f60cf80afe36571bd0f17be3b75f22755a6457","403d308ff3ea1212bb55bbc619d813d03fc9515198e13e04dd224607eba4a75c","b8b7ed302e941989201e22112bb8b2c8edeeb9d3fe677f3ec3b155ad1bf067dc","de3f5544642634ae186a297e5f0f64c1ec8455fd0a9e6419c6a0215e2525e534","ea79deb2c6f4040dc55bd04e4a37ea36858d7e59ae354ebc0eccaa2698fcfeb5","91883e5a7e00b0bc6e87ac5989af4c21de2377268e6bc15379ec1eaae601db50","904206fa7cad3d3da7d04805aa61f9ad2438c6812bd7cfe494711195bb042f1f","29a5c6db1d280d9d1608f0445d11b9894d8b689a5464db6e6b9107ae12ef0a67","2985b5a8371b42b78a230fb9712cc3c53692cfb8490b75bd27e41f9f3ed3bdb8","a48607078976e0d9aa652912f678f0dc38782b0735d1e2e15f78addecd97a932","5134195fec4d019251817043345bf7280c10145fe777078f0b7b10d29af0833b","02465a9c5305147d02b7b8055622109c4a4aa06a7c2cbbe36c8d94d5113f492b","e9c20c57dd7f0282aead93fe090788a197d28817d47cc0ef9f5159b74abad69d","dee13f5af77af9731e0cd98786da6170b21b94996bab2e782cfb315788fde9bc","132679bcb51ed20109bded99dfdc0a065b4c9037c2cacc4dfb4dea623830c17e","4d5c9922ad0be23e51e85f9d8f8b7e5d9a1962e98d7eebacfdbb9d8b8a1cd32f","bfd4b5cd77a389957c8aefef945b2dd6bae4cb79cf094c63cc5b6198e5213b05",{"version":"9bbdca4053c688b71dd5a2cd64c6c3ded916be13360c723c8c6cee23d1978a13","signature":"d183685417ef0f208378af4e4f97ab6addfaf818dfad35835b63535a7aa7fcbf"},"e23fbb983beeaefb3a412da7b4fb0a44e2c35cb4b7afb09aa465f73f1daa974d","64f29be229c7719a5883a31911beda7970aff4336d375ad1feb4304278d3b828","6a8f4a5aa81b64b18130401a3266c15e74b46d8d06d20a19c4105c51672d3362","2cb2f33d92c9ba1402d1dea4a99e1c68ae5ab11c33e1d5c8743a1e49813d63d2","035d3e4f3d656d5427955191ffcb1ce1f8ee9443aba2fccefc0d8ce34328cba1","97b2b5bc1e1474b8d180a47999ae6fdfbff2366235b4f068917f514103ec8ade","2bf0208ac551b03a24141ab9dedf0fdd508290105fe5e7d1a6fa0ac4de014a1b","97584f8cc5c4e9d6bf87c6be28c4326750b7befce0702416ef2e58e269838fde","b57cc712fd0da58bfeffdee5b34a1732536c0a5fdfb588d7ff5e3105049c21af","8e7c8d0c43e90710a47330829989dd888115e708ecf2e93e131af642ff4d894d","f16582e71182d6e9a11d07efd60222ab148716432d333b229c66f9d26bec92a0","e70cb4b742890d3f9c1ae7965918f04cec997b7f339676b9a36bdc4c6a44c707","58eda13626bd8ccfd3069303532127ab52ddeb9f4bbfd6d5f133b83dfb188a0c","987ebc0d0cd29b95188a2b6cf4a1b69b4e780029f64f1de793f519e6f9f4b6ea","2f1f5761db10d675f86c4cdf82014c18a6feba42ffda5233014d031fa65d3270","ffa264a84c0af2ccb222dbfe84f0034c7c5182674d807c0a2c44741c85018959",{"version":"55a914fba7f17f73eb971e012bcb90221d5dca20751852c217428a5511db57a4","impliedFormat":99},{"version":"d9b54195cd22859480b70a2e287c41e654c812b0d3945652bd08c8943ddef78b","impliedFormat":99},{"version":"73b32be132963c6e06bb2f833ea0c21116581a3aafc8ac9145cc89a0b6f54bc0","impliedFormat":99},{"version":"73597a22736b6efce7cb30e380705cd6572d9e3f9816068130ec09550129996f","impliedFormat":99},{"version":"04504c465aabfed05529bf3b314df66c4eb449b188547c51edb962d8eb6069e0","impliedFormat":99},{"version":"09466b34e26295ee836861fa6348aff7b2275c6220cc0b41040c9949421e052f","impliedFormat":99},{"version":"242ce683695df72f1cdd40ae2ac06c569412e533528de95d956b26218cd195f5","impliedFormat":99},{"version":"d75a572cfd779c99cbdab5f8f44f6ce465367c057c07e33364d186de41ad9b14","impliedFormat":99},{"version":"8d12c3032607835687037e28dc245a4af486ef4aa6e6cb13744dcb0a3b074ab4","impliedFormat":99},{"version":"7ee2d1edc6f59a50eaeb12ac61a74ab4832f64661f795131df23ac8256df2329","impliedFormat":99},{"version":"8fea385f7e21a39e857e3fae89eabde7b0960083d205177430be507b38413579","impliedFormat":99},{"version":"7fdb8950d8a019940182ff1f50d02809a45832121b9a7899677a497aaba506ce","impliedFormat":99},{"version":"530e23db4425868edfc20e35fe2d8acf047af5b6f14afa46ee2e0e71e40c8df1","impliedFormat":99},{"version":"7cf421c4c6e223d2b648dae0ea51a134c4c8a5d8d55db1287372c4c1569c656f","impliedFormat":99},{"version":"ee662f8ffa58a60ca3ca8c141d4910043216efe63f696146b6fa0a455a4f9034","impliedFormat":99},{"version":"4eb4f2e56895129861a971177f8e9241ccf633daae3a6ac7343b92e973381c26","impliedFormat":99},{"version":"c75223aab2bfbe3fe85211fe56cfc844dd93d33e503e22e9911fd0d3e6f6538f","impliedFormat":99},{"version":"8fcea3d952a8129821d4060969f305a341706c256cb8002aba8e5b07088c24ed","impliedFormat":99},{"version":"2a6cef87ea83b5bdbc862e894329ba11002e76d5fb6ab24247502ecad2c6fbe7","impliedFormat":99},{"version":"39248c14bedc3e2d734739452408661523228ec790d7142a4de185ae88904da4","impliedFormat":99},{"version":"c14433af8654964ed33f9cc16f9369e05ae543d56bbc6a1c3b393fa7077f08a1","impliedFormat":99},{"version":"d867a5469eabe8abab25b27abb7125ef2ba019ef42dd1ca2b5d0871513042629","impliedFormat":99},{"version":"89fc4cad6ac7ac6d922523b3ab51462b050189ab335766149e5cc777483d4e1b","impliedFormat":1},{"version":"c031417387ddbb2923f41e3fc94b49157745785281c8949a221cd69368610086","impliedFormat":1},{"version":"73ef706b29d220404677226880137ad0da0145b6a2332d5427b9517dee295e70","impliedFormat":99},{"version":"89fc4cad6ac7ac6d922523b3ab51462b050189ab335766149e5cc777483d4e1b","impliedFormat":1},{"version":"27b14b091ccf309c79f3d2cf226edfa4d533b131f19bc0cbe855adebd464c285","impliedFormat":99},{"version":"50854b8ef4c29f3e952f170aaa045604a9d90360b680ddaeff542d1f5bb5fa8c","impliedFormat":99},{"version":"caa3a0be5c051f52e27b91642c8b31037c09ad0b65288498f4c55e33be7ea249","impliedFormat":99},{"version":"48020f2aa87dd71c26414f9afdf172159a6c31186705417da52add9d6cfe2153","impliedFormat":99},{"version":"f4e5a6883146482d6b49c1406f99a38b1ef883382b169bb5fc6cf7cf9f2ac70c","impliedFormat":99},{"version":"8b7b4f82a54a847a29fa481af4ea74372c19b75379bd27658c2a819149f21871","impliedFormat":99},{"version":"4f7faca5821e340342ea0feb3d478126659ece37d5dfdd6d9c9536bfd48def34","impliedFormat":99},{"version":"99878cc85152e70be715546f165826d83cf033547b4647cc3cc9cbd6d4df429a","impliedFormat":99},{"version":"7677f5595e7bdc2e6e42ebe8b4df4f4b520b28f6f175c839b73a208e6f3c8907","impliedFormat":99},{"version":"fd7faa9225e2e61a0a3d786a7a859af52dcb295c06bce7dfca140037655dc095","impliedFormat":99},{"version":"af0f7e3281ab0774f26ca8bc36d6aa37709f3510c8c1eb0ab122e7063159be01","impliedFormat":99},{"version":"960096f9e2ff9e9019e1c23a04916f2005d4c8dbd43f96b196d754b6c8a16700","impliedFormat":99},{"version":"c7c18305c761411b3c168f2b3376101b60d7a7d7c0505e81c6d8193a418f3d63","impliedFormat":99},{"version":"6b9a76dbc0ac3a427aa7370981cea9aea0e8286453b189dd03776f1034f7847c","impliedFormat":99},{"version":"3e48026dd0f58d4668dbfa9c6747302dcbc52e3aec373ec1f95c2ba78c308f33","impliedFormat":99},{"version":"053f54680ea9b4b1a8e9e5fe9f4a1fdcbc00f8f9b6d895109eb0d169915dfd11","impliedFormat":99},{"version":"3b0f440d9e4227285cec9159b1a472bc885687baf227a7b4126e2ba6dbef96fc","impliedFormat":99},{"version":"656e3a4ac005fcb1513ab1224eacfd55ae04b6f16d21d66c971dc901dad62c66","impliedFormat":99},{"version":"ea4891706f147e494a2a7028b2376110c2e85b7561b27448d51a7d1277c6fcf2","impliedFormat":99},{"version":"7f9bb3e6bb8d0607f94d1498c5fa8ac7445fcb4af52d0775a857d0986e0d0c84","impliedFormat":99},{"version":"c98c85d5b894c8955950338b1091f0febdc6c6702cf3b67a171d29d80fb2dfce","impliedFormat":99},{"version":"d00addf28fd877e3f8109b592b1918084cfb831268a0fd052fa72e6e01390cca","impliedFormat":99},{"version":"0cc0f30db3c4a2577606c6930eac2814d0463148d1bf02be9eaa318d6cb6d40e","impliedFormat":99},{"version":"21fb062824012292b09e9357aa7ac3231a0d683a7fbb9bc8e2b027346c7bcb32","impliedFormat":99},{"version":"9aa939dd1371c068dcda7d17c32fcbee08fa994890fefac8ad39d8cd5a294d92","impliedFormat":99},{"version":"8c0e829b03024d1905dba908ed55a5808d79159709770fe7a3b0395fa78125c6","impliedFormat":99},{"version":"15e6253aeb724521fcd0fd8bab60ac00b40e1b6c39aabb0de3b3e45ebe2d584a","impliedFormat":99},{"version":"4d3a0370e69c2d70d62a2eaeb40512474e38b4dff1a4e7ac98637f954ec5c143","impliedFormat":99},{"version":"b0094b81741504d0282359218e3659f5282b9748ad0e80d9a1c634bc1c88af4b","impliedFormat":99},{"version":"2c8e3d7848994c490cace467a6aae3fc4908e5b577b5ab0996200497062bb80b","impliedFormat":99},{"version":"6db32445cedcfaf6f6a4dbb922cdaf87e1cfc0422e4a31efeebef3fb0eb1a93b","impliedFormat":99},{"version":"b5102cfc507fe0c916a9ad45f4f52e00e3959b90eb90c5873e9527cb37eadb78","impliedFormat":99},{"version":"21e3abbcf80dc69638d138f5c6d07f596f8a162a8dca3bd71286403a96f8d0ab","impliedFormat":99},{"version":"20eab98ea24e9bf8834db1a339abb373e6f6a268537efa1fd571cd3809839eb1","impliedFormat":99},{"version":"796885a2efe76d5bef797516bd3a798b275f81075da8497fc1f6a9d3e085f2a8","impliedFormat":99},{"version":"b5a2192e328273da5a8279add3052bbc33b1adecb15f34a577c69c4dd2766d8e","impliedFormat":99},{"version":"20126c8c53f22550e68edb187f5d4d477b79a2effe7801fff3aa47949219d67b","impliedFormat":99},{"version":"8b63cf9a4a5bafaa3d2e157e6d07bb20d0d73fe0c5ddda715342a48d18534154","impliedFormat":99},{"version":"369dd195a978dcb88d63f1f1878e5dabb90bbc79b3e5fb0f16cf06209ab9e7aa","impliedFormat":99},{"version":"090b7d0fd37b238e003029b9137d5dff073791e21adaac556dd7524ed9ed977e","impliedFormat":99},{"version":"efedab846f4656f034814230fc05513b8cefb5f95994faee4f9b174c98bfef41","impliedFormat":99},{"version":"4f8876f00aa99ae0b39d6bca9da9e86f426dc6c458558773a647100a85fc3312","impliedFormat":99},{"version":"a13e1f68a2a1f29ceac30f51562e13677a5b8615377af952f0b7d1f9edff34f4","impliedFormat":99},{"version":"06f1e24d4146a779e7fd7a0f0cfdcdcb878da25e271e1e7d5d7f81d874f2dbec","impliedFormat":99},{"version":"0a3ede23be099f3ad266a10b4ad0cfb6efd446b9951f553274706348c3b56dae","impliedFormat":99},{"version":"c7b05cafd385f8988babecd476f4f9c817ecc68141dad54e2dd3ae458878a8f4","impliedFormat":99},{"version":"8fc8726fe9d96e0440518b06451181cabba87bdcb60a6e854b77e2b6dab52890","impliedFormat":99},{"version":"6cb381987d43f853d8d01c2fd5f32627e0c0f3a4dd1a11d5e3f94ff5832aff2b","impliedFormat":99},{"version":"ba0567434dbadd0fb8e80c4e00fb9c30449497f8bf07e82b2b857db0029f9b18","impliedFormat":99},{"version":"f72e417b7d49a5dec2d4f3857f6925ee78608cda1c42655d0179ccd38c66c15a","impliedFormat":99},{"version":"fdbb1158637d3ca4d209c7174270e5eb1414b4ee5324e9c33b1fae88e83bfc14","impliedFormat":99},{"version":"436cdc04f8ad3a54d2194b9926f52d564157ca162dcf3c9f71fa4711d057190b","impliedFormat":99},{"version":"73d9180a0b84dfb4c1a95bf72028103bd81472595617dd7ce788ea21639bcee4","impliedFormat":99},{"version":"55c1b951a4d7289a3056e2edea9855671a9d1f8f09632916ed1fb2aebb57b5c6","impliedFormat":99},{"version":"09b1271f73d90a01c889b4963a350825cff11493498b4141fde2399ce09de43a","impliedFormat":99},{"version":"bb9c7998d6def957496260f4c881ccc5b3d4eb4084ab00fbd8abc8c1e1ba67b7","impliedFormat":99},{"version":"340efc3f335a2a3ea2ca1899755906bcb6ebcbddf14306e66d0f16746db98273","impliedFormat":99},{"version":"6a691651e2748bf7792a251d820f00e8d9d3e4da1cdfbea91c33beda2bdd8b89","impliedFormat":99},{"version":"c3096b0c0f579462e17c525ee6835d82952c32b35061a1d32ac32d7e0f191da1","impliedFormat":99},{"version":"91b3c513f0ca4e2d0c5bc9ba1f43b169e1da7c49ff2cf5ffe730009c229f359f","impliedFormat":99},{"version":"ea0b435818ce832634961d1b65e972927f65a3c29a3e2c0cec3aafa0d7fe4ea0","impliedFormat":99},{"version":"50fe63347779cd2244429e0d54148fdb5d230dcc11f2bb8c7efc9d12c1e573d2","impliedFormat":99},{"version":"7adac175e5942f34a34f223d213bdd9869935ec6083dc6da836b996b7acdf7d5","impliedFormat":99},{"version":"2af0e322d1c39e8b16436cd9bd9c97b6013b75c179281df61afa10df0c722a1b","impliedFormat":99},{"version":"09b1271f73d90a01c889b4963a350825cff11493498b4141fde2399ce09de43a","impliedFormat":99},{"version":"0ef3eabd40fcec506413988e397ff7dcbed2aebfe4f88c486e2ba8dd1bc0ee0b","impliedFormat":99},{"version":"44dce86f2b5ef5e38fe6c068bc629afc04221adfa039f0dd649ae10f799f9ec8","impliedFormat":99},{"version":"5ad41356543df4a83b3ce069a7e628d2ba648399db0bdd4005bd1dfef26d34e2","impliedFormat":99},{"version":"0b448474270be29ded59bb946ac311c40c579ef0b9cf358a54750eef34359088","impliedFormat":99},{"version":"d7ddde645d6ca5b97f75923b3946e96495f81d7f4fd568201653f1939a3312a3","impliedFormat":99},{"version":"fb1148873f0d706261f8517b7ce3574b369c8213e8304c7c21cb9ca248b8dcc3","impliedFormat":99},{"version":"0637ec66edeed3f9ee0da72c0d5ab2c128db9e5a6226f8aca5672aa617db1726","impliedFormat":99},{"version":"ee49e1206cf12b67d5b72a98eaab773481130b87a9eeaa262086a4314d1cd991","impliedFormat":99},{"version":"9fa29d6f0b05ee8f619202c07680a46025b166da55e431a49c5badaa2983429b","impliedFormat":99},{"version":"f53857d23110842c0c62416b09caccb9286b3ba52fa2b6bbe254c58123d9bb09","impliedFormat":99},{"version":"89c02b0ad4fc44d10576b3e37c2c5262a37f2db171a486d2d5960ee60323bb96","impliedFormat":99},{"version":"59348badf356a43f7e1847364a8fdb8a914b9977a517b41f3ed206db36b875c1","impliedFormat":99},{"version":"ff0c09d8b0c8c0ffb09ef9250fac17c98eb4dd5a4f4955d53fc3880d6553b91b","impliedFormat":99},{"version":"07146d909fcbc1d33c5fc02f74dab3750d075a4de305a6c078fff8265e089c5e","impliedFormat":99},{"version":"b323496b42ebb7f2839ef1acb04947c74cc586c8ad20cc936c069d34b98a29ac","impliedFormat":99},{"version":"62159930f535b73f265f98f669c7f7bbdaef719ebc2de3a2bc4835e71ed68ba0","impliedFormat":99},{"version":"6ae1d121a8c1ff3398eff8af6e398868b631689d120076d7004c787479eacc61","impliedFormat":99},{"version":"d23bfd5a61fb32048f370f988a9772966651be1380c1a93c199d7cb25b7b0cf0","impliedFormat":99},{"version":"7344e1d823581d72124f6a328669abbeec44910c2045823bf7e7bef79ca49f73","impliedFormat":99},{"version":"af4a6e7559998dac4978f02c572d0f391928b6f40c62459c1e4ae5afc12995c7","impliedFormat":99},{"version":"b0a2a4c5ca7f6f874de72e39be8f470b348ec062c005cb5a7acc840fd7f67807","impliedFormat":99},{"version":"75083e759d8b09bcbf201a250c918a35221d05c7524cbb67b2b4d8959c919252","impliedFormat":99},{"version":"d89f7811a420d990b817f383c3fec421559063a7cb744fae619e8bba20dd151d","impliedFormat":99},{"version":"abd03428933117fdb9db45ac492eaac24d9a77c37c3944d26dba044b7fce6870","impliedFormat":99},{"version":"97050f022128934adae6a773a63be3c5bd5726f153fb72e9a8d34f2656135de2","impliedFormat":99},{"version":"3901f637d5f111593a5ea39a31d27e7a5f62195251f4ed6a50b77a020bc6e416","impliedFormat":99},{"version":"7edffa8d9c968f6a96b6ffc774be07717378ec619777e78510a7b6de4bfe67df","impliedFormat":99},{"version":"8f8d24c887f993b6c131075ac4f82cefbb246747b22c50491dc64ffd2cb340d9","impliedFormat":99},{"version":"5ffb8c07f5474d45bab306b6267ef2777ad786a841e0942416f485125cbd2385","impliedFormat":99},{"version":"e0d7a3cdfaa21621610dc3b74f8ccd59a5cd8617843ded1d610f05bf790adde6","impliedFormat":99},{"version":"b8f4165a3fa8fea167bb5016ad7629581d8fffb16447217d480c8a7ea438ed8d","impliedFormat":99},{"version":"b936b8e4ad57e3be1407c74e36645d31bebe7f1183d926a0c438cf416ec708f5","impliedFormat":99},{"version":"13fc27c27bc9a42e5e0c4cc08b64e7693b225c565bdab45ace16c179760f3cc9","impliedFormat":99},{"version":"8ff87eb5acdf565af022fb9145942b2207ac8cd0644917bc7d44efb91f4115d3","impliedFormat":99},{"version":"616ff480886a32cf50f73c4ee5fdd9672a5f21428eadcac34c41acb06035c214","impliedFormat":99},{"version":"f08e5842644a8e03da9efdbf89bf4eb61ea906a3bbc255bd7d7583756cb3dc61","impliedFormat":99},{"version":"562682efb4f43e58eb779a742f3e26c1fd796da0b785620de601202a38764785","impliedFormat":99},{"version":"264f935450101e4b000eb351cf75c9d799ca20a278b260a9e5770303b5f2b6a3","impliedFormat":99},{"version":"f6f171b23ae6db93454343f1b788960f799c8f37043904874a752c0990c6fca6","impliedFormat":99},{"version":"304e41926d3299c9b30bfd418c35fffd2bd9e5ac726d6f758fb4e0f40a738d51","impliedFormat":99},{"version":"7d3b1ddfce35445b76298090a9dcadee8acf20f4c281eb1f2ce14fc7232c9470","affectsGlobalScope":true,"impliedFormat":99},{"version":"02ab5dbcaa58da1d58c46c7cdfa7f94792c5ccf0fc7c0622ef33755fe415366c","impliedFormat":99},{"version":"e689cc8cd8a102d31c9d3a7b0db0028594202093c4aca25982b425e8ae744556","impliedFormat":99},{"version":"478e59ac0830a0f6360236632d0d589fb0211183aa1ab82292fbca529c0cce35","impliedFormat":99},{"version":"1b4ed9deaba72d4bc8495bf46db690dbf91040da0cb2401db10bad162732c0e2","impliedFormat":99},{"version":"cf60c9e69392dd40b81c02f9674792e8bc5b2aff91d1b468e3d19da8b18358f8","impliedFormat":99},{"version":"3e94295f73335c9122308a858445d2348949842579ac2bacd30728ab46fe75a7","impliedFormat":99},{"version":"8a778c0e0c2f0d9156ca87ab56556b7fd876a185960d829c7e9ed416d5be5fb4","impliedFormat":99},{"version":"b233a945227880b8100b0fec2a8916339fa061ccc23d2d9db4b4646a6cd9655f","impliedFormat":99},{"version":"54821272a9f633d5e8ec23714ece5559ae9a7acc576197fe255974ddbd9b05d6","impliedFormat":99},{"version":"e08685c946d49f555b523e481f4122b398c4444c55b164e5ac67c3ba878db8d1","impliedFormat":99},{"version":"3c99d5232a3c8b54016e5700502078af50fe917eb9cb4b6d9a75a0a3456fcd5d","impliedFormat":99},{"version":"9d8e34ec610435ee2708595564bbad809eab15c9e3fa01ad3746bbe9015faaed","impliedFormat":99},{"version":"7202a89bea0bdab87cc0ae60912b9e631a48f519b6a1f323dba8bc77a02a3481","impliedFormat":99},{"version":"f865343c121abc3516abf5b888d0c1b7596ec772229d8e4d4d796f89e8c9d0c0","impliedFormat":99},{"version":"77114bdbc7388aeeb188c85ebe27e38b1a6e29bc9fea6e09b7011bbb4d71ec41","impliedFormat":99},{"version":"3df489529e6dfe63250b187f1823a9d6006b86a7e9cac6b338944d5fc008db70","impliedFormat":99},{"version":"fe0d316062384b233b16caee26bf8c66f2efdcedcf497be08ad9bcea24bd2d2c","impliedFormat":99},{"version":"2f5846c85bd28a5e8ce93a6e8b67ad0fd6f5a9f7049c74e9c1f6628a0c10062a","impliedFormat":99},{"version":"7dfb517c06ecb1ca89d0b46444eae16ad53d0054e6ec9d82c38e3fbf381ff698","impliedFormat":99},{"version":"35999449fe3af6c7821c63cad3c41b99526113945c778f56c2ae970b4b35c490","impliedFormat":99},{"version":"1fff68ffb3b4a2bf1b6f7f4793f17d6a94c72ca8d67c1d0ac8a872483d23aaf2","impliedFormat":99},{"version":"6dd231d71a5c28f43983de7d91fb34c2c841b0d79c3be2e6bffeb2836d344f00","impliedFormat":99},{"version":"e6a96ceaa78397df35800bafd1069651832422126206e60e1046c3b15b6e5977","impliedFormat":99},{"version":"035dcab32722ff83675483f2608d21cb1ec7b0428b8dca87139f1b524c7fcdb5","impliedFormat":99},{"version":"605892c358273dffa8178aa455edf675c326c4197993f3d1287b120d09cee23f","impliedFormat":99},{"version":"a1caf633e62346bf432d548a0ae03d9288dc803c033412d52f6c4d065ef13c25","impliedFormat":99},{"version":"774f59be62f64cf91d01f9f84c52d9797a86ef7713ff7fc11c8815512be20d12","impliedFormat":99},{"version":"46fc114448951c7b7d9ed1f2cc314e8b9be05b655792ab39262c144c7398be9f","impliedFormat":99},{"version":"9be0a613d408a84fa06b3d748ca37fd83abf7448c534873633b7a1d473c21f76","impliedFormat":99},{"version":"f447ea732d033408efd829cf135cac4f920c4d2065fa926d7f019bff4e119630","impliedFormat":99},{"version":"09f1e21f95a70af0aa40680aaa7aadd7d97eb0ef3b61effd1810557e07e4f66a","impliedFormat":99},{"version":"a43ec5b51f6b4d3c53971d68d4522ef3d5d0b6727e0673a83a0a5d8c1ced6be2","impliedFormat":99},{"version":"c06578ae45a183ba9d35eee917b48ecfdec19bb43860ffc9947a7ab2145c8748","impliedFormat":99},{"version":"2a9b4fd6e99e31552e6c1861352c0f0f2efd6efb6eacf62aa22375b6df1684b1","impliedFormat":99},{"version":"ad9f4320035ac22a5d7f5346a38c9907d06ec35e28ec87e66768e336bc1b4d69","impliedFormat":99},{"version":"05a090d5fb9dc0b48e001b69dc13beaab56883d016e6c6835dbdaf4027d622d4","impliedFormat":99},{"version":"76edff84d1d0ad9cece05db594ebc8d55d6492c9f9cc211776d64b722f1908e0","impliedFormat":99},{"version":"ec7cef68bcd53fae06eecbf331bb3e7fdfbbf34ed0bbb1fb026811a3cd323cb4","impliedFormat":99},{"version":"36ea0d582c82f48990eea829818e7e84e1dd80c9dc26119803b735beac5ee025","impliedFormat":99},{"version":"9c3f927107fb7e1086611de817b1eb2c728da334812ddab9592580070c3d0754","impliedFormat":99},{"version":"eeae71425f0747a79f45381da8dd823d625a28c22c31dca659d62fcc8be159c2","impliedFormat":99},{"version":"d769fae4e2194e67a946d6c51bb8081cf7bd35688f9505951ad2fd293e570701","impliedFormat":99},{"version":"55ce8d5c56f615ae645811e512ddb9438168c0f70e2d536537f7e83cd6b7b4b0","impliedFormat":99},{"version":"fa1369ff60d8c69c1493e4d99f35f43089f0922531205d4040e540bb99c0af4f","impliedFormat":99},{"version":"a3382dd7ef2186ea109a6ee6850ca95db91293693c23f7294045034e7d4e3acf","impliedFormat":99},{"version":"2b1d213281f3aa615ae6c81397247800891be98deca0b8b2123681d736784374","impliedFormat":99},{"version":"c34e7a89ed828af658c88c87db249b579a61e116bea0c472d058e05a19bf5fa9","impliedFormat":99},{"version":"7ae166eb400af5825d3e89eea5783261627959809308d4e383f3c627f9dad3d8","impliedFormat":99},{"version":"69f64614a16f499e755db4951fcbb9cf6e6b722cc072c469b60d2ea9a7d3efe8","impliedFormat":99},{"version":"75df3b2101fc743f2e9443a99d4d53c462953c497497cce204d55fc1efb091e0","impliedFormat":99},{"version":"7dc0f40059b991a1624098161c88b4650644375cc748f4ac142888eb527e9ccd","impliedFormat":99},{"version":"a601809a87528d651b7e1501837d57bb840f47766f06e695949a85f3e58c6315","impliedFormat":99},{"version":"d64f68c9dbd079ad99ec9bae342e1b303da6ce5eac4160eb1ed2ef225a9e9b23","impliedFormat":99},{"version":"99c738354ecc1dba7f6364ed69b4e32f5b0ad6ec39f05e1ee485e1ee40b958eb","impliedFormat":99},{"version":"8cd2c3f1c7c15af539068573c2c77a35cc3a1c6914535275228b8ef934e93ae4","impliedFormat":99},{"version":"efb3ac710c156d408caa25dafd69ea6352257c4cebe80dba0f7554b9e903919c","impliedFormat":99},{"version":"260244548bc1c69fbb26f0a3bb7a65441ae24bcaee4fe0724cf0279596d97fb4","impliedFormat":99},{"version":"ce230ce8f34f70c65809e3ac64dfea499c5fd2f2e73cd2c6e9c7a2c5856215a8","impliedFormat":99},{"version":"0e154a7f40d689bd52af327dee00e988d659258af43ee822e125620bdd3e5519","impliedFormat":99},{"version":"cca506c38ef84e3f70e1a01b709dc98573044530807a74fe090798a8d4dc71ac","impliedFormat":99},{"version":"160dbb165463d553da188b8269b095a4636a48145b733acda60041de8fa0ae88","impliedFormat":99},{"version":"8b1deebfd2c3507964b3078743c1cb8dbef48e565ded3a5743063c5387dec62f","impliedFormat":99},{"version":"6a77c11718845ff230ac61f823221c09ec9a14e5edd4c9eae34eead3fc47e2c7","impliedFormat":99},{"version":"5a633dd8dcf5e35ee141c70e7c0a58df4f481fb44bce225019c75eed483be9be","impliedFormat":99},{"version":"f3fb008d3231c50435508ec6fd8a9e1fdc04dd75d4e56ec3879b08215da02e2c","impliedFormat":99},{"version":"9e4af21f88f57530eea7c963d5223b21de0ddccfd79550636e7618612cc33224","impliedFormat":99},{"version":"b48dd54bd70b7cf7310c671c2b5d21a4c50e882273787eeea62a430c378b041a","impliedFormat":99},{"version":"1302d4a20b1ce874c8c7c0af30051e28b7105dadaec0aebd45545fd365592f30","impliedFormat":99},{"version":"fd939887989692c614ea38129952e34eeca05802a0633cb5c85f3f3b00ce9dff","impliedFormat":99},{"version":"3040f5b3649c95d0df70ce7e7c3cce1d22549dd04ae05e655a40e54e4c6299de","impliedFormat":99},{"version":"de0bd5d5bd17ba2789f4a448964aba57e269a89d0499a521ccb08531d8892f55","impliedFormat":99},{"version":"921d42c7ec8dbefd1457f09466dadedb5855a71fa2637ad67f82ff1ed3ddc0d0","impliedFormat":99},{"version":"b0750451f8aec5c70df9e582ab794fab08dae83ea81bb96bf0b0976e0a2301ee","impliedFormat":99},{"version":"8ba931de83284a779d0524b6f8d6cf3956755fb41c8c8c41cd32caf464d27f05","impliedFormat":99},{"version":"4305804b3ae68aebb7ef164aabd7345c6b91aada8adda10db0227922b2c16502","impliedFormat":99},{"version":"96ae321ebb4b8dcdb57e9f8f92a3f8ddb50bdf534cf58e774281c7a90b502f66","impliedFormat":99},{"version":"934158ee729064a805c8d37713161fef46bf36aa9f0d0949f2cd665ded9e2444","impliedFormat":99},{"version":"6ef5957bb7e973ea49d2b04d739e8561bca5ae125925948491b3cfbd4bf6a553","impliedFormat":99},{"version":"6a32433315d54a605c4be53bf7248dfd784a051e8626aeb01a4e71294dd2747f","impliedFormat":99},{"version":"9476325d3457bfe059adfee87179a5c7d44ecbeec789ede9cfab8dc7b74c48db","impliedFormat":99},{"version":"4f1c9401c286c6fff7bbf2596feef20f76828c99e3ccb81f23d2bd33e72256aa","impliedFormat":99},{"version":"b711cdd39419677f7ca52dd050364d8f8d00ea781bb3252b19c71bdb7ec5423e","impliedFormat":99},{"version":"ee11e2318448babc4d95f7a31f9241823b0dfc4eada26c71ef6899ea06e6f46b","impliedFormat":99},{"version":"27a270826a46278ad5196a6dfc21cd6f9173481ca91443669199379772a32ae8","impliedFormat":99},{"version":"7c52f16314474cef2117a00f8b427dfa62c00e889e6484817dc4cabb9143ac73","impliedFormat":99},{"version":"6c72a60bb273bb1c9a03e64f161136af2eb8aacc23be0c29c8c3ece0ea75a919","impliedFormat":99},{"version":"6fa96d12a720bbad2c4e2c75ddffa8572ef9af4b00750d119a783e32aede3013","impliedFormat":99},{"version":"00128fe475159552deb7d2f8699974a30f25c848cf36448a20f10f1f29249696","impliedFormat":99},{"version":"e7bd1dc063eced5cd08738a5adbba56028b319b0781a8a4971472abf05b0efb4","impliedFormat":99},{"version":"2a92bdf4acbd620f12a8930f0e0ec70f1f0a90e3d9b90a5b0954aac6c1d2a39c","impliedFormat":99},{"version":"c8d08a1e9d91ad3f7d9c3862b30fa32ba4bc3ca8393adafdeeeb915275887b82","impliedFormat":99},{"version":"c0dd6b325d95454319f13802d291f4945556a3df50cf8eed54dbb6d0ade0de2f","impliedFormat":99},{"version":"0627ae8289f0107f1d8425904bb0daa9955481138ca5ba2f8b57707003c428d5","impliedFormat":99},{"version":"4d8c5cc34355bfb08441f6bc18bf31f416afbfa1c71b7b25255d66d349be7e14","impliedFormat":99},{"version":"b365233eaff00901f4709fa605ae164a8e1d304dc6c39b82f49dda3338bea2b0","impliedFormat":99},{"version":"456da89f7f4e0f3dc82afc7918090f550a8af51c72a3cfb9887cf7783d09a266","impliedFormat":99},{"version":"d9a2dcc08e20a9cf3cc56cd6e796611247a0e69aa51254811ec2eed5b63e4ba5","impliedFormat":99},{"version":"44abf5b087f6500ab9280da1e51a2682b985f110134488696ac5f84ae6be566c","impliedFormat":99},{"version":"ced7ef0f2429676d335307ad64116cd2cc727bb0ce29a070bb2992e675a8991e","impliedFormat":99},{"version":"0b73db1447d976759731255d45c5a6feff3d59b7856a1c4da057ab8ccf46dc84","impliedFormat":99},{"version":"3fc6f405e56a678370e4feb7a38afd909f77eb2e26fe153cdaea0fb3c42fbbee","impliedFormat":99},{"version":"2762ed7b9ceb45268b0a8023fd96f02df88f5eb2ad56851cbb3da110fd35fdb5","impliedFormat":99},{"version":"9c20802909ca00f79936c66d8315a5f7f2355d343359a1e51b521ec7a8cfa8bf","impliedFormat":99},{"version":"31ddfdf751c96959c458220cd417454b260ff5e88f66dddc33236343156eb22c","impliedFormat":99},{"version":"ec0339cf070b4dedf708aaed26b8da900a86b3396b30a4777afcd76e69462448","impliedFormat":99},{"version":"067eed0758f3e99f0b1cfe5e3948aa371cbb0f48a26db8c911772e50a9cc9283","impliedFormat":99},{"version":"7dfb9316cfbf2124903d9bc3721d6c19afbf5109dfbc2017ca8ae758f85178ab","impliedFormat":99},{"version":"919a7135fa54057cf42c8cd52165bf938baeb6df316b438bbf4d97f3174ff532","impliedFormat":99},{"version":"4a2957dfe878c8b49acb18299dfba2f72b8bf7a265b793916c0479b3d636b23b","impliedFormat":99},{"version":"fad6a11a73a787168630bf5276f8e8525ab56f897a6a0bf0d3795550201e9df5","impliedFormat":99},{"version":"0cc8d34354ec904617af9f1d569c29b90915634c06d61e7e74b74de26c9379d2","impliedFormat":99},{"version":"529b225f4de49eed08f5a8e5c0b3030699980a8ea130298ff9dfa385a99c2a76","impliedFormat":99},{"version":"77bb50ea87284de10139d000837e5cce037405ac2b699707e3f8766454a8c884","impliedFormat":99},{"version":"95c33ceea3574b974d7a2007fed54992c16b68472b25b426336ef9813e2e96e8","impliedFormat":99},{"version":"1ecb3c690b1bfdc8ea6aaa565415802e5c9012ec616a1d9fb6a2dbd15de7b9dc","impliedFormat":99},{"version":"57fc10e689d39484d5ae38b7fc5632c173d2d9f6f90196fc6a81d6087187ed03","impliedFormat":99},{"version":"f1fb180503fecd5b10428a872f284cc6de52053d4f81f53f7ec2df1c9760d0c0","impliedFormat":99},{"version":"d30d4de63fc781a5b9d8431a4b217cd8ca866d6dc7959c2ce8b7561d57a7213f","impliedFormat":99},{"version":"765896b848b82522a72b7f1837342f613d7c7d46e24752344e790d1f5b02810b","impliedFormat":99},{"version":"ee032efc2dd5c686680f097a676b8031726396a7a2083a4b0b0499b0d32a2aea","impliedFormat":99},{"version":"b76c65680c3160e6b92f5f32bc2e35bca72fedb854195126b26144fd191cd696","impliedFormat":99},{"version":"13e9a215593478bd90e44c1a494caf3c2079c426d5ad8023928261bfc4271c72","impliedFormat":99},{"version":"3e27476a10a715506f9bb196c9c8699a8fe952199233c5af428d801fdda56761","impliedFormat":99},{"version":"dbb9ad48b056876e59a7da5e1552c730b7fa27d59fcd5bf27fd7decc9d823bb8","impliedFormat":99},{"version":"4bd72a99a4273c273201ca6d1e4c77415d10aa24274089b7246d3d0e0084ca06","impliedFormat":99},{"version":"7ae03c4abb0c2d04f81d193895241b40355ae605ec16132c1f339c69552627c1","impliedFormat":99},{"version":"650eddf2807994621e8ca331a29cc5d4a093f5f7ff2f588c3bb7016d3fe4ae6a","impliedFormat":99},{"version":"615834ad3e9e9fe6505d8f657e1de837404a7366e35127fcb20e93e9a0fb1370","impliedFormat":99},{"version":"c3661daba5576b4255a3b157e46884151319d8a270ec37ca8f353c3546b12e9b","impliedFormat":99},{"version":"de4abffb7f7ba4fffbd5986f1fe1d9c73339793e9ac8175176f0d70d4e2c26d2","impliedFormat":99},{"version":"211513b39f80376a8428623bb4d11a8f7ef9cd5aa9adce243200698b84ce4dfb","impliedFormat":99},{"version":"9e8d2591367f2773368f9803f62273eb44ef34dd7dfdaa62ff2f671f30ee1165","impliedFormat":99},{"version":"0f3cef820a473cd90e8c4bdf43be376c7becfda2847174320add08d6a04b5e6e","impliedFormat":99},{"version":"20eed68bc1619806d1a8c501163873b760514b04fcf6a7d185c5595ff5baef65","impliedFormat":99},{"version":"620ef28641765cc6701be0d10d537b61868e6f54c9db153ae64d28187b51dbc0","impliedFormat":99},{"version":"341c8114357c0ec0b17a2a1a99aecbfc6bc0393df49ea6a66193d1e7a691b437","impliedFormat":99},{"version":"b01fe782d4c8efc30ab8f55fae1328898ad88a3b2362ba4daac2059bd30ef903","impliedFormat":99},{"version":"f8e8b33983efa33e28e045b68347341fc77f64821b7aabaac456d17b1781e5f4","impliedFormat":99},{"version":"8d3e416906fb559b9e4ad8b4c4a5f54aeadeb48702e4d0367ffba27483a2e822","impliedFormat":99},{"version":"47db572e8e1c12a37c9ac6bd7e3c88b38e169e3d7fd58cb8fb4a978651e3b121","impliedFormat":99},{"version":"a83a8785713569da150cded8e22c8c14b98b8802eb56167db5734157e23ee804","impliedFormat":99},{"version":"cce1c8b93d1e5ed8dcbaca2c4d346abb34da5c14fa51a1c2e5f93a31c214d8e9","impliedFormat":99},{"version":"213a867daad9eba39f37f264e72e7f2faa0bda9095837de58ab276046d61d97c","impliedFormat":99},{"version":"e1c2ba2ca44e3977d3a79d529940706cef16c9fdd9fd9cad836022643edff84f","impliedFormat":99},{"version":"d63bfe03c3113d5e5b6fcef0bed9cd905e391d523a222caa6d537e767f4e0127","impliedFormat":99},{"version":"4f0a99cb58b887865ae5eed873a34f24032b9a8d390aa27c11982e82f0560b0f","impliedFormat":99},{"version":"3c8a75636dc5639ebd8b0d9b27e5f99cdbc4e52df7f8144bc30e530a90310bbe","impliedFormat":99},{"version":"831ec85d8b9ce9460069612cb8ac6c1407ce45ccaa610a8ae53fe6398f4c1ffd","impliedFormat":99},{"version":"84a15a4f985193d563288b201cb1297f3b2e69cf24042e3f47ad14894bd38e74","impliedFormat":99},{"version":"ea9357f6a359e393d26d83d46f709bc9932a59da732e2c59ea0a46c7db70a8d2","impliedFormat":99},{"version":"2b26c09c593fea6a92facd6475954d4fba0bcc62fe7862849f0cc6073d2c6916","impliedFormat":99},{"version":"b56425afeb034738f443847132bcdec0653b89091e5ea836707338175e5cf014","impliedFormat":99},{"version":"7b3019addc0fd289ab1d174d00854502642f26bec1ae4dadd10ca04db0803a30","impliedFormat":99},{"version":"77883003a85bcfe75dc97d4bd07bd68f8603853d5aad11614c1c57a1204aaf03","impliedFormat":99},{"version":"a69755456ad2d38956b1e54b824556195497fbbb438052c9da5cce5a763a9148","impliedFormat":99},{"version":"c4ea7a4734875037bb04c39e9d9a34701b37784b2e83549b340c01e1851e9fca","impliedFormat":99},{"version":"bba563452954b858d18cc5de0aa8a343b70d58ec0369788b2ffd4c97aa8a8bd1","impliedFormat":99},{"version":"48dd38c566f454246dd0a335309bce001ab25a46be2b44b1988f580d576ae3b5","impliedFormat":99},{"version":"0362f8eccf01deee1ada6f9d899cf83e935970431d6b204a0a450b8a425f8143","impliedFormat":99},{"version":"942c02023b0411836b6d404fc290583309df4c50c0c3a5771051be8ecd832e8d","impliedFormat":99},{"version":"181655e54e8b288d671457be112383e6c51502cff5c4e39020c89f281a987307","impliedFormat":99},{"version":"27d7f5784622ac15e5f56c5d0be9aeefe069ed4855e36cc399c12f31818c40d4","impliedFormat":99},{"version":"0e5e37c5ee7966a03954ddcfc7b11c3faed715ee714a7d7b3f6aaf64173c9ac7","impliedFormat":99},{"version":"adcfd9aaf644eca652b521a4ebac738636c38e28826845dcd2e0dac2130ef539","impliedFormat":99},{"version":"fecc64892b1779fb8ee2f78682f7b4a981a10ed19868108d772bd5807c7fec4f","impliedFormat":99},{"version":"a68eb05fb9bfda476d616b68c2c37776e71cba95406d193b91e71a3369f2bbe7","impliedFormat":99},{"version":"0adf5fa16fe3c677bb0923bde787b4e7e1eb23bcc7b83f89d48d65a6eb563699","impliedFormat":99},{"version":"bf4a06264e6b80cc96fa5e6f11b05825126845563efbf5a68a5b18fddee833b1","impliedFormat":99},{"version":"560a6b3a1e8401fe5e947676dabca8bb337fa115dfd292e96a86f3561274a56d","impliedFormat":99},{"version":"70a29119482d358ab4f28d28ee2dcd05d6cbf8e678068855d016e10a9256ec12","impliedFormat":1},{"version":"869ac759ae8f304536d609082732cb025a08dcc38237fe619caf3fcdd41dde6f","impliedFormat":1},{"version":"0ea900fe6565f9133e06bce92e3e9a4b5a69234e83d40b7df2e1752b8d2b5002","impliedFormat":1},{"version":"e5408f95ca9ac5997c0fea772d68b1bf390e16c2a8cad62858553409f2b12412","impliedFormat":1},{"version":"3c1332a48695617fc5c8a1aead8f09758c2e73018bd139882283fb5a5b8536a6","impliedFormat":1},{"version":"9260b03453970e98ce9b1ad851275acd9c7d213c26c7d86bae096e8e9db4e62b","impliedFormat":1},{"version":"083838d2f5fea0c28f02ce67087101f43bd6e8697c51fd48029261653095080c","impliedFormat":1},{"version":"969132719f0f5822e669f6da7bd58ea0eb47f7899c1db854f8f06379f753b365","impliedFormat":1},{"version":"94ca5d43ff6f9dc8b1812b0770b761392e6eac1948d99d2da443dc63c32b2ec1","impliedFormat":1},{"version":"2cbc88cf54c50e74ee5642c12217e6fd5415e1b35232d5666d53418bae210b3b","impliedFormat":1},{"version":"ccb226557417c606f8b1bba85d178f4bcea3f8ae67b0e86292709a634a1d389d","impliedFormat":1},{"version":"5ea98f44cc9de1fe05d037afe4813f3dcd3a8c5de43bdd7db24624a364fad8e6","impliedFormat":1},{"version":"5260a62a7d326565c7b42293ed427e4186b9d43d6f160f50e134a18385970d02","impliedFormat":1},{"version":"0b3fc2d2d41ad187962c43cb38117d0aee0d3d515c8a6750aaea467da76b42aa","impliedFormat":1},{"version":"ed219f328224100dad91505388453a8c24a97367d1bc13dcec82c72ab13012b7","impliedFormat":1},{"version":"6847b17c96eb44634daa112849db0c9ade344fe23e6ced190b7eeb862beca9f4","impliedFormat":1},{"version":"d479a5128f27f63b58d57a61e062bd68fa43b684271449a73a4d3e3666a599a7","impliedFormat":1},{"version":"6f308b141358ac799edc3e83e887441852205dc1348310d30b62c69438b93ca0","impliedFormat":1},{"version":"b2e451d7958fb4e559df8470e78cbabd17bcebdf694c3ac05440b00ae685aadb","impliedFormat":1},{"version":"435b214f224e0bd2daa15376b7663fd6f5cb0e2bb3a4042672d6396686f7967b","impliedFormat":99},{"version":"5ac787a4a245d99203a12f93f1004db507735a7f3f16f3bc41d21997ccf54256","impliedFormat":99},{"version":"767a9d1487a4a83e6dbe19a56310706b92a77dc0e6c400aa288f48891c8af8d3","impliedFormat":99},{"version":"198f2246a78930833c24db9c42da7ab40c084c2e2132a899f9c03dcbe59d207d","impliedFormat":99},{"version":"eb07eea29499b56357f7593fbdbc6d2312d8afc32c14396952db8d897ea0c4c2","impliedFormat":99},{"version":"06efe54b5ceaa113fbc649424419746efde6dcd5af2a7d4472efb62d751801b3","impliedFormat":99},{"version":"39613fd5250b0e6b48f03d2c994f0135c55d64060c6a0486ecfd6344d4a90a7f","impliedFormat":99},{"version":"8dfbc0d30d20c17f8a9a4487ca14ca8fab6b7d6e0432378ba50cc689d4c07a73","impliedFormat":99},{"version":"4b91040a9b0a06d098defafb39f7e6794789d39c6be0cfd95d73dd3635ca7961","impliedFormat":99},{"version":"66b67d15116c453abd384a1ec73ad2cb90b19fff4c08289360c4f3f573465838","impliedFormat":99},{"version":"5805f6ee9c3a5369ba7f37a809e226f0b217d2059d6f699cc242c9907671143f","impliedFormat":99},{"version":"2f0578c52f2b95a2a2187ad6d1d8fa4e835278871c81747c500bf04bbe0301a2","impliedFormat":99},{"version":"ee9811c1b947c37077408d66bf61ca0f7e6ffad850ecec1e246e643c51fbb5e3","impliedFormat":99},{"version":"4e919bdf4100bc0338598352ad2778d4750fb0d5facbd1bc7c5210340a1f756d","impliedFormat":99},{"version":"4b54813a405270d710da2c598f57cc0c512aad7b5f34f8d2e109862020568a58","impliedFormat":99},{"version":"ac29a9fe4dc4829c7f3f693c7667483f9903ead6ac67abf8d6a5744a5578a7a4","impliedFormat":99},{"version":"5429b7f938113b40fa315e0f100220a5801992497bc3eb05e3b395055033a93c","impliedFormat":99},{"version":"aac828f821e824489c3f10a5452e05b7abc084894dcf6cef1855fe44c88d8556","impliedFormat":99},{"version":"9dda93662ba9cc072a048ed9717df4869820cdc84ebd33db3db6e1ef354f521a","impliedFormat":99},{"version":"a769f4df15ce86d72fdc646ef33bf9ad634e2d7f544399ca030b61d61c781942","impliedFormat":99},{"version":"e1848b9ea5d00c149eae78db2141cb099cd5cd0573064c03f24fada82b2a0d94","impliedFormat":99},{"version":"535dc92c4a20901f7dad384f1fd2b19735bb33720fad67283f4c2b06c4735777","impliedFormat":99},{"version":"2aee0f37dd7974c93900bbda19ff133f2ae270938d99c50f3c6c944260d94ac2","impliedFormat":99},{"version":"e30accdbef6f904f20354b6f598d7f2f7ff29094fc5410c33f63b29b4832172a","impliedFormat":1},{"version":"d8e3ef4fff7d0d3ea72616214977dc2e8407716fb2075e48c61a930d40bfc003","impliedFormat":1},{"version":"9b7f0e34eebf9d3b7196bb340fb2b0013db8bd22fad1a5baaf394b1ad27a0adc","impliedFormat":1},{"version":"b1e5f3a55aa219247976db1b0c6af31d07673e8085197aef925f25ca08fe12c4","impliedFormat":1},{"version":"99d035e265fb5d783f128612f410c7341eac318c75a53cad0012cb2d2cf005f1","impliedFormat":99},{"version":"c609560ed4b5a840f9515229fdf7522440cfacaf2b6f21e1c3e6b46bfc4431c6","impliedFormat":99},{"version":"43980aaf3d50729108658c84a9325fb3341186024247f2af90a9114206577d06","impliedFormat":99},{"version":"a59b6920d3cd9ac94aa10df1c8f2aa9c76c91d73e4af0e745821424e73bbffc8","impliedFormat":99},{"version":"26de2510ef97324e48304cad246786f786be6b9d067746ba672724fe99eb4a76","impliedFormat":99},{"version":"8b57037ca744bd60066cb4daeb239264ae4bf833f87edb3db2d59b4ef3d745d3","impliedFormat":99},{"version":"ae650283eb740cc6f195b89c1d341c03eb93a2fbaf3f7dcd5d01e827e23cd3e3","impliedFormat":99},{"version":"a9422b34f43cc9ee3352838bcd6fc2aec4e388dd6af7f4909df84067ef5b827b","impliedFormat":99},{"version":"88729bf6ce9df1a17ce52112cfe4af935cf1463c9128d4c7dde0a11ad10cfcbe","impliedFormat":99},{"version":"3e0d929622db87b5431036fec53dcf6f98fef5c6dae84570ac1c0c7b3c005ffb","impliedFormat":99},{"version":"53090b74e67c3dde2e97a5f3deaf1f1d2184d5caba7124193ebfc3be2daa667d","impliedFormat":99},{"version":"269966782bfaa41f1f629936d53d6ac01020c60abde7a1f70196a4405018f0b2","impliedFormat":99},{"version":"a507cef707a17f4f58b0f106ed3bf5fb044a9cab3f7c24eaeed10e1fdbab6151","impliedFormat":99},{"version":"a14cb49589c589d4e1257bf7bb457548785b619d37e245fe2a6c1b942156584b","impliedFormat":99},{"version":"272f5f51201ffbd79dbb3533503dd3e20d7f8d1040ad42f33068bf9d0b163e7d","impliedFormat":99},{"version":"85a6e5140a3bf1abbba9e6184d732d25648d20007116cbf39bd3baa9312441f2","impliedFormat":99},{"version":"bb9e472d55badebf8969025cc126eb857874252c58795ee5c6e74d686700ed21","impliedFormat":99},{"version":"7be935d17f4f54e3263e1526bae0128ebd6b15835e6c22116a44d8e0ada5a74b","impliedFormat":99},{"version":"b4aece44eaa3781d058e4f0790aa4a4e1d2012a1d62c73ad05e6a5737a7ee293","impliedFormat":99},{"version":"8519f682ce37f2d021cd6072049a7ac2db5fdef449afa3a2a226d346c25d5962","impliedFormat":99},{"version":"a43478ba83037f64bb87ea8471a7e8a407efa910a75540b384593bcce2d38c48","impliedFormat":99},{"version":"9bc917d7e01d56dfae1f76108a8cad4957f961cb51aa23c5d2e69ef3db286e20","impliedFormat":99},{"version":"b0fc879036b6a62cc7cbd27ea444f6fbe57fbef1b1d039b0d566df2117ffb499","impliedFormat":99},{"version":"f321683ba426eff0d826901b147eabd2d23428147643c869ec99c51da801290d","impliedFormat":99},{"version":"3c1183883c83dbb1be210210e1c11a878f87d60f8afc1b3972cc6388c87e7971","impliedFormat":99},{"version":"3c1183883c83dbb1be210210e1c11a878f87d60f8afc1b3972cc6388c87e7971","impliedFormat":99},{"version":"0b4125a4b9bc524a75e880a6f31849624262d8c97cde4a5da1d34256c95f5bfe","impliedFormat":99},{"version":"0c95bbcf76de3e231a4288d81d9e897e10c73da899277da633b44a08eb8eefba","impliedFormat":99},{"version":"d0ca01ffa779f381a0ec9d9efe34ea3cc98b45e4056ab44b5268766d63aab647","impliedFormat":99},{"version":"b5738f6245eee46675619b44f6af0d70f7586be229fb360532a80c44b1b49ff9","impliedFormat":99},{"version":"517171e44831ae1b5c34ba7aa7c7f1dcb21902c31d3f7b2abb51e497a0b99e6f","impliedFormat":99},{"version":"e2e3cde2cec99e82ea98a82c5bd92ed12e4fea8cf402a6e035d5bd2a7cca281a","impliedFormat":99},{"version":"2639caf99c5969ac53c622f5fafed83ca12d53fa87f406aa2cb7467a1103877b","impliedFormat":99},{"version":"a23d0164a568e779958e7643d81d88dc9027e80ed65e3a54da2505af249d329b","impliedFormat":99},{"version":"2131b5fbfbb47e80581e06e8bd11c7bfefcda71f088aa5f1d137d289c20a2222","impliedFormat":99},{"version":"c0c57f6c7ed346d12352f55865e539621bdcad36045d2b9e71be0e168b1192aa","impliedFormat":99},{"version":"11fd3ff2c4379a9f482f0d7c8591fd679d4f8dcab82046db3a1812f8713f2373","impliedFormat":99},{"version":"36f2ab77365fd65ee3261475892dba15c0fe452077a93a19a63aaf2acb62fc98","impliedFormat":99},{"version":"bb9cd6cc3af0b5e3ffa70cb1de85fe6946b3a3f1f10ebed7ed8c772f7ae50466","impliedFormat":99},{"version":"5b3a8b45bba54d7ef198eefa8c61eed06ec95d267108353c1517742be9eecb88","impliedFormat":99},{"version":"8081faa1962486c7e9e5fc2dff88fae24d868c5a585cdb2c38ba1c15fce4deae","impliedFormat":99},{"version":"9f57322db1a5da7c827f95f23fc860c2296730373a87436ad2ee23644c3c86a3","impliedFormat":99},{"version":"1ee555a004b7194196d6d51cf73227cfc1c0f0d043da9a649e5e867a25d1a2fc","impliedFormat":99},{"version":"1d6201fba84d7d56be10c34ef4f816988da4bfd1548902300f3e031a4f482833","impliedFormat":99},{"version":"51e530ae5cf54f398bee91699fa140199f96f2f55b8fa23901815b02c9721fde","impliedFormat":99},{"version":"18cc29fdaa42892eb79f03b9f00bd4619a35bb6dbc1805a7c5f94d9b0e96bf6a","impliedFormat":99},{"version":"b00e3cca08af70a9cad820cfc0c78e477d67b3f72d5f2d6ca967172e3a971f8b","impliedFormat":99},{"version":"9151c2db5ef596dc764093003dc730d6d3d1f75eaf5fa117f6caa2474e98a634","impliedFormat":99},{"version":"12b545c39034ef75d9b4b66d21324cfd2d37ca0f33c563fdd7e32a9f02839ab6","impliedFormat":99},{"version":"a178ef7d260e3ae2d4bb5ef46000ac0ad00c79a454a80b1e03615ae4e410596a","impliedFormat":99},{"version":"bf48205fdc00bea0ed458cf81a57e4cdb09e740669370be0e17a92e0a89338fc","impliedFormat":99},{"version":"b5873d1c47eff986c60cb5d61878fc2734a8c3e8cc64b7e183fbcdae3676aec8","impliedFormat":99},{"version":"3d1354d536d8ea970fca6ea675d5932b2d5720ac458fa85afcdd80f3b708c763","impliedFormat":99},{"version":"a06839234f46aa66759cd492ce3f716a9f32fc30d9310e1b7618c1f5cc075a62","impliedFormat":99},{"version":"92929866d4c2be4b9510afc8ce088817d8a2f5b58398cc032aa3e587fb700a42","impliedFormat":99},{"version":"6483a445bd97d8cc1545cebe5b4b84e7611c5f2ac65adf4fba8188e1758cb1b1","impliedFormat":99},{"version":"4cdce6d44ef612092168edba4cb736735dda79314c8d816bb376d2d4a4aa7f0c","impliedFormat":99},{"version":"d8ef707d006fdf8e64a9ea3673c4748374cac72d794b632dd6868e7973de3b55","impliedFormat":99},{"version":"695dbe57a9f1686b727ff8112def7376b69da4a9f92a6b4660cfc7adfeb4fd57","impliedFormat":99},{"version":"e30accdbef6f904f20354b6f598d7f2f7ff29094fc5410c33f63b29b4832172a","impliedFormat":1},{"version":"5fd2267cea69c19286f0e90a9ba78c0e19c3782ab2580bfc2f5678c5326fb78a","impliedFormat":1},{"version":"2a628d887712c299dd78731d2e18e5d456ac03fb258b8e39f61b2478b02481ee","impliedFormat":1},{"version":"b1e5f3a55aa219247976db1b0c6af31d07673e8085197aef925f25ca08fe12c4","impliedFormat":1},{"version":"e9f80c5934982b97886eadab6684c073344a588d1758b12fba2d0184e6f450a2","impliedFormat":99},{"version":"c609560ed4b5a840f9515229fdf7522440cfacaf2b6f21e1c3e6b46bfc4431c6","impliedFormat":99},{"version":"43980aaf3d50729108658c84a9325fb3341186024247f2af90a9114206577d06","impliedFormat":99},{"version":"a59b6920d3cd9ac94aa10df1c8f2aa9c76c91d73e4af0e745821424e73bbffc8","impliedFormat":99},{"version":"26de2510ef97324e48304cad246786f786be6b9d067746ba672724fe99eb4a76","impliedFormat":99},{"version":"a822bb869dd9dfdb4b1b5c887b90373d5a1e900191772646b6211541a5ea13b8","impliedFormat":99},{"version":"ba56cf294acda8f40e97bdf8f102617b57c914664476e1f900db307ad0e8c3f2","impliedFormat":99},{"version":"92be2c8229c02b140324d56906af58882ffd87ead115a34380580e9dedea4a18","impliedFormat":99},{"version":"a507cef707a17f4f58b0f106ed3bf5fb044a9cab3f7c24eaeed10e1fdbab6151","impliedFormat":99},{"version":"a14cb49589c589d4e1257bf7bb457548785b619d37e245fe2a6c1b942156584b","impliedFormat":99},{"version":"272f5f51201ffbd79dbb3533503dd3e20d7f8d1040ad42f33068bf9d0b163e7d","impliedFormat":99},{"version":"85a6e5140a3bf1abbba9e6184d732d25648d20007116cbf39bd3baa9312441f2","impliedFormat":99},{"version":"bb9e472d55badebf8969025cc126eb857874252c58795ee5c6e74d686700ed21","impliedFormat":99},{"version":"7be935d17f4f54e3263e1526bae0128ebd6b15835e6c22116a44d8e0ada5a74b","impliedFormat":99},{"version":"b4aece44eaa3781d058e4f0790aa4a4e1d2012a1d62c73ad05e6a5737a7ee293","impliedFormat":99},{"version":"8519f682ce37f2d021cd6072049a7ac2db5fdef449afa3a2a226d346c25d5962","impliedFormat":99},{"version":"a43478ba83037f64bb87ea8471a7e8a407efa910a75540b384593bcce2d38c48","impliedFormat":99},{"version":"9bc917d7e01d56dfae1f76108a8cad4957f961cb51aa23c5d2e69ef3db286e20","impliedFormat":99},{"version":"b0fc879036b6a62cc7cbd27ea444f6fbe57fbef1b1d039b0d566df2117ffb499","impliedFormat":99},{"version":"69b3e0b9435c37d191bce1a4d38c8d18e8add8cb99835eab8f566b95ad9de828","impliedFormat":99},{"version":"3c1183883c83dbb1be210210e1c11a878f87d60f8afc1b3972cc6388c87e7971","impliedFormat":99},{"version":"3c1183883c83dbb1be210210e1c11a878f87d60f8afc1b3972cc6388c87e7971","impliedFormat":99},{"version":"0b4125a4b9bc524a75e880a6f31849624262d8c97cde4a5da1d34256c95f5bfe","impliedFormat":99},{"version":"0c95bbcf76de3e231a4288d81d9e897e10c73da899277da633b44a08eb8eefba","impliedFormat":99},{"version":"d0ca01ffa779f381a0ec9d9efe34ea3cc98b45e4056ab44b5268766d63aab647","impliedFormat":99},{"version":"b5738f6245eee46675619b44f6af0d70f7586be229fb360532a80c44b1b49ff9","impliedFormat":99},{"version":"517171e44831ae1b5c34ba7aa7c7f1dcb21902c31d3f7b2abb51e497a0b99e6f","impliedFormat":99},{"version":"e2e3cde2cec99e82ea98a82c5bd92ed12e4fea8cf402a6e035d5bd2a7cca281a","impliedFormat":99},{"version":"9382e32237e08424b2642d1d9ea4af3a76001cef48888273f769af0c95cf169b","impliedFormat":99},{"version":"45a95142d20916e8510b2d4c42b09aaa3d8ca3d0c3dbd7f915da870ad182380c","impliedFormat":99},{"version":"2131b5fbfbb47e80581e06e8bd11c7bfefcda71f088aa5f1d137d289c20a2222","impliedFormat":99},{"version":"c0c57f6c7ed346d12352f55865e539621bdcad36045d2b9e71be0e168b1192aa","impliedFormat":99},{"version":"11fd3ff2c4379a9f482f0d7c8591fd679d4f8dcab82046db3a1812f8713f2373","impliedFormat":99},{"version":"36f2ab77365fd65ee3261475892dba15c0fe452077a93a19a63aaf2acb62fc98","impliedFormat":99},{"version":"bb9cd6cc3af0b5e3ffa70cb1de85fe6946b3a3f1f10ebed7ed8c772f7ae50466","impliedFormat":99},{"version":"5b3a8b45bba54d7ef198eefa8c61eed06ec95d267108353c1517742be9eecb88","impliedFormat":99},{"version":"8081faa1962486c7e9e5fc2dff88fae24d868c5a585cdb2c38ba1c15fce4deae","impliedFormat":99},{"version":"9f57322db1a5da7c827f95f23fc860c2296730373a87436ad2ee23644c3c86a3","impliedFormat":99},{"version":"1ee555a004b7194196d6d51cf73227cfc1c0f0d043da9a649e5e867a25d1a2fc","impliedFormat":99},{"version":"1d6201fba84d7d56be10c34ef4f816988da4bfd1548902300f3e031a4f482833","impliedFormat":99},{"version":"51e530ae5cf54f398bee91699fa140199f96f2f55b8fa23901815b02c9721fde","impliedFormat":99},{"version":"18cc29fdaa42892eb79f03b9f00bd4619a35bb6dbc1805a7c5f94d9b0e96bf6a","impliedFormat":99},{"version":"b00e3cca08af70a9cad820cfc0c78e477d67b3f72d5f2d6ca967172e3a971f8b","impliedFormat":99},{"version":"9151c2db5ef596dc764093003dc730d6d3d1f75eaf5fa117f6caa2474e98a634","impliedFormat":99},{"version":"827f0158dcf51b4afd0bf7867d30ac9436535fb4422b891a16b88799f9caa6e8","impliedFormat":99},{"version":"a178ef7d260e3ae2d4bb5ef46000ac0ad00c79a454a80b1e03615ae4e410596a","impliedFormat":99},{"version":"6e477dd31a5483cbab13f1f907b29474b33a5140dd4e8672a7ebe00aa27984cf","impliedFormat":99},{"version":"b5873d1c47eff986c60cb5d61878fc2734a8c3e8cc64b7e183fbcdae3676aec8","impliedFormat":99},{"version":"3d1354d536d8ea970fca6ea675d5932b2d5720ac458fa85afcdd80f3b708c763","impliedFormat":99},{"version":"a06839234f46aa66759cd492ce3f716a9f32fc30d9310e1b7618c1f5cc075a62","impliedFormat":99},{"version":"92929866d4c2be4b9510afc8ce088817d8a2f5b58398cc032aa3e587fb700a42","impliedFormat":99},{"version":"6483a445bd97d8cc1545cebe5b4b84e7611c5f2ac65adf4fba8188e1758cb1b1","impliedFormat":99},{"version":"513d0b8895a905e579ed2baebdc817a23dae16e78ecd925400e3142a8096f33e","impliedFormat":99},"fce0bcc6a86782ed4eda9ed21c4843dfa3c0845db64634867034d249ac0933ea","51caf311b5397bb74553bc28cc85973db9f9a7a327c68866e7e7750b72dca42b","d392af7961eda9588aed6392908f014fa318daf9e8a952339ed3db69e9ce5273","2778747ec5f0fa749a66df42831ea70270ab3a17a94f1313e01905b794f92a47","925bb05a1ae6a8d137cf092bc8b31e54ebaa5559a444583eddcff605647d5544","01dd48041d3b0d86d198e58cb750852eea8f0a78d40cd52f7e50bf6f33a06dee",{"version":"89fc4cad6ac7ac6d922523b3ab51462b050189ab335766149e5cc777483d4e1b","impliedFormat":1},{"version":"27b14b091ccf309c79f3d2cf226edfa4d533b131f19bc0cbe855adebd464c285","impliedFormat":99},"d41171d9f336c406532c26d9706a7f3dbb54d757e4dd418d1f21623e8871c740",{"version":"5276ee82ef96770571bd5aae9f4f5cdd474c3d4c1a068f1e1d9ab9cf16529975","impliedFormat":1},{"version":"cdb1d174036ebdb04b5a61461ff523efaeefffd87b093f43fdf20196024b2003","impliedFormat":1},{"version":"23c2c70dd974c3b8b66be4f3d6c9351fd41235d9c038b4d57d334dda8f753819","impliedFormat":1},{"version":"dffa09d0911ebb2639cae47397e011cc195de4a3ad83b53efb2651cfa0e0b75e","impliedFormat":1},{"version":"7d2c1ce36b9370a3af266ca6c663fe62e82671f9cf41337bda0efd837a5e2de9","impliedFormat":1},{"version":"6e45f5dd809aca05301c8e1b9f526096fe89b3369da10fe34f9c037832f103a9","impliedFormat":1},{"version":"0db63cf288cd71a85b06be8065db706797fb7d368a2315bd34967070c880facc","impliedFormat":1},{"version":"755ee0128a813468af08c5e673655a068813c92f4179978fd37ac3df1688c2f8","impliedFormat":1},{"version":"f183da4c889c90d5060aacc1c247c6cd68cc0024b9891402bb1c07a492d18018","impliedFormat":1},{"version":"da1c8718353e2981fa5981328a2d5cf6bc70da59c51967924d032a06177bce50","impliedFormat":1},{"version":"cba87731af3b8e51151ab6b3ba2d9604739649cf132885dff49836d5369ae387","impliedFormat":1},{"version":"3965bb091883ba173f7742c16ec8efe81207d75774d3a809385edce6841adca0","impliedFormat":1},{"version":"108fd0cab464e528dfa511d982368df2c9d9964e1e66f8921ef40accce9dfcf7","impliedFormat":1},{"version":"8d48c98fca3f013fd2872810d7168a9c405c4037962637aaa0a094571e731757","impliedFormat":1},{"version":"9898a7c6ed78c9656079244ea2318282f42ffd1cb5d4aa5753decaa7f3eaafa2","impliedFormat":1},"010bd7696850423d70a40aa6a4968cde67ec4f7f1a113a107d0a7423eeb58dd2","92a71fd81ccd1c569d4922967f10b4bf8e680ee7e97b9caadb5426a70249263e","132279ec90347f347997306254f472ccf473cf7ec59e6cbc358c8b3e3d917dd0","283bbcc38c91737aea86f8d5362b4fb48894b64ae12a7341563a1ce7372eb39c","8c3a4923961d532c332df2f3915a4a70441449f099cea296ca91a02bf6b9f310",{"version":"b4f89206c8e318e5e65294ae7925a52a5bc13508809c5c699d7ebfa14e0509eb","affectsGlobalScope":true,"impliedFormat":1},{"version":"d51500cee65d776a8591b72c1019b0dada25d6f7ea39685130ccedad2e8b1eff","impliedFormat":1},{"version":"e733b8a7d2ecce20916d95d75a0c7cdfff7e8371879006902d77969da1550d65","impliedFormat":1},{"version":"d9d5884c0b7a87c6b0b319474eac7987f915f7460a04012d54689c14c800d69c","impliedFormat":1},{"version":"42739f43f21108aaa8b2e9d1246c537c88fc193694d5c3660b49ab5ed87bec60","impliedFormat":1},{"version":"8c4c212cbe640024a5076e006d5ed48c6856bf3a79880c52d0fe453495b84e7d","impliedFormat":1},{"version":"8dbd432facc1bfd211d58bbbf86a405dd55cdf04d6425037171282ae5e1bd5ae","impliedFormat":1},{"version":"bd0ae662720de3f141b078c64de498113fb13faec0c1cbec62f1630f7b8954a3","impliedFormat":1},{"version":"517fee0f998ca443a8eedaed7ad143753cd7ed6c9fc97a62200c09b21ea661d7","impliedFormat":1},{"version":"e94e5a0936bba407a0d0b7846ff8a7960667f09040b575b5035bc30298510781","impliedFormat":1},{"version":"f6a3229a9d452117bfc85b50e955b836c8c91b1244dd8d3413c2824333022982","impliedFormat":1},{"version":"75d3a0dcb75b27ae7f6d3bc06ebacc608c5145b2f403264b64d603d0be929bca","impliedFormat":1},{"version":"28732171a9e5a176e9d8b9bb417b32dc885591bc2642232389a44167bc5ec581","impliedFormat":1},{"version":"90ebe8ddee75b7e87baf030d45d49e13a91dea47fa4cd8494ac85e5ea35779c8","impliedFormat":1},{"version":"6ec1d690b2213c008b55d31778e6c4f13141487fe26749ee6a0b4c2b6f84f9c9","impliedFormat":1},{"version":"43ae0b1b0a836f113aa973b1a4d114e2867fd320125e43a80805d9a80ab07c4b","impliedFormat":1},{"version":"1b6d1aeb6a58db9a9702623d7edaa31eda44cb33fe66f349f6156b20db8b6211","impliedFormat":1},{"version":"5ee542acb0e360c539bcf027de4389536fdaae8653e47b33eb0445ba85bf223a","impliedFormat":1},{"version":"8a0a53613cfa756a769e4514632acac0e17d80631af21a888daa46ac01ccdd1d","impliedFormat":1},{"version":"e7f9e4cf51627c95fdddff062c58c6b1c4e22d1868acbf3e7e663ee95e3790b8","impliedFormat":1},{"version":"449d082b398ad2a53c5def35397b752d61c968a2acacffb935d564b5ff3aa19c","impliedFormat":1},{"version":"1a3aa0fb5f9a2dc05a33faa6246f85ecc52c8af7a5257d8639e724a12ebc92bf","impliedFormat":1},{"version":"6480e9b0877e389c96e3b89c43fb2e4d84bb6ae8cea22f8ea2bf30ac4a4c4136","impliedFormat":1},{"version":"9cd1a75410c01f48f43befd40b47a7d2d42565b5593d5cf02b7472b04a1d98c8","impliedFormat":1},{"version":"d0144e7240c7f26030468a13211194d192316099ebbcee7782c6005cc393c734","impliedFormat":1},{"version":"095a402135de9fbfda29ba7c984bf54b9e65757396b4165706d898e9baa83ed5","impliedFormat":99},{"version":"0b6471168629b8a0cbac9f8f67bbbba83a1d64cf1424cd7d299439b3af88129a","impliedFormat":99},{"version":"3e0fa3b04086663fd406499ea37f0714b0d7cbc296eb81e244f2bf0ba4938bb2","impliedFormat":99},{"version":"3d11abe325e68a5b76d9f53ecc0b4ea29685ccbd8690b279f2177e0750d87f8c","impliedFormat":99},{"version":"f1952d24cb1344241341230924197977764249edcde80605e96454f073ebb35a","impliedFormat":99},{"version":"3b5b37b56d81802168c5b8df2f1d4a7ee018d67e7463f221d49b6ea20af00060","impliedFormat":99},{"version":"f3a6db8faeb959400a4d0e1100b9d5c54eb494800e6dc9a2452bb2e00a27397c","impliedFormat":99},{"version":"d278699a1c7e06a195ecc065c4965d1bbfb5bc2d67176e63bebf58b273158023","impliedFormat":99},{"version":"261ffd2f7502d9387324715c7dcb9f3a30c8d044b6dc3abc7ff80737c366476c","impliedFormat":99},{"version":"28729ff7b2ea98a9ba6ca4490c5540be744a4d73b4199ff6094cb65c9db33607","impliedFormat":99},{"version":"6ac889647435812fb7ced7035daf90c1f307710056e4b496a3fd5cb97c87daed","impliedFormat":99},{"version":"29f60d17027d6bc8891797f6ed95ac84ee42313e6b03ddb49beff6f22f49f8c6","impliedFormat":99},{"version":"f71579228be8825267577e970c8f0ee2869cebae0bb7603b00644fec924c6717","impliedFormat":99},{"version":"e50f096cb424b63343ad5814622623f15cf3830f41710376bebb3c7f71554713","impliedFormat":99},{"version":"69ebae4354b59ff1ba38419d6033e22d0db6ffe6c1d562e78914f88f06ec517f","impliedFormat":99},{"version":"45f0aee62dc187cbde99b10987e1f8649a30bba8bf9c95957e37d1551d0626da","impliedFormat":99},{"version":"919b048385b82efca27e5adec2f61f17a2b219582f2deb8a13b4648c7c8fafbf","impliedFormat":99},{"version":"47747eabb3c64620a12f707bf30c7f7a211e25754a2da1f98267068f49bd0947","impliedFormat":99},{"version":"2dc1bcd6a132924a89f965b60edd5b5333aaa7eb28ba5af44a0a0a328756e9ad","impliedFormat":1},{"version":"ad117b97b2eb65daeeabf0adb13573a8f1d12d5ce21c312eb7eb588106b92560","impliedFormat":1},{"version":"683f7d52795b5e2c0a269c4a202f212d147eee850b6d74050af619cea7638605","impliedFormat":1},{"version":"bf338c88f9e91b1700029f806a2d8bb447f19d3e39fa57dbba16ce8bf43902c2","impliedFormat":1},{"version":"d3c9c7df6fe4c7905f73578af2542e2f303da2b0565abb10ccf8a75626da1bb5","impliedFormat":1},{"version":"a16c041923053317f99708de244e50f0c563de0ee22313739810b67cec8af89a","impliedFormat":1},{"version":"b64880a77efc0fba08ee595d277a52e7abbdef2dde51a163376f03d6d3a67c7a","impliedFormat":1},{"version":"817d7ba9b41a1f3f7d15e8c1067bc32ce0044aab0ba05e2794294ed25959cdf7","impliedFormat":1},{"version":"6e6d52eece8b335d10a436ca59f91cbf0727f9f2ac0521a0b0ffc32da2006948","impliedFormat":1},{"version":"98e70d3105aa56ac3e2a34a78f10c6d352ff9e3148b1bc2bb11c1787f0176d26","impliedFormat":1},{"version":"144ffc9e0632f167247b8ebc6c12b690555b27930cb2d92edceea7df51e54bbe","impliedFormat":1},{"version":"cb6b2bd587f4d8b0299840be7cedf422fb895d3c7f6cbd8c18c041518ba82fee","impliedFormat":1},{"version":"849b51d422f1a846684da755840ffe68f65701b7b7703ea9622847df65dfb2cb","impliedFormat":1},{"version":"3b17eebfd6fea2320c3d3ab55e26bee41e6745fe51432da7901e898249a8c186","impliedFormat":1},{"version":"5d9c054ecd5fad83e0ec5e117196acdcd4b1cc5b8d28f5df752a416c27052aa2","impliedFormat":1},{"version":"949c8eb79434b05b6d1c10d2010216fbd6c920ee376d08627f717d24b6572454","impliedFormat":1},{"version":"25495d26470692e2591e386c1dbffe4aa0b2d8c00af6ac9c8c69657818262dd5","impliedFormat":1},{"version":"abee0197420ed0849c7adbff50fc13f54ccb52f9a8c906e298c28321bf736cd9","impliedFormat":1},{"version":"3af7286265437a7488193d0ab0b56a6e20e1a5e08831a6c3fe0880212c2c6c75","impliedFormat":1},{"version":"d7eadcb936edf325912a70d1c4874c29b92463ba1eecdb302858763db6a68692","impliedFormat":1},{"version":"04fe6e4f5bd35c234cd04ea88ada66b718aec4b3edf611147b0ec9ea216b3cd7","impliedFormat":1},{"version":"7aa826d09dcfa85af6b2cfeeb6a7f340d417968632695fa8eacf4186fb71e8ac","impliedFormat":1},{"version":"ebbf2bf006f21fc203f1a555ff0fdcd8542d1546d7cab60aa835ff5902db0d2d","impliedFormat":1},{"version":"12aaf4e3c85225c710acd6a9f41532bf8e06bf180e54c1bedc60fa9b9c1a7d23","impliedFormat":1},{"version":"7814f653054116409bc9a36968b77c878c2013ef8d8873328e8f6fcd3348d8d9","impliedFormat":1},{"version":"ff4ade9606d1b3fe1a10bdf6ab944e1bb1d5ac86035228ddd3ecb5fbe51d4d47","impliedFormat":99},{"version":"608ffc65e122c3eeeff832a9007ecc00fe71bf1b03a3069a44e8c565ee8af368","impliedFormat":99},{"version":"40b54b241bc79a986a5ac364f7f11c60af8c68ac8d45c80501ed31af7e587a74","impliedFormat":1},{"version":"0d1a503605c35a53f49ff2b6506704b289bc33d9001d2244044c91fc82315c8a","impliedFormat":1},{"version":"96d1d70759af66ea4404f7c18130ef478e5052de8863e2bf4467cfbc2fc7176a","impliedFormat":1},{"version":"fcb4542949fbf132a400c60cc53b79dde681570147af3a5798aa732798c6b0f1","impliedFormat":1},{"version":"9332e2b6255fd361167671093522351ad5e2d0e3a78d9bf8f0959d779f6d3246","impliedFormat":1},{"version":"5be2e2b5ca39c4fc74b0273674a3e7705088513872fa3de1e4f75357a507a988","impliedFormat":1},{"version":"fc8bef71b44a15c1c6afe97e2ce74c7beb10d0a3c45d19dca5b9d53cf81cc744","impliedFormat":1},{"version":"41dd7695c5e11ca31e40bb8d9a2edc9c2b3e262d1007fc7471ecb91516874d98","impliedFormat":1},{"version":"262efb4650083ac514f3119534d502211d0270140057698e7d4978caaf4b6f97","impliedFormat":1},{"version":"b5e98f1f4e64ace252ae743df592ff0187aac817efaf58cd97c63e243fe15951","impliedFormat":1},{"version":"151f53de4563905919248ae634d857276a8491e62416b6f2cccbfebfe6794a72","impliedFormat":1},"8f7f0fe9723363d03731e2af36efe952b9c8dfae8c9c4feca85f917c8d38ee95","7ecd76861caed403cf1c2e800d380817179703bb003a7e94141e51e9e520a16e","dcfa51263066f8d4064c483762236b3257512c2d88434e8a2f1010fc8d77a729","9811c23f18ed827f5f95f59ac41d59c24e048811741bc97ef4751a6e4b588c93","764d3e4fb632118dd99a7e8109e64f2663f14cf970b4d45e8b9b74ba705f68c2","a993b6a3db6a2d2963115b8eb8e4e04ff6e4de394170571a5b703e482ff5314c","767f21b5b918baaab7627cedd23e90e96c6988f86477df1208b5111f41aee03d","51b6fd7947e721d16a909d057b5d9b008e7c467c94efb5cfbca51edaf10454f4","f846a25a6ad92fae372999fc49fb5fe1febd68ca3eea39ef83425a46cc016776","409ffeafca5a6a110031899b1ede663a3c3fa929124893367f4934e32700d68e","21adf40e2fb8b0a48342d2eaf4125363d94acb49cc59f5ac369749efe683990f","05da203db76a7efb938df54d8cf7db7946fb7c89099b5c41c78662d95b8f7fcb","79b4596a792ed6cc9300ab60c2d21d820f4a13717d14e573b55816cdfb245de2","6c96ec3120fd9f90fe1afc383f6b2f92b824907883c6f99268b5167185b0a3d8","4bb6f6bbc4448a16ffb70812aa37b20ca3941b27443ca36d9d3a499a8bf1d564","ced87fa12049ceb1366ca1f09f6513cc7eea164e6922411dc96af74f9d44cc3f","d2e4a17c63760596ff90b4309942c815d06024e25e7a60bea36d17393602bc79","21e7c97a4a252f6c062480252b3f885ec2e7b67ac56664d2779d4874d1d1916e","aba51eb73c16adbc21fd09bf64b6014e84c469284c501a3c9aacf242aa29279d","26b123b60d4d748e6ad048813295f4c368d46faef228690732d8d289a1a5af8d","5d83ba0eae0798f047802f636c62c4189ef4079f2d017f33b14086fae18b0fd9","1d568d68dad90166c8e322e3a301441095b2e149d458f411209fe6e29f0ec1c2","2d995c15bd75d777ddb5e05b3e838750a7a0e229d9503204984aac0e36d886b6","6cad528e6075009933bc7ec3a49f1d4574995a45e5f1fdfe04a0c38dc693ef57","8c504f40166472fe55bb138187ade1677c14699b70731d3d862d5d19193814a7","7d1e53d013ca549fa99df6bb961822493e2878f2f2ba935e95210c9b7a24cd68",{"version":"5276ee82ef96770571bd5aae9f4f5cdd474c3d4c1a068f1e1d9ab9cf16529975","impliedFormat":1},{"version":"cdb1d174036ebdb04b5a61461ff523efaeefffd87b093f43fdf20196024b2003","impliedFormat":1},{"version":"23c2c70dd974c3b8b66be4f3d6c9351fd41235d9c038b4d57d334dda8f753819","impliedFormat":1},{"version":"dffa09d0911ebb2639cae47397e011cc195de4a3ad83b53efb2651cfa0e0b75e","impliedFormat":1},{"version":"26168183003371ceac063f0cdf62be889d0515a193444a99b176094565dabb0a","impliedFormat":1},{"version":"7fc99221160c51281d2b9095552be2b24b600b3b6fe305cfd068bf501f623ef2","impliedFormat":1},{"version":"e36eeb1297210f99ef4644a5028caa2f222cee56f5f577909470aae77924b7fc","impliedFormat":1},{"version":"755ee0128a813468af08c5e673655a068813c92f4179978fd37ac3df1688c2f8","impliedFormat":1},{"version":"f183da4c889c90d5060aacc1c247c6cd68cc0024b9891402bb1c07a492d18018","impliedFormat":1},{"version":"da1c8718353e2981fa5981328a2d5cf6bc70da59c51967924d032a06177bce50","impliedFormat":1},{"version":"b4b9c09ebf50026552009c501feafa8d69c58dd29cfee93f54d5783f8fc6d2b9","impliedFormat":1},{"version":"3965bb091883ba173f7742c16ec8efe81207d75774d3a809385edce6841adca0","impliedFormat":1},{"version":"c1eb69b3ec8f1080980c25c8244c4ba093af729f4dac451758e69026b20c50a7","impliedFormat":1},{"version":"f67870591872110fd6a97ec0d933972f21ccf433bfb9d8ed1f044740958c4e43","impliedFormat":1},"70d4ad847cb64eb83528a594bc5eba51fe712394c7b5c1de540dbfa1fbb252a6","0a598b4c856c45b4847ceb8cbf5e4dfb8eb164053ee407775363fad2b3689893",{"version":"a28e6fadb0b6e7a95cfcd29366f2b72a8e3193270d3f2b673e1876edf0159c7b","impliedFormat":99},"16db379ab816c2dcb506ece1955925fad9cf7e60a27e192f0ae274abeab0e4e5","c24ff7cbdbc36ed2758430652fd2c208c35f23a69b0204b07d6f3ed016eed9f6",{"version":"9be0dc6f4c5ebff5d838dc0d059f25e5a6ab1d224d5adc7ef46887ce8549e897","impliedFormat":99},{"version":"32aa20fd978847e617304582657723f0dcd1809de9b087ed0ad5b7090b1a47c1","impliedFormat":99},{"version":"1f37db92ea78f4d197a201f80a3c52ce6e2b759b19d3a1e9de5aab0c9026fe3f","impliedFormat":99},{"version":"c07898a85c15b3b636506443e88fe6d85bbd568c0bb504a9ae5cb371d58f6319","impliedFormat":99},{"version":"795d467a57e3a7c4aa3d645fa2edae9a2d0d44dde435bd1b222ab533da6fce44","impliedFormat":99},{"version":"bfc5aa7977557874fcbe1e96f7a06e46b3b568b955c82b74a85cc8f6c62060a5","impliedFormat":99},{"version":"f20bb3ae0de20cd6a4b73155cb506bae39e904b7e5ea4f618f5bda7b3ae474fc","impliedFormat":99},{"version":"44c5d9f47e85552ea141ddc1b0af65903297624f0ff2227372d5ce31ff0380c6","impliedFormat":99},"6bfb9aeb01e1f2a8f2b6196412ce85dc2b7cdc8dcf1962f2e1b6516093e8269c","e4a4f02927024f5fbf9e91abffcec93c3771168b5bc36dea3091b152d5f3186d",{"version":"a896cee6bbf43009c05e9ee4b0cfb1147ae49a4ffc2d814c6d7465806d76fe72","impliedFormat":99},{"version":"6bd987ccf12886137d96b81e48f65a7a6fa940085753c4e212c91f51555f13e5","impliedFormat":1},"8151759f968a478356f66626323955df04679687e8bded20e1ee7b29027fc8a2","476bb552263792befe628d5b588cfee6310e91d27d8e5e3135e3c64cfdf661d6","249a206e642fb5f7539f5127d3a5c6a49de3b802ca604e2b5fff4f38f844bfe3","4a9e0a7891dc98c602bfcdd97d00bfebe517011e39a0f88926cf619ee24d9aa1","4fab487193cffe755885c698cc1bdc01b00ecf4dcca0dddfc447d88970681c97","401cbeffc1cbc3427fc85070bb0dd35df981fcf82a30318e9b468a660a95f743","c84078b0f3b82c13b2e97be494c0f1071a89df00858c9035ea5444924a263884","7293106d19cf62705dc6f168cdb00e7e4c37d57f1019d73eab5e5633f002abfb","8bc0222adfdb85b62b1a3f1ac9fafb8e1116c6494cc86782ac2a7fb6d13bd09b","1de97be13cb6d21a4a1da963d41b6141b27f05786ffdb35713bf378328eac097","e538c60f67d9e7d463ce9fc6299a9c1e436fea994f03f14e436871f69659854f","19b53283228e93ccee1500899e42b4d22853555d91fb8f2efa3f82922cdbdc41","9c93d91720155376e598da843b36a77a24890972270195940569950846c0c7d2","8236d0455cdc0c5df74726e2fc7011e4d133b7df6180be669bad5e025d727308","3be0ff06250bdce15bd08cb9eda008ccabd85aa331a784dfb6d81838c470eae0","8278755295ae2604e765676713fb773b43b8a4c8b98b2bf33693c068b916ccf6","10d43e25bfdaf81335aa875387740a9e952a7f5e2f47f9bf6e473c42a7187564","22a90b05fdc32fa4ff466a5819128275749dee90a305858ef353246e723a2d85","51d4f6415cae0357ae923f7110e6f6962690e44c701589a65f2d95903e40e368","cb838c5fdd46f7f469fefa566e2b5c2fafe02be638ef02177bc1c7cbbd3bf879","53fa54de6d9b14ec6a35ac2c6e7c5dcf47ac17eb74741c57d6948db7a2ccc489","1a947f95ecc0f6a6e2ea8122470d6881b5dfb2592051b68ee8f72f8f8ee36d5f","bbdbdb42b704a60fa5d7177ef83346be726578ccf95e26add73999c1148dafea","71b2f6191be093ac9d84c9286a609f3414390ff88be50e2f01c9bcdb85d3287f","35635edf9f859027af3be25cd38a5d42e52c1258a1a3ced5703842d177dd805f","e5357f120b95cc70b91bff28981d75e63d381f96ddd12df8c6274ce209040c52","1142ae3be3921a530a00fbd2f4aa5e511375891f625fa098e2618ffbb804d3c9","3d93128631bbfed8da5aa5960e91a88249a6bfc7bd00dedc04f4d18cbffaf5ef","32377265da5db06811fb10303adbb6759f1dc0796f11c3509f8c368a394c89e7","6a374c778084795fc7a2aa1c15d20e461b1d8ace2990ecdf6ac8baaf25072b7c","90dec2351372005d3ccfe8cdcf628bee17dc7c48a6bacb3c58d13f376aa92abc","b889c9ec0f1e55e0129ce9d06f0cf10daa320f0161b7c992db8bb1ba99adb36f","f310657015f5c7accfa816f290a474674eedbbe3c79a15477d344da54f4c1c56","ca8aa1a3dec921d461a781d9f529d814dc6aff720b10f2e458cb2e0cc7058536","016017c4c67f193e806011e0f76de65cb3c4771f37a0197447ae00f4ec3d675c","f07b219d7d1e1cbe8d95d8a6e0decb00a1b6087ae186c5ebee9896e2ff413ac2","aaddc268703ab388bf6c44617543cc939831ad85d5dc0aa1984c26a6077e7d6d","1eccc6cef0e7c37d47eb03a97ace30d00bf819de8461786360bf7209960ea3ea","eb431d32ffc7698839b93fb185bd7748ce804f6ba334b5a0f84c926ca374223a","5ee4811ca4a46ec233d1cc597bfa9eb54aee855e5270b45cb765aa1eae840344","5dbe51f917f9a0e623f6d4e85168f0fb54590db471edb9a959f1f9c51af279b9","62ab67147a9b8fd96a09da8fdc2471a1ca66d1aecc0f02ef58277f52e4b7c00a","02488bf52002565e729cd29363490adbdfa45672e042fa65325f761e5a69e55b","0a9a76403ee45bcf4bd1afeec765c863db08efa2771089be74033c2c7d734fb7","860408a9ba970b6f1fba26ef47b2a8ba7f8aa79367ae11073285ee82fcc84f03","7f8f3adf0a4936bfe67843d2750d39f9a63001c3abfb2da07d80055807a0488c","ebe28f29d018162083aab8f7b08e66102326527cb3e6eb6adc9d5e3401a76c2c","d1171eedb570edf968f4ad673ae746b0bfa126c17e73e60402262bbf0c15918a","eab87a5108d9732a2508991e58ea5c32b90aa3d6b959eb62b4e29cbb7322bf9c","28d3f60af41a48022385a5619c49a4c799284ebadad30d987ec1f67ef84a1ffe","747e4ce9c28359c400ab94e506648be05de64c9d991b349123a4a8fc48b84b73","1b3f557087d532489d56388c31dd4195b775cc3f735975a4589d2f54aba467c7","4aeae8d8887e81c7698be984c3505a7099f25ee58a6ae215aa5276089924918c","593be32ac4f8fe372a6bd9ea4859ca1a84d6dc84fa630e24616cf24120d68da6","afcd168776c141a058fadc66872e0765bef97fb1c7fbf8a480454bdf30b84186","6da63471ad0749bf97b1e481c0bfe6a43ca8f3daba53269568f033fed989ddf2","8a15db08fb7d7b2ab4717156081b95d4ed32a770e4624b0722e8606e91c3df4b","ff10c6742f17c4ad02e6e18981c646eb136f034df6c6da769ce518bef035dac7","386502117ad2cf606bc88655cb9195b4644bcb8f97cd1e8c5c322ac7e4006c05","ab58c363da9bc405eb1f6810b28b3add09b3f610425615360e311c1198ebd73a","0873fbc7f9d6ab783ed2e6a73403a079cab3d122c7eea69392889eb706d5297a","593be32ac4f8fe372a6bd9ea4859ca1a84d6dc84fa630e24616cf24120d68da6","9e98458ea2d271f13b0d0b5d0a492005fb0ca454d24a2645e129a42a0ce5f3fb","7a912902c1c09e09ec8f2638a4d52f6fca012d1a4402753a604c310f680263f6","a4d0dbc0f6fcba705be0aa16752ba7df2a9a4cc98d03adcf0a70d2b70d0db7c3","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","118fed45cbddb3c9b4a4dab8c83967bd4f61d7b0afd8f148045b4287a4cef9a9","2a100a93d6afbe9e3363df7d206b8a3ce61e2c174e5417f825986bc8d21ffc69","8ea16a7310e3501565e2d32de8b9f985f79e462f655686dcab7d6b230fa655b9","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","b60413abb20bdbfafe6b5326d2b4e05f63dfdcf5d9b1246a3f86ece2ad562d86","b4478b686216adcc7a6255a930d419f33075d942195a00707d9cfe03e373e8b9","c36744b2651a62f52866b47c74545de84fdf6991e0a96920e0004642e4830524","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","2049bb071060b81c49c6cf96872f23632d6e4fa7f9a1c93e007dec52d77f8a70","907a3d799649a512646f1e6b70591b137a5f5923669ccf8673003ad498c42e75","b82efd290a7dd61bddb329a05b5d622ec9927cfc8c27b8178676c85875460266","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","6204a985b097ba214229d512959870ec0d74c7b6708b5bebd9f7c270d9ba3f42","234efca8a392e60b9c4d5f5ae51b20c7e593706ed542033427d7123f9ac00047","a21ce57317e583912540dad2b34d2762431c9f603a480affc58b03e6b5e8a369","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","ce0d2754f32697babe3c5ebccd63d627bc2fe2c47d02edc8fb52aefd67bf20ff","30c53f37fc9649f10cd59a98f43a9358878d7be661ace991325756c2d69eaebe","320bec3745b17fe114b018d64b01f1463b34ab3d0196319c3261710e908d3541","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","b48a58724e886fc741cbc9db68909d87f8102cdd102b34b8d011f40263f2eff6","481f5f7de3521edad947b39300f2978debd136ab602433d014e44f6e119dc242","87223c92d8c9f0f6d2163674475be7c4d2c8a4439c31fcf04d01a873c255361e","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","292d1124dff7d7313ac9d6ec5879a113e09acaf4226ab127cb024fd7d0d2131e","9bb30ee6833cc37825294772c9c67863ebf61c3913eb92abb3f259444c274498","693c946a6f66734a59fcb7a131f1f744645b92ba919aac02893161d5b7633964","aea1e4628bba7c088db32011bc0c10cef5543824a882f5e7abc9d480ed900b61","30c53f37fc9649f10cd59a98f43a9358878d7be661ace991325756c2d69eaebe","c52f0a0c1ada7b92b2dc03e2d68cede5dd7d0c3d5f6564dfbf8bc23c5dce603c","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","6983b0c80cc42153db35b6a4dc27c916c15ef43f07c5444754aa99d211e31f82","a09132cf4896ca4a291b30f07e0c2dfa420d4e71b5802f5d130123d20fe976d7","b223502c32cb7040a9ccc12fd30e4a5da2334cd9823920f33e449713eca4d435","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","e3bfcb48c23f5e17495e0050deddcfae71a2ead167760132a4c68bca3ea19f3a","30c53f37fc9649f10cd59a98f43a9358878d7be661ace991325756c2d69eaebe","9e544e6dfc01035c7f28297d2e7d966a655ef1869f6ef4a8a613cf0810113bfc","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","40a717506493221f42ea61f37615fe241827f16309699a4f00d397742db73cb4","c34fa140427f097c7bf3b5b428756fdc790df61bf7c5826008107e2e772f2d1c","aadb12cc5f8c3160aac0f9dc62daa4386c30386ca82223d283f5ce64b486e81e","7b00f5001a9cc73872657547eaf8d736a5ee7d86a82281099111cb56078c45bf","4b80774707d45b293e210ad51549d26e73e44ffafb80874d1a16c232cb47a28a","1423249be76c3ea1e9f13797229a3f813675589513a4b6989e0291e5efd2fed4","f896934a55f792e6e48635ad510db4f9c8cf62d59ccb9076e3ddaaa058eb2299","c9d0eb2d0e962a44edbff2d4ef0d1bba177815b032347c6ca687199569391c16","3e4e710ea86a17244a493dd90c8540cae7c9c14902d004a9a5af29c33ae956a0","44c0d53011f4b029ae82ccf4b1ae9f79b50756aa374e66f63772d661348ef5b3","cef52f035785e353e67a7589e972cebb9768a1c7dee644e2048f14124222bb20","af47ec042fb2136af93235422654247a3988acf6407b643cf9e4c82a6223938d","6fb1d409092b2c60d495bcd219fbd259432787812615d018d34e3095a9779661","86d7666fdb51a41a2eec4b622ebb4e386827f51525d1c0eb39f142a3043cb939","1140fa6ed9e972caad948398ac3f0c66f7f1c3eedac3aebf5666dbf1e08c9984","b6e96a71d65e642f68e0d8c3affc3dd76e358402d629bba297aef9c01d865d35","65e8f650d059a9f6866c8d21277eb75f109c179e6662635e31c73f7314a15b47","973c1d4a8e79b6956e68a922cb0a17d5a73e0f97b9e83ddd320cfd4734260fea","f7047e6358933c7805013ebb85901582f04a55fcc40e9502c32f97513bf78412","8cdcb4c784cb0572917238dcefe583009adbf7797d4c4886ad4039982b5a21fb","07516dc144bbd2ca6c851b2c633c0531f07a8481c1b751e53572b36b4972f463","d1970db5ca2441b07bf3573094ee46114427df80ec4931ace0bdcf77aba69fe5","6dbf76049317057ff152b0491fe3252229cb9443bab1e44802735492727377b9","74e1e40bd50b34196d8a33446cd965f40bb47e5805ffdb95b3eab8a554646752","7747dc051cafcc0b8577ee408f4daf15c9be9259d88c26f2209a96f9eb546a13","f9fb06981b946167276f069cf5bab3d9c731443e9c13fc7d0b92176e5a214343",{"version":"702ed702c1c340fe4de8ffafb5af6b9e8dcdf465320cdd7ee5ea743b21abe4cf","signature":"01fe9ce173f45a09b54f82b726959cff3d7af1f2e6596298f44b8476c86b1609"},{"version":"29da1ad7f96472379fd04d511cf2ab58a6270ff73dbd5debcbd2c7933c8cb2b6","signature":"01fe9ce173f45a09b54f82b726959cff3d7af1f2e6596298f44b8476c86b1609"},"92168667f91a00af0f722ec8f8de41a56b81081946ef40734ba99f3bb0af1e87","b438026fd0b4d593a387291b3d00b5bc6005f00a6a82f8888501f835e89962d2",{"version":"420e51b7c60bb804e685172b22bf3df94202b1d87f7b6c7e085aecc7064c5fd3","signature":"c7a13e2494f7604a3015fbf3ed69bd64c5ac49c5efc69193b94dd4624ca3ac31"},"8f4563159beadd75bf68ed8816df95daff8f661b9c1eceef817b1cb212b7eb5b",{"version":"d9c6e8aa2aa261714fe5acf1d00d64a88c9403d59ef13cd88b4e382812ebca60","signature":"e59d82748ead45dadf4021ef4d32f101e87ae318853e086e2b301fcdaff78805"},{"version":"3fe553fb989b92e12ceba9573d25aa0c008ab476c63c450b83012f5623f2b74e","signature":"01fe9ce173f45a09b54f82b726959cff3d7af1f2e6596298f44b8476c86b1609"},{"version":"3793b3c429626f29cee5acbc1bd7ebd20dcff7f8e8b34e05e5fe73850944ad91","signature":"6f430d362f1f5af632ba71a426099a73046c276296cece673d4da78bfde3b9d3"},{"version":"89a26c835c143998a3155eedd1b997fd3d5e319200db92d76970f4b82b52f785","signature":"ecc9c331029bef03a4617196ab916fc5d45b29c39898dd248787d7406751b46f"},{"version":"0c98f63bae22d46f99c3b9a463766e69bb6a33f7c2b739a425d23aeb0fc5a468","signature":"01fe9ce173f45a09b54f82b726959cff3d7af1f2e6596298f44b8476c86b1609"},"71336d2b229dfe87d375349ad48e56b50497bbe016aa6c5f5ab474c332a47fc4","b3d64e107af520235489c6ae5f27c4ed2d5b1e20bf14400a318459319372fb92","f570553cc117a5b10246f1baa14980d501e86fe29a3e3eb92a4ebc8bb5b586fb","b8a7c792da78d7c358243bc909f2386ded97ee47397aad6fbee8b81cc139e916","fbffe3cd9ee84ff85c569c2099baa96d7795df06c22940c10545488dd1a6fa96","ac02c5780d20a8bdcf91bec4a7d7f67c6ce3027cf25e1ffbc46780c379e499f4","18f97d316ded16682e0238de59e32672c77a29c5e427f9b532bfbd6e622a8344","89c67a901ab5e00abb6ae1ca5c97ab9da40d2bdef92413d730e8ada3da2449ab","b84bf8850597b6296f984612ea2775f6c17a51056c78dd05e037d7c5cb1b5c84","1d5613198f43052f404ec0d41155a8a33d6ec11ca3f7c3762422b123a3d79912","d65ee52c5f6a97afc1182e45dd4c0306a4b23935cd959162af0c45f95fbb6506","716c3c72272c620c83b73b7f3331e591b245dd1963a3f56b890202dc35e4a922","e929970d3b5f26baa81520defcb14d5736b906bd97c1944117c0b701774fe6b9","039c083e305f3bd6d2a1a79fadefa34e309ffa714a5b6d28d5e466176409fe32","908563083b6bc71fa2c9d13cdf89642cfc2bb2e25bf7ac0c5075c6b7ec0538e8","949ad82b645e715938818b7e88a461b0f449436248cfaf11041e194dcbe55df5","dd51bfc79ecaf436d787354b727c38477d7668799f537ce52c304ef7b7386b44","e2c3158e8c5b09e261905bb377ed06562ace98b9365e327544c925d72980ab95",{"version":"04d2351388e3703d9eea9b8d22ca4453d40c9c47673697dafa07bb80f250714f","impliedFormat":99},"5b169703744a581cc41ead96b91ff1ca203f598a0fbb7fc5c475442b44a49741","989ef2ce7e7d2b5fb7cb27c624b244ca3212adb649454146293af2dd3f47faec","6a6cbaccf66ec3a6ca2e2011da79a56aeef182f896d668d180372d03a4f15c74","8f0ff0f7f53aa0d040927159e547d2e201d6bf5bf80a9eccbf49b61fcf102f65","c4914ffabcf525b9bb8a93deb96740f8472b0f1657e17e8a674ecbf8ef6daa40","f81feb8c38d8e187025bbfd52bb52cbf250a736fd38570372ae9bbb5ee3e35d9","ba233f0f876ade2fb846230915b0f2e2cd7f2f9c850d0ae5031240b90adc9320","0800cf2618838a7259300ad750a6082625acceab6ae570f3cc86b894fdd8ac2e","82c7ebad97b9e7ea28d09327522976affdf6137d903127b3224943519fdbbeaf","638c696aee97d0a7c2c56599043f24d53e740439da60dc0d1c2656171fad84c8","a823842f755ebb9a5f53f17a1bf58af08e82d025489a738b294ccfe4cdb64f90","43ec53da0e417894fdae2f84ca2861ee785f9cc8054b1355cad458e32e758790","ee1712609c030f93f0193104a41e472b3b17838da6067fa7805478e81332b98c","20d70bea5782e468fb89759369709d156829e090b355915ff28730a506e1e2a1","d3b610f24e0d08a1079f42b995138866ce6f2681ed0b2d435e134d469cb8f67b","efc09ca98d6b6e72bc69f8bbdbfcdb01c16f24ee4fcda39e3add30a3416166dd","ce8f04f229a40d31b90a740e7b74aca3ed76b03b7f1585ca1323f1b80d6f7006","dbe95686b188aeb09b4f3041b2509d5cf543314b57e725372f351eaea25971ee","976c05f92fabbf396a18651da480b6b2d23195b3c9b5b6f37f27c1b5fb286b54","aa6aad25b2e56284705f8594a304ac31b2e74e6db9f67209b149c5882e4b89dd","e05a47f523b7792fa063e687e327bac6f00011da01c032003225c815eca79497","ae0ba394411502f58ba43cfffbbe5d12dbd312c833b3969b16bf1a94ec90e530","d15e9b66b65a440157551cde22c910c2e2b186e6c7f44324e895f291d629117c","4af52ca6c4b164c1f51fe78464d0eb5fdfbc89385d7628238d3ab6d8bd523da7","084e034e45167d15d154b2e7811a281d94885c71b3b01d4769a44f55c0f6f952",{"version":"79fd7bba032eaaf7f726b479c7c83a2c8bb7c18cfb0c1772a13b23069dbdfeda","signature":"01fe9ce173f45a09b54f82b726959cff3d7af1f2e6596298f44b8476c86b1609"},"71860f1efab600e8405761b577df7e870dbfb8415d7899696d3b2128fd00a931","474f6272ee75a64d1e98271ae5b83cf4862adf6c141726433296b463a1c130a3","fe5a46c46f3dea2fb31b76edc5fdc14e3ee051bf4fa95cdf32c97d1b9518ff53","e10eafaac3c15258ed78fbef15a3f8692196f971d53f137e60315e5adf7459a3","39492b021fb0e38a2277b43b075781b34e6f4f189ea5f53ed082372ea96c1dcb","906e1e7266f5495194c95064d02829511c0fced58fb5811180488d7158b3ccb0","4c09210b68020d99169d29a1185e9ce81943bd1e313b703546f652ca02b873ec","97c87af69630762a38163d2433a905b297546eef1f7572f7e89f3720f3e8cdbe","7f392b3f1c1b62dc1b577810cea037562b2163d1dab33df28fe973c21007793d","2d5d18f62e794df536196bf7820fa9f3bf92c8fb62b64e7e83373a19ae1cd7f0","f45cfe5a4f8c43c95c9c11d87a58b105cd216f1ae3f59ec2a1aaa598a9cf52c6","68020d3d42f720106a089dca5c168cf04e5d349089fbc191c36f9cccabcb3c3a","94e34c7d90e04bd1de26495f460aaf1f00e7bb004ffec8797f617ea29ae837a5","7f863c4a7c54be9ac30b0575f918420a38ff2edde87b808e59c4c8902e2fe93e","0043c0a8c6d450739b60f14cf684806ae4241c91f3fca50f172665dd9adfde90","9ec2d2c25f1f8befa23ba16b01c401d73da979dcdda8532aa0600f37edbf743b","7232de6a2a92489a070d7701bc60ae747fb40107563e87eb59096c540c4c40ad","1103186962bccc2e2100b1135a8e288f614bce6617ed8a85170e06a3b69cebf8","16d86d734dd6e6ff0ddc33e0e599da535de9bbc5b63abe3b35050f41c00892a3","cd8ffeab689cf8a4b893cdf152bae8be5526afaa8c2eb4a0819dd3db60e14602","7d9e7e04b576f76dfafbb03eccc7781d7b545450be3b4df7015369a4901090a7","3f08732c3a69da9b77f7e626163bb2b84afad459b844e629e01282312c53d82d","de936b6eabc0ac5efe7656dcadf07e5b3baff23ac51c8ef8d301fe5f0647dcbb","44ee0be70278c636f36b993c239c08f0f01c71e16d083b0be9a70f9a66efff09","1b8cacc68f25d13d3bfff13b9dbf773d52e40dca350697b0c19ceb0bd913c22e","ddfbc2e8c681833765607dcbc38a0fa7c768ed7a7d82cfaab528a049b3a55642","96775c3bb0698311914ff1c422bc3c680e143a26f9625a591bcee4e3f0f5d78c",{"version":"d2c13e6de6161ee47ad9edd275f03910121f6d3488a8d36a63e16c6635634bd8","affectsGlobalScope":true},{"version":"ea8a445ae856033c4027b52f3ed2a225ad841dde1248b9d2f58283671dce372d","affectsGlobalScope":true},"73bd4ebe9409ec75ebb1a8f91f1564b92ee28695c995ea15095fc51e830405ab",{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"58647d85d0f722a1ce9de50955df60a7489f0593bf1a7015521efe901c06d770","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"80523c00b8544a2000ae0143e4a90a00b47f99823eb7926c1e03c494216fc363","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"746911b62b329587939560deb5c036aca48aece03147b021fa680223255d5183","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"035d0934d304483f07148427a5bd5b98ac265dae914a6b49749fe23fbd893ec7","impliedFormat":99},{"version":"e2ed5b81cbed3a511b21a18ab2539e79ac1f4bc1d1d28f8d35d8104caa3b429f","impliedFormat":99},{"version":"b8caba62c0d2ef625f31cbb4fde09d851251af2551086ccf068611b0a69efd81","affectsGlobalScope":true,"impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"52dcc257df5119fb66d864625112ce5033ac51a4c2afe376a0b299d2f7f76e4a","impliedFormat":1},{"version":"e5bab5f871ef708d52d47b3e5d0aa72a08ee7a152f33931d9a60809711a2a9a3","impliedFormat":1},{"version":"e16dc2a81595736024a206c7d5c8a39bfe2e6039208ef29981d0d95434ba8fcf","impliedFormat":1},{"version":"cc4a4903fb698ca1d961d4c10dce658aa3a479faf40509d526f122b044eaf6a4","impliedFormat":1},{"version":"19ee8416e6473ed6c7adb868fa796b5653cf0fa2a337658e677eaa0d134388c3","impliedFormat":1},{"version":"1328ab4e442614b28cdb3d4b414cf68325c0da0dca07287a338d0654b7a00261","impliedFormat":1},{"version":"a039dc21f045919f3cbee2ec13812cc6cc3eebc99dae4be00973230f468d19a6","impliedFormat":1},{"version":"3fbe57af01460e49dcd29df55d6931e1672bc6f1be0fb073d11410bc16f9037d","impliedFormat":1},{"version":"f760be449e8562ec5c09bb5187e8e1eabf3c113c0c58cddda53ef8c69f3e2131","impliedFormat":1},{"version":"44325ed13294fce6ab825b82947bbeed2611db7dad9d9135260192f375e5a189","impliedFormat":1},{"version":"e392e8fb5b514eafc585601c1d781485aa6dd6a320e75daf1064a4c6918a1b45","impliedFormat":1},{"version":"46e4a36e8ddbdfb4e7330e11c81c970dc8b218611df9183d39c41c5f8c653b55","impliedFormat":1},{"version":"370bde134aa8c2abc926d0e99d3a4d5d5dba65c6ee65459137e4f02670cbf841","impliedFormat":1},{"version":"6332f565867cf4a740a70e30f31cefba37ef7cebcf74f22eab8d744fde6d193e","impliedFormat":1},{"version":"2977b7884aedc895a1d0c9c210c7cf3272c29d6959a08a6fa3ff71e0aff08175","impliedFormat":1},{"version":"17f2922d41ddd032830a91371c948cd9ce903b35c95adca72271a54584f19b0b","impliedFormat":1},{"version":"3eed76ede2a1a14d7c9bb0a642041282dcc264811139d3dd275c9fe14efc9840","impliedFormat":1},{"version":"e3cf0611709328b449ec13f8c436712d62003620ce480139fae46ce001c2ee9f","impliedFormat":1},{"version":"8d369483f0c2b9ee388129cfdb6a43bc8112b377e86a41884bd06e19ce04f4c1","impliedFormat":99},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"bf6402a3cfff440801c3ea5835f08784aac18087016534b48741adbcee931921","impliedFormat":1},{"version":"71b110829b8f5e7653352a132544ece2b9a10e93ba1c77453187673bd46f13ee","impliedFormat":1},{"version":"7c0ace9de3109ecdd8ad808dd40a052b82681786c66bb0bff6d848c1fc56a7c4","impliedFormat":1},{"version":"1223780c318ef42fd33ac772996335ed92d57cf7c0fc73178acab5e154971aab","impliedFormat":1},{"version":"0d04cbe88c8a25c2debd2eef03ec5674563e23ca9323fa82ede3577822653bd2","impliedFormat":1},{"version":"aaa70439f135c3fa0a34313de49e94cae3db954c8b8d6af0d56a46c998c2923f","impliedFormat":1},{"version":"4ace083580c1b77eb8ddf4ea915cde605af1a96e426c4c04b897feef1acdb534","impliedFormat":1},{"version":"daf07c1ca8ccfb21ad958833546a4f414c418fe096dcebdbb90b02e12aa5c3a2","impliedFormat":1},{"version":"89ac5224feeb2de76fc52fc2a91c5f6448a98dbe4e8d726ecb1730fa64cd2d30","impliedFormat":1},{"version":"7feb39ba69b3fc6d55faca4f91f06d77d15ffedd3931b0ef7740e8b6fd488b15","impliedFormat":1},{"version":"acf00cfabe8c4de18bea655754ea39c4d04140257556bbf283255b695d00e36f","impliedFormat":1},{"version":"39b70d5f131fcfdeba404ee63aba25f26d8376a73bacd8275fb5a9f06219ac77","impliedFormat":1},{"version":"cdae26c737cf4534eeec210e42eab2d5f0c3855240d8dde3be4aee9194e4e781","impliedFormat":1},{"version":"5aa0c50083d0d9a423a46afaef78c7f42420759cfa038ad40e8b9e6cafc38831","impliedFormat":1},{"version":"10d6a49a99a593678ba4ea6073d53d005adfc383df24a9e93f86bf47de6ed857","impliedFormat":1},{"version":"1b7ea32849a7982047c2e5d372300a4c92338683864c9ab0f5bbd1acadae83a3","impliedFormat":1},{"version":"224083e6fcec1d300229da3d1dafc678c642863996cbfed7290df20954435a55","impliedFormat":1},{"version":"4248ac3167b1a1ce199fda9307abc314b3132527aeb94ec30dbcfe4c6a417b1b","impliedFormat":1},{"version":"633cb8c2c51c550a63bda0e3dec0ad5fa1346d1682111917ad4bc7005d496d8c","impliedFormat":1},{"version":"ca055d26105248f745ea6259b4c498ebeed18c9b772e7f2b3a16f50226ff9078","impliedFormat":1},{"version":"ea6b2badb951d6dfa24bb7d7eb733327e5f9a15fc994d6dc1c54b2c7a83b6a0b","impliedFormat":1},{"version":"03fdf8dba650d830388b9985750d770dd435f95634717f41cea814863a9ac98b","impliedFormat":1},{"version":"6fd08e3ef1568cd0dc735c9015f6765e25143a4a0331d004a29c51b50eec402a","impliedFormat":1},{"version":"2e988cd4d24edac4936449630581c79686c8adac10357eb0cdb410c24f47c7f0","impliedFormat":1},{"version":"b813f62a37886ed986b0f6f8c5bf323b3fcae32c1952b71d75741e74ea9353cf","impliedFormat":1},{"version":"44a1a722038365972b1b52841e1132785bf5d75839dbc6cc1339f2d36f8507a1","impliedFormat":1},{"version":"83fe1053701101ac6d25364696fea50d2ceb2f81d1456bc11e682a20aaeac52e","impliedFormat":1},{"version":"4f228cb2089a5a135a1a8cefe612d5aebcef8258f7dbe3b7c4dad4e26a81ec08","impliedFormat":1},{"version":"7870becb94cbc11d2d01b77c4422589adcba4d8e59f726246d40cd0d129784d8","affectsGlobalScope":true,"impliedFormat":1},{"version":"f70b8328a15ca1d10b1436b691e134a49bc30dcf3183a69bfaa7ba77e1b78ecd","impliedFormat":1},{"version":"d9030fc0c412a31e7e13d189b9ad032b5177c20217add0f24fd3fff0cf272882","impliedFormat":99},{"version":"2be2227c3810dfd84e46674fd33b8d09a4a28ad9cb633ed536effd411665ea1e","impliedFormat":99},{"version":"7f9c8c4fd31e6e0f137ded52f026f97934abcc4624db1c9c8120b91a170798e0","impliedFormat":1},{"version":"957a44f864ab3c182edc747428e8eec1765257deee7fac86c1147eeac897d832","impliedFormat":1},{"version":"3feec212c0aeb91e5a6e62caaf9f128954590210f8c302910ea377c088f6b61a","impliedFormat":99},{"version":"d27eadfc7a0c340fbbb62294e70eb5cf27751e1dcf47ee688ca38dd64d15502c","impliedFormat":99},{"version":"86d818ada2f5f0cfffca153af94205b67ba50f8e36524a413d66652f34ef19af","impliedFormat":99},{"version":"40afd49a15d0bafef682b42664ff21c274e02dcc60052f2df85dd53c70d9394f","impliedFormat":99},{"version":"5a5b1dd91662e93efae28d985e0e44d10f6a7e3c2c2ae8abc29bcfc406cb5310","impliedFormat":99},{"version":"66d0a61b3b0df6c9c2eb09dbe26e3c2aef71d9043fed17cd56de6669cb706325","impliedFormat":99},{"version":"f6692c3a1847d846bc4b7a690ef2ba096b2ca56bea5818f073eb8193ce33b5e1","impliedFormat":99},{"version":"1e4d27cf43aa16d164e958a220fee3c225b9dd146b1912cbc12083263f157ca9","impliedFormat":99},{"version":"a46147f499d4246998d1e44b43beecd2ee04c0a330c35863eaeccc827a737fdf","impliedFormat":1},{"version":"390140c96dcaf0831d24b5408d19af017e3a8f150fed140791d976ac20dd2da7","impliedFormat":99},{"version":"886c87489e99cbe6af5b1d83f147b04f96a2ae499d4302de7f9e4478cb93ccca","impliedFormat":99},{"version":"13e7c1f8ddda39d034935e667f3a314ec8b89b8be18fbd4cd987ea4312b4221f","impliedFormat":99},{"version":"370a3bbb8117e32fd7ae37d318e28cf63251013fe015c5dd382599614a3d5d59","impliedFormat":99},{"version":"daf09fb2571ee9e9251b08237852ed26b67257cb7997358935608f63f9fd2ecb","impliedFormat":99},{"version":"768fd34f23de8dc5f5df6cd45f044bb4193105b5964e4ef734dbfc1a1f8e6223","impliedFormat":1},{"version":"dc18b19797fbc286f2bd51e14eca66fb46bd07c0c567cb40fc04e6e805533850","impliedFormat":99},{"version":"5903ab9ed38b4d4f878e507f76020f75b7fc2285515ebdb7596393ce196eee2f","impliedFormat":99},{"version":"58395463e3fd8b466d5801cd73027f82bbf12e3d90cb4b27538e61ee9ff3427c","impliedFormat":99},{"version":"4d4804f5da06e47254d253a07e82d400c55964ea097016753dbd4372ce0eaab0","impliedFormat":99},{"version":"cf76eeea2b4ec3fe26520cd129cfc32352d1ddb22b6d4ff0c6a709656a4b1b37","impliedFormat":1},{"version":"fea0cb28540b473977c722853998d39d28575fa12e31b3371fcf1f324e3a9fb7","impliedFormat":1},{"version":"ee4ee9bf6c6d276343e7f0bce3a5374800eb4ec6b2d7c70fab6ae3ef840d9777","impliedFormat":1},{"version":"571ba264349552a1111ac0d6a5ed580a41c390aac43a70546c3a7374c77faa71","impliedFormat":1},"06f5c2408e959ccebcbef2989bce4a528a531aeddb4f3c7fb2324c03a00b9b19"],"root":[89,107,[124,146],[1401,1421],[1425,1437],[1445,1448],1450,1451,[1453,1469],[1544,1546],1548,1549,[1564,1610],[2074,2079],2082,[2098,2102],[2184,2209],2224,2225,2227,2228,2237,2238,[2241,2457],2646],"options":{"allowImportingTsExtensions":true,"composite":true,"esModuleInterop":true,"jsx":1,"jsxImportSource":"vue","module":99,"noImplicitThis":true,"skipLibCheck":true,"strict":true,"target":99,"useDefineForClassFields":true,"verbatimModuleSyntax":true},"referencedMap":[[2455,1],[2454,2],[89,3],[92,4],[91,5],[1035,6],[1029,5],[1033,6],[1032,7],[1028,6],[1027,5],[1036,8],[1034,7],[1030,7],[1031,7],[166,9],[167,9],[168,9],[169,9],[170,9],[171,9],[172,9],[173,9],[174,9],[175,9],[176,9],[177,9],[178,9],[179,9],[180,9],[181,9],[182,9],[183,9],[184,9],[185,9],[186,9],[187,9],[188,9],[189,9],[190,9],[191,9],[192,9],[193,9],[194,9],[195,9],[196,9],[197,9],[198,9],[199,9],[200,9],[201,9],[202,9],[203,9],[204,9],[205,9],[206,9],[207,9],[208,9],[209,9],[210,9],[211,9],[212,9],[213,9],[214,9],[215,9],[216,9],[217,9],[218,9],[219,9],[220,9],[221,9],[222,9],[223,9],[224,9],[225,9],[226,9],[227,9],[228,9],[229,9],[230,9],[231,9],[232,9],[233,9],[234,9],[235,9],[236,9],[237,9],[238,9],[239,9],[240,9],[241,9],[242,9],[243,9],[244,9],[245,9],[246,9],[247,9],[248,9],[249,9],[250,9],[251,9],[252,9],[253,9],[254,9],[255,9],[256,9],[257,9],[258,9],[259,9],[260,9],[261,9],[262,9],[263,9],[264,9],[265,9],[266,9],[267,9],[268,9],[269,9],[270,9],[271,9],[272,9],[273,9],[274,9],[275,9],[276,9],[277,9],[278,9],[279,9],[280,9],[281,9],[282,9],[283,9],[284,9],[285,9],[286,9],[287,9],[288,9],[289,9],[290,9],[291,9],[292,9],[293,9],[294,9],[295,9],[296,9],[297,9],[298,9],[299,9],[300,9],[301,9],[302,9],[303,9],[304,9],[305,9],[306,9],[307,9],[459,10],[308,9],[309,9],[310,9],[311,9],[312,9],[313,9],[314,9],[315,9],[316,9],[317,9],[318,9],[319,9],[320,9],[321,9],[322,9],[323,9],[324,9],[325,9],[326,9],[327,9],[328,9],[329,9],[330,9],[331,9],[332,9],[333,9],[334,9],[335,9],[336,9],[337,9],[338,9],[339,9],[340,9],[341,9],[342,9],[343,9],[344,9],[345,9],[346,9],[347,9],[348,9],[349,9],[350,9],[351,9],[352,9],[353,9],[354,9],[355,9],[356,9],[357,9],[358,9],[359,9],[360,9],[361,9],[362,9],[363,9],[364,9],[365,9],[366,9],[367,9],[368,9],[369,9],[370,9],[371,9],[372,9],[373,9],[374,9],[375,9],[376,9],[377,9],[378,9],[379,9],[380,9],[381,9],[382,9],[383,9],[384,9],[385,9],[386,9],[387,9],[388,9],[389,9],[390,9],[391,9],[392,9],[393,9],[394,9],[395,9],[396,9],[397,9],[398,9],[399,9],[400,9],[401,9],[402,9],[403,9],[404,9],[405,9],[406,9],[407,9],[408,9],[409,9],[410,9],[411,9],[412,9],[413,9],[414,9],[415,9],[416,9],[417,9],[418,9],[419,9],[420,9],[421,9],[422,9],[423,9],[424,9],[425,9],[426,9],[427,9],[428,9],[429,9],[430,9],[431,9],[432,9],[433,9],[434,9],[435,9],[436,9],[437,9],[438,9],[439,9],[440,9],[441,9],[442,9],[443,9],[444,9],[445,9],[446,9],[447,9],[448,9],[449,9],[450,9],[451,9],[452,9],[453,9],[454,9],[455,9],[456,9],[457,9],[458,9],[460,11],[986,12],[988,13],[985,5],[987,5],[2239,9],[1929,14],[1925,15],[1912,5],[1928,16],[1921,17],[1919,18],[1918,18],[1917,17],[1914,18],[1915,17],[1923,19],[1916,18],[1913,17],[1920,18],[1926,20],[1927,21],[1922,22],[1924,18],[826,23],[822,24],[809,5],[825,25],[818,26],[816,27],[815,27],[814,26],[811,27],[812,26],[820,28],[813,27],[810,26],[817,27],[823,29],[824,30],[819,31],[821,27],[2096,32],[2093,33],[2092,34],[2083,5],[2084,5],[2086,35],[2085,5],[2095,36],[2087,34],[2088,37],[2091,38],[2089,5],[2090,34],[2094,5],[1637,39],[1611,9],[1612,40],[1613,9],[1614,9],[1615,41],[2015,42],[1633,5],[1636,5],[1634,43],[1989,44],[1988,45],[1987,5],[1971,46],[1970,9],[1973,47],[1974,48],[1972,49],[1976,50],[1975,5],[1979,51],[1980,52],[1978,51],[1977,5],[2009,53],[2008,9],[1981,9],[2011,54],[1991,55],[1990,9],[1982,5],[1984,56],[1983,5],[1986,57],[1985,49],[1993,9],[2007,58],[2006,59],[2005,9],[1992,9],[1996,9],[2000,60],[1998,61],[1999,9],[1997,9],[1995,62],[1994,5],[2002,63],[2001,5],[2004,64],[2003,9],[1953,5],[2013,65],[2012,9],[2014,66],[1962,67],[1961,68],[1960,69],[1966,70],[1963,9],[1964,71],[1965,71],[1967,72],[1968,73],[1959,74],[1969,75],[2010,5],[1823,76],[1758,77],[1759,78],[1760,79],[1761,80],[1762,81],[1763,82],[1764,83],[1765,84],[1766,85],[1767,86],[1768,87],[1769,88],[1770,89],[1771,90],[1772,91],[1773,92],[1813,93],[1774,94],[1775,95],[1776,96],[1777,97],[1778,98],[1779,99],[1780,100],[1781,101],[1782,102],[1783,103],[1784,104],[1785,105],[1786,106],[1787,107],[1788,108],[1789,109],[1790,110],[1791,111],[1792,112],[1793,113],[1794,114],[1795,115],[1796,116],[1797,117],[1798,118],[1799,119],[1800,120],[1801,121],[1802,122],[1803,123],[1804,124],[1805,125],[1806,126],[1807,127],[1808,128],[1809,129],[1810,130],[1811,131],[1812,132],[1822,133],[1747,5],[1753,134],[1755,135],[1757,136],[1814,137],[1815,136],[1816,136],[1817,138],[1821,139],[1818,136],[1819,136],[1820,136],[1824,140],[1825,141],[1826,142],[1827,142],[1828,143],[1829,142],[1830,142],[1831,144],[1832,142],[1833,145],[1834,145],[1835,145],[1836,146],[1837,145],[1838,147],[1839,142],[1840,145],[1841,143],[1842,146],[1843,142],[1844,142],[1845,143],[1846,146],[1847,146],[1848,143],[1849,142],[1850,148],[1851,149],[1852,143],[1853,143],[1854,145],[1855,142],[1856,142],[1857,143],[1858,142],[1875,150],[1859,142],[1860,141],[1861,141],[1862,141],[1863,145],[1864,145],[1865,146],[1866,146],[1867,143],[1868,141],[1869,141],[1870,151],[1871,152],[1872,142],[1873,141],[1874,153],[1911,154],[1749,76],[1881,155],[1876,156],[1877,156],[1878,156],[1879,157],[1880,158],[1752,159],[1751,159],[1756,148],[1882,160],[1750,76],[1886,161],[1883,162],[1884,162],[1885,163],[1887,141],[1754,164],[1888,145],[1889,146],[1890,5],[1891,5],[1892,5],[1893,5],[1894,5],[1895,5],[1910,165],[1896,5],[1897,5],[1898,5],[1899,5],[1900,5],[1901,5],[1902,5],[1903,5],[1904,5],[1905,5],[1906,5],[1907,5],[1908,5],[1909,5],[1931,166],[1932,167],[1933,168],[1937,166],[1938,169],[1939,170],[1745,171],[1744,172],[1748,173],[1746,174],[1934,175],[1935,176],[1936,177],[1940,178],[1946,179],[1941,9],[1942,9],[1943,180],[1944,181],[1945,180],[2223,182],[2220,183],[2219,184],[2210,5],[2211,5],[2213,185],[2212,5],[2222,186],[2214,184],[2215,187],[2218,188],[2216,5],[2217,184],[2221,5],[2562,5],[2146,5],[471,189],[472,189],[473,189],[474,189],[475,189],[476,189],[477,189],[478,189],[479,189],[480,189],[481,189],[482,189],[483,189],[484,189],[485,189],[486,189],[487,189],[488,189],[489,189],[490,189],[491,189],[492,189],[493,189],[494,189],[495,189],[496,189],[497,189],[498,189],[499,189],[500,189],[501,189],[502,189],[503,189],[504,189],[505,189],[506,189],[507,189],[508,189],[509,189],[510,189],[511,189],[512,189],[513,189],[514,189],[515,189],[516,189],[517,189],[518,189],[519,189],[520,189],[521,189],[522,189],[523,189],[524,189],[525,189],[526,189],[527,189],[528,189],[529,189],[530,189],[531,189],[532,189],[533,189],[534,189],[535,189],[536,189],[537,189],[538,189],[539,189],[540,189],[541,189],[542,189],[543,189],[544,189],[545,189],[546,189],[547,189],[548,189],[549,189],[550,189],[551,189],[552,189],[553,189],[554,189],[555,189],[556,189],[557,189],[558,189],[559,189],[560,189],[561,189],[562,189],[563,189],[564,189],[565,189],[566,189],[567,189],[775,190],[568,189],[569,189],[570,189],[571,189],[572,189],[573,189],[574,189],[575,189],[576,189],[577,189],[578,189],[579,189],[580,189],[581,189],[582,189],[583,189],[584,189],[585,189],[586,189],[587,189],[588,189],[589,189],[590,189],[591,189],[592,189],[593,189],[594,189],[595,189],[596,189],[597,189],[598,189],[599,189],[600,189],[601,189],[602,189],[603,189],[604,189],[605,189],[606,189],[607,189],[608,189],[609,189],[610,189],[611,189],[612,189],[613,189],[614,189],[615,189],[616,189],[617,189],[618,189],[619,189],[620,189],[621,189],[622,189],[623,189],[624,189],[625,189],[626,189],[627,189],[628,189],[629,189],[630,189],[631,189],[632,189],[633,189],[634,189],[635,189],[636,189],[637,189],[638,189],[639,189],[640,189],[641,189],[642,189],[643,189],[644,189],[645,189],[646,189],[647,189],[648,189],[649,189],[650,189],[651,189],[652,189],[653,189],[654,189],[655,189],[656,189],[657,189],[658,189],[659,189],[660,189],[661,189],[662,189],[663,189],[664,189],[665,189],[666,189],[667,189],[668,189],[669,189],[670,189],[671,189],[672,189],[673,189],[674,189],[675,189],[676,189],[677,189],[678,189],[679,189],[680,189],[681,189],[682,189],[683,189],[684,189],[685,189],[686,189],[687,189],[688,189],[689,189],[690,189],[691,189],[692,189],[693,189],[694,189],[695,189],[696,189],[697,189],[698,189],[699,189],[700,189],[701,189],[702,189],[703,189],[704,189],[705,189],[706,189],[707,189],[708,189],[709,189],[710,189],[711,189],[712,189],[713,189],[714,189],[715,189],[716,189],[717,189],[718,189],[719,189],[720,189],[721,189],[722,189],[723,189],[724,189],[725,189],[726,189],[727,189],[728,189],[729,189],[730,189],[731,189],[732,189],[733,189],[734,189],[735,189],[736,189],[737,189],[738,189],[739,189],[740,189],[741,189],[742,189],[743,189],[744,189],[745,189],[746,189],[747,189],[748,189],[749,189],[750,189],[751,189],[752,189],[753,189],[754,189],[755,189],[756,189],[757,189],[758,189],[759,189],[760,189],[761,189],[762,189],[763,189],[764,189],[765,189],[766,189],[767,189],[768,189],[769,189],[770,189],[771,189],[772,189],[773,189],[774,189],[470,191],[2508,192],[2509,192],[2510,193],[2463,194],[2511,195],[2512,196],[2513,197],[2458,5],[2461,198],[2459,5],[2460,5],[2514,199],[2515,200],[2516,201],[2517,202],[2518,203],[2519,204],[2520,204],[2521,205],[2522,206],[2523,207],[2524,208],[2464,5],[2462,5],[2525,209],[2526,210],[2527,211],[2561,212],[2528,213],[2529,5],[2530,214],[2531,215],[2532,216],[2533,217],[2534,218],[2535,219],[2536,220],[2537,221],[2538,222],[2539,222],[2540,223],[2541,5],[2542,224],[2543,225],[2545,226],[2544,227],[2546,228],[2547,229],[2548,230],[2549,231],[2550,232],[2551,233],[2552,234],[2553,235],[2554,236],[2555,237],[2556,238],[2557,239],[2558,240],[2465,5],[2466,5],[2467,5],[2505,241],[2506,5],[2507,5],[2559,242],[2560,243],[2643,244],[2172,245],[2171,245],[2627,246],[2624,247],[2626,248],[2625,249],[93,250],[94,251],[2622,252],[95,253],[96,254],[98,255],[90,5],[779,256],[105,257],[778,9],[104,9],[2150,258],[2164,259],[2165,260],[2166,261],[2170,262],[2151,263],[2177,264],[2178,265],[2169,266],[2155,267],[2159,268],[2149,269],[2157,270],[2158,271],[2156,266],[2154,269],[2152,272],[2168,273],[2153,274],[2174,275],[2175,276],[2173,277],[2148,278],[2167,5],[2179,279],[2181,280],[2182,281],[2107,5],[2105,5],[2106,3],[2103,5],[2180,5],[2104,5],[1145,282],[1144,5],[110,5],[1452,5],[97,5],[869,5],[868,283],[867,5],[2147,5],[2230,284],[2232,285],[1441,286],[2234,287],[1443,288],[2236,289],[2229,290],[2231,290],[1440,290],[1442,5],[2233,290],[2235,290],[1439,5],[795,291],[794,292],[793,293],[799,294],[796,295],[797,296],[798,297],[804,298],[802,9],[803,299],[801,300],[800,301],[1392,302],[1391,303],[1390,304],[843,305],[839,306],[841,307],[833,308],[840,309],[834,310],[842,311],[847,312],[844,9],[845,313],[846,314],[851,315],[848,316],[849,317],[850,318],[858,319],[853,320],[856,321],[852,295],[855,322],[854,322],[857,323],[865,324],[862,325],[863,326],[859,327],[861,328],[860,329],[864,330],[874,331],[866,316],[870,332],[871,333],[872,334],[873,335],[878,336],[875,316],[876,337],[877,338],[885,339],[880,316],[883,340],[879,316],[882,341],[881,340],[884,342],[892,343],[889,344],[890,345],[891,346],[888,347],[887,348],[886,349],[1004,350],[1001,351],[1002,352],[1003,353],[1007,354],[1006,355],[1005,356],[1014,357],[1013,358],[1011,359],[1010,360],[1009,361],[1008,358],[1012,362],[1017,363],[1016,364],[1015,365],[1026,366],[1025,9],[1024,367],[1019,368],[1022,369],[1018,370],[1021,371],[1020,371],[1023,372],[1040,373],[1039,374],[1038,375],[1037,376],[1050,377],[1049,378],[1048,379],[1090,380],[1086,381],[1087,382],[1088,383],[1089,384],[1096,385],[1092,9],[1091,9],[1093,9],[1094,9],[1095,9],[1099,386],[1098,387],[1097,388],[1113,389],[1108,390],[1111,391],[1112,392],[1110,393],[1109,394],[1117,395],[1115,396],[1116,397],[1114,398],[1121,399],[1120,316],[1119,400],[1118,401],[1056,402],[1055,390],[1051,403],[1053,404],[1052,405],[1054,405],[1124,406],[1123,407],[1122,408],[1127,409],[1126,410],[1125,411],[1137,412],[1135,413],[1136,9],[1131,414],[1132,415],[1133,416],[1134,417],[1141,418],[1138,316],[1139,419],[1140,420],[1154,421],[1148,422],[1147,423],[1152,424],[1143,425],[1151,426],[1153,427],[1149,428],[1150,422],[1146,429],[1142,430],[1130,431],[1129,432],[1128,433],[1157,434],[1156,435],[1155,436],[1160,437],[1159,438],[1158,439],[1393,440],[1374,441],[1373,9],[1163,442],[1162,443],[1161,444],[1167,445],[1164,446],[1165,447],[1166,448],[808,449],[805,450],[806,451],[807,452],[1062,453],[1061,454],[1060,455],[1379,456],[1378,457],[1376,458],[1377,457],[1375,459],[1366,460],[1363,461],[1365,462],[1364,463],[1362,5],[1177,464],[1175,465],[1171,9],[1174,466],[1170,467],[1173,468],[1168,469],[1172,316],[1176,5],[1169,470],[1382,471],[1380,472],[1381,473],[1059,474],[1058,475],[1057,476],[1385,477],[1384,478],[1383,479],[1179,480],[1178,481],[1182,482],[1181,483],[1180,484],[1185,485],[1184,9],[1183,316],[1188,486],[1187,487],[1186,488],[1389,489],[1388,9],[1387,490],[1386,491],[838,492],[835,493],[830,9],[827,494],[837,495],[836,496],[829,497],[828,498],[832,499],[831,500],[1191,501],[1190,502],[1189,503],[1199,504],[1198,505],[1195,506],[1194,507],[1197,508],[1196,505],[1193,509],[1192,510],[1202,511],[1201,512],[1200,513],[1205,514],[1204,515],[1203,516],[1209,517],[1208,9],[1207,518],[1206,519],[1076,520],[1075,9],[1071,521],[1070,522],[1073,523],[1072,524],[1074,524],[1361,525],[1360,526],[1359,527],[1358,5],[1234,528],[1225,529],[1221,530],[1219,5],[1224,531],[1222,532],[1223,533],[1233,534],[1232,9],[1226,316],[1231,535],[1229,536],[1228,537],[1230,538],[1227,539],[1239,540],[1238,541],[1237,542],[1236,543],[1235,544],[1245,545],[1243,546],[1244,547],[1241,316],[1242,548],[1240,549],[1249,550],[1247,9],[1246,551],[1248,552],[1372,553],[1371,554],[1370,555],[1369,556],[1368,557],[1367,9],[1252,558],[1251,559],[1250,560],[1258,561],[1256,562],[1255,563],[1254,564],[1253,565],[1257,5],[1261,566],[1260,567],[1259,568],[1294,569],[1284,9],[1273,570],[1264,571],[1293,572],[1274,573],[1281,574],[1276,575],[1271,576],[1279,577],[1282,578],[1272,579],[1280,580],[1290,581],[1289,582],[1278,583],[1287,584],[1286,585],[1269,586],[1288,587],[1262,5],[1266,588],[1275,589],[1270,590],[1277,570],[1285,5],[1292,591],[1265,592],[1268,593],[1283,594],[1267,595],[1263,596],[1291,597],[1085,598],[1081,599],[1064,600],[1063,601],[1079,602],[1069,602],[1083,603],[1080,604],[1065,605],[1066,606],[1082,607],[1067,608],[1084,609],[1068,610],[1302,611],[1301,612],[1298,613],[1297,614],[1299,615],[1296,616],[1295,617],[1300,618],[1000,619],[999,620],[998,621],[1305,622],[1303,623],[1304,624],[1107,625],[1101,626],[1100,627],[1104,628],[1105,629],[1102,630],[1106,631],[1103,632],[1308,633],[1307,634],[1306,635],[1313,636],[1311,637],[1310,638],[1309,316],[1312,639],[1047,640],[1046,641],[1043,642],[1042,643],[1045,644],[1044,645],[1041,646],[1357,647],[1351,648],[1355,649],[1356,650],[1354,651],[1353,652],[1352,653],[1319,654],[1316,655],[1314,656],[1318,657],[1317,656],[1331,658],[1329,659],[1330,660],[1336,661],[1335,662],[1334,663],[1333,664],[1332,665],[1328,666],[1326,667],[1323,668],[1322,669],[1320,670],[1327,5],[1324,671],[1321,672],[1325,673],[1347,674],[1337,675],[1346,9],[1341,676],[1340,677],[1345,678],[1344,679],[1343,680],[1342,681],[1339,682],[1338,683],[1220,684],[1217,685],[1218,686],[1213,687],[1214,688],[1212,688],[1210,5],[1216,9],[1215,687],[1211,689],[1350,690],[1349,691],[1348,692],[147,5],[152,5],[148,5],[149,5],[153,5],[150,5],[151,5],[1394,693],[1395,9],[1398,694],[1078,695],[1396,9],[1397,9],[997,696],[996,9],[893,9],[894,9],[994,9],[990,9],[982,316],[895,697],[896,9],[995,316],[979,5],[989,698],[993,459],[897,9],[983,9],[978,459],[981,9],[965,699],[967,700],[968,9],[969,316],[966,9],[991,9],[980,9],[972,494],[970,9],[971,9],[973,5],[992,623],[974,9],[975,9],[976,5],[977,5],[984,9],[1400,701],[964,702],[899,5],[900,5],[901,5],[902,5],[903,5],[904,5],[905,5],[906,5],[907,5],[908,5],[909,5],[910,5],[898,5],[911,5],[912,5],[913,5],[914,5],[915,5],[916,5],[917,5],[918,5],[919,5],[920,5],[921,5],[922,5],[923,5],[924,5],[925,5],[926,5],[927,5],[928,5],[929,5],[930,5],[931,5],[932,5],[933,5],[934,5],[935,5],[936,5],[937,5],[938,5],[939,5],[940,5],[941,5],[942,5],[943,5],[944,5],[945,5],[946,5],[947,5],[948,5],[949,5],[950,5],[951,5],[952,5],[953,5],[954,5],[955,5],[956,5],[957,5],[958,5],[959,5],[960,5],[106,5],[962,5],[963,5],[961,5],[1399,703],[777,704],[780,697],[158,5],[163,5],[159,5],[164,705],[160,5],[161,5],[162,9],[790,5],[781,5],[782,253],[783,5],[792,706],[791,5],[784,707],[785,5],[786,5],[787,253],[789,5],[788,253],[154,708],[165,5],[461,709],[469,710],[463,711],[468,712],[156,713],[157,714],[155,5],[464,9],[465,715],[462,9],[466,716],[467,9],[2567,5],[2240,717],[1449,5],[1471,718],[1472,719],[1470,5],[1526,720],[1478,721],[1480,722],[1473,718],[1527,723],[1479,724],[1484,725],[1485,724],[1486,726],[1487,724],[1488,727],[1489,726],[1490,724],[1491,724],[1523,728],[1518,729],[1519,724],[1520,724],[1492,724],[1493,724],[1521,724],[1494,724],[1514,724],[1517,724],[1516,724],[1515,724],[1495,724],[1496,724],[1497,725],[1498,724],[1499,724],[1512,724],[1501,724],[1500,724],[1524,724],[1503,724],[1522,724],[1502,724],[1513,724],[1505,728],[1506,724],[1508,726],[1507,724],[1509,724],[1525,724],[1510,724],[1511,724],[1476,730],[1475,5],[1481,731],[1483,732],[1477,5],[1482,733],[1504,733],[1474,734],[1529,735],[1536,736],[1537,736],[1539,737],[1538,736],[1528,738],[1542,739],[1531,740],[1533,741],[1541,742],[1534,743],[1532,744],[1540,745],[1535,746],[1530,747],[2176,5],[1958,748],[1957,749],[1954,5],[1955,750],[1956,751],[2595,5],[2631,5],[1543,5],[776,752],[2620,5],[2628,5],[1077,5],[1739,5],[109,753],[2584,754],[2582,755],[2583,756],[2571,757],[2572,755],[2579,758],[2570,759],[2575,760],[2585,5],[2576,761],[2581,762],[2587,763],[2586,764],[2569,765],[2577,766],[2578,767],[2573,768],[2580,754],[2574,769],[1740,770],[1743,771],[1741,171],[1742,772],[2564,773],[2563,774],[2608,775],[2589,5],[2609,776],[2591,777],[2616,778],[2610,5],[2612,779],[2613,779],[2614,780],[2611,5],[2615,781],[2594,782],[2592,5],[2593,783],[2607,784],[2590,5],[2605,785],[2596,786],[2597,787],[2598,787],[2599,786],[2606,788],[2600,787],[2601,785],[2602,786],[2603,787],[2604,786],[2161,789],[2160,790],[2163,791],[2162,792],[2108,790],[2127,793],[2120,5],[2111,794],[2109,790],[2112,790],[2110,795],[2113,790],[2115,790],[2114,790],[2117,790],[2116,790],[2119,790],[2118,790],[2121,796],[2122,790],[2126,797],[2123,798],[2124,790],[2125,790],[2143,799],[2129,799],[2137,799],[2128,5],[2145,800],[2139,801],[2141,5],[2144,802],[2132,803],[2133,803],[2135,803],[2131,804],[2138,805],[2134,803],[2130,803],[2140,799],[2142,806],[2136,807],[2568,5],[2632,808],[1930,809],[1563,810],[1550,5],[1560,5],[1556,5],[1557,5],[1551,5],[1561,5],[1562,5],[1559,5],[1555,5],[1554,5],[1558,811],[1552,5],[1553,5],[1624,812],[1623,9],[1669,9],[1618,9],[1619,5],[1620,813],[1688,9],[1689,814],[1690,9],[1692,815],[1691,9],[1625,9],[1693,9],[1694,9],[1722,816],[1723,817],[1718,9],[1695,818],[1696,818],[1698,819],[1697,820],[1699,9],[1700,818],[1724,9],[1726,821],[1702,822],[1701,9],[1713,9],[1714,818],[1715,818],[1716,818],[1727,816],[1703,9],[1631,823],[1628,9],[1629,824],[1630,5],[1622,825],[1621,5],[1670,9],[1717,9],[1725,826],[1641,827],[1639,828],[1640,829],[1668,830],[1720,5],[1721,831],[1706,832],[1673,833],[1674,834],[1675,820],[1676,835],[1728,9],[1729,836],[1677,820],[1678,837],[1679,838],[1730,820],[1731,839],[1732,840],[1733,841],[1666,842],[1667,843],[1707,820],[1708,844],[1734,845],[1735,846],[1647,9],[1680,820],[1682,847],[1681,820],[1683,848],[1685,849],[1617,850],[1737,851],[1736,852],[1948,853],[1947,854],[1738,5],[1950,855],[1949,826],[1709,856],[1710,857],[1627,858],[1626,9],[1687,859],[1686,820],[1712,860],[1711,861],[1951,862],[1952,863],[1632,864],[1672,865],[1671,866],[1704,867],[1719,868],[1705,5],[1653,830],[1659,5],[1658,869],[1662,5],[1646,5],[1648,845],[1656,870],[1657,5],[1644,871],[1645,872],[1635,5],[1642,873],[1665,874],[1650,875],[1616,5],[1638,876],[1655,5],[1661,877],[1660,9],[1643,826],[1654,878],[1651,5],[1649,5],[1664,879],[1652,830],[1663,5],[1684,5],[80,5],[81,5],[15,5],[13,5],[14,5],[19,5],[18,5],[2,5],[20,5],[21,5],[22,5],[23,5],[24,5],[25,5],[26,5],[27,5],[3,5],[28,5],[29,5],[4,5],[30,5],[34,5],[31,5],[32,5],[33,5],[35,5],[36,5],[37,5],[5,5],[38,5],[39,5],[40,5],[41,5],[6,5],[45,5],[42,5],[43,5],[44,5],[46,5],[7,5],[47,5],[52,5],[53,5],[48,5],[49,5],[50,5],[51,5],[8,5],[57,5],[54,5],[55,5],[56,5],[58,5],[9,5],[59,5],[60,5],[61,5],[63,5],[62,5],[64,5],[65,5],[10,5],[66,5],[67,5],[68,5],[11,5],[69,5],[70,5],[71,5],[72,5],[73,5],[1,5],[74,5],[75,5],[12,5],[78,5],[77,5],[82,5],[76,5],[79,5],[17,5],[16,5],[2621,5],[2483,880],[2493,881],[2482,880],[2503,882],[2474,883],[2473,884],[2502,244],[2496,885],[2501,886],[2476,887],[2490,888],[2475,889],[2499,890],[2471,891],[2470,244],[2500,892],[2472,893],[2477,894],[2478,5],[2481,894],[2468,5],[2504,895],[2494,896],[2485,897],[2486,898],[2488,899],[2484,900],[2487,901],[2497,244],[2479,902],[2480,903],[2489,904],[2469,905],[2492,896],[2491,894],[2495,5],[2498,906],[2633,907],[2629,908],[2630,909],[2635,910],[2636,911],[2634,5],[2640,912],[2639,913],[2641,914],[2638,915],[2642,916],[2644,917],[2645,916],[88,918],[2619,919],[2566,920],[2565,921],[84,921],[83,5],[85,922],[86,5],[87,923],[2617,924],[2588,5],[2618,925],[2226,5],[1315,5],[1438,9],[108,9],[1444,926],[102,9],[103,927],[2623,249],[99,928],[100,929],[2183,9],[2637,5],[101,572],[2097,39],[2081,39],[2080,5],[2048,930],[2047,931],[2046,5],[2030,932],[2029,9],[2032,933],[2033,934],[2031,935],[2035,936],[2034,5],[2038,937],[2039,938],[2037,937],[2036,5],[2068,939],[2067,9],[2040,9],[2070,940],[2050,941],[2049,9],[2041,5],[2043,942],[2042,5],[2045,943],[2044,935],[2052,9],[2066,944],[2065,945],[2064,9],[2051,9],[2055,9],[2059,946],[2057,947],[2058,9],[2056,9],[2054,948],[2053,5],[2061,949],[2060,5],[2063,950],[2062,9],[2016,5],[2072,951],[2071,9],[2073,952],[2025,953],[2024,954],[2023,955],[2026,956],[2027,957],[2022,958],[2028,959],[2069,5],[2021,960],[2020,961],[2017,5],[2018,962],[2019,963],[112,964],[113,965],[111,966],[114,967],[115,968],[116,969],[117,970],[118,971],[119,972],[120,973],[121,974],[122,975],[123,976],[1424,5],[1423,977],[1422,5],[1547,978],[1577,979],[1595,979],[1585,979],[1586,979],[1596,979],[1597,979],[1435,979],[1598,979],[1579,979],[1587,979],[1427,979],[1425,979],[1431,979],[1453,980],[1588,979],[1548,979],[1467,979],[1589,979],[1434,979],[1599,979],[1600,979],[1461,979],[1601,979],[1602,979],[1603,979],[1590,979],[1591,979],[1592,979],[1593,979],[1604,979],[1605,979],[1606,979],[1607,979],[146,979],[1608,979],[1609,979],[1594,979],[1433,979],[1610,979],[127,981],[1581,982],[2075,983],[2076,984],[2098,985],[1580,986],[2099,987],[2100,988],[2101,989],[2102,988],[2190,990],[2191,991],[2192,988],[2193,992],[2195,993],[2196,994],[2194,995],[2197,996],[2199,997],[2200,998],[2198,999],[2203,1000],[2201,998],[2204,1001],[2202,998],[2206,1002],[2185,1003],[2186,1004],[2188,1005],[2189,1006],[2187,988],[1468,1007],[2207,1008],[2208,988],[2209,987],[2184,1009],[2074,1010],[1544,1011],[1455,1012],[2224,1013],[124,999],[134,999],[107,999],[128,999],[125,999],[126,999],[2225,1014],[2205,999],[1415,572],[143,1015],[1436,572],[139,1016],[2227,1017],[2228,1018],[1583,572],[2237,1019],[2238,1020],[2241,1021],[2243,1022],[2245,1023],[2246,572],[1416,1024],[140,1025],[141,1024],[142,987],[1403,1026],[144,1027],[145,1024],[1402,1028],[1404,1029],[137,1030],[138,1031],[1410,1032],[1405,1033],[1407,1034],[1408,1035],[1409,1036],[1411,1037],[1584,1038],[1582,1039],[2244,1016],[2247,1040],[1571,1041],[1570,1042],[2242,1043],[1578,1044],[130,1045],[136,1046],[133,1047],[132,1048],[1446,999],[131,999],[2077,999],[2078,999],[2248,999],[1469,999],[1566,572],[2249,999],[1401,1049],[2250,572],[1457,1050],[2082,999],[1454,1051],[1437,1052],[1574,1053],[1572,1054],[1576,1055],[1573,1056],[135,1057],[2079,999],[1406,1058],[129,999],[1575,999],[1419,999],[1420,1059],[1418,1060],[1417,1061],[2251,1062],[2252,1063],[2253,1064],[2254,1065],[2255,1066],[2256,1067],[2257,1068],[2258,1069],[2259,1070],[2260,1071],[2261,1072],[2267,1073],[2265,1074],[2264,1075],[2263,1076],[2266,1077],[2262,1078],[2269,1079],[2268,1080],[2270,1079],[2271,1079],[2272,1081],[2273,1082],[2274,1083],[2275,1084],[2276,1085],[2277,991],[2278,1084],[2279,1086],[2280,1087],[2281,1088],[2282,1089],[2286,1090],[1464,999],[1465,1091],[2283,1092],[2284,1093],[2285,1094],[2287,1095],[2288,1096],[2296,1097],[2292,1098],[2297,1099],[2290,988],[1429,1100],[2298,1101],[2291,1097],[2293,1102],[2294,1103],[2300,1104],[2301,1102],[2302,1105],[2299,1106],[2304,1107],[2305,1108],[2306,1109],[2303,999],[2308,1110],[2309,1111],[2310,1112],[2307,999],[1428,999],[2312,1113],[2313,1114],[2314,1115],[2311,999],[2316,1116],[2317,1117],[2318,1118],[2315,999],[2320,1119],[2321,1120],[2322,1121],[2319,999],[2324,1122],[2325,1123],[2326,1124],[2323,999],[2328,1125],[2329,988],[2330,1126],[2327,999],[2332,1127],[2333,1128],[2331,999],[2335,1129],[2336,988],[2337,1130],[2334,999],[2339,1131],[2340,1132],[2341,1133],[2338,999],[2343,1134],[2344,988],[2345,1135],[2342,999],[2346,1136],[2289,1137],[1430,1138],[2348,1139],[2347,987],[2349,1140],[2295,1141],[2351,1142],[2354,1143],[2352,1144],[2353,1145],[2350,1146],[2355,1147],[2356,1148],[1426,1149],[2357,1150],[2358,1147],[1414,1151],[1413,1151],[1412,1152],[2359,1153],[1432,1154],[2360,1155],[2361,1156],[2362,1157],[2370,1158],[2371,1159],[2363,1160],[2368,1161],[2365,1162],[2364,1163],[2366,1164],[2367,1165],[2369,1166],[2372,1167],[2373,1167],[2374,1168],[2375,1169],[2376,1170],[2377,1171],[2378,1172],[2379,1167],[2380,999],[2381,1173],[2382,1174],[2383,988],[2384,1175],[2385,1176],[2386,1177],[2387,1178],[2388,1179],[2389,1180],[2390,1181],[2391,1182],[2392,1183],[1462,1184],[2393,1185],[2394,1186],[2395,1187],[2396,1188],[2397,1189],[2398,1190],[2399,1191],[2400,1192],[2402,1193],[2401,5],[2403,1194],[2404,1195],[2405,1194],[2406,1196],[2407,1197],[2408,1198],[2409,1199],[2410,1200],[2411,1201],[2412,1202],[2413,1203],[2414,1204],[2415,1205],[2416,1206],[2417,1207],[2418,1208],[2419,1209],[2420,1210],[2421,1211],[2422,1212],[2423,1213],[2424,1214],[2425,1215],[2426,1216],[2427,1217],[2428,1218],[2432,1219],[2431,1220],[2434,1221],[2429,988],[2430,1222],[2433,1220],[2437,1223],[2435,1224],[2436,1225],[2438,1226],[1549,1227],[1460,1228],[1459,1229],[1564,1230],[2440,1231],[1456,1232],[1448,1233],[1447,1234],[1445,1235],[2441,1090],[2442,1090],[1458,1236],[1568,1237],[1567,1238],[1466,1239],[1451,1240],[1450,1241],[2443,1242],[1463,1090],[1546,1243],[1545,1244],[2439,1245],[1565,1246],[1569,1247],[2444,1248],[2445,988],[2446,1249],[2447,988],[2448,988],[2449,988],[2450,988],[2451,1250],[2452,1251],[1421,1252],[2453,1253],[2456,5],[2457,1254],[2646,1255]],"semanticDiagnosticsPerFile":[[1432,[{"start":1799,"length":4,"code":2322,"category":1,"messageText":{"messageText":"Type '\"\" | \"info\" | \"danger\"' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type '\"\"' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tag/src/tag.d.ts","start":414,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type '{ readonly type?: \"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined; readonly closable?: boolean | undefined; readonly disableTransitions?: boolean | undefined; ... 6 more ...; readonly onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & R...'","category":3,"code":6500}]},{"start":7767,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined'.","relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tag/src/tag.d.ts","start":414,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type '{ readonly type?: \"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined; readonly closable?: boolean | undefined; readonly disableTransitions?: boolean | undefined; ... 6 more ...; readonly onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & R...'","category":3,"code":6500}]}]],[1450,[{"start":4562,"length":16,"messageText":"Expected 0 arguments, but got 1.","category":1,"code":2554},{"start":4647,"length":12,"messageText":"Expected 0 arguments, but got 1.","category":1,"code":2554},{"start":4725,"length":9,"messageText":"Expected 0 arguments, but got 1.","category":1,"code":2554},{"start":4800,"length":9,"messageText":"Expected 0 arguments, but got 1.","category":1,"code":2554},{"start":5010,"length":19,"messageText":"Expected 0 arguments, but got 1.","category":1,"code":2554}]],[2076,[{"start":1300,"length":5,"messageText":"'attrs' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.","category":1,"code":7022}]],[2077,[{"start":10172,"length":13,"code":2339,"category":1,"messageText":"Property 'captureStream' does not exist on type 'HTMLVideoElement'."}]],[2190,[{"start":888,"length":28,"code":7016,"category":1,"messageText":{"messageText":"Could not find a declaration file for module '@wangeditor/editor-for-vue'. 'D:/web/zyt/admin/node_modules/.pnpm/@wangeditor+editor-for-vue@_d49ef1161b4f4b880c450fdbfe3a0001/node_modules/@wangeditor/editor-for-vue/dist/index.esm.js' implicitly has an 'any' type.","category":1,"code":7016,"next":[{"info":{"moduleReference":"@wangeditor/editor-for-vue","mode":99}}]}}]],[2257,[{"start":8667,"length":6,"code":2339,"category":1,"messageText":"Property 'remark' does not exist on type 'never'."}]],[2284,[{"start":104030,"length":19,"code":2322,"category":1,"messageText":{"messageText":"Type '{ name: any; code: any; children: any; }[]' is not assignable to type 'never[]'.","category":1,"code":2322,"next":[{"messageText":"Type '{ name: any; code: any; children: any; }' is not assignable to type 'never'.","category":1,"code":2322}]}},{"start":104298,"length":989,"code":2322,"category":1,"messageText":"Type '{ name: string; children: { name: string; children: { name: string; }[]; }[]; }' is not assignable to type 'never'."},{"start":105302,"length":471,"code":2322,"category":1,"messageText":"Type '{ name: string; children: { name: string; children: { name: string; }[]; }[]; }' is not assignable to type 'never'."},{"start":105788,"length":471,"code":2322,"category":1,"messageText":"Type '{ name: string; children: { name: string; children: { name: string; }[]; }[]; }' is not assignable to type 'never'."},{"start":106274,"length":803,"code":2322,"category":1,"messageText":"Type '{ name: string; children: { name: string; children: { name: string; }[]; }[]; }' is not assignable to type 'never'."},{"start":114787,"length":17,"messageText":"Cannot find name 'searchPatientsAPI'.","category":1,"code":2304},{"start":68312,"length":6,"code":2322,"category":1,"messageText":{"messageText":"Type '(value: string[]) => void' is not assignable to type '(value: CascaderValue | null | undefined) => any'.","category":1,"code":2322,"next":[{"messageText":"Types of parameters 'value' and 'value' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'CascaderValue | null | undefined' is not assignable to type 'string[]'.","category":1,"code":2322,"next":[{"messageText":"Type 'undefined' is not assignable to type 'string[]'.","category":1,"code":2322}]}]}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader/src/cascader.vue.d.ts","start":2156,"length":8,"messageText":"The expected type comes from property 'onChange' which is declared here on type '__VLS_NormalizeComponentEvent; props: TreeOptionProps; effect: EpPropMergeType<...>; ... 48 more ...; cacheData: unknown[]; }> & Omit<...> & Record<...>'","category":3,"code":6500}]},{"start":51818,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | null | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-number/src/input-number.d.ts","start":907,"length":10,"messageText":"The expected type comes from property 'modelValue' which is declared here on type '{ readonly id?: string | undefined; readonly step?: number | undefined; readonly stepStrictly?: boolean | undefined; readonly max?: number | undefined; readonly min?: number | undefined; ... 19 more ...; readonly \"onUpdate:modelValue\"?: ((val: number | undefined) => any) | undefined; } & VNodeProps & AllowedComponen...'","category":3,"code":6500}]},{"start":64632,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | null | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-number/src/input-number.d.ts","start":907,"length":10,"messageText":"The expected type comes from property 'modelValue' which is declared here on type '{ readonly id?: string | undefined; readonly step?: number | undefined; readonly stepStrictly?: boolean | undefined; readonly max?: number | undefined; readonly min?: number | undefined; ... 19 more ...; readonly \"onUpdate:modelValue\"?: ((val: number | undefined) => any) | undefined; } & VNodeProps & AllowedComponen...'","category":3,"code":6500}]},{"start":112955,"length":1,"messageText":"Parameter 'r' implicitly has an 'any' type.","category":1,"code":7006}]],[2288,[{"start":160795,"length":19,"code":2322,"category":1,"messageText":{"messageText":"Type '{ value: any; label: any; code: any; children: any; }[]' is not assignable to type 'never[]'.","category":1,"code":2322,"next":[{"messageText":"Type '{ value: any; label: any; code: any; children: any; }' is not assignable to type 'never'.","category":1,"code":2322}]}},{"start":224456,"length":15,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./src/api/tcm.ts","start":17286,"length":15,"messageText":"The expected type comes from property 'medication_days' which is declared here on type '{ id: number; dose_count?: number | undefined; medication_days?: number | undefined; }'","category":3,"code":6500}]},{"start":14551,"length":4,"code":2322,"category":1,"messageText":{"messageText":"Type 'unknown[]' is not assignable to type 'TreeNodeData[]'.","category":1,"code":2322,"next":[{"messageText":"Type 'unknown' is not assignable to type 'TreeNodeData'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","start":27789,"length":4,"messageText":"The expected type comes from property 'data' which is declared here on type 'Partial<{ lazy: boolean; offset: number; teleported: EpPropMergeType; props: TreeOptionProps; effect: EpPropMergeType<...>; ... 48 more ...; cacheData: unknown[]; }> & Omit<...> & Record<...>'","category":3,"code":6500}]},{"start":30726,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":221199,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":31214,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":245332,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":31670,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":221199,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":32150,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":246213,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":32596,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '{ id: number; express_company?: unknown; tracking_number?: unknown; ship_mode?: unknown; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record' but required in type '{ id: number; express_company?: unknown; tracking_number?: unknown; ship_mode?: unknown; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":229341,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":33061,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '{ id: number; diagnosis_id?: number | undefined; pay_order_ids?: number[] | undefined; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record' but required in type '{ id: number; diagnosis_id?: number | undefined; pay_order_ids?: number[] | undefined; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":241940,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":33521,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":244963,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":33975,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":237117,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":92405,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | null | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-number/src/input-number.d.ts","start":907,"length":10,"messageText":"The expected type comes from property 'modelValue' which is declared here on type '{ readonly id?: string | undefined; readonly step?: number | undefined; readonly stepStrictly?: boolean | undefined; readonly max?: number | undefined; readonly min?: number | undefined; ... 19 more ...; readonly \"onUpdate:modelValue\"?: ((val: number | undefined) => any) | undefined; } & VNodeProps & AllowedComponen...'","category":3,"code":6500}]},{"start":104708,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | null | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-number/src/input-number.d.ts","start":907,"length":10,"messageText":"The expected type comes from property 'modelValue' which is declared here on type '{ readonly id?: string | undefined; readonly step?: number | undefined; readonly stepStrictly?: boolean | undefined; readonly max?: number | undefined; readonly min?: number | undefined; ... 19 more ...; readonly \"onUpdate:modelValue\"?: ((val: number | undefined) => any) | undefined; } & VNodeProps & AllowedComponen...'","category":3,"code":6500}]},{"start":142032,"length":10,"messageText":"'__VLS_ctx.detailData' is possibly 'null'.","category":1,"code":18047},{"start":142126,"length":10,"messageText":"'__VLS_ctx.detailData' is possibly 'null'.","category":1,"code":18047},{"start":142223,"length":10,"messageText":"'__VLS_ctx.detailData' is possibly 'null'.","category":1,"code":18047},{"start":147974,"length":1,"messageText":"Parameter 'r' implicitly has an 'any' type.","category":1,"code":7006}]],[2300,[{"start":325,"length":8,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ modelValue: any; }' is not assignable to parameter of type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & Record<...>'.","category":1,"code":2345,"next":[{"messageText":"Property 'itemData' is missing in type '{ modelValue: any; }' but required in type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; }'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type '{ modelValue: any; }' is not assignable to type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; }'."}}]},"relatedInformation":[{"file":"./src/views/decoration/component/tabbar/pc/menu-set.vue","start":4006,"length":8,"messageText":"'itemData' is declared here.","category":3,"code":2728}]},{"start":454,"length":8,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ modelValue: any; }' is not assignable to parameter of type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & Record<...>'.","category":1,"code":2345,"next":[{"messageText":"Property 'itemData' is missing in type '{ modelValue: any; }' but required in type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; }'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type '{ modelValue: any; }' is not assignable to type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; }'."}}]},"relatedInformation":[{"file":"./src/views/decoration/component/tabbar/pc/menu-set.vue","start":4006,"length":8,"messageText":"'itemData' is declared here.","category":3,"code":2728}]}]],[2313,[{"start":195,"length":6,"code":2339,"category":1,"messageText":"Property 'height' does not exist on type '{}'."}]],[2355,[{"start":5709,"length":5,"messageText":"Parameter 'depts' implicitly has an 'any' type.","category":1,"code":7006},{"start":5738,"length":6,"messageText":"Variable 'result' implicitly has type 'any[]' in some locations where its type cannot be determined.","category":1,"code":7034},{"start":5777,"length":4,"messageText":"Parameter 'dept' implicitly has an 'any' type.","category":1,"code":7006},{"start":5946,"length":6,"messageText":"Variable 'result' implicitly has an 'any[]' type.","category":1,"code":7005},{"start":6044,"length":6,"messageText":"Variable 'result' implicitly has an 'any[]' type.","category":1,"code":7005}]],[2358,[{"start":10278,"length":47,"code":2769,"category":1,"messageText":{"messageText":"No overload matches this call.","category":1,"code":2769,"next":[{"messageText":"Overload 1 of 3, '(callbackfn: (previousValue: unknown, currentValue: unknown, currentIndex: number, array: unknown[]) => unknown, initialValue: unknown): unknown', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type '(total: number, count: number) => number' is not assignable to parameter of type '(previousValue: unknown, currentValue: unknown, currentIndex: number, array: unknown[]) => unknown'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'total' and 'previousValue' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322}]}]}]},{"messageText":"Overload 2 of 3, '(callbackfn: (previousValue: number, currentValue: unknown, currentIndex: number, array: unknown[]) => number, initialValue: number): number', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type '(total: number, count: number) => number' is not assignable to parameter of type '(previousValue: number, currentValue: unknown, currentIndex: number, array: unknown[]) => number'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'count' and 'currentValue' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322}]}]}]}]},"relatedInformation":[]},{"start":10485,"length":47,"code":2769,"category":1,"messageText":{"messageText":"No overload matches this call.","category":1,"code":2769,"next":[{"messageText":"Overload 1 of 3, '(callbackfn: (previousValue: unknown, currentValue: unknown, currentIndex: number, array: unknown[]) => unknown, initialValue: unknown): unknown', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type '(total: number, count: number) => number' is not assignable to parameter of type '(previousValue: unknown, currentValue: unknown, currentIndex: number, array: unknown[]) => unknown'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'total' and 'previousValue' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322}]}]}]},{"messageText":"Overload 2 of 3, '(callbackfn: (previousValue: number, currentValue: unknown, currentIndex: number, array: unknown[]) => number, initialValue: number): number', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type '(total: number, count: number) => number' is not assignable to parameter of type '(previousValue: number, currentValue: unknown, currentIndex: number, array: unknown[]) => number'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'count' and 'currentValue' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322}]}]}]}]},"relatedInformation":[]},{"start":4702,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined'.","relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tag/src/tag.d.ts","start":414,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type '{ readonly type?: \"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined; readonly closable?: boolean | undefined; readonly disableTransitions?: boolean | undefined; ... 6 more ...; readonly onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & R...'","category":3,"code":6500}]},{"start":6901,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined'.","relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tag/src/tag.d.ts","start":414,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type '{ readonly type?: \"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined; readonly closable?: boolean | undefined; readonly disableTransitions?: boolean | undefined; ... 6 more ...; readonly onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & R...'","category":3,"code":6500}]}]],[2360,[{"start":7613,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined'.","relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tag/src/tag.d.ts","start":414,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type '{ readonly type?: \"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined; readonly closable?: boolean | undefined; readonly disableTransitions?: boolean | undefined; ... 6 more ...; readonly onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & R...'","category":3,"code":6500}]}]],[2385,[{"start":397,"length":10,"code":2322,"category":1,"messageText":{"messageText":"Type '(opts?: { silent?: boolean; }) => Promise' is not assignable to type '(name: TabPaneName) => any'.","category":1,"code":2322,"next":[{"messageText":"Types of parameters 'opts' and 'name' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'TabPaneName' is not assignable to type '{ silent?: boolean | undefined; } | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' has no properties in common with type '{ silent?: boolean | undefined; }'.","category":1,"code":2559}]}]}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/src/tabs.d.ts","start":7614,"length":11,"messageText":"The expected type comes from property 'onTabChange' which is declared here on type '__VLS_NormalizeComponentEvent; readonly closable: boolean; readonly tabindex: EpPropMergeType; ... 4 more ...; readonly addable: boolean; }>...'","category":3,"code":6500}]}]],[2388,[{"start":56480,"length":34,"messageText":"This comparison appears to be unintentional because the types '\"supplement\"' and '\"normal\"' have no overlap.","category":1,"code":2367},{"start":20344,"length":28,"messageText":"This comparison appears to be unintentional because the types '\"supplement\"' and '\"normal\"' have no overlap.","category":1,"code":2367}]],[2389,[{"start":742,"length":5,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'value' does not exist in type 'TreeOptionProps'.","relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","start":25072,"length":5,"messageText":"The expected type comes from property 'props' which is declared here on type 'Partial<{ lazy: boolean; offset: number; teleported: EpPropMergeType; props: TreeOptionProps; effect: EpPropMergeType<...>; ... 48 more ...; cacheData: unknown[]; }> & Omit<...> & Record<...>'","category":3,"code":6500}]}]],[2394,[{"start":1732,"length":5,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'value' does not exist in type 'TreeOptionProps'.","relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","start":25072,"length":5,"messageText":"The expected type comes from property 'props' which is declared here on type 'Partial<{ lazy: boolean; offset: number; teleported: EpPropMergeType; props: TreeOptionProps; effect: EpPropMergeType<...>; ... 48 more ...; cacheData: unknown[]; }> & Omit<...> & Record<...>'","category":3,"code":6500}]}]],[2435,[{"start":5402,"length":4,"code":2322,"category":1,"messageText":{"messageText":"Type 'unknown[]' is not assignable to type 'TreeNodeData[]'.","category":1,"code":2322,"next":[{"messageText":"Type 'unknown' is not assignable to type 'TreeNodeData'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","start":27789,"length":4,"messageText":"The expected type comes from property 'data' which is declared here on type 'Partial<{ lazy: boolean; offset: number; teleported: EpPropMergeType; props: TreeOptionProps; effect: EpPropMergeType<...>; ... 48 more ...; cacheData: unknown[]; }> & Omit<...> & Record<...>'","category":3,"code":6500}]}]],[2438,[{"start":31652,"length":6,"code":2349,"category":1,"messageText":{"messageText":"This expression is not callable.","category":1,"code":2349,"next":[{"messageText":"Type 'String' has no call signatures.","category":1,"code":2757}]},"relatedInformation":[{"start":31652,"length":6,"messageText":"Are you missing a semicolon?","category":1,"code":2734}]},{"start":32437,"length":2,"code":2349,"category":1,"messageText":{"messageText":"This expression is not callable.","category":1,"code":2349,"next":[{"messageText":"Type 'String' has no call signatures.","category":1,"code":2757}]},"relatedInformation":[{"start":32437,"length":2,"messageText":"Are you missing a semicolon?","category":1,"code":2734}]}]],[2440,[{"start":14749,"length":34,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type 'number'."}]],[2453,[{"start":24819,"length":1,"messageText":"Parameter 'd' implicitly has an 'any' type.","category":1,"code":7006}]]],"changeFileSet":[2372,2380,2381],"affectedFilesPendingEmit":[1577,1595,1585,1586,1596,1597,1435,1598,1579,1587,1427,1425,1431,1453,1588,1548,1467,1589,1434,1599,1600,1461,1601,1602,1603,1590,1591,1592,1593,1604,1605,1606,1607,146,1608,1609,1594,1433,1610,127,1581,2075,2076,2098,1580,2099,2100,2101,2102,2190,2191,2192,2193,2195,2196,2194,2197,2199,2200,2198,2203,2201,2204,2202,2206,2185,2186,2188,2189,2187,1468,2207,2208,2209,2184,2074,1544,1455,2224,124,134,107,128,125,126,2225,2205,1415,143,1436,139,2227,2228,1583,2237,2238,2241,2243,2245,2246,1416,140,141,142,1403,144,145,1402,1404,137,138,1410,1405,1407,1408,1409,1411,1584,1582,2244,2247,1571,1570,2242,1578,130,136,133,132,1446,131,2077,2078,2248,1469,1566,2249,1401,2250,1457,2082,1454,1437,1574,1572,1576,135,2079,1406,129,1575,1419,1420,1418,1417,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2267,2265,2264,2263,2266,2262,2269,2268,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2286,1464,1465,2283,2284,2285,2287,2288,2296,2292,2297,2290,1429,2298,2291,2293,2294,2300,2301,2302,2299,2304,2305,2306,2303,2308,2309,2310,2307,1428,2312,2313,2314,2311,2316,2317,2318,2315,2320,2321,2322,2319,2324,2325,2326,2323,2328,2329,2330,2327,2332,2333,2331,2335,2336,2337,2334,2339,2340,2341,2338,2343,2344,2345,2342,2346,2289,1430,2348,2347,2349,2295,2351,2354,2352,2353,2350,2355,2356,1426,2357,2358,1414,1413,1412,2359,1432,2360,2361,2362,2370,2371,2363,2368,2365,2364,2366,2367,2369,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,1462,2393,2394,2395,2396,2397,2398,2399,2400,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2432,2431,2434,2429,2430,2433,2437,2435,2436,2438,1549,1460,1459,1564,2440,1456,1448,1447,1445,2441,2442,1458,1568,1567,1466,1451,1450,2443,1463,1546,1545,2439,1565,1569,2444,2445,2446,2447,2448,2449,2450,2451,2452,1421,2453,2646],"emitSignatures":[107,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1445,1446,1447,1448,1450,1451,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1544,1545,1546,1548,1549,1564,1565,1566,1567,1568,1569,1570,1571,1572,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,2074,2075,2076,2077,2078,2079,2082,2098,2099,2100,2101,2102,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2224,2225,2227,2228,2237,2238,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2646],"version":"5.7.3"} \ No newline at end of file +{"fileNames":["./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es5.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.full.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/types/hmrpayload.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/types/customevent.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/types/hot.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/types/importglob.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/types/importmeta.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/client.d.ts","./global.d.ts","./node_modules/.pnpm/@vue+shared@3.5.33/node_modules/@vue/shared/dist/shared.d.ts","./node_modules/.pnpm/@babel+types@7.29.0/node_modules/@babel/types/lib/index.d.ts","./node_modules/.pnpm/@babel+parser@7.29.3/node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/.pnpm/@vue+compiler-core@3.5.33/node_modules/@vue/compiler-core/dist/compiler-core.d.ts","./node_modules/.pnpm/@vue+compiler-dom@3.5.33/node_modules/@vue/compiler-dom/dist/compiler-dom.d.ts","./node_modules/.pnpm/@vue+reactivity@3.5.33/node_modules/@vue/reactivity/dist/reactivity.d.ts","./node_modules/.pnpm/@vue+runtime-core@3.5.33/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","./node_modules/.pnpm/csstype@3.2.3/node_modules/csstype/index.d.ts","./node_modules/.pnpm/@vue+runtime-dom@3.5.33/node_modules/@vue/runtime-dom/dist/runtime-dom.d.ts","./node_modules/.pnpm/vue@3.5.33_typescript@5.7.3/node_modules/vue/dist/vue.d.mts","./node_modules/.pnpm/vue@3.5.33_typescript@5.7.3/node_modules/vue/jsx-runtime/index.d.ts","./node_modules/.vue-global-types/vue_3.5_0_0_0.d.ts","./node_modules/.pnpm/vue-router@4.6.4_vue@3.5.33_typescript@5.7.3_/node_modules/vue-router/dist/router-cwonjprp.d.mts","./node_modules/.pnpm/vue-router@4.6.4_vue@3.5.33_typescript@5.7.3_/node_modules/vue-router/dist/vue-router.d.mts","./node_modules/.pnpm/@vueuse+shared@12.7.0_typescript@5.7.3/node_modules/@vueuse/shared/index.d.mts","./node_modules/.pnpm/@vueuse+core@12.7.0_typescript@5.7.3/node_modules/@vueuse/core/index.d.mts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/zh-cn.d.ts","./src/enums/appenums.ts","./node_modules/.pnpm/vue-demi@0.14.10_vue@3.5.33_typescript@5.7.3_/node_modules/vue-demi/lib/index.d.ts","./node_modules/.pnpm/pinia@2.3.1_typescript@5.7.3_vue@3.5.33_typescript@5.7.3_/node_modules/pinia/dist/pinia.d.ts","./node_modules/.pnpm/axios@1.16.0/node_modules/axios/index.d.ts","./node_modules/@types/lodash/common/common.d.ts","./node_modules/@types/lodash/common/array.d.ts","./node_modules/@types/lodash/common/collection.d.ts","./node_modules/@types/lodash/common/date.d.ts","./node_modules/@types/lodash/common/function.d.ts","./node_modules/@types/lodash/common/lang.d.ts","./node_modules/@types/lodash/common/math.d.ts","./node_modules/@types/lodash/common/number.d.ts","./node_modules/@types/lodash/common/object.d.ts","./node_modules/@types/lodash/common/seq.d.ts","./node_modules/@types/lodash/common/string.d.ts","./node_modules/@types/lodash/common/util.d.ts","./node_modules/@types/lodash/index.d.ts","./src/config/index.ts","./src/enums/pageenum.ts","./src/enums/requestenums.ts","./src/api/user.ts","./src/enums/cacheenums.ts","./src/utils/validate.ts","./src/stores/modules/multipletabs.ts","./src/utils/cache.ts","./src/utils/auth.ts","./src/stores/modules/user.ts","./src/config/setting.ts","./src/utils/theme.ts","./src/stores/modules/setting.ts","./src/layout/default/components/setting/drawer.vue","./src/layout/default/components/setting/index.vue","./src/hooks/usewatchroute.ts","./src/layout/default/components/header/breadcrumb.vue","./src/layout/default/components/header/fold.vue","./src/layout/default/components/header/full-screen.vue","./src/hooks/usemultipletabs.ts","./src/layout/default/components/header/multiple-tabs.vue","./src/layout/default/components/header/refresh.vue","./src/api/setting/system.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/constants/aria.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/constants/date.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/constants/event.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/constants/key.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/constants/size.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/constants/column-alignment.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/constants/form.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/typescript.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/props/util.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/props/runtime.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/props/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/dom/aria.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/dom/event.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/dom/position.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/dom/scroll.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/dom/style.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/dom/element.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/dom/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/global-node.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/add-location.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/aim.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/alarm-clock.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/apple.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/arrow-down-bold.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/arrow-down.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/arrow-left-bold.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/arrow-left.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/arrow-right-bold.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/arrow-right.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/arrow-up-bold.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/arrow-up.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/avatar.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/back.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/baseball.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/basketball.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/bell-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/bell.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/bicycle.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/bottom-left.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/bottom-right.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/bottom.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/bowl.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/box.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/briefcase.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/brush-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/brush.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/burger.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/calendar.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/camera-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/camera.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/caret-bottom.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/caret-left.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/caret-right.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/caret-top.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/cellphone.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/chat-dot-round.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/chat-dot-square.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/chat-line-round.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/chat-line-square.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/chat-round.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/chat-square.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/check.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/checked.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/cherry.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/chicken.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/chrome-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/circle-check-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/circle-check.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/circle-close-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/circle-close.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/circle-plus-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/circle-plus.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/clock.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/close-bold.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/close.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/cloudy.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/coffee-cup.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/coffee.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/coin.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/cold-drink.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/collection-tag.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/collection.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/comment.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/compass.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/connection.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/coordinate.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/copy-document.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/cpu.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/credit-card.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/crop.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/d-arrow-left.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/d-arrow-right.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/d-caret.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/data-analysis.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/data-board.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/data-line.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/delete-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/delete-location.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/delete.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/dessert.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/discount.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/dish-dot.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/dish.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/document-add.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/document-checked.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/document-copy.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/document-delete.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/document-remove.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/document.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/download.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/drizzling.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/edit-pen.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/edit.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/eleme-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/eleme.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/element-plus.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/expand.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/failed.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/female.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/files.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/film.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/filter.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/finished.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/first-aid-kit.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/flag.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/fold.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/folder-add.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/folder-checked.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/folder-delete.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/folder-opened.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/folder-remove.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/folder.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/food.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/football.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/fork-spoon.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/fries.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/full-screen.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/goblet-full.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/goblet-square-full.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/goblet-square.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/goblet.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/gold-medal.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/goods-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/goods.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/grape.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/grid.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/guide.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/handbag.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/headset.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/help-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/help.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/hide.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/histogram.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/home-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/hot-water.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/house.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/ice-cream-round.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/ice-cream-square.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/ice-cream.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/ice-drink.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/ice-tea.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/info-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/iphone.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/key.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/knife-fork.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/lightning.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/link.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/list.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/loading.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/location-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/location-information.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/location.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/lock.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/lollipop.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/magic-stick.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/magnet.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/male.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/management.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/map-location.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/medal.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/memo.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/menu.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/message-box.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/message.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/mic.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/microphone.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/milk-tea.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/minus.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/money.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/monitor.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/moon-night.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/moon.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/more-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/more.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/mostly-cloudy.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/mouse.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/mug.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/mute-notification.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/mute.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/no-smoking.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/notebook.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/notification.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/odometer.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/office-building.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/open.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/operation.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/opportunity.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/orange.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/paperclip.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/partly-cloudy.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/pear.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/phone-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/phone.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/picture-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/picture-rounded.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/picture.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/pie-chart.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/place.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/platform.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/plus.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/pointer.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/position.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/postcard.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/pouring.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/present.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/price-tag.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/printer.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/promotion.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/quartz-watch.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/question-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/rank.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/reading-lamp.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/reading.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/refresh-left.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/refresh-right.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/refresh.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/refrigerator.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/remove-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/remove.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/right.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/scale-to-original.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/school.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/scissor.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/search.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/select.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sell.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/semi-select.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/service.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/set-up.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/setting.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/share.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/ship.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/shop.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/shopping-bag.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/shopping-cart-full.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/shopping-cart.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/shopping-trolley.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/smoking.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/soccer.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sold-out.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sort-down.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sort-up.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sort.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/stamp.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/star-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/star.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/stopwatch.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/success-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sugar.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/suitcase-line.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/suitcase.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sunny.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sunrise.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/sunset.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/switch-button.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/switch-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/switch.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/takeaway-box.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/ticket.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/tickets.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/timer.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/toilet-paper.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/tools.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/top-left.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/top-right.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/top.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/trend-charts.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/trophy-base.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/trophy.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/turn-off.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/umbrella.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/unlock.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/upload-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/upload.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/user-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/user.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/van.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/video-camera-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/video-camera.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/video-pause.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/video-play.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/view.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/wallet-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/wallet.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/warn-triangle-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/warning-filled.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/warning.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/watch.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/watermelon.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/wind-power.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/zoom-in.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/zoom-out.vue.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/components/index.d.ts","./node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.33_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/types/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/icon.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/typescript.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/install.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/refs.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/size.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/validator.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/vnode.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/props/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/vue/index.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/index.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/add.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/after.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/ary.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/assign.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/assignin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/assigninwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/assignwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/at.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/attempt.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/before.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/bind.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/bindall.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/bindkey.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/camelcase.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/capitalize.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/castarray.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/ceil.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/chain.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/chunk.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/clamp.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/clone.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/clonedeep.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/clonedeepwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/clonewith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/compact.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/concat.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/cond.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/conforms.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/conformsto.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/constant.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/countby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/create.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/curry.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/curryright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/debounce.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/deburr.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/defaults.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/defaultsdeep.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/defaultto.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/defer.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/delay.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/difference.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/differenceby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/differencewith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/divide.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/drop.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/dropright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/droprightwhile.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/dropwhile.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/each.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/eachright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/endswith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/entries.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/entriesin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/eq.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/escape.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/escaperegexp.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/every.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/extend.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/extendwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/fill.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/filter.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/find.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/findindex.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/findkey.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/findlast.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/findlastindex.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/findlastkey.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/first.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flatmap.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flatmapdeep.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flatmapdepth.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flatten.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flattendeep.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flattendepth.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flip.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/floor.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flow.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/flowright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/foreach.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/foreachright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/forin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/forinright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/forown.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/forownright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/frompairs.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/functions.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/functionsin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/get.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/groupby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/gt.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/gte.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/has.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/hasin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/head.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/identity.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/includes.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/indexof.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/initial.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/inrange.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/intersection.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/intersectionby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/intersectionwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/invert.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/invertby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/invoke.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/invokemap.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isarguments.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isarray.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isarraybuffer.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isarraylike.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isarraylikeobject.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isboolean.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isbuffer.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isdate.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/iselement.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isempty.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isequal.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isequalwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/iserror.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isfinite.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isfunction.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isinteger.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/islength.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/ismap.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/ismatch.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/ismatchwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isnan.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isnative.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isnil.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isnull.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isnumber.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isobject.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isobjectlike.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isplainobject.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isregexp.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/issafeinteger.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isset.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isstring.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/issymbol.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/istypedarray.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isundefined.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isweakmap.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/isweakset.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/iteratee.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/join.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/kebabcase.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/keyby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/keys.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/keysin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/last.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/lastindexof.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/lowercase.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/lowerfirst.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/lt.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/lte.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/map.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/mapkeys.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/mapvalues.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/matches.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/matchesproperty.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/max.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/maxby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/mean.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/meanby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/memoize.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/merge.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/mergewith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/method.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/methodof.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/min.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/minby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/mixin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/multiply.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/negate.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/noop.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/now.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/nth.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/ntharg.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/omit.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/omitby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/once.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/orderby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/over.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/overargs.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/overevery.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/oversome.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/pad.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/padend.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/padstart.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/parseint.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/partial.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/partialright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/partition.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/pick.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/pickby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/property.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/propertyof.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/pull.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/pullall.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/pullallby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/pullallwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/pullat.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/random.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/range.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/rangeright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/rearg.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/reduce.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/reduceright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/reject.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/remove.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/repeat.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/replace.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/rest.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/result.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/reverse.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/round.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sample.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/samplesize.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/set.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/setwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/shuffle.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/size.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/slice.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/snakecase.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/some.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sortby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sortedindex.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sortedindexby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sortedindexof.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sortedlastindex.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sortedlastindexby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sortedlastindexof.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sorteduniq.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sorteduniqby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/split.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/spread.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/startcase.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/startswith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/stubarray.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/stubfalse.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/stubobject.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/stubstring.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/stubtrue.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/subtract.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sum.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/sumby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tail.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/take.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/takeright.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/takerightwhile.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/takewhile.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tap.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/template.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/templatesettings.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/throttle.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/thru.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/times.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/toarray.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tofinite.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tointeger.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tolength.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tolower.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tonumber.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/topairs.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/topairsin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/topath.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/toplainobject.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tosafeinteger.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/tostring.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/toupper.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/transform.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/trim.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/trimend.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/trimstart.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/truncate.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/unary.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/unescape.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/union.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/unionby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/unionwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/uniq.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/uniqby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/uniqueid.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/uniqwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/unset.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/unzip.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/unzipwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/update.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/updatewith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/uppercase.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/upperfirst.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/values.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/valuesin.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/without.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/words.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/wrap.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/xor.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/xorby.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/xorwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/zip.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/zipobject.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/zipobjectdeep.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/zipwith.d.ts","./node_modules/.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es/index.d.ts","./node_modules/.pnpm/lodash-unified@1.0.3_@types_168785b94d783e1b7a7274df40d5f9d9/node_modules/lodash-unified/type.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/arrays.d.ts","./node_modules/.pnpm/@vueuse+shared@12.0.0_typescript@5.7.3/node_modules/@vueuse/shared/index.d.mts","./node_modules/.pnpm/@vueuse+core@12.0.0_typescript@5.7.3/node_modules/@vueuse/core/index.d.mts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/browser.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/error.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/functions.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/i18n.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/objects.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/raf.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/rand.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/strings.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/throttlebyraf.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/easings.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/numbers.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/utils/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/affix/src/affix.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/affix/src/affix.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/affix/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/alert/src/alert.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/alert/src/alert.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/alert/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/alert/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/anchor/src/anchor.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/anchor/src/anchor.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/anchor/src/anchor-link.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/anchor/src/anchor-link.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/anchor/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input/src/input.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input/src/input.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input/index.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/enums.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/popperoffsets.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/flip.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/hide.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/offset.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/eventlisteners.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/computestyles.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/arrow.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/preventoverflow.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/applystyles.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/types.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/modifiers/index.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/utils/detectoverflow.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/createpopper.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/popper-lite.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/popper.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/lib/index.d.ts","./node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/popper.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/popper.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/arrow.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/trigger.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/trigger.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/avatar/src/avatar.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/avatar/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/arrow.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/content.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/src/content.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popper/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/avatar/src/avatar-group-props.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/avatar/src/avatar.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/avatar/src/avatar-group.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/avatar/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/avatar/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/backtop/src/backtop.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/backtop/src/backtop.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/backtop/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/backtop/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/badge/src/badge.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/badge/src/badge.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/badge/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/badge/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/breadcrumb/src/breadcrumb.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/breadcrumb/src/breadcrumb-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/breadcrumb/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/breadcrumb/src/breadcrumb.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/breadcrumb/src/breadcrumb-item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/breadcrumb/src/instances.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/breadcrumb/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/button/src/button.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/button/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/button/src/button.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/button/src/button-group.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/button/src/button-group.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/button/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/button/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/calendar/src/calendar.d.ts","./node_modules/.pnpm/dayjs@1.11.20/node_modules/dayjs/locale/types.d.ts","./node_modules/.pnpm/dayjs@1.11.20/node_modules/dayjs/locale/index.d.ts","./node_modules/.pnpm/dayjs@1.11.20/node_modules/dayjs/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/calendar/src/calendar.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/calendar/src/date-table.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/calendar/src/date-table.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/calendar/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/calendar/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/card/src/card.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/card/src/card.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/card/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/card/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/carousel/src/carousel.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/carousel/src/carousel-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/carousel/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/carousel/src/carousel.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/carousel/src/carousel-item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/carousel/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/carousel/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader-panel/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader-panel/src/node.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader-panel/src/menu.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader-panel/src/config.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader-panel/src/index.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader-panel/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader-panel/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-attrs/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-calc-input-width/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-deprecated/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-draggable/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-focus/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/en.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/af.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ar-eg.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ar.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/az.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/bg.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/bn.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ca.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ckb.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/cs.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/da.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/de.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/el.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/eo.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/es.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/et.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/eu.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/fa.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/fi.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/fr.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/he.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/hi.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/hr.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/hu.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/hy-am.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/id.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/it.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ja.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/kk.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/km.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ko.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ku.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ky.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/lo.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/lt.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/lv.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/mg.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/mn.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ms.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/my.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/nb-no.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/nl.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/no.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/pa.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/pl.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/pt-br.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/pt.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ro.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ru.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/sk.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/sl.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/sr.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/sv.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/sw.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ta.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/te.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/th.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/tk.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/tr.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/ug-cn.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/uk.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/uz-uz.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/vi.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/zh-tw.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/zh-hk.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/lang/zh-mo.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/locale/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-locale/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-namespace/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-lockscreen/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-modal/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-model-toggle/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-prevent-global/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-prop/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-popper/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-same-target/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-teleport/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-throttle-render/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-timeout/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-transition-fallthrough/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-id/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-escape-keydown/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-popper-container/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-intermediate-render/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-delayed-toggle/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-forward-ref/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-z-index/index.d.ts","./node_modules/.pnpm/@floating-ui+utils@0.2.11/node_modules/@floating-ui/utils/dist/floating-ui.utils.d.mts","./node_modules/.pnpm/@floating-ui+core@1.7.5/node_modules/@floating-ui/core/dist/floating-ui.core.d.mts","./node_modules/.pnpm/@floating-ui+utils@0.2.11/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.d.mts","./node_modules/.pnpm/@floating-ui+dom@1.7.6/node_modules/@floating-ui/dom/dist/floating-ui.dom.d.mts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-floating/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-cursor/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-ordered-children/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-size/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-focus-controller/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-composition/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-empty-values/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/use-aria/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/hooks/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tag/src/tag.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tag/src/tag.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tag/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader/src/cascader.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader/src/cascader.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader/src/instances.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/check-tag/src/check-tag.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/check-tag/src/check-tag.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/check-tag/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/checkbox/src/checkbox.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/checkbox/src/checkbox.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/checkbox/src/checkbox-group.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/checkbox/src/checkbox-group.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/checkbox/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/checkbox/src/checkbox-button.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/checkbox/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/col/src/col.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/col/src/col.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/col/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse/src/collapse.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse/src/collapse-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse/src/collapse.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse/src/collapse-item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse-transition/src/collapse-transition.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/collapse-transition/index.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/interfaces.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/index.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/css-color-names.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/readability.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/to-ms-filter.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/from-ratio.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/format-input.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/random.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/conversion.d.ts","./node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/public_api.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/color-picker-panel/src/utils/color.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/color-picker-panel/src/color-picker-panel.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/color-picker-panel/src/color-picker-panel.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/color-picker-panel/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tooltip/src/trigger.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tooltip/src/content.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tooltip/src/content.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tooltip/src/tooltip.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tooltip/src/tooltip.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tooltip/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tooltip/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/color-picker/src/color-picker.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/color-picker/src/color-picker.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/color-picker/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dialog/src/dialog-content.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dialog/src/dialog.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dialog/src/dialog.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dialog/src/use-dialog.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dialog/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dialog/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/message/src/message.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/message/src/message.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/message/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/link/src/link.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/link/src/link.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/link/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/store/tree.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/store/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/table-header/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/table-layout.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/table/defaults.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/util.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/table-column/defaults.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/scrollbar/src/scrollbar.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/scrollbar/src/scrollbar.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/scrollbar/src/thumb.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/scrollbar/src/thumb.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/scrollbar/src/util.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/scrollbar/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/scrollbar/index.d.ts","./node_modules/.pnpm/normalize-wheel-es@1.2.0/node_modules/normalize-wheel-es/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/directives/mousewheel/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/table-body/defaults.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/table-footer/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/h-helper.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/table.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/table-column/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/src/tablecolumn.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/config-provider/src/config-provider-props.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/config-provider/src/config-provider.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/config-provider/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/config-provider/src/hooks/use-global-config.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/config-provider/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/container/src/container.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/container/src/aside.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/container/src/footer.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/container/src/header.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/container/src/main.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/container/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/countdown/src/countdown.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/countdown/src/countdown.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/countdown/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-picker/src/common/props.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-picker/src/common/picker.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-picker/src/time-picker-com/panel-time-pick.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-picker/src/utils.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-picker/src/composables/use-common-picker.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-picker/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-picker/src/time-picker.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-picker/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker-panel/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker-panel/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker-panel/src/props/date-picker-panel.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker-panel/src/date-picker-panel.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker-panel/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker-panel/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker/src/props.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker/src/date-picker.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/date-picker/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/descriptions/src/description.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/descriptions/src/description.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/descriptions/src/description-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/descriptions/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/divider/src/divider.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/divider/src/divider.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/divider/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/drawer/src/drawer.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/drawer/src/drawer.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/drawer/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/icon/src/icon.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/icon/src/icon.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/icon/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dropdown/src/dropdown.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dropdown/src/dropdown.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dropdown/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dropdown/src/tokens.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dropdown/src/dropdown-item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dropdown/src/dropdown-menu.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/dropdown/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/empty/src/empty.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/empty/src/empty.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/empty/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/empty/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/utils.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/form.d.ts","./node_modules/.pnpm/async-validator@4.2.5/node_modules/async-validator/dist-types/interface.d.ts","./node_modules/.pnpm/async-validator@4.2.5/node_modules/async-validator/dist-types/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/form-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/hooks/use-form-common-props.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/hooks/use-form-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/form.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/form-item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/src/hooks/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/form/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/image-viewer/src/image-viewer.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/image-viewer/src/image-viewer.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/image-viewer/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/image/src/image.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/image/src/image.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/image/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-number/src/input-number.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-number/src/input-number.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-number/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-tag/src/input-tag.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-tag/src/input-tag.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-tag/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-tag/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/menu.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/menu-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/menu-item-group.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/sub-menu.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/menu-item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/menu-item-group.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/src/tokens.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/menu/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/overlay/src/overlay.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/overlay/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/page-header/src/page-header.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/page-header/src/page-header.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/page-header/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/pagination/src/pagination.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/pagination/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/pagination/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popconfirm/src/popconfirm.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popconfirm/src/popconfirm.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popconfirm/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/progress/src/progress.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/progress/src/progress.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/progress/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/radio/src/radio.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/radio/src/radio.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/radio/src/radio-button.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/radio/src/radio-button.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/radio/src/radio-group.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/radio/src/radio-group.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/radio/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/radio/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/rate/src/rate.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/rate/src/rate.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/rate/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/result/src/result.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/result/src/result.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/result/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/row/src/row.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/row/src/row.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/row/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/row/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/defaults.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/components/fixed-size-list.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/components/dynamic-size-list.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/components/fixed-size-grid.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/props.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/hooks/use-cache.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/builders/build-grid.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/src/components/dynamic-size-grid.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select-v2/src/select.types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/virtual-list/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select-v2/src/select-dropdown.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select-v2/src/token.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select-v2/src/useprops.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select-v2/src/select.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select-v2/src/defaults.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select/src/option.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select/src/type.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select/src/select.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select/src/select.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select/src/token.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select/src/option.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select/src/option-group.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/select-v2/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/skeleton/src/skeleton.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/skeleton/src/skeleton.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/skeleton/src/skeleton-item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/skeleton/src/skeleton-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/skeleton/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/slider/src/slider.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/slider/src/marker.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/slider/src/slider.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/slider/src/composables/use-marks.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/slider/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/slider/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/space/src/space.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/space/src/item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/space/src/use-space.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/space/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/statistic/src/statistic.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/statistic/src/statistic.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/statistic/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/steps/src/steps.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/steps/src/steps.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/steps/src/item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/steps/src/item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/steps/src/tokens.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/steps/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/switch/src/switch.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/switch/src/switch.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/switch/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/common.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/row.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/grid.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/table.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/table-grid.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/composables/use-scrollbar.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/header-row.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/header-row.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/row.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/cell.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/cell.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/header-cell.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/header-cell.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/header.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/composables/use-columns.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/header.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/sort-icon.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/expand-icon.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/table-v2.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/auto-resizer.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/private.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/composables/use-row.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/composables/use-data.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/composables/use-styles.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/composables/use-auto-resize.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/composables/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/use-table.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/renderers/header-cell.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/src/components/auto-resizer.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/table-v2/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/src/tab-pane.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/src/tab-pane.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/src/tab-bar.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/src/tab-bar.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/src/tab-nav.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/src/tabs.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/text/src/text.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/text/src/text.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/text/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-select/src/time-select.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-select/src/time-select.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/time-select/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/timeline/src/timeline.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/timeline/src/timeline-item.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/timeline/src/timeline-item.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/timeline/src/tokens.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/timeline/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/transfer/src/transfer-panel.vue.d.ts","./node_modules/.pnpm/vue-component-type-helpers@3.2.8/node_modules/vue-component-type-helpers/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/transfer/src/transfer-panel.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/transfer/src/transfer.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/transfer/src/transfer.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/transfer/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/src/model/usedragnode.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/src/tree.type.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/src/model/tree-store.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/src/model/node.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/src/tree.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/src/tree.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/src/tokens.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-select/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-select/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-v2/src/virtual-tree.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-v2/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-v2/src/tree.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-v2/src/instance.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-v2/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/ajax.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/upload.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/upload.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/upload-content.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/upload-content.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/upload-list.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/upload-list.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/upload-dragger.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/upload-dragger.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/src/constants.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/upload/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/watermark/src/watermark.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/watermark/src/watermark.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/watermark/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tour/src/content.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tour/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tour/src/tour.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tour/src/tour.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tour/src/step.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tour/src/step.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tour/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/segmented/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/segmented/src/segmented.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/segmented/src/segmented.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/segmented/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/mention/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/mention/src/helper.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/mention/src/mention.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/mention/src/mention.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/mention/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/splitter/src/type.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/splitter/src/splitter.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/splitter/src/splitter.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/splitter/src/split-panel.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/splitter/src/split-panel.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/splitter/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/infinite-scroll/src/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/infinite-scroll/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/loading/src/types.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/loading/src/loading.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/loading/src/service.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/loading/src/directive.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/loading/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/message-box/src/message-box.type.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/message-box/src/messagebox.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/message-box/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/notification/src/notification.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/notification/src/notification.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/notification/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popover/src/popover.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popover/src/popover.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popover/src/directive.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/popover/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/autocomplete/src/autocomplete.vue.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/autocomplete/src/autocomplete.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/autocomplete/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/defaults.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/directives/click-outside/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/directives/repeat-click/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/directives/trap-focus/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/directives/index.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/make-installer.d.ts","./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/index.d.ts","./src/utils/feedback.ts","./src/layout/default/components/header/user-drop-down.vue","./src/layout/default/components/header/index.vue","./src/layout/default/components/main.vue","./src/layout/default/components/sidebar/logo.vue","./src/utils/util.ts","./src/layout/default/components/sidebar/menu-item.vue","./src/layout/default/components/sidebar/menu.vue","./src/layout/default/components/sidebar/side.vue","./src/layout/default/components/sidebar/index.vue","./src/layout/default/index.vue","./src/views/error/components/error.vue","./src/views/error/404.vue","./src/views/error/403.vue","./src/hooks/uselockfn.ts","./src/layout/components/footer.vue","./src/views/account/login.vue","./src/views/account/change-password.vue","./src/utils/wecomoauthpostmessage.ts","./src/views/account/bind-work-wechat.vue","./src/views/user/setting.vue","./node_modules/dayjs/locale/types.d.ts","./node_modules/dayjs/locale/index.d.ts","./node_modules/dayjs/index.d.ts","./src/api/doctor.ts","./src/views/doctor/progress.vue","./src/api/decoration.ts","./src/views/decoration/component/widgets/index.ts","./src/views/decoration/component/pages/preview-pc.vue","./src/views/decoration/pc_details.vue","./src/api/fans.ts","./src/views/fans/h5.vue","./src/api/tcm.ts","./src/api/order.ts","./src/api/channel/weapp.ts","./src/hooks/usepaging.ts","./src/utils/perm.ts","./node_modules/.pnpm/vue-demi@0.13.11_vue@3.5.33_typescript@5.7.3_/node_modules/vue-demi/lib/index.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/types/dist/shared.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/types/dist/core.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/core.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/types/dist/echarts.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/index.d.ts","./node_modules/.pnpm/vue-echarts@6.7.3_@vue+runt_9e349b8fe817591c55152dc2c2ed6abf/node_modules/vue-echarts/dist/index.d.ts","./src/views/tcm/diagnosis/components/diagnosistodolist.vue","./src/utils/blood-thresholds.ts","./src/views/tcm/diagnosis/components/dailymatrix.vue","./src/views/tcm/diagnosis/components/caserecordlist.vue","./node_modules/.pnpm/hls.js@1.6.17/node_modules/hls.js/dist/hls.d.mts","./src/views/tcm/diagnosis/components/recordingvideoplayer.vue","./src/views/tcm/diagnosis/components/recordingplaybackblock.vue","./node_modules/.pnpm/cos-js-sdk-v5@1.10.1/node_modules/cos-js-sdk-v5/index.d.ts","./src/api/file.ts","./src/utils/oss-direct-upload.ts","./src/components/upload/index.vue","./src/views/tcm/diagnosis/components/callrecordpanel.vue","./src/utils/im-business-message-parse.ts","./src/views/tcm/diagnosis/components/imchatrecordpanel.vue","./src/views/tcm/diagnosis/components/assignlogpanel.vue","./src/views/tcm/diagnosis/components/appointmentrecordpanel.vue","./src/api/patient.ts","./src/views/patient/reception/components/notetimeline.vue","./src/views/tcm/diagnosis/components/trackingnotetimeline.vue","./src/views/consumer/prescription/components/prescription-order-utils.ts","./src/views/consumer/prescription/components/prescriptionorderdetaildrawer.vue","./src/views/tcm/diagnosis/components/patientorderlist.vue","./src/api/medicine.ts","./src/components/medicine-name-select/index.vue","./src/utils/diabetes-discovery-display.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/core/logger.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/core/cache-storage.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/core/context.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/layout/bounds.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/dom/document-cloner.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/syntax/tokenizer.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/syntax/parser.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/types/index.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/ipropertydescriptor.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/background-clip.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/itypedescriptor.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/types/color.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/types/length-percentage.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/types/image.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/background-image.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/background-origin.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/background-position.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/background-repeat.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/background-size.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/border-radius.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/border-style.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/border-width.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/direction.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/display.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/float.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/letter-spacing.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/line-break.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/list-style-image.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/list-style-position.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/list-style-type.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/overflow.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/overflow-wrap.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/text-align.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/position.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/types/length.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/text-shadow.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/text-transform.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/transform.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/transform-origin.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/visibility.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/word-break.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/z-index.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/opacity.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/text-decoration-line.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/font-family.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/font-weight.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/font-variant.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/font-style.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/content.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/counter-increment.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/counter-reset.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/duration.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/quotes.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/box-shadow.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/paint-order.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/property-descriptors/webkit-text-stroke-width.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/index.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/css/layout/text.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/dom/text-container.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/dom/element-container.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/render/vector.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/render/bezier-curve.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/render/path.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/render/bound-curves.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/render/effects.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/render/stacking-context.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/dom/replaced-elements/canvas-element-container.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/dom/replaced-elements/image-element-container.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/dom/replaced-elements/svg-element-container.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/dom/replaced-elements/index.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/render/renderer.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/render/canvas/canvas-renderer.d.ts","./node_modules/.pnpm/html2canvas@1.4.1/node_modules/html2canvas/dist/types/index.d.ts","./node_modules/.pnpm/jspdf@2.5.2/node_modules/jspdf/types/index.d.ts","./src/components/tcm-prescription/index.vue","./src/views/tcm/diagnosis/edit.vue","./src/views/tcm/diagnosis/detail.vue","./node_modules/dayjs/plugin/isoweek.d.ts","./src/api/first_visit.ts","./src/views/tcm/diagnosis/appointment.vue","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/cdn-streaming/cdn-streaming.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/device-detector/device-detector.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/video-effect/virtual-background/virtual-background.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/video-effect/watermark/watermark.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/video-effect/beauty/beauty.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/video-effect/basic-beauty/basic-beauty.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/cross-room/cross-room.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/custom-encryption/custom-encryption.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/video-effect/video-mixer/video-mixer.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/small-stream-auto-switcher/small-stream-auto-switcher.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/chorus/chorus.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/lebplayer/lebplayer.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/plugins/realtime-transcriber/realtime-transcriber.esm.d.ts","./node_modules/.pnpm/trtc-sdk-v5@5.17.1/node_modules/trtc-sdk-v5/index.d.ts","./src/views/tcm/diagnosis/components/assistantwatchcalldialog.vue","./src/views/tcm/diagnosis/index_h5.vue","./src/utils/diag-display.ts","./src/views/tcm/diagnosis/components/patientinfocard.vue","./src/views/tcm/diagnosis/components/patientcasecard.vue","./src/views/tcm/diagnosis/readonly.vue","./src/router/routes.ts","./src/router/index.ts","./src/utils/request/cancel.ts","./src/utils/request/type.d.ts","./src/utils/request/axios.ts","./src/utils/wecombindguard.ts","./src/utils/request/index.ts","./src/api/app.ts","./src/stores/modules/app.ts","./src/api/chat.ts","./src/components/chat-notify-toast/index.vue","./src/app.vue","./src/permission.ts","./src/install/index.ts","./src/main.ts","./src/api/article.ts","./src/api/asset.ts","./src/api/consumer.ts","./src/api/finance.ts","./src/api/message.ts","./src/api/pharmacy.ts","./src/api/qywx-msg.ts","./src/api/qywx.ts","./src/api/self_input_stats.ts","./src/api/stats.ts","./src/api/app/recharge.ts","./src/api/channel/h5.ts","./src/api/channel/open_setting.ts","./src/api/channel/wx_oa.ts","./src/api/org/department.ts","./src/api/org/post.ts","./src/api/perms/admin.ts","./src/api/perms/menu.ts","./src/api/perms/role.ts","./src/api/setting/dict.ts","./src/api/setting/pay.ts","./src/api/setting/search.ts","./src/api/setting/storage.ts","./src/api/setting/user.ts","./src/api/setting/website.ts","./src/api/tools/code.ts","./node_modules/.pnpm/@tencentcloud+chat-uikit-vu_f78cbc43da431f244e6b6d27ca79f135/node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chat/chat.vue.d.ts","./node_modules/.pnpm/@tencentcloud+chat-uikit-vu_f78cbc43da431f244e6b6d27ca79f135/node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chat/index.d.ts","./node_modules/.pnpm/@tencentcloud+chat-uikit-vu_f78cbc43da431f244e6b6d27ca79f135/node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chatheader/chatheader.vue.d.ts","./node_modules/.pnpm/@tencentcloud+chat-uikit-vu_f78cbc43da431f244e6b6d27ca79f135/node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chatheader/hooks/usechatheader.d.ts","./node_modules/.pnpm/@tencentcloud+chat-uikit-vu_f78cbc43da431f244e6b6d27ca79f135/node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chatheader/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/login.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/loginstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/avatar/avatar.vue.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/avatar/constants/avatar.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/avatar/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/userpicker/type.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/userpicker/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/basecomp/view/view.vue.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/basecomp/view/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/chatsetting/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/uikitmodalstate/uikitmodalstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/uikitmodalstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/uikitmodal/type.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/uikitmodal/uikitmodal.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/uikitmodal/useroommodal/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/uikitmodal/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/subentry/common/base.d.ts","./node_modules/.pnpm/@tencentcloud+chat@3.5.9/node_modules/@tencentcloud/chat/index.d.ts","./node_modules/.pnpm/@tencentcloud+tuiroom-engine-js@3.5.2/node_modules/@tencentcloud/tuiroom-engine-js/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/device.d.ts","./node_modules/.pnpm/@tencentcloud+chat@3.6.6/node_modules/@tencentcloud/chat/index.d.ts","./node_modules/.pnpm/@tencentcloud+chat-uikit-engine@2.5.8/node_modules/@tencentcloud/chat-uikit-engine/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/message.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/hooks/useofflinepushinfo/types.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/hooks/useofflinepushinfo/useofflinepushinfo.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/hooks/useofflinepushinfo/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/engine.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/search.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/contact.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/conversation.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/call.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/groupsettingstate/types.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/chatsetting.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/types.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/live.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/stream.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/videomixer.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/audience.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/seat.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/monitor.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/coguest.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/cohost.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/battle.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/barrage.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/room.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/participant.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/beauty.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/virtualbackground.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/user.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/devicestate/devicestate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/devicestate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/hooks/useroomengine.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/audiosettingpanel/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/videosettingpanel/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/subentry/common/rtc.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/subentry/common/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/barragestate/barragestate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/barragestate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/battlestate/battlestate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/battlestate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/cogueststate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/cohoststate/cohoststate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/cohoststate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/liveaudiencestate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/liveliststate/liveliststate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/liveliststate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/livemonitorstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/utils/eventcenter.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/liveseatstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/videomixerstate/videomixerstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/videomixerstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/barrageinput/barrageinputh5.vue.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/barrageinput/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/barragelist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/camerabutton/index.vue.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/camerabutton/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/coguestpanel/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/cohostpanel/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/liveaudiencelist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/livelist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/livemonitorview/livemonitorview.vue.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/livemonitorview/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/livescenepanel/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/liveview/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/micbutton/index.vue.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/micbutton/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/streammixer/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/subentry/live/live.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/types/asr.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/asrstate/asrstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/freebeautystate/freebeautystate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/freebeautystate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/roomparticipantstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/roomstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/virtualbackgroundstate/virtualbackgroundstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/virtualbackgroundstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/roomparticipantlist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/roomparticipantview/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/roomview/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/scheduleroompanel/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/virtualbackgroundpanel/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/freebeautypanel/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/subentry/room/room.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/i18n/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/contactlist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/conversationlist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/messageinput/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/hooks/usemessageactions.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/messagelist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/components/search/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/c2csettingstate/c2csettingstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/c2csettingstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/contactliststate/contactliststate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/contactliststate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/conversationliststate/conversationliststate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/conversationliststate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/groupsettingstate/groupsettingstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/groupsettingstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/messageactionstate/messageactionstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/messageactionstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/messageinputstate/type.d.ts","./node_modules/.pnpm/orderedmap@2.1.1/node_modules/orderedmap/dist/index.d.ts","./node_modules/.pnpm/prosemirror-model@1.25.4/node_modules/prosemirror-model/dist/index.d.ts","./node_modules/.pnpm/prosemirror-transform@1.12.0/node_modules/prosemirror-transform/dist/index.d.ts","./node_modules/.pnpm/prosemirror-view@1.41.8/node_modules/prosemirror-view/dist/index.d.ts","./node_modules/.pnpm/prosemirror-state@1.4.4/node_modules/prosemirror-state/dist/index.d.ts","./node_modules/.pnpm/@tiptap+pm@2.27.2/node_modules/@tiptap/pm/state/dist/index.d.ts","./node_modules/.pnpm/@tiptap+pm@2.27.2/node_modules/@tiptap/pm/model/dist/index.d.ts","./node_modules/.pnpm/@tiptap+pm@2.27.2/node_modules/@tiptap/pm/view/dist/index.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/eventemitter.d.ts","./node_modules/.pnpm/@tiptap+pm@2.27.2/node_modules/@tiptap/pm/transform/dist/index.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/inputrule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/pasterule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/node.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/mark.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extension.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/types.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensionmanager.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/nodepos.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/clipboardtextserializer.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/blur.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/clearcontent.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/clearnodes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/command.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/createparagraphnear.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/cut.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/deletecurrentnode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/deletenode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/deleterange.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/deleteselection.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/enter.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/exitcode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/extendmarkrange.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/first.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/focus.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/foreach.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/insertcontent.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/insertcontentat.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/join.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/joinitembackward.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/joinitemforward.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/jointextblockbackward.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/jointextblockforward.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/keyboardshortcut.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/lift.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/liftemptyblock.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/liftlistitem.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/newlineincode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/resetattributes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/scrollintoview.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/selectall.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/selectnodebackward.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/selectnodeforward.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/selectparentnode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/selecttextblockend.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/selecttextblockstart.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/setcontent.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/setmark.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/setmeta.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/setnode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/setnodeselection.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/settextselection.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/sinklistitem.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/splitblock.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/splitlistitem.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/togglelist.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/togglemark.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/togglenode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/togglewrap.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/undoinputrule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/unsetallmarks.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/unsetmark.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/updateattributes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/wrapin.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/wrapinlist.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commands/index.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/commands.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/drop.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/editable.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/focusevents.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/keymap.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/paste.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/tabindex.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/extensions/index.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/editor.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/commandmanager.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/combinetransactionsteps.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/createchainablestate.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/createdocument.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/createnodefromcontent.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/defaultblockat.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/findchildren.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/findchildreninrange.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/findparentnode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/findparentnodeclosesttopos.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/generatehtml.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/generatejson.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/generatetext.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getattributes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getattributesfromextensions.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getchangedranges.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getdebugjson.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getextensionfield.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/gethtmlfromfragment.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getmarkattributes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getmarkrange.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getmarksbetween.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getmarktype.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getnodeatposition.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getnodeattributes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getnodetype.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getrenderedattributes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getschema.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getschemabyresolvedextensions.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getschematypebyname.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getschematypenamebyname.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/getsplittedattributes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/gettext.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/gettextbetween.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/gettextcontentfromnodes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/gettextserializersfromschema.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/injectextensionattributestoparserule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/isactive.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/isatendofnode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/isatstartofnode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/isextensionrulesenabled.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/islist.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/ismarkactive.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/isnodeactive.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/isnodeempty.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/isnodeselection.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/istextselection.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/postodomrect.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/resolvefocusposition.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/rewriteunknowncontent.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/selectiontoinsertionend.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/splitextensions.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/helpers/index.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/inputrules/markinputrule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/inputrules/nodeinputrule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/inputrules/textblocktypeinputrule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/inputrules/textinputrule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/inputrules/wrappinginputrule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/inputrules/index.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/nodeview.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/pasterules/markpasterule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/pasterules/nodepasterule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/pasterules/textpasterule.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/pasterules/index.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/tracker.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/callorreturn.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/caninsertnode.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/createstyletag.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/deleteprops.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/elementfromstring.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/escapeforregex.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/findduplicates.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/fromstring.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/isemptyobject.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/isfunction.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/isios.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/ismacos.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/isnumber.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/isplainobject.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/isregexp.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/issafari.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/isstring.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/mergeattributes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/mergedeep.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/minmax.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/objectincludes.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/removeduplicates.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/utilities/index.d.ts","./node_modules/.pnpm/@tiptap+core@2.27.2_@tiptap+pm@2.27.2/node_modules/@tiptap/core/dist/index.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/enums.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/popperoffsets.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/flip.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/hide.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/offset.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/eventlisteners.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/computestyles.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/arrow.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/preventoverflow.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/applystyles.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/types.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/index.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/detectoverflow.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/createpopper.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/popper-lite.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/popper.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/index.d.ts","./node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/index.d.ts","./node_modules/.pnpm/tippy.js@6.3.7/node_modules/tippy.js/index.d.ts","./node_modules/.pnpm/@tiptap+extension-bubble-me_cb4d88b0b911ecd5388577427968ef89/node_modules/@tiptap/extension-bubble-menu/dist/bubble-menu-plugin.d.ts","./node_modules/.pnpm/@tiptap+extension-bubble-me_cb4d88b0b911ecd5388577427968ef89/node_modules/@tiptap/extension-bubble-menu/dist/bubble-menu.d.ts","./node_modules/.pnpm/@tiptap+extension-bubble-me_cb4d88b0b911ecd5388577427968ef89/node_modules/@tiptap/extension-bubble-menu/dist/index.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/bubblemenu.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/editor.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/editorcontent.d.ts","./node_modules/.pnpm/@tiptap+extension-floating-_8ade271869755387a8482cceb81d75f6/node_modules/@tiptap/extension-floating-menu/dist/floating-menu-plugin.d.ts","./node_modules/.pnpm/@tiptap+extension-floating-_8ade271869755387a8482cceb81d75f6/node_modules/@tiptap/extension-floating-menu/dist/floating-menu.d.ts","./node_modules/.pnpm/@tiptap+extension-floating-_8ade271869755387a8482cceb81d75f6/node_modules/@tiptap/extension-floating-menu/dist/index.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/floatingmenu.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/nodeviewcontent.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/nodeviewwrapper.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/useeditor.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/vuenodeviewrenderer.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/vuerenderer.d.ts","./node_modules/.pnpm/@tiptap+vue-3@2.27.2_@tipta_58f9c9cb8880c604b8226ea71b48e5d0/node_modules/@tiptap/vue-3/dist/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/messageinputstate/messageinputstate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/messageinputstate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/messageliststate/messageliststate.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/states/messageliststate/index.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/subentry/chat/chat.d.ts","./node_modules/.pnpm/tuikit-atomicx-vue3@4.5.7_@_fc6d7901627ffa37cce9ed5237679065/node_modules/tuikit-atomicx-vue3/dist/subentry/chat/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/constants/interface.d.ts","./node_modules/.pnpm/i18next@23.15.1/node_modules/i18next/typescript/helpers.d.ts","./node_modules/.pnpm/i18next@23.15.1/node_modules/i18next/typescript/options.d.ts","./node_modules/.pnpm/i18next@23.15.1/node_modules/i18next/typescript/t.d.ts","./node_modules/.pnpm/i18next@23.15.1/node_modules/i18next/index.d.ts","./node_modules/.pnpm/i18next@23.15.1/node_modules/i18next/index.d.mts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/i18n/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/uselanguageprovider.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/languageprovider.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/stylepresetprovider/interface.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/stylepresetprovider/stylepresetprovider.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/stylepresetprovider/usestylepresetprovider.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/stylepresetprovider/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/uikitprovider/uikitprovider.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/uikitprovider/useuikitprovider.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/button/types.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/button/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/type.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/dialog.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/drawer/types.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/drawer/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/types.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/index.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/dropdownitem.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/icon/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/en-us/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/zh-cn/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/type.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/types.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/index.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/input/types.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/input/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/select/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/option/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/switch/types.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/switch/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/slider/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/type.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/index.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/swiperitem.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/toast/type.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/toast/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/watermark/index.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/watermark/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/type.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/index.vue.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/hooks/usecomponent.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/hooks/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/utils/utils.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/directives/loading/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/directives/index.d.ts","./node_modules/.pnpm/@tencentcloud+uikit-base-co_be75d70b544ed9dfda482c36cc733d1c/node_modules/@tencentcloud/uikit-base-component-vue3/dist/index.d.ts","./node_modules/.pnpm/@tencentcloud+chat-uikit-vu_f78cbc43da431f244e6b6d27ca79f135/node_modules/@tencentcloud/chat-uikit-vue3/dist/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/constants/interface.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/typescript/helpers.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/typescript/options.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/typescript/t.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/index.d.mts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/i18n/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/uselanguageprovider.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/languageprovider.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/uikitprovider/uikitprovider.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/uikitprovider/useuikitprovider.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/button/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/button/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/dialog.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/drawer/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/drawer/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/dropdownitem.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/icon/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/en-us/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/zh-cn/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/input/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/input/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/select/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/option/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/switch/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/switch/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/slider/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/swiperitem.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/toast/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/toast/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/watermark/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/watermark/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/hooks/usecomponent.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/hooks/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/utils/utils.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/directives/loading/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/directives/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/index.d.ts","./src/components/sidetab.vue","./src/components/app-link/index.vue","./src/components/chat-dialog/chatmessageitem.vue","./src/utils/call-local-recorder.ts","./src/utils/call-video-screenshot.ts","./src/utils/tuicall-error.ts","./node_modules/@tencentcloud/chat/index.d.ts","./node_modules/@tencentcloud/chat-uikit-engine/index.d.ts","./src/utils/im-call-hangup-detect.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/const/call.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/const/error.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/const/log.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/const/index.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/icallservice.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/icallstore.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/ituiglobal.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/ituistore.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/index.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/callservice/uidesign.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/callservice/index.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/locales/index.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/index.d.ts","./node_modules/.pnpm/@tencentcloud+call-uikit-vue@4.0.12/node_modules/@tencentcloud/call-uikit-vue/types/index.d.ts","./node_modules/@tencentcloud/call-engine-js/index.d.ts","./src/components/chat-dialog/index.vue","./src/components/color-picker/index.vue","./src/components/daterange-picker/index.vue","./src/components/del-wrap/index.vue","./src/components/dict-value/index.vue","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/utils/browser-polyfill.d.ts","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/utils/node-polyfill.d.ts","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/locale/index.d.ts","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/register-builtin-modules/index.d.ts","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/init-default-config/index.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/create-editor.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/element.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/node.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/editor.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/location.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/operation.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/path.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/path-ref.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/point.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/point-ref.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/range.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/range-ref.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/custom-types.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/interfaces/text.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/transforms/general.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/transforms/node.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/transforms/selection.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/transforms/text.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/transforms/index.d.ts","./node_modules/.pnpm/slate@0.72.0/node_modules/slate/dist/index.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/htmldomapi.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/helpers/attachto.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/modules/style.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/modules/eventlisteners.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/modules/attributes.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/modules/class.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/modules/props.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/modules/dataset.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/vnode.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/hooks.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/modules/module.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/init.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/thunk.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/is.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/tovnode.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/h.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/jsx.d.ts","./node_modules/.pnpm/snabbdom@3.6.3/node_modules/snabbdom/build/index.d.ts","./node_modules/.pnpm/@types+event-emitter@0.3.5/node_modules/@types/event-emitter/index.d.ts","./node_modules/.pnpm/dom7@3.0.0/node_modules/dom7/dom7.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/utils/dom.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/menus/interface.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/config/interface.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/editor/interface.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/render/index.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/to-html/index.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/parse-html/index.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/menus/bar/toolbar.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/menus/register.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/menus/panel-and-modal/baseclass.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/menus/panel-and-modal/modal.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/menus/index.d.ts","./node_modules/.pnpm/slate-history@0.66.0_slate@0.72.0/node_modules/slate-history/dist/history.d.ts","./node_modules/.pnpm/slate-history@0.66.0_slate@0.72.0/node_modules/slate-history/dist/history-editor.d.ts","./node_modules/.pnpm/slate-history@0.66.0_slate@0.72.0/node_modules/slate-history/dist/with-history.d.ts","./node_modules/.pnpm/slate-history@0.66.0_slate@0.72.0/node_modules/slate-history/dist/index.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/create/create-editor.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/create/create-toolbar.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/create/index.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/utils/key.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/text-area/textarea.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/menus/bar/hoverbar.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/editor/dom-editor.d.ts","./node_modules/.pnpm/@uppy+utils@4.1.3/node_modules/@uppy/utils/types/index.d.ts","./node_modules/.pnpm/@uppy+core@2.3.4/node_modules/@uppy/core/types/index.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/upload/interface.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/upload/createuploader.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/upload/index.d.ts","./node_modules/.pnpm/i18next@20.4.0/node_modules/i18next/index.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/i18n/index.d.ts","./node_modules/.pnpm/@wangeditor+core@1.1.19_@up_585ce3e2c6aab8ba5d7bc1a654d2a2a0/node_modules/@wangeditor/core/dist/core/src/index.d.ts","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/boot.d.ts","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/utils/dom.d.ts","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/create.d.ts","./node_modules/.pnpm/@wangeditor+editor@5.1.23/node_modules/@wangeditor/editor/dist/editor/src/index.d.ts","./node_modules/.pnpm/vuedraggable@4.1.0_vue@3.5.33_typescript@5.7.3_/node_modules/vuedraggable/src/vuedraggable.d.ts","./src/components/popup/index.vue","./src/components/material/file.vue","./src/components/material/hook.ts","./src/components/material/preview.vue","./src/components/material/index.vue","./src/components/material/picker.vue","./src/components/editor/index.vue","./src/components/export-data/index.vue","./src/components/footer-btns/index.vue","./src/components/icon/index.ts","./src/components/icon/svg-icon.vue","./src/components/icon/index.vue","./src/components/icon/picker.vue","./src/components/image-contain/index.vue","./src/components/link/index.ts","./src/components/link/article-list.vue","./src/components/link/custom-link.vue","./src/components/link/mini-program.vue","./src/components/link/shop-pages.vue","./src/components/link/index.vue","./src/components/link/picker.vue","./src/hooks/uselisttimefilter.ts","./src/components/list-time-filter/index.vue","./src/components/overflow-tooltip/index.vue","./src/components/pagination/index.vue","./src/components/popover-input/index.vue","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/const/call.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/const/error.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/const/log.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/const/index.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/icallservice.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/icallstore.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/ituiglobal.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/ituistore.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/index.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/callservice/uidesign.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/callservice/index.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/locales/index.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/tuicallservice/index.d.ts","./node_modules/.pnpm/@trtc+calls-uikit-vue@4.5.0/node_modules/@trtc/calls-uikit-vue/types/index.d.ts","./src/components/video-call/index.vue","./src/hooks/usedictoptions.ts","./node_modules/.pnpm/vue-clipboard3@2.0.0/node_modules/vue-clipboard3/dist/esm/index.d.ts","./src/install/directives/copy.ts","./src/install/directives/perms.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/types/dist/charts.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/charts.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/types/dist/components.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/components.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/types/dist/features.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/features.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/types/dist/renderers.d.ts","./node_modules/.pnpm/echarts@5.6.0/node_modules/echarts/renderers.d.ts","./src/install/plugins/echart.ts","./src/install/plugins/element.ts","./node_modules/.pnpm/@highlightjs+vue-plugin@2.1_297347e077cdaa3fb4c77d862f4e02c2/node_modules/@highlightjs/vue-plugin/dist/vue.d.ts","./node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/types/index.d.ts","./src/install/plugins/hljs.ts","./src/stores/index.ts","./src/install/plugins/pinia.ts","./src/router/guard/index.ts","./src/install/plugins/router.ts","./src/install/plugins/tuikit.ts","./src/router/guard/init.ts","./src/utils/checkhttps.ts","./src/utils/env.ts","./src/utils/getexposetype.ts","./src/views/app/recharge/index.vue","./src/views/article/column/edit.vue","./src/views/article/column/index.vue","./src/views/article/lists/edit.vue","./src/views/article/lists/index.vue","./src/views/asset/resource/index.vue","./src/views/asset/user/index.vue","./src/views/channel/h5.vue","./src/views/channel/open_setting.vue","./src/views/channel/weapp.vue","./src/views/channel/wx_oa/config.vue","./src/views/channel/wx_oa/menu_com/usemenuoa.ts","./src/views/channel/wx_oa/menu_com/oa-menu-form.vue","./src/views/channel/wx_oa/menu_com/oa-menu-form-edit.vue","./src/views/channel/wx_oa/menu_com/oa-attr.vue","./src/views/channel/wx_oa/menu_com/oa-phone.vue","./src/views/channel/wx_oa/menu.vue","./src/views/channel/wx_oa/reply/edit.vue","./src/views/channel/wx_oa/reply/default_reply.vue","./src/views/channel/wx_oa/reply/follow_reply.vue","./src/views/channel/wx_oa/reply/keyword_reply.vue","./src/views/chat/components/messagebubble.vue","./src/views/chat/components/sendpanel.vue","./src/views/chat/index.vue","./src/views/consumer/assistant/edit.vue","./src/views/consumer/assistant/index.vue","./src/views/consumer/components/account-adjust.vue","./src/views/consumer/doctor/edit.vue","./src/views/consumer/doctor/index.vue","./src/views/consumer/doctor/paiban.vue","./src/views/consumer/lists/detail.vue","./src/views/consumer/lists/index.vue","./src/views/consumer/prescription/guahao.vue","./src/views/consumer/prescription/index.vue","./src/views/consumer/prescription/list.vue","./src/views/consumer/prescription/components/gancaosubmissionreconcilebutton.vue","./src/views/consumer/prescription/order_list.vue","./src/views/consumer/prescription/order_list_h5.vue","./src/views/decoration/pc.vue","./src/views/decoration/component/pages/menu.vue","./src/views/decoration/component/tabbar/mobile/attr.vue","./src/views/decoration/component/decoration-img.vue","./src/views/decoration/component/tabbar/mobile/content.vue","./src/views/decoration/component/tabbar/mobile/index.ts","./src/views/decoration/tabbar.vue","./src/views/decoration/component/add-nav.vue","./src/views/decoration/component/pages/attr-setting.vue","./src/views/decoration/component/pages/preview.vue","./src/views/decoration/component/tabbar/pc/menu-set.vue","./src/views/decoration/component/tabbar/pc/attr.vue","./src/views/decoration/component/tabbar/pc/content.vue","./src/views/decoration/component/tabbar/pc/index.ts","./src/views/decoration/component/widgets/banner/options.ts","./src/views/decoration/component/widgets/banner/attr.vue","./src/views/decoration/component/widgets/banner/content.vue","./src/views/decoration/component/widgets/banner/index.ts","./src/views/decoration/component/widgets/customer-service/options.ts","./src/views/decoration/component/widgets/customer-service/attr.vue","./src/views/decoration/component/widgets/customer-service/content.vue","./src/views/decoration/component/widgets/customer-service/index.ts","./src/views/decoration/component/widgets/middle-banner/options.ts","./src/views/decoration/component/widgets/middle-banner/attr.vue","./src/views/decoration/component/widgets/middle-banner/content.vue","./src/views/decoration/component/widgets/middle-banner/index.ts","./src/views/decoration/component/widgets/my-service/options.ts","./src/views/decoration/component/widgets/my-service/attr.vue","./src/views/decoration/component/widgets/my-service/content.vue","./src/views/decoration/component/widgets/my-service/index.ts","./src/views/decoration/component/widgets/nav/options.ts","./src/views/decoration/component/widgets/nav/attr.vue","./src/views/decoration/component/widgets/nav/content.vue","./src/views/decoration/component/widgets/nav/index.ts","./src/views/decoration/component/widgets/news/options.ts","./src/views/decoration/component/widgets/news/attr.vue","./src/views/decoration/component/widgets/news/content.vue","./src/views/decoration/component/widgets/news/index.ts","./src/views/decoration/component/widgets/page-meta/options.ts","./src/views/decoration/component/widgets/page-meta/attr.vue","./src/views/decoration/component/widgets/page-meta/content.vue","./src/views/decoration/component/widgets/page-meta/index.ts","./src/views/decoration/component/widgets/pc-banner/options.ts","./src/views/decoration/component/widgets/pc-banner/content.vue","./src/views/decoration/component/widgets/pc-banner/index.ts","./src/views/decoration/component/widgets/search/options.ts","./src/views/decoration/component/widgets/search/attr.vue","./src/views/decoration/component/widgets/search/content.vue","./src/views/decoration/component/widgets/search/index.ts","./src/views/decoration/component/widgets/user-banner/options.ts","./src/views/decoration/component/widgets/user-banner/attr.vue","./src/views/decoration/component/widgets/user-banner/content.vue","./src/views/decoration/component/widgets/user-banner/index.ts","./src/views/decoration/component/widgets/user-info/options.ts","./src/views/decoration/component/widgets/user-info/attr.vue","./src/views/decoration/component/widgets/user-info/content.vue","./src/views/decoration/component/widgets/user-info/index.ts","./src/views/decoration/pages/index.vue","./src/views/decoration/style/components/theme-picker.vue","./src/views/decoration/style/components/mobile-style.vue","./src/views/decoration/style/style.vue","./src/views/dev_tools/components/relations-add.vue","./src/views/dev_tools/code/edit.vue","./src/views/dev_tools/components/code-preview.vue","./src/views/dev_tools/components/data-table.vue","./src/views/dev_tools/code/index.vue","./src/views/doctor/dept-tongji.vue","./src/views/doctor/medicine.vue","./src/views/doctor/roster.vue","./src/views/doctor/tongji.vue","./src/views/fans/commission-settlement.vue","./src/views/fans/index.vue","./src/views/fans/qywx.vue","./src/views/fans/yeji.vue","./src/views/finance/balance_details.vue","./src/views/finance/mubiao-dept-node.vue","./src/views/finance/mubiao-dept-card.vue","./src/views/finance/mubiao.vue","./src/views/finance/recharge_record.vue","./src/views/finance/component/refund-log.vue","./src/views/finance/refund_record.vue","./src/views/finance/account_cost/edit.vue","./src/views/finance/account_cost/index.vue","./src/views/first_visit/conversion/index.vue","./src/views/first_visit/doctor_dashboard/index.vue","./src/views/first_visit/my_patients/components/order-actions.ts","./src/views/first_visit/my_patients/components/orderactionhost.vue","./src/views/first_visit/my_patients/components/orderpanel.vue","./src/views/first_visit/my_patients/components/progresspanel.vue","./src/views/first_visit/my_patients/index.vue","./src/views/first_visit/registration_stats/index.vue","./src/views/first_visit/wecom_promotion/components/wecom-widget-templates.ts","./src/views/first_visit/wecom_promotion/components/wecomfloatingwidgetbuilder.vue","./src/views/first_visit/wecom_promotion/index.vue","./src/views/material/index.vue","./src/views/message/notice/edit.vue","./src/views/message/notice/index.vue","./src/views/message/short_letter/edit.vue","./src/views/message/short_letter/index.vue","./src/views/order/index.vue","./src/views/organization/department/edit.vue","./src/views/organization/department/index.vue","./src/views/organization/post/edit.vue","./src/views/organization/post/index.vue","./src/views/patient/reception/index.vue","./src/views/permission/admin/edit.vue","./src/views/permission/admin/index.vue","./src/views/permission/menu/edit.vue","./src/views/permission/menu/index.vue","./src/views/permission/role/auth.vue","./src/views/permission/role/edit.vue","./src/views/permission/role/index.vue","./src/views/pharmacy/medicine_mapping/latest-request.d.mts","./src/views/pharmacy/medicine_mapping/index.vue","./src/views/setting/dict/data/edit.vue","./src/views/setting/dict/data/index.vue","./src/views/setting/dict/type/edit.vue","./src/views/setting/dict/type/index.vue","./src/views/setting/pay/config/edit.vue","./src/views/setting/pay/config/index.vue","./src/views/setting/pay/method/index.vue","./src/views/setting/search/index.vue","./src/views/setting/storage/edit.vue","./src/views/setting/storage/index.vue","./src/views/setting/system/cache.vue","./src/views/setting/system/environment.vue","./src/views/setting/system/journal.vue","./src/views/setting/system/scheduled_task/edit.vue","./src/views/setting/system/scheduled_task/index.vue","./src/views/setting/user/login_register.vue","./src/views/setting/user/setup.vue","./src/views/setting/website/filing.vue","./src/views/setting/website/information.vue","./src/views/setting/website/protocol.vue","./src/views/setting/website/statistics.vue","./src/views/stats/assistant-performance/index.vue","./src/views/stats/auto_assign_log/index.vue","./src/views/stats/conversion/index.vue","./src/views/stats/performance-dashboard/index.vue","./src/views/stats/revisit_rate/index.vue","./src/views/stats/self_input/mediasourceselect.vue","./src/views/stats/self_input/usemediasourceoptions.ts","./src/views/stats/self_input/cost-edit.vue","./src/views/stats/self_input/account_cost.vue","./src/views/stats/self_input/yeji-edit.vue","./src/views/stats/self_input/index.vue","./src/views/tcm/appointment/list.vue","./src/views/tcm/appointment/list_h5.vue","./src/views/tcm/appointment/components/prescription-drawer.vue","./src/views/tcm/diagnosis/add.vue","./src/views/tcm/diagnosis/index.vue","./src/views/tcm/diagnosis/components/bloodrecordlist.vue","./src/views/tcm/diagnosis/components/dietrecordlist.vue","./src/views/tcm/diagnosis/components/exerciserecordlist.vue","./src/views/tcm/diagnosis/components/trackingmatrix.vue","./src/views/tcm/follow/index.vue","./src/views/template/component/file.vue","./src/views/template/component/icon.vue","./src/views/template/component/link.vue","./src/views/template/component/overflow.vue","./src/views/template/component/popover_input.vue","./src/views/template/component/rich_text.vue","./src/views/template/component/upload.vue","./src/views/test/patient-call.vue","./src/views/workbench/index.vue","./components.d.ts","./auto-imports.d.ts","./typings/index.d.ts","./typings/router.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/compatibility/index.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/globals.typedarray.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/buffer.buffer.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/globals.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/events.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/storage.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/assert.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/assert/strict.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/async_hooks.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/buffer.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/child_process.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/cluster.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/console.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/constants.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/crypto.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/dgram.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/dns.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/dns/promises.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/domain.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/events.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/fs.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/fs/promises.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/http.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/http2.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/https.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/inspector.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/inspector.generated.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/module.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/net.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/os.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/path.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/perf_hooks.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/process.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/punycode.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/querystring.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/readline.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/readline/promises.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/repl.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/sea.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/sqlite.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/stream.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/stream/promises.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/stream/consumers.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/stream/web.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/string_decoder.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/test.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/timers.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/timers/promises.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/tls.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/trace_events.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/tty.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/url.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/util.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/v8.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/vm.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/wasi.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/worker_threads.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/zlib.d.ts","./node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/index.d.ts","./node_modules/.pnpm/@types+estree@1.0.8/node_modules/@types/estree/index.d.ts","./node_modules/.pnpm/rollup@4.60.3/node_modules/rollup/dist/rollup.d.ts","./node_modules/.pnpm/rollup@4.60.3/node_modules/rollup/dist/parseast.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/dist/node/modulerunnertransport.d-dj_me5sf.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/dist/node/module-runner.d.ts","./node_modules/.pnpm/esbuild@0.25.0/node_modules/esbuild/lib/main.d.ts","./node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/source-map.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/previous-map.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/input.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/declaration.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/root.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/warning.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/lazy-result.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/no-work-result.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/processor.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/result.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/document.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/rule.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/node.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/comment.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/container.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/at-rule.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/list.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/postcss.d.ts","./node_modules/.pnpm/postcss@8.5.14/node_modules/postcss/lib/postcss.d.mts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/types/internal/lightningcssoptions.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/deprecations.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/util/promise_or.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/importer.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/logger/source_location.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/logger/source_span.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/logger/index.d.ts","./node_modules/.pnpm/immutable@4.3.8/node_modules/immutable/dist/immutable.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/boolean.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/calculation.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/color.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/function.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/list.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/map.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/mixin.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/number.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/string.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/argument_list.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/value/index.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/options.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/compile.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/exception.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/legacy/exception.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/legacy/plugin_this.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/legacy/function.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/legacy/importer.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/legacy/options.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/legacy/render.d.ts","./node_modules/.pnpm/sass@1.79.6/node_modules/sass/types/index.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/types/internal/csspreprocessoroptions.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/types/metadata.d.ts","./node_modules/.pnpm/vite@6.4.2_@types+node@22.1_8f5e549addd5aa700368df43e00a64dc/node_modules/vite/dist/node/index.d.ts","./node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.d.mts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/typescript.d.ts","./node_modules/.pnpm/@vue+compiler-sfc@3.5.33/node_modules/@vue/compiler-sfc/dist/compiler-sfc.d.ts","./node_modules/.pnpm/vue@3.5.33_typescript@5.7.3/node_modules/vue/compiler-sfc/index.d.mts","./node_modules/.pnpm/@vitejs+plugin-vue@5.2.1_vi_26ff37bca32818ba6abc2479b735c8c5/node_modules/@vitejs/plugin-vue/dist/index.d.mts","./node_modules/.pnpm/@vue+babel-plugin-resolve-type@1.5.0_@babel+core@7.29.0/node_modules/@vue/babel-plugin-resolve-type/dist/index.d.mts","./node_modules/.pnpm/@vue+babel-plugin-jsx@1.5.0_@babel+core@7.29.0/node_modules/@vue/babel-plugin-jsx/dist/index.d.mts","./node_modules/.pnpm/@vitejs+plugin-vue-jsx@4.1._15604a3242b44866a4c8e668a8c2b0af/node_modules/@vitejs/plugin-vue-jsx/dist/index.d.mts","./node_modules/.pnpm/mlly@1.8.2/node_modules/mlly/dist/index.d.ts","./node_modules/.pnpm/unimport@4.1.1/node_modules/unimport/dist/shared/unimport.cavrr9sh.d.mts","./node_modules/.pnpm/unimport@4.1.1/node_modules/unimport/dist/shared/unimport.czoa5cgj.d.mts","./node_modules/.pnpm/js-tokens@9.0.1/node_modules/js-tokens/index.d.ts","./node_modules/.pnpm/strip-literal@3.1.0/node_modules/strip-literal/dist/index.d.mts","./node_modules/.pnpm/unimport@4.1.1/node_modules/unimport/dist/index.d.mts","./node_modules/.pnpm/unplugin-utils@0.2.5/node_modules/unplugin-utils/dist/index.d.ts","./node_modules/.pnpm/unplugin-auto-import@19.1.0_6f0c1011f66a70c739aaa005d5971cab/node_modules/unplugin-auto-import/dist/types.d.ts","./node_modules/.pnpm/unplugin-auto-import@19.1.0_6f0c1011f66a70c739aaa005d5971cab/node_modules/unplugin-auto-import/dist/vite.d.ts","./node_modules/.pnpm/webpack-virtual-modules@0.6.2/node_modules/webpack-virtual-modules/lib/index.d.ts","./node_modules/.pnpm/unplugin@2.2.0/node_modules/unplugin/dist/index.d.ts","./node_modules/.pnpm/unplugin-vue-components@28._94a912e1594e219e37a7871a02240417/node_modules/unplugin-vue-components/dist/types.d.ts","./node_modules/.pnpm/unplugin-vue-components@28._94a912e1594e219e37a7871a02240417/node_modules/unplugin-vue-components/dist/resolvers.d.ts","./node_modules/.pnpm/unplugin-vue-components@28._94a912e1594e219e37a7871a02240417/node_modules/unplugin-vue-components/dist/vite.d.ts","./node_modules/.pnpm/vite-plugin-style-import@2._963cef04d855493cf45de9418d5fb104/node_modules/vite-plugin-style-import/dist/index.d.ts","./node_modules/.pnpm/@types+svgo@2.6.4/node_modules/@types/svgo/index.d.ts","./node_modules/.pnpm/vite-plugin-svg-icons@2.0.1_832c8c32224a985848ba91788e93a372/node_modules/vite-plugin-svg-icons/dist/index.d.ts","./node_modules/.pnpm/vite-plugin-vue-setup-exten_dfd817fabadf21a508603ce199129005/node_modules/vite-plugin-vue-setup-extend/dist/index.d.ts","./vite.config.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/common.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/array.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/collection.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/date.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/function.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/lang.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/math.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/number.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/object.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/seq.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/string.d.ts","./node_modules/.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash/common/util.d.ts"],"fileIdsList":[[99,103,109,868,1400,1423,2454,2457,2463,2511,2528,2529],[99,103,109,868,1400,1423,1455,1468,1544,1580,2074,2075,2076,2098,2099,2100,2101,2102,2184,2185,2187,2188,2189,2190,2191,2192,2194,2195,2196,2197,2199,2200,2201,2202,2203,2204,2206,2207,2208,2209,2224,2457,2463,2511,2528,2529],[88,868,1423,2463,2511,2528,2529],[91,868,1423,2463,2511,2528,2529],[868,1423,2463,2511,2528,2529],[868,1027,1423,2463,2511,2528,2529],[868,1028,1423,2463,2511,2528,2529],[868,1027,1028,1029,1030,1031,1032,1033,1034,1035,1423,2463,2511,2528,2529],[99,103,109,868,1423,2454,2463,2511,2528,2529],[166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,868,1423,2463,2511,2528,2529],[459,868,1423,2463,2511,2528,2529],[868,985,1423,2463,2511,2528,2529],[868,986,987,1423,2463,2511,2528,2529],[868,1423,1928,2463,2511,2528,2529],[868,1423,1922,1924,2463,2511,2528,2529],[868,1423,1912,1922,1923,1925,1926,1927,2463,2511,2528,2529],[868,1423,1922,2463,2511,2528,2529],[868,1423,1912,1922,2463,2511,2528,2529],[868,1423,1913,1914,1915,1916,1917,1918,1919,1920,1921,2463,2511,2528,2529],[868,1423,1913,1917,1918,1921,1922,1925,2463,2511,2528,2529],[868,1423,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1925,1926,2463,2511,2528,2529],[868,1423,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,2463,2511,2528,2529],[825,868,1423,2463,2511,2528,2529],[819,821,868,1423,2463,2511,2528,2529],[809,819,820,822,823,824,868,1423,2463,2511,2528,2529],[819,868,1423,2463,2511,2528,2529],[809,819,868,1423,2463,2511,2528,2529],[810,811,812,813,814,815,816,817,818,868,1423,2463,2511,2528,2529],[810,814,815,818,819,822,868,1423,2463,2511,2528,2529],[810,811,812,813,814,815,816,817,818,819,820,822,823,868,1423,2463,2511,2528,2529],[809,810,811,812,813,814,815,816,817,818,868,1423,2463,2511,2528,2529],[868,1423,2095,2463,2511,2528,2529],[868,1423,2086,2087,2091,2092,2463,2511,2528,2529],[868,1423,2086,2463,2511,2528,2529],[868,1423,2083,2084,2085,2463,2511,2528,2529],[868,1423,2086,2093,2094,2463,2511,2528,2529],[868,1423,2086,2091,2463,2511,2528,2529],[868,1423,2087,2088,2089,2090,2463,2511,2528,2529],[868,1423,1636,2463,2511,2528,2529],[868,1423,1611,2463,2511,2528,2529],[868,1423,1613,1614,2463,2511,2528,2529],[868,1423,1612,1615,1952,2014,2463,2511,2528,2529],[868,1423,1633,2463,2511,2528,2529],[99,103,109,868,1423,1987,1988,2454,2463,2511,2528,2529],[99,103,109,868,1423,1987,2454,2463,2511,2528,2529],[99,103,109,868,1423,1970,2454,2463,2511,2528,2529],[99,103,109,868,1423,1972,2454,2463,2511,2528,2529],[99,103,109,868,1423,1972,1973,2454,2463,2511,2528,2529],[868,1423,1970,2463,2511,2528,2529],[99,103,109,868,1423,1975,2454,2463,2511,2528,2529],[99,103,109,868,1423,1977,2454,2463,2511,2528,2529],[99,103,109,868,1423,1977,1978,1979,2454,2463,2511,2528,2529],[868,1423,2008,2463,2511,2528,2529],[868,1423,1971,1974,1976,1980,1981,1986,1989,1991,1992,1993,1995,1996,2000,2002,2004,2007,2009,2010,2463,2511,2528,2529],[99,103,109,868,1423,1990,2454,2463,2511,2528,2529],[868,1423,1982,1983,2463,2511,2528,2529],[868,1423,1984,1985,2463,2511,2528,2529],[868,1423,2005,2006,2463,2511,2528,2529],[99,103,109,868,1423,2005,2454,2463,2511,2528,2529],[868,1423,1997,1998,1999,2463,2511,2528,2529],[99,103,109,868,1423,1997,2454,2463,2511,2528,2529],[99,103,109,868,1423,1994,2454,2463,2511,2528,2529],[99,103,109,868,1423,2001,2454,2463,2511,2528,2529],[99,103,109,868,1423,2003,2454,2463,2511,2528,2529],[99,103,109,868,1423,2012,2454,2463,2511,2528,2529],[868,1423,1959,1969,2011,2013,2463,2511,2528,2529],[868,1423,1960,1961,2463,2511,2528,2529],[99,103,109,868,1423,1960,2454,2463,2511,2528,2529],[99,103,109,868,1423,1958,1959,2454,2463,2511,2528,2529],[868,1423,1963,1964,1965,2463,2511,2528,2529],[99,103,109,868,1423,1963,2454,2463,2511,2528,2529],[99,103,109,868,1423,1953,1962,1966,2454,2463,2511,2528,2529],[99,103,109,868,1423,1953,1958,1965,2454,2463,2511,2528,2529],[868,1423,1958,2463,2511,2528,2529],[868,1423,1966,1967,1968,2463,2511,2528,2529],[868,1423,1744,1754,1822,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1744,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1811,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1812,1911,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1911,2463,2511,2528,2529],[868,1423,1744,1745,1746,1747,1754,1755,1756,1821,2463,2511,2528,2529],[868,1423,1744,1749,1750,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1822,1911,2463,2511,2528,2529],[868,1423,1744,1745,1746,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1822,1911,2463,2511,2528,2529],[868,1423,1753,2463,2511,2528,2529],[868,1423,1753,1813,2463,2511,2528,2529],[868,1423,1744,1753,2463,2511,2528,2529],[868,1423,1757,1814,1815,1816,1817,1818,1819,1820,2463,2511,2528,2529],[868,1423,1744,1745,1748,2463,2511,2528,2529],[868,1423,1744,2463,2511,2528,2529],[868,1423,1745,1754,2463,2511,2528,2529],[868,1423,1745,2463,2511,2528,2529],[868,1423,1740,1744,1754,2463,2511,2528,2529],[868,1423,1754,2463,2511,2528,2529],[868,1423,1744,1745,2463,2511,2528,2529],[868,1423,1748,1754,2463,2511,2528,2529],[868,1423,1745,1754,1822,2463,2511,2528,2529],[868,1423,1745,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2463,2511,2528,2529],[868,1423,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,2463,2511,2528,2529],[868,1423,1746,2463,2511,2528,2529],[868,1423,1744,1745,1754,2463,2511,2528,2529],[868,1423,1751,1752,1753,1754,2463,2511,2528,2529],[868,1423,1749,1750,1751,1752,1753,1754,1756,1821,1822,1823,1875,1881,1882,1886,1887,1910,2463,2511,2528,2529],[868,1423,1876,1877,1878,1879,1880,2463,2511,2528,2529],[868,1423,1745,1749,1754,2463,2511,2528,2529],[868,1423,1749,2463,2511,2528,2529],[868,1423,1745,1749,1754,1822,2463,2511,2528,2529],[868,1423,1744,1745,1749,1750,1751,1752,1753,1754,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1822,1911,2463,2511,2528,2529],[868,1423,1746,1754,1822,2463,2511,2528,2529],[868,1423,1883,1884,1885,2463,2511,2528,2529],[868,1423,1745,1750,1754,2463,2511,2528,2529],[868,1423,1750,2463,2511,2528,2529],[868,1423,1744,1745,1746,1748,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1822,1911,2463,2511,2528,2529],[868,1423,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,2463,2511,2528,2529],[868,1423,1744,1746,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,1930,2463,2511,2528,2529],[868,1423,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,1931,2463,2511,2528,2529],[868,1423,1931,1932,2463,2511,2528,2529],[868,1423,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,1937,2463,2511,2528,2529],[868,1423,1937,1938,2463,2511,2528,2529],[868,1423,1740,2463,2511,2528,2529],[868,1423,1743,2463,2511,2528,2529],[868,1423,1741,2463,2511,2528,2529],[868,1423,1742,2463,2511,2528,2529],[99,103,109,868,1423,1742,1743,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,1930,1933,2454,2463,2511,2528,2529],[99,103,109,868,1423,1744,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2454,2463,2511,2528,2529],[99,103,109,868,1423,1935,2454,2463,2511,2528,2529],[99,103,109,868,1423,1742,1743,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,1930,1939,2454,2463,2511,2528,2529],[868,1423,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,1934,1935,1936,1940,1941,1942,1943,1944,1945,2463,2511,2528,2529],[99,103,109,868,1423,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,1935,2454,2463,2511,2528,2529],[99,103,109,868,1423,1745,1746,1751,1752,1753,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1911,2454,2463,2511,2528,2529],[868,1423,2222,2463,2511,2528,2529],[868,1423,2213,2214,2218,2219,2463,2511,2528,2529],[868,1423,2213,2463,2511,2528,2529],[868,1423,2210,2211,2212,2463,2511,2528,2529],[868,1423,2213,2220,2221,2463,2511,2528,2529],[868,1423,2213,2218,2463,2511,2528,2529],[868,1423,2214,2215,2216,2217,2463,2511,2528,2529],[123,868,1423,2463,2511,2528,2529],[471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,868,1423,2463,2511,2528,2529],[868,1423,2463,2511,2528,2529,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658],[868,1423,2463,2508,2509,2511,2528,2529],[868,1423,2463,2510,2511,2528,2529],[868,1423,2511,2528,2529],[868,1423,2463,2511,2516,2528,2529,2546],[868,1423,2463,2511,2512,2517,2522,2528,2529,2531,2543,2554],[868,1423,2463,2511,2512,2513,2522,2528,2529,2531],[868,1423,2458,2459,2460,2463,2511,2528,2529],[868,1423,2463,2511,2514,2528,2529,2555],[868,1423,2463,2511,2515,2516,2523,2528,2529,2532],[868,1423,2463,2511,2516,2528,2529,2543,2551],[868,1423,2463,2511,2517,2519,2522,2528,2529,2531],[868,1423,2463,2510,2511,2518,2528,2529],[868,1423,2463,2511,2519,2520,2528,2529],[868,1423,2463,2511,2521,2522,2528,2529],[868,1423,2463,2510,2511,2522,2528,2529],[868,1423,2463,2511,2522,2523,2524,2528,2529,2543,2554],[868,1423,2463,2511,2522,2523,2524,2528,2529,2538,2543,2546],[868,1423,2463,2504,2511,2519,2522,2525,2528,2529,2531,2543,2554],[868,1423,2463,2511,2522,2523,2525,2526,2528,2529,2531,2543,2551,2554],[868,1423,2463,2511,2525,2527,2528,2529,2543,2551,2554],[868,1423,2461,2462,2463,2464,2465,2466,2467,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560],[868,1423,2463,2511,2522,2528,2529],[868,1423,2463,2511,2528,2529,2530,2554],[868,1423,2463,2511,2519,2522,2528,2529,2531,2543],[868,1423,2463,2511,2528,2529,2532],[868,1423,2463,2511,2528,2529,2533],[868,1423,2463,2510,2511,2528,2529,2534],[868,1423,2463,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560],[868,1423,2463,2511,2528,2529,2536],[868,1423,2463,2511,2528,2529,2537],[868,1423,2463,2511,2522,2528,2529,2538,2539],[868,1423,2463,2511,2528,2529,2538,2540,2555,2557],[868,1423,2463,2511,2523,2528,2529],[868,1423,2463,2511,2522,2528,2529,2543,2544,2546],[868,1423,2463,2511,2528,2529,2545,2546],[868,1423,2463,2511,2528,2529,2543,2544],[868,1423,2463,2511,2528,2529,2546],[868,1423,2463,2511,2528,2529,2547],[868,1423,2463,2508,2511,2528,2529,2543,2548,2554],[868,1423,2463,2511,2522,2528,2529,2549,2550],[868,1423,2463,2511,2528,2529,2549,2550],[868,1423,2463,2511,2516,2528,2529,2531,2543,2551],[868,1423,2463,2511,2528,2529,2552],[868,1423,2463,2511,2528,2529,2531,2553],[868,1423,2463,2511,2525,2528,2529,2537,2554],[868,1423,2463,2511,2516,2528,2529,2555],[868,1423,2463,2511,2528,2529,2543,2556],[868,1423,2463,2511,2528,2529,2530,2557],[868,1423,2463,2511,2528,2529,2558],[868,1423,2463,2504,2511,2528,2529],[868,1423,2463,2504,2511,2522,2524,2528,2529,2534,2543,2546,2554,2556,2557,2559],[868,1423,2463,2511,2528,2529,2543,2560],[868,1423,2463,2511,2528,2529,2561],[868,1423,2171,2463,2511,2528,2529],[868,1423,2463,2511,2528,2529,2619,2626],[868,1423,2463,2511,2528,2529,2619,2623],[91,868,1423,2463,2511,2528,2529,2625],[868,1423,2463,2511,2528,2529,2622],[90,91,92,868,1423,2463,2511,2528,2529],[93,868,1423,2463,2511,2528,2529],[91,92,93,868,1423,2463,2511,2528,2529,2587,2620,2621],[90,868,1423,2463,2511,2528,2529],[90,95,96,98,868,1423,2463,2511,2528,2529],[95,96,97,98,868,1423,2463,2511,2528,2529],[99,103,109,778,868,1423,2454,2463,2511,2528,2529],[99,103,104,109,868,1423,2454,2463,2511,2528,2529],[868,1423,2127,2149,2151,2463,2511,2528,2529],[868,1423,2127,2148,2150,2151,2163,2463,2511,2528,2529],[868,1423,2148,2150,2151,2155,2463,2511,2528,2529],[868,1423,2164,2165,2463,2511,2528,2529],[868,1423,2127,2148,2151,2155,2167,2168,2169,2463,2511,2528,2529],[868,1423,2127,2146,2148,2149,2150,2463,2511,2528,2529],[868,1423,2176,2463,2511,2528,2529],[88,868,1423,2150,2151,2152,2153,2154,2159,2166,2170,2175,2177,2463,2511,2528,2529],[868,1423,2149,2463,2511,2528,2529],[868,1423,2148,2149,2150,2463,2511,2528,2529],[868,1423,2149,2155,2156,2158,2463,2511,2528,2529],[868,1423,2127,2148,2151,2463,2511,2528,2529],[868,1423,2148,2151,2463,2511,2528,2529],[868,1423,2148,2149,2151,2157,2463,2511,2528,2529],[868,1423,2127,2145,2151,2463,2511,2528,2529],[868,1423,2148,2463,2511,2528,2529],[868,1423,2127,2151,2463,2511,2528,2529],[868,1423,2172,2173,2463,2511,2528,2529],[868,1423,2173,2174,2463,2511,2528,2529],[868,1423,2172,2463,2511,2528,2529],[868,1423,2147,2463,2511,2528,2529],[868,1423,2178,2463,2511,2528,2529],[868,1423,2127,2178,2180,2463,2511,2528,2529],[88,868,1423,2105,2106,2107,2127,2178,2179,2181,2463,2511,2528,2529],[868,1144,1423,2463,2511,2528,2529],[867,1423,2463,2511,2528,2529],[868,1423,2229,2463,2511,2528,2529],[868,1423,2231,2463,2511,2528,2529],[868,1423,1440,2463,2511,2528,2529],[868,1423,2233,2463,2511,2528,2529],[868,1423,1442,2463,2511,2528,2529],[868,1423,2235,2463,2511,2528,2529],[868,1423,1439,2463,2511,2528,2529],[462,792,793,794,868,1423,2463,2511,2528,2529],[97,99,103,109,154,157,792,793,868,1423,2454,2463,2511,2528,2529],[97,99,103,109,794,868,1423,2454,2463,2511,2528,2529],[462,792,796,797,798,868,1423,2463,2511,2528,2529],[99,103,109,157,461,792,868,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,796,868,1423,2454,2463,2511,2528,2529],[797,868,1423,2463,2511,2528,2529],[462,792,800,801,803,868,1423,2463,2511,2528,2529],[99,103,109,802,868,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,800,868,1423,2454,2463,2511,2528,2529],[99,103,109,801,868,1423,2454,2463,2511,2528,2529],[462,792,868,1390,1391,1423,2463,2511,2528,2529],[99,103,109,154,157,792,805,808,838,868,1043,1047,1315,1390,1423,2454,2463,2511,2528,2529],[99,103,109,807,808,868,1045,1047,1391,1423,2454,2463,2511,2528,2529],[462,792,833,834,839,840,841,842,868,1423,2463,2511,2528,2529],[99,103,109,157,792,829,838,868,1423,2454,2463,2511,2528,2529],[99,100,103,109,157,792,829,838,868,1400,1423,2454,2463,2511,2528,2529],[97,99,103,109,151,154,157,461,792,868,1423,2454,2463,2511,2528,2529],[97,99,103,109,833,868,1423,2454,2463,2511,2528,2529],[99,103,109,833,868,1423,2454,2463,2511,2528,2529],[840,841,868,1423,2463,2511,2528,2529],[462,792,844,845,846,868,1423,2463,2511,2528,2529],[99,103,109,844,868,1423,2454,2463,2511,2528,2529],[845,868,1423,2463,2511,2528,2529],[462,792,848,849,850,868,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1423,2454,2463,2511,2528,2529],[99,103,109,848,868,1423,2454,2463,2511,2528,2529],[849,868,1423,2463,2511,2528,2529],[462,792,852,853,854,855,856,857,868,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1423,2454,2457,2463,2511,2528,2529],[99,103,109,853,868,1423,2454,2457,2463,2511,2528,2529],[99,103,109,852,868,1423,2454,2463,2511,2528,2529],[855,856,868,1423,2463,2511,2528,2529],[462,792,859,860,861,863,864,868,1423,2463,2511,2528,2529],[99,103,109,792,859,868,1423,2454,2463,2511,2528,2529],[99,103,109,862,868,1423,2454,2463,2511,2528,2529],[99,103,109,151,157,461,792,868,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,859,868,1423,2454,2463,2511,2528,2529],[99,103,109,859,868,1423,2454,2463,2511,2528,2529],[861,863,868,1423,2463,2511,2528,2529],[462,792,866,868,870,873,1423,2463,2511,2528,2529],[99,103,109,866,868,869,1423,2454,2463,2511,2528,2529],[99,103,109,792,868,869,1423,2454,2463,2511,2528,2529],[99,103,109,868,869,871,1423,2454,2463,2511,2528,2529],[868,870,872,1423,2463,2511,2528,2529],[462,792,868,875,876,877,1423,2463,2511,2528,2529],[99,103,109,868,875,1423,2454,2463,2511,2528,2529],[868,876,1423,2463,2511,2528,2529],[462,792,868,879,880,881,882,883,884,1423,2463,2511,2528,2529],[99,103,109,868,880,1423,2454,2463,2511,2528,2529],[99,103,109,868,879,1423,2454,2463,2511,2528,2529],[868,882,883,1423,2463,2511,2528,2529],[154,462,792,868,886,887,889,890,891,1423,2463,2511,2528,2529],[99,103,109,157,792,868,886,1423,2454,2463,2511,2528,2529],[99,103,109,868,886,887,889,891,1423,2454,2463,2511,2528,2529],[868,888,890,1423,2463,2511,2528,2529],[99,103,109,868,886,887,1423,2454,2463,2511,2528,2529],[868,886,1423,2463,2511,2528,2529],[99,103,109,154,792,868,887,1423,2454,2463,2511,2528,2529],[462,792,868,1001,1002,1003,1423,2463,2511,2528,2529],[99,103,109,151,157,461,792,829,838,868,886,887,889,892,995,997,999,1000,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,829,838,868,886,887,891,892,1001,1423,2454,2463,2511,2528,2529],[868,1002,1423,2463,2511,2528,2529],[462,792,868,1005,1006,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1005,1423,2454,2463,2511,2528,2529],[99,103,109,868,1006,1423,2454,2463,2511,2528,2529],[462,792,868,1008,1009,1010,1011,1012,1013,1423,2463,2511,2528,2529],[99,103,109,868,1009,1423,2454,2463,2511,2528,2529],[99,103,109,151,157,792,868,996,997,1009,1010,1423,2454,2463,2511,2528,2529],[99,103,109,868,1009,1011,1400,1423,2454,2463,2511,2528,2529],[99,103,109,151,157,792,868,996,997,1008,1423,2454,2463,2511,2528,2529],[99,103,109,868,1011,1423,2454,2463,2511,2528,2529],[462,792,868,1015,1016,1423,2463,2511,2528,2529],[99,103,109,154,157,792,868,1015,1423,2454,2463,2511,2528,2529],[99,103,109,868,1016,1423,2454,2463,2511,2528,2529],[462,792,868,1025,1423,2463,2511,2528,2529],[462,792,868,1018,1019,1020,1021,1022,1023,1423,2463,2511,2528,2529],[99,103,109,157,461,792,868,1018,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,868,1019,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,868,1423,2454,2463,2511,2528,2529],[99,103,109,868,1018,1423,2454,2463,2511,2528,2529],[868,1021,1022,1423,2463,2511,2528,2529],[462,792,868,1038,1039,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1036,1037,1038,1423,2454,2463,2511,2528,2529],[99,103,109,807,808,868,1037,1039,1423,2454,2463,2511,2528,2529],[868,1036,1423,2463,2511,2528,2529],[462,792,868,1048,1049,1423,2463,2511,2528,2529],[99,103,109,151,157,792,868,995,996,997,1036,1043,1047,1048,1423,2454,2463,2511,2528,2529],[99,103,109,868,1037,1049,1423,2454,2463,2511,2528,2529],[462,792,868,1086,1087,1088,1089,1423,2463,2511,2528,2529],[99,103,109,157,792,859,865,868,875,878,964,1053,1056,1058,1059,1061,1062,1067,1085,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,859,868,875,964,1053,1058,1059,1061,1067,1086,1400,1423,2454,2463,2511,2528,2529],[99,103,109,868,1086,1423,2454,2463,2511,2528,2529],[99,103,109,779,868,965,997,1086,1088,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1091,1092,1093,1094,1095,1423,2463,2511,2528,2529],[462,792,868,1097,1098,1423,2463,2511,2528,2529],[99,103,109,157,792,868,869,1097,1423,2454,2463,2511,2528,2529],[99,103,109,868,869,1098,1423,2454,2463,2511,2528,2529],[462,792,868,1108,1109,1110,1111,1112,1423,2463,2511,2528,2529],[99,103,109,868,966,997,1423,2454,2463,2511,2528,2529],[99,100,103,109,157,792,868,1100,1107,1109,1400,1423,2454,2463,2511,2528,2529],[868,1111,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1100,1107,1109,1423,2454,2463,2511,2528,2529],[868,869,1423,2463,2511,2528,2529],[462,792,868,1114,1115,1116,1423,2463,2511,2528,2529],[99,100,103,109,157,792,838,868,1100,1107,1109,1113,1400,1423,2454,2463,2511,2528,2529],[868,1115,1423,2463,2511,2528,2529],[99,103,109,157,792,838,868,1100,1107,1109,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1118,1119,1120,1423,2463,2511,2528,2529],[99,103,109,151,157,792,868,1118,1423,2454,2463,2511,2528,2529],[99,103,109,868,1119,1423,2454,2463,2511,2528,2529],[462,792,868,1052,1053,1054,1055,1423,2463,2511,2528,2529],[99,103,109,461,792,868,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1051,1052,1423,2454,2463,2511,2528,2529],[99,103,109,868,1053,1423,2454,2463,2511,2528,2529],[462,792,868,1122,1123,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1122,1423,2454,2463,2511,2528,2529],[99,103,109,868,1123,1423,2454,2463,2511,2528,2529],[462,792,868,1125,1126,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1053,1056,1125,1423,2454,2463,2511,2528,2529],[99,103,109,868,1053,1056,1126,1423,2454,2463,2511,2528,2529],[462,792,868,1131,1132,1133,1134,1135,1136,1423,2463,2511,2528,2529],[99,103,109,157,462,792,868,1129,1400,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,826,827,829,838,859,865,868,1423,2454,2463,2511,2528,2529],[99,103,109,151,154,157,461,462,792,827,829,838,859,862,863,865,868,965,997,1041,1043,1045,1047,1071,1076,1129,1130,1400,1423,2454,2463,2511,2528,2529],[868,1132,1423,2463,2511,2528,2529],[99,103,109,829,838,868,1423,2454,2463,2511,2528,2529],[462,792,868,1138,1139,1140,1423,2463,2511,2528,2529],[99,103,109,868,1138,1423,2454,2463,2511,2528,2529],[868,1139,1423,2463,2511,2528,2529],[462,792,868,1143,1146,1147,1148,1149,1150,1151,1152,1153,1423,2463,2511,2528,2529],[99,103,109,868,1146,1423,2454,2463,2511,2528,2529],[99,103,109,151,154,157,792,868,1146,1423,2454,2463,2511,2528,2529],[99,103,109,868,1146,1147,1423,2454,2463,2511,2528,2529],[99,103,109,151,154,157,792,868,1146,1147,1423,2454,2463,2511,2528,2529],[99,103,109,154,792,868,1143,1146,1147,1423,2454,2463,2511,2528,2529],[868,1149,1150,1423,2463,2511,2528,2529],[99,103,109,151,779,868,1423,2454,2463,2511,2528,2529],[99,103,109,151,154,779,792,868,1142,1143,1145,1147,1423,2454,2463,2511,2528,2529],[99,103,109,792,868,1146,1147,1423,2454,2463,2511,2528,2529],[462,792,868,1128,1129,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1128,1423,2454,2463,2511,2528,2529],[99,103,109,868,1129,1423,2454,2463,2511,2528,2529],[462,792,868,1155,1156,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1155,1423,2454,2463,2511,2528,2529],[99,103,109,868,1156,1423,2454,2463,2511,2528,2529],[462,792,868,1158,1159,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1158,1423,2454,2463,2511,2528,2529],[99,103,109,868,1156,1157,1159,1423,2454,2463,2511,2528,2529],[154,794,795,796,798,799,801,804,805,807,808,827,829,830,831,832,833,834,835,836,837,838,839,842,843,844,846,847,848,850,851,852,853,854,857,858,859,860,864,865,866,868,873,874,875,877,878,879,880,881,884,885,886,887,889,891,892,999,1000,1001,1003,1004,1006,1007,1009,1011,1012,1014,1016,1017,1018,1019,1020,1023,1024,1026,1039,1040,1041,1043,1045,1046,1047,1049,1050,1053,1054,1055,1056,1058,1059,1061,1062,1067,1069,1071,1073,1074,1075,1076,1085,1086,1087,1088,1089,1090,1096,1098,1099,1100,1101,1102,1103,1105,1107,1108,1109,1110,1112,1113,1114,1116,1117,1119,1120,1121,1123,1124,1126,1127,1129,1130,1131,1133,1134,1137,1138,1140,1141,1143,1146,1147,1148,1149,1150,1154,1156,1157,1159,1160,1162,1163,1164,1166,1167,1168,1169,1170,1171,1172,1175,1176,1177,1178,1179,1181,1182,1183,1184,1185,1187,1188,1190,1191,1193,1195,1197,1198,1199,1201,1202,1204,1205,1207,1208,1209,1211,1212,1213,1214,1215,1217,1218,1220,1222,1225,1227,1229,1230,1233,1234,1236,1238,1239,1242,1244,1245,1246,1247,1248,1249,1251,1252,1254,1256,1257,1258,1260,1261,1262,1263,1265,1267,1283,1284,1285,1292,1294,1296,1298,1299,1300,1301,1302,1303,1305,1307,1308,1309,1311,1312,1313,1318,1319,1320,1321,1324,1326,1327,1328,1329,1331,1335,1336,1339,1341,1343,1345,1346,1347,1349,1350,1351,1352,1354,1355,1357,1360,1361,1362,1365,1366,1369,1371,1372,1374,1375,1376,1377,1378,1379,1380,1382,1384,1385,1387,1389,1391,1392,1423,2463,2511,2528,2529],[99,103,109,462,792,868,1373,1423,2454,2463,2511,2528,2529],[462,792,868,1161,1162,1423,2463,2511,2528,2529],[99,103,109,151,157,792,868,1161,1423,2454,2463,2511,2528,2529],[99,103,109,868,1162,1423,2454,2463,2511,2528,2529],[462,792,868,1164,1165,1166,1423,2463,2511,2528,2529],[99,103,109,151,157,461,792,829,838,868,999,1000,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,829,868,1164,1400,1423,2454,2463,2511,2528,2529],[868,1165,1423,2463,2511,2528,2529],[462,792,805,806,807,868,1423,2463,2511,2528,2529],[99,103,109,151,154,157,461,792,868,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,805,868,1423,2454,2463,2511,2528,2529],[806,868,1423,2463,2511,2528,2529],[462,792,868,1060,1061,1423,2463,2511,2528,2529],[99,103,109,157,461,792,868,1060,1423,2454,2463,2511,2528,2529],[99,103,109,868,1061,1423,2454,2463,2511,2528,2529],[99,103,109,868,1375,1376,1377,1378,1423,2454,2463,2511,2528,2529],[99,103,109,868,1375,1376,1423,2454,2463,2511,2528,2529],[99,103,109,868,1375,1423,2454,2463,2511,2528,2529],[99,103,109,779,868,1423,2454,2463,2511,2528,2529],[462,792,868,1362,1364,1365,1423,2463,2511,2528,2529],[868,1362,1423,2463,2511,2528,2529],[99,103,109,154,157,792,805,808,838,868,1043,1047,1315,1362,1363,1364,1423,2454,2463,2511,2528,2529],[99,103,109,807,808,868,1045,1047,1362,1365,1423,2454,2463,2511,2528,2529],[462,792,868,1168,1169,1170,1171,1172,1173,1174,1175,1176,1423,2463,2511,2528,2529],[868,1168,1172,1173,1174,1423,2463,2511,2528,2529],[99,103,109,868,1171,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1169,1423,2454,2457,2463,2511,2528,2529],[99,103,109,868,1169,1170,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,829,838,868,1169,1423,2454,2457,2463,2511,2528,2529],[99,103,109,868,1168,1423,2454,2457,2463,2511,2528,2529],[462,792,868,1380,1381,1423,2463,2511,2528,2529],[99,103,109,151,154,792,805,859,865,868,1423,2454,2463,2511,2528,2529],[868,1380,1423,2463,2511,2528,2529],[462,792,868,1058,1423,2463,2511,2528,2529],[99,103,109,154,157,461,792,868,1057,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,868,1058,1423,2454,2463,2511,2528,2529],[462,792,868,1384,1423,2463,2511,2528,2529],[99,103,109,157,461,792,868,1383,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,868,1384,1423,2454,2463,2511,2528,2529],[97,99,103,109,157,792,868,1178,1423,2454,2463,2511,2528,2529],[97,99,103,109,157,792,868,1423,2454,2463,2511,2528,2529],[462,792,868,1180,1181,1423,2463,2511,2528,2529],[99,103,109,157,461,792,868,1180,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,868,1181,1423,2454,2463,2511,2528,2529],[462,792,868,1183,1184,1423,2463,2511,2528,2529],[462,792,868,1186,1187,1423,2463,2511,2528,2529],[99,103,109,157,461,792,827,829,859,865,868,1041,1043,1047,1186,1400,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,829,859,865,868,1187,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1386,1387,1388,1423,2463,2511,2528,2529],[99,103,109,154,157,792,826,829,838,868,1041,1043,1047,1386,1423,2454,2463,2511,2528,2529],[99,103,109,154,792,829,838,868,1041,1047,1387,1400,1423,2454,2463,2511,2528,2529],[462,792,826,827,828,829,830,831,832,835,836,837,868,1423,2463,2511,2528,2529],[99,103,109,157,792,830,868,1423,2454,2463,2511,2528,2529],[99,103,109,826,868,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,826,827,829,835,836,868,1423,2454,2463,2511,2528,2529],[99,103,109,826,829,837,838,868,1400,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,828,868,1423,2454,2463,2511,2528,2529],[99,103,109,827,829,868,1423,2454,2463,2511,2528,2529],[99,103,109,827,831,868,1423,2454,2463,2511,2528,2529],[99,103,109,827,832,868,1423,2454,2463,2511,2528,2529],[462,792,868,1189,1190,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1189,1423,2454,2463,2511,2528,2529],[99,103,109,868,1190,1423,2454,2463,2511,2528,2529],[462,792,868,1192,1193,1194,1195,1196,1197,1198,1423,2463,2511,2528,2529],[99,103,109,868,1197,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1193,1194,1423,2454,2463,2511,2528,2529],[99,103,109,868,1195,1423,2454,2463,2511,2528,2529],[99,103,109,151,157,792,868,1196,1423,2454,2463,2511,2528,2529],[99,103,109,151,157,792,868,1192,1423,2454,2463,2511,2528,2529],[99,103,109,868,1193,1423,2454,2463,2511,2528,2529],[462,792,868,1200,1201,1423,2463,2511,2528,2529],[99,103,109,151,157,461,792,868,1200,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,868,1201,1423,2454,2463,2511,2528,2529],[462,792,868,1203,1204,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1203,1423,2454,2463,2511,2528,2529],[99,103,109,868,1204,1423,2454,2463,2511,2528,2529],[462,792,868,1206,1207,1208,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1206,1423,2454,2463,2511,2528,2529],[99,103,109,868,1207,1423,2454,2463,2511,2528,2529],[462,792,868,1070,1071,1073,1074,1075,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1070,1423,2454,2463,2511,2528,2529],[99,103,109,868,1071,1423,2454,2463,2511,2528,2529],[99,103,109,868,1072,1423,2454,2463,2511,2528,2529],[99,103,109,868,1073,1423,2454,2463,2511,2528,2529],[99,103,109,151,868,1358,1360,1400,1423,2454,2463,2511,2528,2529],[99,103,109,151,157,792,868,1315,1358,1359,1423,2454,2463,2511,2528,2529],[99,103,109,868,1358,1360,1423,2454,2463,2511,2528,2529],[462,792,868,1222,1224,1225,1423,2463,2511,2528,2529],[99,103,109,157,462,792,829,838,868,1219,1223,1224,1423,2454,2463,2511,2528,2529],[99,100,103,109,868,1212,1213,1219,1220,1423,2454,2463,2511,2528,2529],[99,100,103,109,154,157,462,779,792,829,838,868,999,1000,1041,1043,1045,1047,1129,1130,1219,1221,1223,1225,1400,1423,2454,2463,2511,2528,2529],[99,103,109,868,1045,1047,1219,1225,1423,2454,2463,2511,2528,2529],[99,103,109,868,1222,1423,2454,2463,2511,2528,2529],[462,792,868,1227,1228,1229,1230,1231,1232,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1227,1423,2454,2463,2511,2528,2529],[99,103,109,157,462,792,829,838,868,1223,1228,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,462,779,792,829,838,868,999,1000,1041,1043,1045,1047,1071,1076,1129,1130,1219,1223,1227,1229,1400,1423,2454,2463,2511,2528,2529],[99,103,109,868,1227,1423,2454,2463,2511,2528,2529],[99,103,109,868,1226,1229,1423,2454,2463,2511,2528,2529],[462,792,868,1235,1236,1237,1238,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1237,1423,2454,2463,2511,2528,2529],[99,103,109,868,1238,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,975,997,1235,1423,2454,2463,2511,2528,2529],[99,103,109,868,1236,1423,2454,2463,2511,2528,2529],[462,792,868,1240,1242,1244,1423,2463,2511,2528,2529],[99,103,109,868,1241,1242,1423,2454,2463,2511,2528,2529],[99,103,109,868,1242,1243,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,826,868,1240,1241,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,838,868,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1246,1247,1248,1423,2463,2511,2528,2529],[97,99,103,109,154,157,792,868,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,868,1246,1423,2454,2463,2511,2528,2529],[462,792,868,1368,1369,1370,1371,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1370,1423,2454,2463,2511,2528,2529],[99,103,109,868,1371,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1367,1368,1423,2454,2463,2511,2528,2529],[99,103,109,868,1367,1369,1423,2454,2463,2511,2528,2529],[462,792,868,1250,1251,1423,2463,2511,2528,2529],[99,103,109,157,792,868,869,1250,1423,2454,2463,2511,2528,2529],[99,103,109,868,869,1251,1423,2454,2463,2511,2528,2529],[462,792,868,1253,1254,1255,1256,1257,1423,2463,2511,2528,2529],[99,103,109,157,461,792,868,1255,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,868,1254,1256,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1253,1423,2454,2463,2511,2528,2529],[99,103,109,868,1254,1423,2454,2463,2511,2528,2529],[462,792,868,1259,1260,1423,2463,2511,2528,2529],[99,103,109,151,157,461,792,868,1259,1423,2454,2463,2511,2528,2529],[99,103,109,868,1260,1423,2454,2463,2511,2528,2529],[462,792,868,1262,1263,1265,1267,1283,1284,1285,1292,1293,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1264,1423,2454,2463,2511,2528,2529],[99,103,109,868,1263,1423,2454,2463,2511,2528,2529],[99,100,103,109,868,1423,2454,2463,2511,2528,2529],[99,103,109,868,1273,1423,2454,2463,2511,2528,2529],[99,100,103,109,868,1272,1423,2454,2463,2511,2528,2529],[99,103,109,868,1275,1423,2454,2463,2511,2528,2529],[99,100,103,109,868,1263,1264,1270,1423,2454,2463,2511,2528,2529],[99,100,103,109,157,792,868,1264,1277,1278,1423,2454,2463,2511,2528,2529],[868,1271,1272,1274,1276,1279,1280,1281,1423,2463,2511,2528,2529],[99,100,103,109,157,792,868,1263,1264,1265,1423,2454,2463,2511,2528,2529],[99,103,109,868,1262,1423,2454,2463,2511,2528,2529],[868,1211,1269,1278,1286,1287,1288,1289,1423,2463,2511,2528,2529],[99,103,109,868,1284,1423,2454,2463,2511,2528,2529],[99,103,109,868,1263,1267,1423,2454,2463,2511,2528,2529],[99,103,109,868,1263,1267,1286,1423,2454,2463,2511,2528,2529],[99,103,109,868,966,997,1263,1265,1266,1267,1268,1423,2454,2463,2511,2528,2529],[99,103,109,868,1211,1220,1267,1268,1423,2454,2463,2511,2528,2529],[99,103,109,868,1267,1278,1423,2454,2463,2511,2528,2529],[99,103,109,792,868,1220,1263,1264,1423,2454,2463,2511,2528,2529],[99,103,109,868,1264,1423,2454,2463,2511,2528,2529],[99,103,109,868,1263,1264,1423,2454,2463,2511,2528,2529],[99,103,109,868,965,966,997,1267,1271,1282,1291,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1263,1264,1423,2454,2463,2511,2528,2529],[99,100,103,109,157,792,868,1211,1218,1220,1263,1264,1266,1423,2454,2463,2511,2528,2529],[99,100,103,109,157,792,868,1211,1262,1263,1264,1265,1266,1267,1269,1271,1272,1282,1400,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1262,1263,1264,1265,1266,1423,2454,2463,2511,2528,2529],[99,103,109,152,868,1262,1423,2454,2463,2511,2528,2529],[99,103,109,868,1211,1263,1265,1266,1267,1268,1269,1290,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1067,1069,1082,1083,1084,1423,2463,2511,2528,2529],[99,103,109,868,1067,1069,1423,2454,2463,2511,2528,2529],[99,103,109,868,965,997,1063,1067,1069,1423,2454,2463,2511,2528,2529],[99,103,109,868,1064,1067,1423,2454,2463,2511,2528,2529],[99,103,109,868,1064,1067,1068,1423,2454,2463,2511,2528,2529],[99,103,109,151,868,1009,1010,1013,1014,1045,1067,1069,1400,1423,2454,2463,2511,2528,2529],[99,103,109,868,1064,1066,1067,1069,1423,2454,2463,2511,2528,2529],[99,103,109,151,868,965,997,1009,1010,1013,1014,1064,1066,1067,1069,1400,1423,2454,2463,2511,2528,2529],[99,103,109,868,1064,1065,1067,1069,1423,2454,2463,2511,2528,2529],[99,103,109,151,157,462,776,792,868,965,997,1009,1010,1013,1045,1063,1064,1065,1066,1067,1069,1071,1076,1078,1079,1080,1081,1400,1423,2454,2463,2511,2528,2529],[99,103,109,151,154,792,868,1064,1066,1068,1069,1423,2454,2463,2511,2528,2529],[868,1083,1423,2463,2511,2528,2529],[99,103,109,868,1045,1047,1067,1069,1423,2454,2463,2511,2528,2529],[462,792,868,1295,1296,1298,1299,1300,1301,1423,2463,2511,2528,2529],[99,103,109,868,1296,1299,1300,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,868,1297,1301,1423,2454,2463,2511,2528,2529],[99,103,109,868,1298,1301,1423,2454,2463,2511,2528,2529],[99,100,103,109,157,792,868,1298,1301,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1295,1423,2454,2463,2511,2528,2529],[99,103,109,868,1296,1423,2454,2463,2511,2528,2529],[99,100,103,109,154,157,792,868,1299,1301,1423,2454,2463,2511,2528,2529],[462,792,868,998,999,1423,2463,2511,2528,2529],[99,103,109,151,157,792,868,998,1423,2454,2463,2511,2528,2529],[99,103,109,868,999,1423,2454,2463,2511,2528,2529],[462,792,868,1303,1304,1423,2463,2511,2528,2529],[99,103,109,151,157,792,868,1423,2454,2463,2511,2528,2529],[99,103,109,151,868,1303,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1100,1101,1102,1103,1105,1106,1423,2463,2511,2528,2529],[99,103,109,157,792,826,868,869,1100,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,826,838,868,869,1423,2454,2463,2511,2528,2529],[99,103,109,868,869,1100,1423,2454,2463,2511,2528,2529],[99,103,109,868,1104,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,869,1423,2454,2463,2511,2528,2529],[99,100,103,109,157,792,838,868,1100,1400,1423,2454,2463,2511,2528,2529],[868,869,1100,1423,2463,2511,2528,2529],[462,792,868,1306,1307,1423,2463,2511,2528,2529],[99,103,109,151,157,461,792,829,838,868,995,997,1306,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,829,868,1307,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1309,1310,1311,1312,1423,2463,2511,2528,2529],[99,103,109,157,461,792,868,1310,1423,2454,2463,2511,2528,2529],[99,103,109,868,1311,1423,2454,2463,2511,2528,2529],[99,103,109,868,1309,1423,2454,2463,2511,2528,2529],[462,792,868,1041,1043,1044,1045,1046,1423,2463,2511,2528,2529],[99,103,109,154,792,868,1041,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,829,837,838,868,982,996,997,1042,1423,2454,2463,2511,2528,2529],[99,103,109,829,837,838,868,1043,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,827,829,835,838,868,969,997,1041,1043,1044,1423,2454,2463,2511,2528,2529],[99,103,109,154,792,829,838,868,1041,1043,1045,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,827,832,838,868,1423,2454,2463,2511,2528,2529],[462,792,868,1351,1352,1353,1354,1355,1356,1423,2463,2511,2528,2529],[99,103,109,157,792,868,988,1423,2454,2463,2511,2528,2529],[99,103,109,157,461,792,868,988,1351,1352,1423,2454,2463,2511,2528,2529],[99,103,109,868,988,1352,1355,1423,2454,2463,2511,2528,2529],[99,103,109,157,461,792,868,988,1351,1352,1353,1423,2454,2463,2511,2528,2529],[99,103,109,868,988,1352,1354,1400,1423,2454,2463,2511,2528,2529],[99,103,109,859,865,868,1423,2454,2463,2511,2528,2529],[462,792,868,1317,1318,1423,2463,2511,2528,2529],[99,103,109,792,868,1314,1315,1318,1423,2454,2463,2511,2528,2529],[99,103,109,868,1316,1318,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,868,1315,1317,1423,2454,2463,2511,2528,2529],[462,792,868,1329,1330,1423,2463,2511,2528,2529],[868,1229,1233,1326,1328,1423,2463,2511,2528,2529],[99,103,109,157,792,829,838,868,1229,1233,1321,1328,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1334,1335,1423,2463,2511,2528,2529],[868,1334,1423,2463,2511,2528,2529],[99,103,109,868,1009,1211,1220,1321,1333,1400,1423,2454,2463,2511,2528,2529],[99,103,109,461,792,868,1332,1423,2454,2463,2511,2528,2529],[99,103,109,792,868,1014,1321,1333,1423,2454,2463,2511,2528,2529],[462,792,868,1320,1321,1324,1325,1326,1327,1423,2463,2511,2528,2529],[868,1325,1423,2463,2511,2528,2529],[154,792,868,1321,1322,1423,2463,2511,2528,2529],[868,1321,1323,1423,2463,2511,2528,2529],[99,103,109,868,1321,1322,1323,1324,1423,2454,2463,2511,2528,2529],[99,103,109,157,462,792,868,1321,1323,1423,2454,2463,2511,2528,2529],[99,103,109,868,1320,1322,1323,1324,1423,2454,2463,2511,2528,2529],[99,103,109,151,154,157,462,792,868,965,997,1009,1010,1013,1129,1320,1321,1322,1323,1400,1423,2454,2463,2511,2528,2529],[462,792,868,1338,1339,1341,1343,1345,1346,1423,2463,2511,2528,2529],[868,1339,1423,2463,2511,2528,2529],[99,103,109,154,157,792,868,1337,1339,1340,1423,2454,2463,2511,2528,2529],[99,103,109,154,792,868,1337,1339,1341,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1344,1423,2454,2463,2511,2528,2529],[99,103,109,868,1345,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1339,1342,1423,2454,2463,2511,2528,2529],[99,103,109,868,1339,1343,1423,2454,2463,2511,2528,2529],[99,103,109,154,157,792,868,1337,1338,1423,2454,2463,2511,2528,2529],[99,103,109,154,792,868,1339,1423,2454,2463,2511,2528,2529],[868,1211,1212,1213,1214,1215,1217,1218,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1211,1215,1216,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1211,1217,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1211,1423,2454,2463,2511,2528,2529],[99,103,109,157,792,868,1211,1400,1423,2454,2463,2511,2528,2529],[99,103,109,868,1210,1423,2454,2463,2511,2528,2529],[462,792,868,1348,1349,1423,2463,2511,2528,2529],[99,103,109,157,792,868,1348,1423,2454,2463,2511,2528,2529],[99,103,109,868,1349,1423,2454,2463,2511,2528,2529],[99,103,109,868,1088,1393,1423,2454,2463,2511,2528,2529],[868,1078,1395,1396,1397,1423,2463,2511,2528,2529],[99,103,109,868,1077,1423,2454,2463,2511,2528,2529],[868,893,894,895,896,897,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,989,990,991,992,993,994,995,996,1423,2463,2511,2528,2529],[779,868,1423,2463,2511,2528,2529],[99,103,109,868,988,1423,2454,2463,2511,2528,2529],[99,103,109,154,779,792,868,898,964,1423,2454,2463,2511,2528,2529],[99,103,109,868,966,1423,2454,2463,2511,2528,2529],[99,103,109,147,148,149,150,151,152,153,154,794,795,796,798,799,801,804,805,807,808,827,829,830,831,832,833,834,835,836,837,838,839,842,843,844,846,847,848,850,851,852,853,854,857,858,859,860,864,865,866,868,869,873,874,875,877,878,879,880,881,884,885,886,887,889,891,892,893,894,895,896,897,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,989,990,991,992,993,994,995,996,997,999,1000,1001,1003,1004,1006,1007,1009,1011,1012,1014,1016,1017,1018,1019,1020,1023,1024,1026,1039,1040,1041,1043,1045,1046,1047,1049,1050,1053,1054,1055,1056,1058,1059,1061,1062,1067,1069,1071,1073,1074,1075,1076,1078,1085,1086,1087,1088,1089,1090,1096,1098,1099,1100,1101,1102,1103,1105,1107,1108,1109,1110,1112,1113,1114,1116,1117,1119,1120,1121,1123,1124,1126,1127,1129,1130,1131,1133,1134,1137,1138,1140,1141,1143,1146,1147,1148,1149,1150,1154,1156,1157,1159,1160,1162,1163,1164,1166,1167,1168,1169,1170,1171,1172,1175,1176,1177,1178,1179,1181,1182,1183,1184,1185,1187,1188,1190,1191,1193,1195,1197,1198,1199,1201,1202,1204,1205,1207,1208,1209,1211,1212,1213,1214,1215,1217,1218,1222,1225,1227,1229,1230,1233,1234,1236,1238,1239,1242,1244,1245,1246,1247,1248,1249,1251,1252,1254,1256,1257,1258,1260,1261,1262,1263,1265,1267,1283,1284,1285,1292,1294,1296,1298,1299,1300,1301,1302,1303,1305,1307,1308,1309,1311,1312,1313,1318,1319,1320,1321,1324,1326,1327,1328,1329,1331,1335,1336,1339,1341,1343,1345,1346,1347,1349,1350,1351,1352,1354,1355,1357,1360,1361,1362,1365,1366,1369,1371,1372,1374,1375,1376,1377,1378,1379,1380,1382,1384,1385,1387,1389,1391,1392,1393,1394,1395,1396,1397,1398,1399,1423,2454,2463,2511,2528,2529],[106,868,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,1423,2463,2511,2528,2529],[99,103,109,868,1088,1090,1423,2454,2463,2511,2528,2529],[776,868,1423,2463,2511,2528,2529],[158,159,160,161,162,163,868,1423,2463,2511,2528,2529],[154,155,156,157,158,159,160,161,162,163,164,165,461,462,463,464,465,466,467,469,777,780,781,782,783,784,785,786,787,788,789,790,791,868,1423,2463,2511,2528,2529],[90,154,792,868,1423,2463,2511,2528,2529],[97,868,1423,2463,2511,2528,2529],[99,103,109,460,868,1423,2454,2463,2511,2528,2529],[155,156,157,165,461,462,463,464,465,466,467,468,868,1423,2463,2511,2528,2529],[99,103,109,462,868,1423,2454,2463,2511,2528,2529],[155,156,157,868,1423,2463,2511,2528,2529],[99,103,109,157,868,1423,2454,2463,2511,2528,2529],[99,103,109,155,156,868,1423,2454,2463,2511,2528,2529],[151,868,1423,2463,2511,2528,2529],[148,151,868,1423,2463,2511,2528,2529],[868,1423,2240,2463,2511,2528,2529],[868,1423,1472,2463,2511,2528,2529],[868,1423,1470,1471,1473,2463,2511,2528,2529],[868,1423,1472,1476,1479,1481,1482,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,2463,2511,2528,2529],[868,1423,1472,1476,1477,2463,2511,2528,2529],[868,1423,1472,1476,2463,2511,2528,2529],[868,1423,1472,1473,1526,2463,2511,2528,2529],[868,1423,1478,2463,2511,2528,2529],[868,1423,1478,1483,2463,2511,2528,2529],[868,1423,1478,1482,2463,2511,2528,2529],[868,1423,1475,1478,1482,2463,2511,2528,2529],[868,1423,1478,1481,1504,2463,2511,2528,2529],[868,1423,1476,1478,2463,2511,2528,2529],[868,1423,1475,2463,2511,2528,2529],[868,1423,1472,1480,2463,2511,2528,2529],[868,1423,1476,1480,1481,1482,2463,2511,2528,2529],[868,1423,1475,1476,2463,2511,2528,2529],[868,1423,1472,1473,2463,2511,2528,2529],[868,1423,1472,1473,1526,1528,2463,2511,2528,2529],[868,1423,1472,1529,2463,2511,2528,2529],[868,1423,1536,1537,1538,2463,2511,2528,2529],[868,1423,1472,1526,1527,2463,2511,2528,2529],[868,1423,1472,1474,1541,2463,2511,2528,2529],[868,1423,1530,1532,2463,2511,2528,2529],[868,1423,1529,1532,2463,2511,2528,2529],[868,1423,1472,1481,1490,1526,1527,1528,1529,1532,1533,1534,1535,1539,1540,2463,2511,2528,2529],[868,1423,1507,1532,2463,2511,2528,2529],[868,1423,1530,1531,2463,2511,2528,2529],[868,1423,1472,1541,2463,2511,2528,2529],[868,1423,1529,1533,1534,2463,2511,2528,2529],[868,1423,1532,2463,2511,2528,2529],[868,1423,1954,1955,1956,1957,2463,2511,2528,2529],[868,1423,1954,1955,1956,2463,2511,2528,2529],[868,1423,1954,2463,2511,2528,2529],[868,1423,1954,1955,2463,2511,2528,2529],[775,868,1423,2463,2511,2528,2529],[99,103,108,868,1423,2454,2463,2511,2528,2529],[868,1423,2463,2511,2528,2529,2583],[868,1423,2463,2511,2528,2529,2581,2583],[868,1423,2463,2511,2528,2529,2572,2580,2581,2582,2584,2586],[868,1423,2463,2511,2528,2529,2570],[868,1423,2463,2511,2528,2529,2573,2578,2583,2586],[868,1423,2463,2511,2528,2529,2569,2586],[868,1423,2463,2511,2528,2529,2573,2574,2577,2578,2579,2586],[868,1423,2463,2511,2528,2529,2573,2574,2575,2577,2578,2586],[868,1423,2463,2511,2528,2529,2570,2571,2572,2573,2574,2578,2579,2580,2582,2583,2584,2586],[868,1423,2463,2511,2528,2529,2586],[868,1423,2463,2511,2528,2529,2568,2570,2571,2572,2573,2574,2575,2577,2578,2579,2580,2581,2582,2583,2584,2585],[868,1423,2463,2511,2528,2529,2568,2586],[868,1423,2463,2511,2528,2529,2573,2575,2576,2578,2579,2586],[868,1423,2463,2511,2528,2529,2577,2586],[868,1423,2463,2511,2528,2529,2578,2579,2583,2586],[868,1423,2463,2511,2528,2529,2571,2581],[868,1423,1739,2463,2511,2528,2529],[868,1423,1740,1741,1742,2463,2511,2528,2529],[868,1423,1740,1741,1743,2463,2511,2528,2529],[868,1423,2463,2511,2528,2529,2563,2618,2619],[868,1423,2463,2511,2528,2529,2562,2563],[868,1423,2463,2511,2528,2529,2568,2607],[868,1423,2463,2511,2528,2529,2594],[868,1423,2463,2511,2528,2529,2590,2607],[868,1423,2463,2511,2528,2529,2589,2590,2591,2594,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615],[868,1423,2463,2511,2528,2529,2611],[868,1423,2463,2511,2528,2529,2589,2591,2594,2612,2613],[868,1423,2463,2511,2528,2529,2610,2614],[868,1423,2463,2511,2528,2529,2589,2592,2593],[868,1423,2463,2511,2528,2529,2592],[868,1423,2463,2511,2528,2529,2589,2590,2591,2594,2606],[868,1423,2463,2511,2528,2529,2595,2600,2606],[868,1423,2463,2511,2528,2529,2606],[868,1423,2463,2511,2528,2529,2595,2606],[868,1423,2463,2511,2528,2529,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605],[868,1423,2127,2160,2463,2511,2528,2529],[868,1423,2127,2463,2511,2528,2529],[868,1423,2160,2161,2162,2463,2511,2528,2529],[868,1423,2127,2161,2463,2511,2528,2529],[868,1423,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2126,2463,2511,2528,2529],[868,1423,2109,2110,2127,2463,2511,2528,2529],[868,1423,2109,2127,2463,2511,2528,2529],[868,1423,2120,2127,2463,2511,2528,2529],[868,1423,2122,2123,2124,2125,2463,2511,2528,2529],[868,1423,2111,2127,2463,2511,2528,2529],[868,1423,2136,2463,2511,2528,2529],[868,1423,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2463,2511,2528,2529],[868,1423,2128,2136,2138,2463,2511,2528,2529],[868,1423,2134,2136,2143,2463,2511,2528,2529],[868,1423,2138,2463,2511,2528,2529],[868,1423,2136,2138,2463,2511,2528,2529],[868,1423,2137,2463,2511,2528,2529],[868,1423,2128,2136,2463,2511,2528,2529],[868,1423,2129,2130,2131,2132,2133,2134,2135,2137,2463,2511,2528,2529],[868,1423,2463,2511,2528,2529,2631],[868,1423,1929,2463,2511,2528,2529],[868,1423,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,2463,2511,2528,2529],[868,1423,1563,2463,2511,2528,2529],[868,1423,1623,2463,2511,2528,2529],[868,1423,1618,1619,2463,2511,2528,2529],[99,103,109,868,1423,1688,2454,2463,2511,2528,2529],[868,1423,1691,2463,2511,2528,2529],[99,103,109,868,1423,1637,1721,2454,2463,2511,2528,2529],[99,103,109,868,1423,1620,1637,1721,2454,2463,2511,2528,2529],[99,103,109,868,1423,1721,2454,2463,2511,2528,2529],[868,1423,1697,2463,2511,2528,2529],[99,103,109,868,1423,1665,2454,2463,2511,2528,2529],[99,103,109,868,1423,1721,1725,2454,2463,2511,2528,2529],[868,1423,1701,2463,2511,2528,2529],[868,1423,1629,1630,2463,2511,2528,2529],[868,1423,1628,2463,2511,2528,2529],[99,103,109,868,1423,1621,2454,2463,2511,2528,2529],[99,103,109,868,1423,1642,2454,2463,2511,2528,2529],[868,1423,1639,1640,2463,2511,2528,2529],[868,1423,1642,2463,2511,2528,2529],[868,1423,1639,2463,2511,2528,2529],[868,1423,1634,2463,2511,2528,2529],[868,1423,1665,1672,1704,1719,1720,1951,2463,2511,2528,2529],[99,103,109,868,1423,1705,2454,2463,2511,2528,2529],[99,103,109,868,1423,1634,1659,2454,2463,2511,2528,2529],[868,1423,1673,2463,2511,2528,2529],[868,1423,1675,2463,2511,2528,2529],[868,1423,1728,2463,2511,2528,2529],[99,103,109,868,1423,1634,1665,2454,2463,2511,2528,2529],[868,1423,1678,2463,2511,2528,2529],[868,1423,1730,2463,2511,2528,2529],[99,103,109,868,1423,1637,1665,2454,2463,2511,2528,2529],[868,1423,1732,2463,2511,2528,2529],[99,103,109,868,1423,1634,1635,1665,2454,2463,2511,2528,2529],[868,1423,1666,2463,2511,2528,2529],[868,1423,1707,2463,2511,2528,2529],[868,1423,1647,2463,2511,2528,2529],[868,1423,1734,2463,2511,2528,2529],[868,1423,1681,2463,2511,2528,2529],[99,103,109,868,1423,1665,1721,2454,2463,2511,2528,2529],[99,103,109,868,1423,1634,1654,1684,1721,2454,2463,2511,2528,2529],[99,103,109,868,1423,1616,2454,2463,2511,2528,2529],[868,1423,1736,2463,2511,2528,2529],[99,103,109,868,1423,1639,1642,2454,2463,2511,2528,2529],[868,1423,1947,2463,2511,2528,2529],[99,103,109,868,1423,1641,1642,1738,1946,2454,2463,2511,2528,2529],[868,1423,1949,2463,2511,2528,2529],[868,1423,1661,2463,2511,2528,2529],[868,1423,1660,2463,2511,2528,2529],[868,1423,1626,2463,2511,2528,2529],[868,1423,1686,2463,2511,2528,2529],[868,1423,1711,2463,2511,2528,2529],[99,103,109,868,1423,1663,2454,2463,2511,2528,2529],[868,1423,1624,1625,1638,1642,1643,1644,1645,1646,1648,1722,1723,1724,1725,1726,1727,1729,1731,1733,1735,1737,1948,1950,2463,2511,2528,2529],[868,1423,1617,1620,1622,1638,1642,1643,1644,1645,1646,1648,1951,2463,2511,2528,2529],[868,1423,1617,1620,1622,1627,1631,2463,2511,2528,2529],[868,1423,1632,1671,2463,2511,2528,2529],[868,1423,1667,1668,1669,1670,2463,2511,2528,2529],[868,1423,1674,1676,1677,1679,1680,1682,1683,1685,1687,1689,1690,1692,1693,1694,1695,1696,1698,1699,1700,1702,1703,2463,2511,2528,2529],[868,1423,1706,1708,1709,1710,1712,1713,1714,1715,1716,1717,1718,2463,2511,2528,2529],[868,1423,1654,2463,2511,2528,2529],[868,1423,1653,2463,2511,2528,2529],[99,103,109,868,1423,1637,1642,2454,2463,2511,2528,2529],[99,103,109,868,1423,1620,1637,1642,1644,2454,2463,2511,2528,2529],[868,1423,1637,1641,2463,2511,2528,2529],[868,1423,1616,1635,1638,1642,1643,1644,1645,1646,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,2463,2511,2528,2529],[868,1423,1649,2463,2511,2528,2529],[868,1423,1637,2463,2511,2528,2529],[99,103,109,868,1423,1635,1660,2454,2463,2511,2528,2529],[868,1423,1635,2463,2511,2528,2529],[99,103,109,868,1423,1635,1649,2454,2463,2511,2528,2529],[868,1423,2463,2476,2480,2511,2528,2529,2554],[868,1423,2463,2476,2511,2528,2529,2543,2554],[868,1423,2463,2471,2511,2528,2529],[868,1423,2463,2473,2476,2511,2528,2529,2551,2554],[868,1423,2463,2511,2528,2529,2531,2551],[868,1423,2463,2471,2511,2528,2529,2561],[868,1423,2463,2473,2476,2511,2528,2529,2531,2554],[868,1423,2463,2468,2469,2472,2475,2511,2522,2528,2529,2543,2554],[868,1423,2463,2476,2483,2511,2528,2529],[868,1423,2463,2468,2474,2511,2528,2529],[868,1423,2463,2476,2497,2498,2511,2528,2529],[868,1423,2463,2472,2476,2511,2528,2529,2546,2554,2561],[868,1423,2463,2497,2511,2528,2529,2561],[868,1423,2463,2470,2471,2511,2528,2529,2561],[868,1423,2463,2476,2511,2528,2529],[868,1423,2463,2470,2471,2472,2473,2474,2475,2476,2477,2478,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2498,2499,2500,2501,2502,2503,2511,2528,2529],[868,1423,2463,2476,2491,2511,2528,2529],[868,1423,2463,2476,2483,2484,2511,2528,2529],[868,1423,2463,2474,2476,2484,2485,2511,2528,2529],[868,1423,2463,2475,2511,2528,2529],[868,1423,2463,2468,2471,2476,2511,2528,2529],[868,1423,2463,2476,2480,2484,2485,2511,2528,2529],[868,1423,2463,2480,2511,2528,2529],[868,1423,2463,2474,2476,2479,2511,2528,2529,2554],[868,1423,2463,2468,2473,2476,2483,2511,2528,2529],[868,1423,2463,2511,2528,2529,2543],[868,1423,2463,2471,2476,2497,2511,2528,2529,2559,2561],[868,1423,2463,2511,2528,2529,2620,2628,2629,2630,2632],[868,1423,2463,2511,2528,2529,2620,2628],[868,1423,2463,2511,2528,2529,2629],[868,1423,2463,2511,2528,2529,2633,2634],[868,1423,2463,2511,2528,2529,2633,2634,2635],[868,1423,2463,2511,2528,2529,2634,2638,2639],[868,1423,2463,2511,2528,2529,2634,2638],[868,1423,2463,2511,2528,2529,2619,2634,2638,2639],[868,1423,2463,2511,2528,2529,2563,2567,2618,2619,2637],[868,1423,2463,2511,2528,2529,2619],[868,1423,2463,2511,2528,2529,2619,2643],[87,868,1423,2463,2511,2528,2529],[83,84,86,868,1423,2463,2511,2522,2523,2525,2526,2527,2528,2529,2531,2543,2551,2554,2560,2561,2563,2564,2565,2566,2567,2587,2588,2617,2618,2619],[83,84,85,868,1423,2463,2511,2528,2529,2565],[83,868,1423,2463,2511,2528,2529],[84,868,1423,2463,2511,2528,2529],[85,86,868,1423,2463,2511,2528,2529],[868,1423,2463,2511,2528,2529,2616],[868,1423,2463,2511,2528,2529,2563,2619],[99,103,109,868,1423,1438,1439,1441,1442,1443,2454,2463,2511,2528,2529],[99,102,103,109,868,1423,2454,2463,2511,2528,2529],[94,98,868,1423,2463,2511,2528,2529],[98,868,1423,2463,2511,2528,2529],[99,103,109,868,1423,2046,2047,2454,2463,2511,2528,2529],[99,103,109,868,1423,2046,2454,2463,2511,2528,2529],[99,103,109,868,1423,2029,2454,2463,2511,2528,2529],[99,103,109,868,1423,2031,2454,2463,2511,2528,2529],[99,103,109,868,1423,2031,2032,2454,2463,2511,2528,2529],[868,1423,2029,2463,2511,2528,2529],[99,103,109,868,1423,2034,2454,2463,2511,2528,2529],[99,103,109,868,1423,2036,2454,2463,2511,2528,2529],[99,103,109,868,1423,2036,2037,2038,2454,2463,2511,2528,2529],[868,1423,2067,2463,2511,2528,2529],[868,1423,2030,2033,2035,2039,2040,2045,2048,2050,2051,2052,2054,2055,2059,2061,2063,2066,2068,2069,2463,2511,2528,2529],[99,103,109,868,1423,2049,2454,2463,2511,2528,2529],[868,1423,2041,2042,2463,2511,2528,2529],[868,1423,2043,2044,2463,2511,2528,2529],[868,1423,2064,2065,2463,2511,2528,2529],[99,103,109,868,1423,2064,2454,2463,2511,2528,2529],[868,1423,2056,2057,2058,2463,2511,2528,2529],[99,103,109,868,1423,2056,2454,2463,2511,2528,2529],[99,103,109,868,1423,2053,2454,2463,2511,2528,2529],[99,103,109,868,1423,2060,2454,2463,2511,2528,2529],[99,103,109,868,1423,2062,2454,2463,2511,2528,2529],[99,103,109,868,1423,2071,2454,2463,2511,2528,2529],[868,1423,2022,2028,2070,2072,2463,2511,2528,2529],[868,1423,2023,2024,2463,2511,2528,2529],[99,103,109,868,1423,2023,2454,2463,2511,2528,2529],[99,103,109,868,1423,2021,2022,2454,2463,2511,2528,2529],[99,103,109,868,1423,2016,2025,2454,2463,2511,2528,2529],[99,103,109,868,1423,2016,2021,2454,2463,2511,2528,2529],[868,1423,2021,2463,2511,2528,2529],[868,1423,2026,2027,2463,2511,2528,2529],[868,1423,2017,2018,2019,2020,2463,2511,2528,2529],[868,1423,2017,2018,2019,2463,2511,2528,2529],[868,1423,2017,2463,2511,2528,2529],[868,1423,2017,2018,2463,2511,2528,2529],[111,113,114,115,116,117,118,119,120,121,122,123,868,1423,2463,2511,2528,2529],[111,112,114,115,116,117,118,119,120,121,122,123,868,1423,2463,2511,2528,2529],[112,113,114,115,116,117,118,119,120,121,122,123,868,1423,2463,2511,2528,2529],[111,112,113,115,116,117,118,119,120,121,122,123,868,1423,2463,2511,2528,2529],[111,112,113,114,116,117,118,119,120,121,122,123,868,1423,2463,2511,2528,2529],[111,112,113,114,115,117,118,119,120,121,122,123,868,1423,2463,2511,2528,2529],[111,112,113,114,115,116,118,119,120,121,122,123,868,1423,2463,2511,2528,2529],[111,112,113,114,115,116,117,119,120,121,122,123,868,1423,2463,2511,2528,2529],[111,112,113,114,115,116,117,118,120,121,122,123,868,1423,2463,2511,2528,2529],[111,112,113,114,115,116,117,118,119,121,122,123,868,1423,2463,2511,2528,2529],[111,112,113,114,115,116,117,118,119,120,122,123,868,1423,2463,2511,2528,2529],[111,112,113,114,115,116,117,118,119,120,121,123,868,1423,2463,2511,2528,2529],[111,112,113,114,115,116,117,118,119,120,121,122,868,1423,2463,2511,2528,2529],[868,1422,2463,2511,2528,2529],[868,1423,1424,2463,2511,2528,2529],[100,868,1423,1576,2463,2511,2528,2529],[100,124,126,132,868,1423,1576,1578,2463,2511,2528,2529],[100,124,868,1423,1576,2463,2511,2528,2529],[99,100,101,103,105,106,107,109,133,136,868,1423,1578,1580,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,129,868,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1457,2015,2454,2463,2511,2528,2529],[88,99,100,101,103,109,133,460,868,1401,1423,1433,1453,1461,1636,1637,2015,2076,2077,2078,2079,2082,2096,2097,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1579,2454,2457,2463,2511,2528,2529],[99,100,101,103,105,109,868,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2101,2454,2463,2511,2528,2529],[88,99,100,101,103,109,868,1406,1423,2182,2189,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1401,1423,2184,2454,2463,2511,2528,2529],[100,460,868,1423,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,2193,2194,2195,2454,2463,2511,2528,2529],[99,100,101,103,105,109,868,1400,1423,2193,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1406,1423,2194,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1406,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1436,1585,2198,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2198,2454,2463,2511,2528,2529],[100,868,1423,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2198,2199,2200,2201,2202,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2184,2198,2203,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2205,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2185,2454,2463,2511,2528,2529],[99,100,103,109,868,1400,1401,1423,1436,1453,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,2185,2186,2187,2454,2463,2511,2528,2529],[99,100,101,103,105,109,868,1401,1423,1453,1578,2183,2184,2185,2187,2188,2189,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1467,2454,2463,2511,2528,2529],[99,100,101,103,105,109,868,1400,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2015,2073,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1401,1423,1433,1467,1468,1469,1542,1543,1577,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,124,126,133,868,1400,1401,1423,1454,1455,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1433,2079,2223,2454,2463,2511,2528,2529],[99,100,103,109,868,1423,1577,2454,2463,2511,2528,2529],[100,130,136,868,1423,2463,2511,2528,2529],[100,103,868,1423,2457,2463,2511,2528,2529],[100,868,1401,1423,2226,2463,2511,2528,2529],[99,100,103,109,133,868,1423,2454,2463,2511,2528,2529],[100,868,1423,1441,2230,2232,2234,2236,2463,2511,2528,2529],[99,100,103,109,460,868,1423,2454,2463,2511,2528,2529],[88,99,100,103,109,868,1423,2239,2240,2454,2463,2511,2528,2529],[99,100,103,109,868,1423,2242,2454,2463,2511,2528,2529],[99,100,103,109,868,1423,1571,2244,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,139,868,1423,2454,2457,2463,2511,2528,2529],[99,100,101,103,105,109,136,138,140,141,142,144,145,868,1402,1423,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,130,139,143,868,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,133,146,868,1401,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,130,136,868,1423,1578,2454,2463,2511,2528,2529],[88,99,100,101,103,105,109,136,868,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,136,137,868,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,136,868,1409,1423,1578,2454,2463,2511,2528,2529],[99,100,101,103,107,109,868,1423,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,129,868,1406,1423,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,868,1407,1423,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,133,136,868,1405,1408,1423,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1403,1404,1410,1423,2454,2463,2511,2528,2529],[88,99,100,103,109,868,1423,1577,1581,1582,1583,2454,2463,2511,2528,2529],[100,103,124,125,129,130,132,133,868,1423,1570,1571,2457,2463,2511,2528,2529],[100,103,868,1423,1578,2457,2463,2511,2528,2529],[100,103,107,129,133,868,1423,1570,2457,2463,2511,2528,2529],[100,103,125,868,1411,1413,1414,1417,1418,1420,1421,1423,1426,1430,1432,1565,1569,2457,2463,2511,2528,2529],[100,109,868,1423,2463,2511,2528,2529],[100,109,124,868,1423,1577,2463,2511,2528,2529],[100,103,109,125,129,868,1423,2457,2463,2511,2528,2529],[90,100,109,128,131,134,135,868,1423,2463,2511,2528,2529],[100,103,109,125,127,128,131,132,868,1423,1571,2457,2463,2511,2528,2529],[100,128,130,131,133,868,1423,1571,2463,2511,2528,2529],[100,868,1376,1400,1423,2463,2511,2528,2529],[100,868,1423,1424,2463,2511,2528,2529],[100,868,1423,1452,1453,2463,2511,2528,2529],[100,133,868,1423,2463,2511,2528,2529],[100,110,123,126,868,1423,1572,1573,2463,2511,2528,2529],[100,110,868,1423,1573,2463,2511,2528,2529],[100,110,123,124,125,126,132,868,1401,1423,1571,1573,1574,1575,2463,2511,2528,2529],[110,868,1423,1573,2463,2511,2528,2529],[100,868,1423,2456,2463,2511,2528,2529],[90,100,123,868,1423,2463,2511,2528,2529],[99,100,101,103,109,125,127,132,133,460,868,1400,1416,1419,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,125,127,132,133,868,1400,1415,1416,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,125,127,128,131,133,460,868,1400,1415,1416,1423,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1595,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1585,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1585,2252,2454,2463,2511,2528,2529],[99,100,101,103,109,143,868,1400,1423,1585,2225,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1571,1585,2225,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1455,1586,2189,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1423,1586,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1596,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1597,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1435,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1578,1598,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2262,2265,2266,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2262,2263,2264,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2263,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,2262,2454,2463,2511,2528,2529],[99,100,101,103,109,136,868,1423,2262,2454,2463,2511,2528,2529],[99,100,103,109,868,1400,1401,1423,1598,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1598,2268,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1598,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1406,1423,1591,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1453,1591,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1406,1423,1436,1591,2272,2273,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1401,1423,1577,1599,1600,1601,2225,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1601,2275,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1601,2278,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1424,1425,1433,1547,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1406,1423,1587,2277,2454,2463,2511,2528,2529],[99,100,101,103,107,109,868,1423,1436,1571,1587,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1433,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1400,1401,1423,1433,1464,1577,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1425,1433,1436,1577,2100,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1400,1401,1423,1433,1436,1437,1467,1468,1542,1543,1545,1577,1603,2100,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,133,868,1400,1401,1423,1433,1436,1468,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1400,1401,1423,1433,1436,1464,1465,1542,1543,1545,1577,1599,2205,2206,2286,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1400,1401,1423,1433,1436,1464,1542,1543,1545,1577,1599,2205,2206,2286,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,2183,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1406,1423,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1428,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1428,2454,2463,2511,2528,2529],[99,100,101,103,109,460,775,868,1423,1428,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2292,2454,2463,2511,2528,2529],[100,868,1423,2291,2293,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2299,2454,2463,2511,2528,2529],[100,868,1423,2300,2301,2463,2511,2528,2529],[99,100,101,103,109,775,868,1401,1423,2183,2454,2463,2511,2528,2529],[99,100,101,103,109,775,868,1401,1423,2183,2303,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2292,2303,2454,2463,2511,2528,2529],[100,868,1423,2303,2304,2305,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2307,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2292,2307,2454,2463,2511,2528,2529],[100,868,1423,2307,2308,2309,2463,2511,2528,2529],[99,100,101,103,109,775,868,1401,1423,2183,2311,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2292,2311,2454,2463,2511,2528,2529],[100,868,1423,2311,2312,2313,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2296,2315,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2292,2315,2454,2463,2511,2528,2529],[100,868,1423,2315,2316,2317,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2296,2319,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2292,2319,2454,2463,2511,2528,2529],[100,868,1423,2319,2320,2321,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2323,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1427,2323,2454,2463,2511,2528,2529],[100,868,1423,2323,2324,2325,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2327,2454,2463,2511,2528,2529],[100,868,1423,2327,2328,2329,2463,2511,2528,2529],[99,100,101,103,109,775,868,1401,1423,2184,2331,2454,2463,2511,2528,2529],[100,868,1423,2331,2332,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2334,2454,2463,2511,2528,2529],[100,868,1423,2334,2335,2336,2463,2511,2528,2529],[99,100,101,103,109,775,868,1401,1423,2183,2338,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2292,2338,2454,2463,2511,2528,2529],[100,868,1423,2338,2339,2340,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2342,2454,2463,2511,2528,2529],[100,868,1423,2342,2343,2344,2463,2511,2528,2529],[99,100,101,103,109,868,1406,1423,1427,1428,2290,2297,2298,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1427,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1427,1429,2454,2463,2511,2528,2529],[99,100,101,103,105,109,868,1423,2347,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1427,2348,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1427,2290,2294,2454,2463,2511,2528,2529],[99,100,101,103,109,123,868,1400,1401,1423,1602,1604,1610,2225,2350,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1571,1610,2249,2352,2353,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,2226,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1610,2184,2208,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1610,2184,2225,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1425,2454,2463,2511,2528,2529],[99,100,101,103,109,132,460,868,1400,1401,1423,1467,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1423,1424,1425,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1401,1423,1424,1425,1547,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1412,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1423,1594,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1401,1423,1424,1431,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1401,1423,1424,1431,1436,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1436,1592,2454,2463,2511,2528,2529],[99,100,101,103,109,110,460,868,1400,1423,1433,1437,1444,1573,1588,1594,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1588,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1588,2205,2206,2370,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1436,1588,2225,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1588,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,2364,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1588,2364,2365,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1588,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1588,2368,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1423,1444,1548,2454,2463,2511,2528,2529],[100,868,1423,1437,1464,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1401,1423,1465,1548,2374,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1436,1548,2374,2375,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1424,1436,1548,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1401,1423,1424,1433,1435,1436,1437,1545,1548,1549,2376,2377,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1423,1548,2380,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1423,1548,2381,2454,2463,2511,2528,2529],[99,100,101,103,109,123,143,868,1400,1401,1423,1589,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1436,1571,1589,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1589,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1589,2386,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1433,1434,1436,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1599,2184,2225,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1401,1423,1599,2389,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1600,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1600,2391,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1401,1423,1437,1461,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1425,1433,1447,1461,1462,1469,1545,1566,1567,1568,2098,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1599,1600,1601,1603,2184,2225,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1601,1603,2225,2394,2454,2463,2511,2528,2529],[99,100,101,103,107,109,868,1400,1406,1423,1571,1602,2184,2454,2463,2511,2528,2529],[99,100,101,103,107,109,868,1400,1401,1423,1436,1602,2396,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1406,1423,1602,1603,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1603,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1603,2398,2399,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1401,1423,1590,2401,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1604,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1604,2403,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1571,1604,2405,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1415,1423,1605,2250,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1605,2250,2407,2454,2463,2511,2528,2529],[99,100,101,103,109,123,868,1423,1605,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1606,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1607,2184,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1607,2411,2454,2463,2511,2528,2529],[99,100,101,103,109,146,868,1401,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,146,868,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,146,868,1423,1436,2454,2463,2511,2528,2529],[99,100,101,103,109,143,146,868,1400,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,146,868,1401,1423,1436,1571,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1608,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1608,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1609,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1578,1609,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1609,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1609,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1444,1594,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1594,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1423,1436,1444,1594,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1444,1594,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1437,1465,1545,1594,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1571,1593,1599,2205,2206,2429,2430,2431,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1423,1593,2184,2429,2430,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1436,1571,1593,1599,2429,2430,2433,2454,2463,2511,2528,2529],[100,868,1423,1593,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1401,1423,1433,1468,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1401,1423,1425,1433,1435,1436,1437,1461,1469,1544,1545,1577,1599,2098,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1401,1423,1425,1433,1435,1436,1437,1461,1469,1544,1545,1577,2098,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1401,1423,1433,1577,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1424,1425,1433,1547,1548,1577,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1425,1577,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1433,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1433,1563,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1433,1443,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1433,1451,1455,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1433,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1401,1423,1433,1437,1444,1445,1446,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1400,1401,1423,1433,1437,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1400,1423,1424,1433,1457,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1446,1469,1566,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1566,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1401,1423,1433,1436,1464,1465,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1450,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1449,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1433,1446,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1433,1577,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1400,1401,1423,1433,1437,1447,1448,1456,1458,1459,1460,1461,1462,1463,1466,1544,1577,1578,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1401,1423,1424,1425,1433,1434,1435,1436,1437,1544,1545,1546,1549,1564,1577,2100,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1401,1423,1424,1425,1433,1434,1435,1436,1437,1544,1545,1546,1549,1564,1577,2454,2463,2511,2528,2529],[99,100,101,103,109,460,868,1423,1433,1437,1447,1456,1458,1459,1460,1461,1462,1466,1566,1567,1568,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1401,1423,1424,1425,1433,1434,1435,1436,1437,1545,1546,1549,1564,1577,1599,2454,2457,2463,2511,2528,2529],[99,100,101,103,109,868,1423,2193,2195,2454,2463,2511,2528,2529],[99,100,101,103,109,868,1423,1455,2454,2463,2511,2528,2529],[99,100,101,103,109,133,460,868,1400,1423,1576,2096,2454,2463,2511,2528,2529],[99,100,101,103,109,127,133,460,868,1400,1401,1419,1423,2454,2463,2511,2528,2529],[99,100,101,103,109,136,460,868,1406,1423,1433,1434,1444,1577,2250,2454,2463,2511,2528,2529],[103,868,1423,2457,2463,2511,2528,2529],[100,868,1423,2463,2511,2523,2528,2529,2533,2554,2619,2624,2627,2636,2640,2641,2642,2644,2645]],"fileInfos":[{"version":"e41c290ef7dd7dab3493e6cbe5909e0148edf4a8dad0271be08edec368a0f7b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"e12a46ce14b817d4c9e6b2b478956452330bf00c9801b79de46f7a1815b5bd40","impliedFormat":1},{"version":"4fd3f3422b2d2a3dfd5cdd0f387b3a8ec45f006c6ea896a4cb41264c2100bb2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"69e65d976bf166ce4a9e6f6c18f94d2424bf116e90837ace179610dbccad9b42","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"62bb211266ee48b2d0edf0d8d1b191f0c24fc379a82bd4c1692a082c540bc6b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1e2a172204962276504466a6393426d2ca9c54894b1ad0a6c9dad867a65f876","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"bab26767638ab3557de12c900f0b91f710c7dc40ee9793d5a27d32c04f0bf646","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"61d6a2092f48af66dbfb220e31eea8b10bc02b6932d6e529005fd2d7b3281290","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"bde31fd423cd93b0eff97197a3f66df7c93e8c0c335cbeb113b7ff1ac35c23f4","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"11443a1dcfaaa404c68d53368b5b818712b95dd19f188cab1669c39bee8b84b3","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"7f698624bbbb060ece7c0e51b7236520ebada74b747d7523c7df376453ed6fea","impliedFormat":1},{"version":"19efad8495a7a6b064483fccd1d2b427403dd84e67819f86d1c6ee3d7abf749c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1eef826bc4a19de22155487984e345a34c9cd511dd1170edc7a447cb8231dd4a","affectsGlobalScope":true,"impliedFormat":99},"424faf9241dd699dda995b367ed36665732da1e6ec1f33b2fd40394488ecac92",{"version":"f468b74459f1ad4473b36a36d49f2b255f3c6b5d536c81239c2b2971df089eaf","impliedFormat":1},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"524a409ad72186b7f6cb16898c349465cfa876f641d6cb6137b3123d5cfca619","impliedFormat":1},{"version":"ebe84ad8344962b7117a3b95065f47383215020eaf1b626463863b45b4d16e62","impliedFormat":1},{"version":"dc0c80f91a4d46c5c4f625a35601ff3c815e2395e6680bacfa12970fc6d49c93","impliedFormat":1},{"version":"3e74c6f34a28b7c948bfdaf19172000d589093660b3605f8c21c1b30173c729b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"88ad1af02cacc61bf79683b021d326eeafc91231660a06495c5046d4649ec3a2","impliedFormat":1},{"version":"c0191592be8eb7906f99ac4b8798d80a585b94001ea1a5f50d6ce5b0d13a5c62","impliedFormat":99},{"version":"318d19118bf6bf8d088441c948990f53cafc79ed581b78f3d41a0f7a3f5f145c","impliedFormat":1},{"version":"549d2a340dc2ac41cf361e10d14d3a2cecd425ffd6fc6f764964c5c4ee0b63d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"860814185d89237c84a6bd1e4f108c2c0b2401609a74a33bc7cab14ea4ee9f21","impliedFormat":99},{"version":"e1ddcbacb7658bf0683bca4ebd31bd05f64823712651263bfc75128a45f00ff7","impliedFormat":99},{"version":"cd0e1f0599b6d8fdd60dc96fdc8527cc60d903e8dffe0b93b7a3527e09e23d49","impliedFormat":99},{"version":"4d643a0df06c8a561870a279ccf6ff9d29a1f04e2c9378eba501eb0e058e13fa","impliedFormat":99},{"version":"e3a0a9032e3ce3945446b33b6329405565aaf5d0e7c115250b972f02dc64d0ae","impliedFormat":1},"6ef27fa41da37327fdb938f081d14851cc26dda0ea642190a0c5f9577a9f1edf",{"version":"52f5c39e78a90c1d8ed7db18f39d890b2e8464a3f44d4233617893f6648e317d","impliedFormat":1},{"version":"a69e8bce30aea7ec98f3b6ddfbc378c92826fede01aafbaec703057c2503ea51","impliedFormat":1},{"version":"b7e91960129ba8a3c22f2402dc8d901b07a44fd11085309ba4780ea044f08323","impliedFormat":99},{"version":"380b919bfa0516118edaf25b99e45f855e7bc3fd75ce4163a1cfe4a666388804","impliedFormat":1},{"version":"40de86ced5175a6ffe84a52abe6ac59ac0efbc604a5975a8c6476c3ddc682ff1","impliedFormat":1},{"version":"fcf79300e5257a23ed3bacaa6861d7c645139c6f7ece134d15e6669447e5e6db","impliedFormat":1},{"version":"187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","impliedFormat":1},{"version":"aa2c18a1b5a086bbcaae10a4efba409cc95ba7287d8cf8f2591b53704fea3dea","impliedFormat":1},{"version":"5a0b15210129310cee9fa6af9200714bb4b12af4a04d890e15f34dbea1cf1852","impliedFormat":1},{"version":"0244119dbcbcf34faf3ffdae72dab1e9bc2bc9efc3c477b2240ffa94af3bca56","impliedFormat":1},{"version":"00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","impliedFormat":1},{"version":"a873c50d3e47c21aa09fbe1e2023d9a44efb07cc0cb8c72f418bf301b0771fd3","impliedFormat":1},{"version":"7c14ccd2eaa82619fffc1bfa877eb68a012e9fb723d07ee98db451fadb618906","impliedFormat":1},{"version":"49c36529ee09ea9ce19525af5bb84985ea8e782cb7ee8c493d9e36d027a3d019","impliedFormat":1},{"version":"df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","impliedFormat":1},{"version":"4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd","impliedFormat":1},"e0f525d113db44555dd40d6e1fd5e2708f6626c28ed93fa5a3e7864343a4e0b9","d6d50f70ef4224b378ff4a44a6772a5d6c71185869a1dca5dd69198552e33c38","4d85921513f6d9f0e98515890c56d6f150d1caa17cf2cdab54fa0837fa48be58","d287164f84628dcbf023783cfbaccecc0277307f30884afd734c778aaff927c0","56c90889c4d093f8a990ccd3f941cf0bd6b78404aa181416c6d856e3b70115f2","8fe156b1d07c194843a01048c28f920fb155943097eec7b3e06c23fa238cf29f","1249c8a45fe697d72e57c06af96b5b1b1fd02fe0ecdeaa24b5e42676e1686b39","d25f406cdc96422dc6e297a4fc1ea5f08a64ac5f917a70d634bb336e9faf2bd4","c066f545f56d4a7ceb40c7ba6f65af579295560016fd32cef080ac44e9a1437f","fef37fa42bdf34c9082bbdc575cc7e6f13eb9bb57752aa627aad29a648a540c8","7cac9e7dc9264c05eb8b8bd22289f2a4452f97a06daf49b306b76d3106b523c8","fe33311e48e4bcfb8618123fb0134917d3e5f282de6febbfb711c91a2af4f8e0","138ce2f3a7361fe0151dc4fa5720981e62631e3a6503f18d8f4adec58be90da7","fcd22ca9951b617db6b7e805e4dd290a925da6df49e8cbe4818b557bc4ba72c8","41c71bd48f563ed0c2643897c7580c3473a2c45de816131c7f497ada25aa4aca","d3bd74d3efb3eedf8ef3202bd4633e0078a2f0c071347b84ee5e9655c72ec842","396cba6f686e1e46bab41d2796f030d2005694313bd86b0199711eb811661237","3227f8860dca1346c30b08a6b2d66749d65f6ffaab10bc1f1bbad9db23583ac5","1e6bcca7dec48f12c2eb622d3e75a503abd1a8786b28e4c5ab9aeeabaa4db520","817f82dc697d9df3ad46d5790d6fffa3fa490c77a88488f64ab6cad508d5a94f","e18396704db58a17a9b6bc0203e69648d35e23bcb5d654183ff5aa3ebe0cfcc7","c73047306842c0bf13cd3f7b3be3af76e8d58ad16ab549a8812c4f51e4b7f76f","7faca21e2c4e0119f1386f27695516fabc4bceca350e96f6e5c37a45605779bf",{"version":"922d92b500c5359d96b1eff81fe281d1f5350120db253773a3f1c85985c4a9bf","impliedFormat":1},{"version":"ac4efaa37cc9798679da23050bd4e374affb69acda810572d73b11fce731308a","impliedFormat":1},{"version":"c477f69ebfcd6153946ce95799cf49b1c7bce11cec250dab336516b5ad27d72b","impliedFormat":1},{"version":"6355649c4afa3e56a8dd808c3330952154d900bdab5a078dbaffe3974c7baab2","impliedFormat":1},{"version":"5e7185c89a21a5406274b1f010bdce770ad45e7cf09a8b8b346bac352939164a","impliedFormat":1},{"version":"9e9df7677da806cf5eabc7899cb66f6eb075f6c20ed1761a2e882c46883d1ce6","impliedFormat":1},{"version":"633a12dbfb5225a7284b1fa29993f681edf1fe4b36178650d6b4ea1962307f07","impliedFormat":1},{"version":"31ba0d4593007ba73ea1cff32896f6ba551a5794a880c032df2d10aecbc82fe6","impliedFormat":1},{"version":"b4f9fb54a352a0319f6de11eb784b8c9be6aa7b0c65e2fbc8e6822c8f4622ec5","impliedFormat":1},{"version":"24fd9b011d5f800715009959e4c9fcf8dc8a458d4d72e762380e8031f16be8cc","impliedFormat":1},{"version":"bd9462141e563c72110be58bc0e62ca260a62abe07cb4c951d64e636eee9fa60","impliedFormat":1},{"version":"1147ac71b3cfc8d6e9ebf4bf06435bd0a5b6d72a5457b7b00428f218bd01c2e7","impliedFormat":1},{"version":"9a643956e978408cff58f04e3001a41384ed0b4b6f43eeb2a9f91a70f56d2131","impliedFormat":1},{"version":"94d96cc9eb83bf3f3b67497f77d53298fed988c2a00899ba18bc23a8455a6064","impliedFormat":1},{"version":"446d5326728f7110b6180431f407bd8a8344129621fb22130cfdb618aa62e514","impliedFormat":1},{"version":"025b16217c6d980741432fc156bdcbe22b1084f8d1f3f472f6601f09f7853415","impliedFormat":1},{"version":"afb4fe76ed12d1b7b8724321e0f13aab912e633899f7c3e37074035ee9cff91e","impliedFormat":1},{"version":"490621c395bfa973fa6a8c4afc16ccb196a5aac60b55c61d98050ce4990520a5","impliedFormat":1},{"version":"c38e7e1b936c9a8e3f01e291dbc228232c9b61ce96bdfeb78dbc3b74f987c49c","impliedFormat":1},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"e720c8a37b87f5713093ed04015dbc647996545ffc0fdf07885f444af738dcff","impliedFormat":99},{"version":"f73b596cb4b4860fd0a3ea8cab67a42ad344d95a392ca986ca4588f59ea8c2cf","impliedFormat":99},{"version":"29b9ed9e1bccc6eff19b59c3f361ee102d8a77f4409fdb56a642a09cd4142d80","impliedFormat":1},{"version":"219afaff7dd670d2b610e23f8ea09d4982a947516074fb55b7f8f2f218f8da31","impliedFormat":1},{"version":"f3233f848276835085121850b21375b1ae23b1d558e12b520c42e99f19517b05","impliedFormat":1},{"version":"12395b35d56e3162be3e6ff07945f8c385351af536c735958eba430c387fbb3f","impliedFormat":1},{"version":"9bb4778628c37e1e4f0f8379339dcd75bfae5d47fc1fb96673b4fe3f8b328197","impliedFormat":1},{"version":"73a4f0c06fbb2a75e748dae42517c062ad303b0a43d302e8fc2ff89e92f0ecde","impliedFormat":1},{"version":"1f8cd888d94150cec2d0c3b5c734caaabaa418cd10d25463c82718979ec3bec8","impliedFormat":1},{"version":"c6a6c807ba136407c33e425c37a02550b3d729deb0a4a5bb8e7cdef29eea6814","impliedFormat":1},{"version":"ddd271c30afbb3ad41466f9dd0702c868ef992912684162952b976f436dde50c","impliedFormat":1},{"version":"4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd","impliedFormat":1},{"version":"cf93e7b09b66e142429611c27ba2cbf330826057e3c793e1e2861e976fae3940","impliedFormat":99},{"version":"90e727d145feb03695693fdc9f165a4dc10684713ee5f6aa81e97a6086faa0f8","impliedFormat":99},{"version":"ee2c6ec73c636c9da5ab4ce9227e5197f55a57241d66ea5828f94b69a4a09a2d","impliedFormat":99},{"version":"afaf64477630c7297e3733765046c95640ab1c63f0dfb3c624691c8445bc3b08","impliedFormat":99},{"version":"5aa03223a53ad03171988820b81a6cae9647eabcebcb987d1284799de978d8e3","impliedFormat":99},{"version":"7f50c8914983009c2b940923d891e621db624ba32968a51db46e0bf480e4e1cb","impliedFormat":99},{"version":"90fc18234b7d2e19d18ac026361aaf2f49d27c98dc30d9f01e033a9c2b01c765","impliedFormat":99},{"version":"a980e4d46239f344eb4d5442b69dcf1d46bd2acac8d908574b5a507181f7e2a1","impliedFormat":99},{"version":"bbbfa4c51cdaa6e2ef7f7be3ae199b319de6b31e3b5afa7e5a2229c14bb2568a","impliedFormat":99},{"version":"bc7bfe8f48fa3067deb3b37d4b511588b01831ba123a785ea81320fe74dd9540","impliedFormat":99},{"version":"fd60c0aaf7c52115f0e7f367d794657ac18dbb257255777406829ab65ca85746","impliedFormat":99},{"version":"15c17866d58a19f4a01a125f3f511567bd1c22235b4fd77bf90c793bf28388c3","impliedFormat":99},{"version":"51301a76264b1e1b4046f803bda44307fba403183bc274fe9e7227252d7315cb","impliedFormat":99},{"version":"ddef23e8ace6c2b2ddf8d8092d30b1dd313743f7ff47b2cbb43f36c395896008","impliedFormat":99},{"version":"9e42df47111429042b5e22561849a512ad5871668097664b8fb06a11640140ac","impliedFormat":99},{"version":"391fcc749c6f94c6c4b7f017c6a6f63296c1c9ae03fa639f99337dddb9cc33fe","impliedFormat":99},{"version":"ac4706eb1fb167b19f336a93989763ab175cd7cc6227b0dcbfa6a7824c6ba59a","impliedFormat":99},{"version":"633220dc1e1a5d0ccf11d3c3e8cadc9124daf80fef468f2ff8186a2775229de3","impliedFormat":99},{"version":"6de22ad73e332e513454f0292275155d6cb77f2f695b73f0744928c4ebb3a128","impliedFormat":99},{"version":"ebe0e3c77f5114b656d857213698fade968cff1b3a681d1868f3cfdd09d63b75","impliedFormat":99},{"version":"22c27a87488a0625657b52b9750122814c2f5582cac971484cda0dcd7a46dc3b","impliedFormat":99},{"version":"7e7a817c8ec57035b2b74df8d5dbcc376a4a60ad870b27ec35463536158e1156","impliedFormat":99},{"version":"0e2061f86ca739f34feae42fd7cce27cc171788d251a587215b33eaec456e786","impliedFormat":99},{"version":"91659b2b090cadffdb593736210910508fc5b77046d4ce180b52580b14b075ec","impliedFormat":99},{"version":"d0f6c657c45faaf576ca1a1dc64484534a8dc74ada36fd57008edc1aab65a02b","impliedFormat":99},{"version":"ce0c52b1ebc023b71d3c1fe974804a2422cf1d85d4af74bb1bced36ff3bff8b5","impliedFormat":99},{"version":"9c6acb4a388887f9a5552eda68987ee5d607152163d72f123193a984c48157c9","impliedFormat":99},{"version":"90d0a9968cbb7048015736299f96a0cceb01cf583fd2e9a9edbc632ac4c81b01","impliedFormat":99},{"version":"49abec0571c941ab6f095885a76828d50498511c03bb326eec62a852e58000c5","impliedFormat":99},{"version":"8eeb4a4ff94460051173d561749539bca870422a6400108903af2fb7a1ffe3d7","impliedFormat":99},{"version":"49e39b284b87452fed1e27ac0748ba698f5a27debe05084bc5066b3ecf4ed762","impliedFormat":99},{"version":"59dcf835762f8df90fba5a3f8ba87941467604041cf127fb456543c793b71456","impliedFormat":99},{"version":"33e0c4c683dcaeb66bedf5bb6cc35798d00ac58d7f3bc82aadb50fa475781d60","impliedFormat":99},{"version":"605839abb6d150b0d83ed3712e1b3ffbeb309e382770e7754085d36bc2d84a4c","impliedFormat":99},{"version":"a862dcb740371257e3dae1ab379b0859edcb5119484f8359a5e6fb405db9e12e","impliedFormat":99},{"version":"0f0a16a0e8037c17e28f537028215e87db047eba52281bd33484d5395402f3c1","impliedFormat":99},{"version":"cf533aed4c455b526ddccbb10dae7cc77e9269c3d7862f9e5cedbd4f5c92e05e","impliedFormat":99},{"version":"f8a60ca31702a0209ef217f8f3b4b32f498813927df2304787ac968c78d8560d","impliedFormat":99},{"version":"530192961885d3ddad87bf9c4390e12689fa29ff515df57f17a57c9125fc77c3","impliedFormat":99},{"version":"165ba9e775dd769749e2177c383d24578e3b212e4774b0a72ad0f6faee103b68","impliedFormat":99},{"version":"61448f238fdfa94e5ccce1f43a7cced5e548b1ea2d957bec5259a6e719378381","impliedFormat":99},{"version":"69fa523e48131ced0a52ab1af36c3a922c5fd7a25e474d82117329fe051f5b85","impliedFormat":99},{"version":"fa10b79cd06f5dd03435e184fb05cc5f0d02713bfb4ee9d343db527501be334c","impliedFormat":99},{"version":"c6fb591e363ee4dea2b102bb721c0921485459df23a2d2171af8354cacef4bce","impliedFormat":99},{"version":"ea7e1f1097c2e61ed6e56fa04a9d7beae9d276d87ac6edb0cd39a3ee649cddfe","impliedFormat":99},{"version":"e8cf2659d87462aae9c7647e2a256ac7dcaf2a565a9681bfb49328a8a52861e8","impliedFormat":99},{"version":"7e374cb98b705d35369b3c15444ef2ff5ff983bd2fbb77a287f7e3240abf208c","impliedFormat":99},{"version":"ca75ba1519f9a426b8c512046ebbad58231d8627678d054008c93c51bc0f3fa5","impliedFormat":99},{"version":"ff63760147d7a60dcfc4ac16e40aa2696d016b9ffe27e296b43655dfa869d66b","impliedFormat":99},{"version":"4d434123b16f46b290982907a4d24675442eb651ca95a5e98e4c274be16f1220","impliedFormat":99},{"version":"57263d6ba38046e85f499f3c0ab518cfaf0a5f5d4f53bdae896d045209ab4aff","impliedFormat":99},{"version":"d3a535f2cd5d17f12b1abf0b19a64e816b90c8c10a030b58f308c0f7f2acfe2c","impliedFormat":99},{"version":"be26d49bb713c13bd737d00ae8a61aa394f0b76bc2d5a1c93c74f59402eb8db3","impliedFormat":99},{"version":"c7012003ac0c9e6c9d3a6418128ddebf6219d904095180d4502b19c42f46a186","impliedFormat":99},{"version":"d58c55750756bcf73f474344e6b4a9376e5381e4ba7d834dc352264b491423b6","impliedFormat":99},{"version":"01e2aabfabe22b4bf6d715fc54d72d32fa860a3bd1faa8974e0d672c4b565dfe","impliedFormat":99},{"version":"ba2c489bb2566c16d28f0500b3d98013917e471c40a4417c03991460cb248e88","impliedFormat":99},{"version":"39f94b619f0844c454a6f912e5d6868d0beb32752587b134c3c858b10ecd7056","impliedFormat":99},{"version":"0d2d8b0477b1cf16b34088e786e9745c3e8145bc8eea5919b700ad054e70a095","impliedFormat":99},{"version":"2a5e963b2b8f33a50bb516215ba54a20801cb379a8e9b1ae0b311e900dc7254c","impliedFormat":99},{"version":"d8307f62b55feeb5858529314761089746dce957d2b8fd919673a4985fa4342a","impliedFormat":99},{"version":"bf449ec80fc692b2703ad03e64ae007b3513ecd507dc2ab77f39be6f578e6f5c","impliedFormat":99},{"version":"f780213dd78998daf2511385dd51abf72905f709c839a9457b6ba2a55df57be7","impliedFormat":99},{"version":"2b7843e8a9a50bdf511de24350b6d429a3ee28430f5e8af7d3599b1e9aa7057f","impliedFormat":99},{"version":"05d95be6e25b4118c2eb28667e784f0b25882f6a8486147788df675c85391ab7","impliedFormat":99},{"version":"62d2721e9f2c9197c3e2e5cffeb2f76c6412121ae155153179049890011eb785","impliedFormat":99},{"version":"ff5668fb7594c02aca5e7ba7be6c238676226e450681ca96b457f4a84898b2d9","impliedFormat":99},{"version":"59fd37ea08657fef36c55ddea879eae550ffe21d7e3a1f8699314a85a30d8ae9","impliedFormat":99},{"version":"84e23663776e080e18b25052eb3459b1a0486b5b19f674d59b96347c0cb7312a","impliedFormat":99},{"version":"43e5934c7355731eec20c5a2aa7a859086f19f60a4e5fcd80e6684228f6fb767","impliedFormat":99},{"version":"a49c210c136c518a7c08325f6058fc648f59f911c41c93de2026db692bba0e47","impliedFormat":99},{"version":"1a92f93597ebc451e9ef4b158653c8d31902de5e6c8a574470ecb6da64932df4","impliedFormat":99},{"version":"256513ad066ac9898a70ca01e6fbdb3898a4e0fe408fbf70608fdc28ac1af224","impliedFormat":99},{"version":"d9835850b6cc05c21e8d85692a8071ebcf167a4382e5e39bf700c4a1e816437e","impliedFormat":99},{"version":"e5ab7190f818442e958d0322191c24c2447ddceae393c4e811e79cda6bd49836","impliedFormat":99},{"version":"91b4b77ef81466ce894f1aade7d35d3589ddd5c9981109d1dea11f55a4b807a0","impliedFormat":99},{"version":"03abb209bed94c8c893d9872639e3789f0282061c7aa6917888965e4047a8b5f","impliedFormat":99},{"version":"e97a07901de562219f5cba545b0945a1540d9663bd9abce66495721af3903eec","impliedFormat":99},{"version":"bf39ed1fdf29bc8178055ec4ff32be6725c1de9f29c252e31bdc71baf5c227e6","impliedFormat":99},{"version":"985eabf06dac7288fc355435b18641282f86107e48334a83605739a1fe82ac15","impliedFormat":99},{"version":"6112d33bcf51e3e6f6a81e419f29580e2f8e773529d53958c7c1c99728d4fb2e","impliedFormat":99},{"version":"89e9f7e87a573504acc2e7e5ad727a110b960330657d1b9a6d3526e77c83d8be","impliedFormat":99},{"version":"44bbb88abe9958c7c417e8687abf65820385191685009cc4b739c2d270cb02e9","impliedFormat":99},{"version":"ab4b506b53d2c4aec4cc00452740c540a0e6abe7778063e95c81a5cd557c19eb","impliedFormat":99},{"version":"858757bde6d615d0d1ee474c972131c6d79c37b0b61897da7fbd7110beb8af12","impliedFormat":99},{"version":"60b9dea33807b086a1b4b4b89f72d5da27ad0dd36d6436a6e306600c47438ac4","impliedFormat":99},{"version":"409c963b1166d0c1d49fdad1dfeb4de27fd2d6662d699009857de9baf43ca7c3","impliedFormat":99},{"version":"b7674ecfeb5753e965404f7b3d31eec8450857d1a23770cb867c82f264f546ab","impliedFormat":99},{"version":"c9800b9a9ad7fcdf74ed8972a5928b66f0e4ff674d55fd038a3b1c076911dcbe","impliedFormat":99},{"version":"99864433e35b24c61f8790d2224428e3b920624c01a6d26ea8b27ee1f62836bb","impliedFormat":99},{"version":"c391317b9ff8f87d28c6bfe4e50ed92e8f8bfab1bb8a03cd1fe104ff13186f83","impliedFormat":99},{"version":"42bdc3c98446fdd528e2591213f71ce6f7008fb9bb12413bd57df60d892a3fb5","impliedFormat":99},{"version":"542d2d689b58c25d39a76312ccaea2fcd10a45fb27b890e18015399c8032e2d9","impliedFormat":99},{"version":"97d1656f0a563dbb361d22b3d7c2487427b0998f347123abd1c69a4991326c96","impliedFormat":99},{"version":"d4f53ed7960c9fba8378af3fa28e3cc483d6c0b48e4a152a83ff0973d507307d","impliedFormat":99},{"version":"0665de5280d65ec32776dc55fb37128e259e60f389cde5b9803cf9e81ad23ce0","impliedFormat":99},{"version":"b6dc8fd1c6092da86725c338ca6c263d1c6dd3073046d3ec4eb2d68515062da2","impliedFormat":99},{"version":"d9198a0f01f00870653347560e10494efeca0bfa2de0988bd5d883a9d2c47edb","impliedFormat":99},{"version":"d4279865b926d7e2cfe8863b2eae270c4c035b6e923af8f9d7e6462d68679e07","impliedFormat":99},{"version":"73b6945448bb3425b764cfe7b1c4b0b56c010cc66e5f438ef320c53e469797eb","impliedFormat":99},{"version":"cf72fd8ffa5395f4f1a26be60246ec79c5a9ad201579c9ba63fd2607b5daf184","impliedFormat":99},{"version":"301a458744666096f84580a78cc3f6e8411f8bab92608cdaa33707546ca2906f","impliedFormat":99},{"version":"711e70c0916ff5f821ea208043ecd3e67ed09434b8a31d5616286802b58ebebe","impliedFormat":99},{"version":"e1f2fd9f88dd0e40c358fbf8c8f992211ab00a699e7d6823579b615b874a8453","impliedFormat":99},{"version":"17db3a9dcb2e1689ff7ace9c94fa110c88da64d69f01dc2f3cec698e4fc7e29e","impliedFormat":99},{"version":"73fb07305106bb18c2230890fcacf910fd1a7a77d93ac12ec40bc04c49ee5b8e","impliedFormat":99},{"version":"2c5f341625a45530b040d59a4bc2bc83824d258985ede10c67005be72d3e21d0","impliedFormat":99},{"version":"c4a262730d4277ecaaf6f6553dabecc84dcca8decaebbf2e16f1df8bbd996397","impliedFormat":99},{"version":"c23c533d85518f3358c55a7f19ab1a05aad290251e8bba0947bd19ea3c259467","impliedFormat":99},{"version":"5d0322a0b8cdc67b8c71e4ccaa30286b0c8453211d4c955a217ac2d3590e911f","impliedFormat":99},{"version":"f5e4032b6e4e116e7fec5b2620a2a35d0b6b8b4a1cc9b94a8e5ee76190153110","impliedFormat":99},{"version":"9ab26cb62a0e86ab7f669c311eb0c4d665457eb70a103508aa39da6ccee663da","impliedFormat":99},{"version":"5f64d1a11d8d4ce2c7ee3b72471df76b82d178a48964a14cdfdc7c5ef7276d70","impliedFormat":99},{"version":"24e2fbc48f65814e691d9377399807b9ec22cd54b51d631ba9e48ee18c5939dd","impliedFormat":99},{"version":"bfa2648b2ee90268c6b6f19e84da3176b4d46329c9ec0555d470e647d0568dfb","impliedFormat":99},{"version":"75ef3cb4e7b3583ba268a094c1bd16ce31023f2c3d1ac36e75ca65aca9721534","impliedFormat":99},{"version":"3be6b3304a81d0301838860fd3b4536c2b93390e785808a1f1a30e4135501514","impliedFormat":99},{"version":"da66c1b3e50ef9908e31ce7a281b137b2db41423c2b143c62524f97a536a53d9","impliedFormat":99},{"version":"3ada1b216e45bb9e32e30d8179a0a95870576fe949c33d9767823ccf4f4f4c97","impliedFormat":99},{"version":"1ace2885dffab849f7c98bffe3d1233260fbf07ee62cb58130167fd67a376a65","impliedFormat":99},{"version":"2126e5989c0ca5194d883cf9e9c10fe3e5224fbd3e4a4a6267677544e8be0aae","impliedFormat":99},{"version":"41a6738cf3c756af74753c5033e95c5b33dfc1f6e1287fa769a1ac4027335bf5","impliedFormat":99},{"version":"6e8630be5b0166cbc9f359b9f9e42801626d64ff1702dcb691af811149766154","impliedFormat":99},{"version":"e36b77c04e00b4a0bb4e1364f2646618a54910c27f6dc3fc558ca2ced8ca5bc5","impliedFormat":99},{"version":"2c4ea7e9f95a558f46c89726d1fedcb525ef649eb755a3d7d5055e22b80c2904","impliedFormat":99},{"version":"4875d65190e789fad05e73abd178297b386806b88b624328222d82e455c0f2e7","impliedFormat":99},{"version":"bf5302ecfaacee37c2316e33703723d62e66590093738c8921773ee30f2ecc38","impliedFormat":99},{"version":"62684064fe034d54b87f62ad416f41b98a405dee4146d0ec03b198c3634ea93c","impliedFormat":99},{"version":"be02cbdb1688c8387f8a76a9c6ed9d75d8bb794ec5b9b1d2ba3339a952a00614","impliedFormat":99},{"version":"cefaff060473a5dbf4939ee1b52eb900f215f8d6249dc7c058d6b869d599983c","impliedFormat":99},{"version":"b2797235a4c1a7442a6f326f28ffb966226c3419399dbb33634b8159af2c712f","impliedFormat":99},{"version":"164d633bbd4329794d329219fc173c3de85d5ad866d44e5b5f0fb60c140e98f2","impliedFormat":99},{"version":"b74300dd0a52eaf564b3757c07d07e1d92def4e3b8708f12eedb40033e4cafe9","impliedFormat":99},{"version":"a792f80b1e265b06dce1783992dbee2b45815a7bdc030782464b8cf982337cf2","impliedFormat":99},{"version":"8816b4b3a87d9b77f0355e616b38ed5054f993cc4c141101297f1914976a94b1","impliedFormat":99},{"version":"0f35e4da974793534c4ca1cdd9491eab6993f8cf47103dadfc048b899ed9b511","impliedFormat":99},{"version":"0ccdfcaebf297ec7b9dde20bbbc8539d5951a3d8aaa40665ca469da27f5a86e1","impliedFormat":99},{"version":"7fcb05c8ce81f05499c7b0488ae02a0a1ac6aebc78c01e9f8c42d98f7ba68140","impliedFormat":99},{"version":"81c376c9e4d227a4629c7fca9dde3bbdfa44bd5bd281aee0ed03801182368dc5","impliedFormat":99},{"version":"0f2448f95110c3714797e4c043bbc539368e9c4c33586d03ecda166aa9908843","impliedFormat":99},{"version":"b2f1a443f7f3982d7325775906b51665fe875c82a62be3528a36184852faa0bb","impliedFormat":99},{"version":"7568ff1f23363d7ee349105eb936e156d61aea8864187a4c5d85c60594b44a25","impliedFormat":99},{"version":"8c4d1d9a4eba4eac69e6da0f599a424b2689aee55a455f0b5a7f27a807e064db","impliedFormat":99},{"version":"e1beb9077c100bdd0fc8e727615f5dae2c6e1207de224569421907072f4ec885","impliedFormat":99},{"version":"3dda13836320ec71b95a68cd3d91a27118b34c05a2bfda3e7e51f1d8ca9b960b","impliedFormat":99},{"version":"fedc79cb91f2b3a14e832d7a8e3d58eb02b5d5411c843fcbdc79e35041316b36","impliedFormat":99},{"version":"99f395322ffae908dcdfbaa2624cc7a2a2cb7b0fbf1a1274aca506f7b57ebcb5","impliedFormat":99},{"version":"5e1f7c43e8d45f2222a5c61cbc88b074f4aaf1ca4b118ac6d6123c858efdcd71","impliedFormat":99},{"version":"7388273ab71cb8f22b3f25ffd8d44a37d5740077c4d87023da25575204d57872","impliedFormat":99},{"version":"0a48ceb01a0fdfc506aa20dfd8a3563edbdeaa53a8333ddf261d2ee87669ea7b","impliedFormat":99},{"version":"3182d06b874f31e8e55f91ea706c85d5f207f16273480f46438781d0bd2a46a1","impliedFormat":99},{"version":"ccd47cab635e8f71693fa4e2bbb7969f559972dae97bd5dbd1bbfee77a63b410","impliedFormat":99},{"version":"89770fa14c037f3dc3882e6c56be1c01bb495c81dec96fa29f868185d9555a5d","impliedFormat":99},{"version":"7048c397f08c54099c52e6b9d90623dc9dc6811ea142f8af3200e40d66a972e1","impliedFormat":99},{"version":"512120cd6f026ce1d3cf686c6ab5da80caa40ef92aa47466ec60ba61a48b5551","impliedFormat":99},{"version":"6cd0cb7f999f221e984157a7640e7871960131f6b221d67e4fdc2a53937c6770","impliedFormat":99},{"version":"f48b84a0884776f1bc5bf0fcf3f69832e97b97dc55d79d7557f344de900d259b","impliedFormat":99},{"version":"dca490d986411644b0f9edf6ea701016836558e8677c150dca8ad315178ec735","impliedFormat":99},{"version":"a028a04948cf98c1233166b48887dad324e8fe424a4be368a287c706d9ccd491","impliedFormat":99},{"version":"3046ed22c701f24272534b293c10cfd17b0f6a89c2ec6014c9a44a90963dfa06","impliedFormat":99},{"version":"394da10397d272f19a324c95bea7492faadf2263da157831e02ae1107bd410f5","impliedFormat":99},{"version":"0580595a99248b2d30d03f2307c50f14eb21716a55beb84dd09d240b1b087a42","impliedFormat":99},{"version":"a7da9510150f36a9bea61513b107b59a423fdff54429ad38547c7475cd390e95","impliedFormat":99},{"version":"659615f96e64361af7127645bb91f287f7b46c5d03bea7371e6e02099226d818","impliedFormat":99},{"version":"1f2a42974920476ce46bb666cd9b3c1b82b2072b66ccd0d775aa960532d78176","impliedFormat":99},{"version":"500b3ae6095cbab92d81de0b40c9129f5524d10ad955643f81fc07d726c5a667","impliedFormat":99},{"version":"a957ad4bd562be0662fb99599dbcf0e16d1631f857e5e1a83a3f3afb6c226059","impliedFormat":99},{"version":"e57a4915266a6a751c6c172e8f30f6df44a495608613e1f1c410196207da9641","impliedFormat":99},{"version":"7a12e57143b7bc5a52a41a8c4e6283a8f8d59a5e302478185fb623a7157fff5e","impliedFormat":99},{"version":"17b3426162e1d9cb0a843e8d04212aabe461d53548e671236de957ed3ae9471b","impliedFormat":99},{"version":"f38e86eb00398d63180210c5090ef6ed065004474361146573f98b3c8a96477d","impliedFormat":99},{"version":"231d9e32382d3971f58325e5a85ba283a2021243651cb650f82f87a1bf62d649","impliedFormat":99},{"version":"6532e3e87b87c95f0771611afce929b5bad9d2c94855b19b29b3246937c9840b","impliedFormat":99},{"version":"65704bbb8f0b55c73871335edd3c9cead7c9f0d4b21f64f5d22d0987c45687f0","impliedFormat":99},{"version":"787232f574af2253ac860f22a445c755d57c73a69a402823ae81ba0dfdd1ce23","impliedFormat":99},{"version":"5e63903cd5ebce02486b91647d951d61a16ad80d65f9c56581cd624f39a66007","impliedFormat":99},{"version":"bcc89a120d8f3c02411f4df6b1d989143c01369314e9b0e04794441e6b078d22","impliedFormat":99},{"version":"d17531ef42b7c76d953f63bd5c5cd927c4723e62a7e0b2badf812d5f35f784eb","impliedFormat":99},{"version":"6d4ee1a8e3a97168ea4c4cc1c68bb61a3fd77134f15c71bb9f3f63df3d26b54c","impliedFormat":99},{"version":"1eb04fea6b47b16922ed79625d90431a8b2fc7ba9d5768b255e62df0c96f1e3a","impliedFormat":99},{"version":"de0c2eece83bd81b8682f4496f558beb728263e17e74cbc4910e5c9ce7bef689","impliedFormat":99},{"version":"98866542d45306dab48ecc3ddd98ee54fa983353bc3139dfbc619df882f54d90","impliedFormat":99},{"version":"9e04c7708917af428c165f1e38536ddb2e8ecd576f55ed11a97442dc34b6b010","impliedFormat":99},{"version":"31fe6f6d02b53c1a7c34b8d8f8c87ee9b6dd4b67f158cbfff3034b4f3f69c409","impliedFormat":99},{"version":"2e1d853f84188e8e002361f4bfdd892ac31c68acaeac426a63cd4ff7abf150d0","impliedFormat":99},{"version":"666b5289ec8a01c4cc0977c62e3fd32e89a8e3fd9e97c8d8fd646f632e63c055","impliedFormat":99},{"version":"a1107bbb2b10982dba1f7958a6a5cf841e1a19d6976d0ecdc4c43269c7b0eaf2","impliedFormat":99},{"version":"07fa6122f7495331f39167ec9e4ebd990146a20f99c16c17bc0a98aa81f63b27","impliedFormat":99},{"version":"39c1483481b35c2123eaab5094a8b548a0c3f1e483ab7338102c3291f1ab18bf","impliedFormat":99},{"version":"b73e6242c13796e7d5fba225bf1c07c8ee66d31b7bb65f45be14226a9ae492d2","impliedFormat":99},{"version":"f2931608d541145d189390d6cfb74e1b1e88f73c0b9a80c4356a4daa7fa5e005","impliedFormat":99},{"version":"8684656fe3bf1425a91bd62b8b455a1c7ec18b074fd695793cfae44ae02e381a","impliedFormat":99},{"version":"ccf0b9057dd65c7fb5e237de34f706966ebc30c6d3669715ed05e76225f54fbd","impliedFormat":99},{"version":"d930f077da575e8ea761e3d644d4c6279e2d847bae2b3ea893bbd572315acc21","impliedFormat":99},{"version":"19b0616946cb615abde72c6d69049f136cc4821b784634771c1d73bec8005f73","impliedFormat":99},{"version":"553312560ad0ef97b344b653931935d6e80840c2de6ab90b8be43cbacf0d04cf","impliedFormat":99},{"version":"1225cf1910667bfd52b4daa9974197c3485f21fe631c3ce9db3b733334199faa","impliedFormat":99},{"version":"f7cb9e46bd6ab9d620d68257b525dbbbbc9b0b148adf500b819d756ebc339de0","impliedFormat":99},{"version":"e46d6c3120aca07ae8ec3189edf518c667d027478810ca67a62431a0fa545434","impliedFormat":99},{"version":"9d234b7d2f662a135d430d3190fc21074325f296273125244b2bf8328b5839a0","impliedFormat":99},{"version":"0554ef14d10acea403348c53436b1dd8d61e7c73ef5872e2fe69cc1c433b02f8","impliedFormat":99},{"version":"2f6ae5538090db60514336bd1441ca208a8fab13108cfa4b311e61eaca5ff716","impliedFormat":99},{"version":"17bf4ce505a4cff88fb56177a8f7eb48aa55c22ccc4cce3e49cc5c8ddc54b07d","impliedFormat":99},{"version":"3d735f493d7da48156b79b4d8a406bf2bbf7e3fe379210d8f7c085028143ee40","impliedFormat":99},{"version":"41de1b3ddd71bd0d9ed7ac217ca1b15b177dd731d5251cde094945c20a715d03","impliedFormat":99},{"version":"17d9c562a46c6a25bc2f317c9b06dd4e8e0368cbe9bdf89be6117aeafd577b36","impliedFormat":99},{"version":"ded799031fe18a0bb5e78be38a6ae168458ff41b6c6542392b009d2abe6a6f32","impliedFormat":99},{"version":"ed48d467a7b25ee1a2769adebc198b647a820e242c96a5f96c1e6c27a40ab131","impliedFormat":99},{"version":"b914114df05f286897a1ae85d2df39cfd98ed8da68754d73cf830159e85ddd15","impliedFormat":99},{"version":"73881e647da3c226f21e0b80e216feaf14a5541a861494c744e9fbe1c3b3a6af","impliedFormat":99},{"version":"d79e1d31b939fa99694f2d6fbdd19870147401dbb3f42214e84c011e7ec359ab","impliedFormat":99},{"version":"4f71097eae7aa37941bab39beb2e53e624321fd341c12cc1d400eb7a805691ff","impliedFormat":99},{"version":"58ebb4f21f3a90dda31a01764462aa617849fdb1b592f3a8d875c85019956aff","impliedFormat":99},{"version":"a8e8d0e6efff70f3c28d3e384f9d64530c7a7596a201e4879a7fd75c7d55cbb5","impliedFormat":99},{"version":"df5cbb80d8353bf0511a4047cc7b8434b0be12e280b6cf3de919d5a3380912c0","impliedFormat":99},{"version":"256eb0520e822b56f720962edd7807ed36abdf7ea23bcadf4a25929a3317c8cf","impliedFormat":99},{"version":"9cf2cbc9ceb5f718c1705f37ce5454f14d3b89f690d9864394963567673c1b5c","impliedFormat":99},{"version":"07d3dd790cf1e66bb6fc9806d014dd40bb2055f8d6ca3811cf0e12f92ba4cb9a","impliedFormat":99},{"version":"1f99fd62e9cff9b50c36f368caf3b9fb79fc6f6c75ca5d3c2ec4afaea08d9109","impliedFormat":99},{"version":"6558faaacba5622ef7f1fdfb843cd967af2c105469b9ff5c18a81ce85178fca7","impliedFormat":99},{"version":"34e7f17ae9395b0269cd3f2f0af10709e6dc975c5b44a36b6b70442dc5e25a38","impliedFormat":99},{"version":"a4295111b54f84c02c27e46b0855b02fad3421ae1d2d7e67ecf16cb49538280a","impliedFormat":99},{"version":"ce9746b2ceae2388b7be9fe1f009dcecbc65f0bdbc16f40c0027fab0fb848c3b","impliedFormat":99},{"version":"35ce823a59f397f0e85295387778f51467cea137d787df385be57a2099752bfb","impliedFormat":99},{"version":"2e5acd3ec67bc309e4f679a70c894f809863c33b9572a8da0b78db403edfa106","impliedFormat":99},{"version":"1872f3fcea0643d5e03b19a19d777704320f857d1be0eb4ee372681357e20c88","impliedFormat":99},{"version":"9689628941205e40dcbb2706d1833bd00ce7510d333b2ef08be24ecbf3eb1a37","impliedFormat":99},{"version":"0317a72a0b63094781476cf1d2d27585d00eb2b0ca62b5287124735912f3d048","impliedFormat":99},{"version":"6ce4c0ab3450a4fff25d60a058a25039cffd03141549589689f5a17055ad0545","impliedFormat":99},{"version":"9153ec7b0577ae77349d2c5e8c5dd57163f41853b80c4fb5ce342c7a431cbe1e","impliedFormat":99},{"version":"f490dfa4619e48edd594a36079950c9fca1230efb3a82aaf325047262ba07379","impliedFormat":99},{"version":"674f00085caff46d2cbc76fc74740fd31f49d53396804558573421e138be0c12","impliedFormat":99},{"version":"41d029194c4811f09b350a1e858143c191073007a9ee836061090ed0143ad94f","impliedFormat":99},{"version":"44a6259ffd6febd8510b9a9b13a700e1d022530d8b33663f0735dbb3bee67b3d","impliedFormat":99},{"version":"6f4322500aff8676d9b8eef7711c7166708d4a0686b792aa4b158e276ed946a7","impliedFormat":99},{"version":"e829ff9ecffa3510d3a4d2c3e4e9b54d4a4ccfef004bacbb1d6919ce3ccca01f","impliedFormat":99},{"version":"62e6fec9dbd012460b47af7e727ec4cd34345b6e4311e781f040e6b640d7f93e","impliedFormat":99},{"version":"4d180dd4d0785f2cd140bc069d56285d0121d95b53e4348feb4f62db2d7035d3","impliedFormat":99},{"version":"f1142cbba31d7f492d2e7c91d82211a8334e6642efe52b71d9a82cb95ba4e8ae","impliedFormat":99},{"version":"279cac827be5d48c0f69fe319dc38c876fdd076b66995d9779c43558552d8a50","impliedFormat":99},{"version":"a70ff3c65dc0e7213bfe0d81c072951db9f5b1e640eb66c1eaed0737879c797b","impliedFormat":99},{"version":"f75d3303c1750f4fdacd23354657eca09aae16122c344e65b8c14c570ff67df5","impliedFormat":99},{"version":"3ebae6a418229d4b303f8e0fdb14de83f39fba9f57b39d5f213398bca72137c7","impliedFormat":99},{"version":"21ba07e33265f59d52dece5ac44f933b2b464059514587e64ad5182ddf34a9b0","impliedFormat":99},{"version":"2d3d96efba00493059c460fd55e6206b0667fc2e73215c4f1a9eb559b550021f","impliedFormat":99},{"version":"d23d4a57fff5cec5607521ba3b72f372e3d735d0f6b11a4681655b0bdd0505f4","impliedFormat":99},{"version":"395c1f3da7e9c87097c8095acbb361541480bf5fd7fa92523985019fef7761dd","impliedFormat":99},{"version":"d61f3d719293c2f92a04ba73d08536940805938ecab89ac35ceabc8a48ccb648","impliedFormat":99},{"version":"ca693235a1242bcd97254f43a17592aa84af66ccb7497333ccfea54842fde648","impliedFormat":99},{"version":"cd41cf040b2e368382f2382ec9145824777233730e3965e9a7ba4523a6a4698e","impliedFormat":99},{"version":"2e7a9dba6512b0310c037a28d27330520904cf5063ca19f034b74ad280dbfe71","impliedFormat":99},{"version":"9f2a38baf702e6cb98e0392fa39d25a64c41457a827b935b366c5e0980a6a667","impliedFormat":99},{"version":"c1dc37f0e7252928f73d03b0d6b46feb26dea3d8737a531ca4c0ec4105e33120","impliedFormat":99},{"version":"25126b80243fb499517e94fc5afe5c9c5df3a0105618e33581fb5b2f2622f342","impliedFormat":99},{"version":"d332c2ddcb64012290eb14753c1b49fe3eee9ca067204efba1cf31c1ce1ee020","impliedFormat":99},{"version":"1be8da453470021f6fe936ba19ee0bfebc7cfa2406953fa56e78940467c90769","impliedFormat":99},{"version":"7c9f2d62d83f1292a183a44fb7fb1f16eb9037deb05691d307d4017ac8af850a","impliedFormat":99},{"version":"d0163ab7b0de6e23b8562af8b5b4adea4182884ca7543488f7ac2a3478f3ae6e","impliedFormat":99},{"version":"05224e15c6e51c4c6cd08c65f0766723f6b39165534b67546076c226661db691","impliedFormat":99},{"version":"a5f7158823c7700dd9fc1843a94b9edc309180c969fbfa6d591aeb0b33d3b514","impliedFormat":99},{"version":"7d30937f8cf9bb0d4b2c2a8fb56a415d7ef393f6252b24e4863f3d7b84285724","impliedFormat":99},{"version":"e04d074584483dc9c59341f9f36c7220f16eed09f7af1fa3ef9c64c26095faec","impliedFormat":99},{"version":"619697e06cbc2c77edda949a83a62047e777efacde1433e895b904fe4877c650","impliedFormat":99},{"version":"88d9a8593d2e6aee67f7b15a25bda62652c77be72b79afbee52bea61d5ffb39e","impliedFormat":99},{"version":"044d7acfc9bd1af21951e32252cf8f3a11c8b35a704169115ddcbde9fd717de2","impliedFormat":99},{"version":"a4ca8f13a91bd80e6d7a4f013b8a9e156fbf579bbec981fe724dad38719cfe01","impliedFormat":99},{"version":"5a216426a68418e37e55c7a4366bc50efc99bda9dc361eae94d7e336da96c027","impliedFormat":99},{"version":"13b65b640306755096d304e76d4a237d21103de88b474634f7ae13a2fac722d5","impliedFormat":99},{"version":"7478bd43e449d3ce4e94f3ed1105c65007b21f078b3a791ea5d2c47b30ea6962","impliedFormat":99},{"version":"601d3e8e71b7d6a24fc003aca9989a6c25fa2b3755df196fd0aaee709d190303","impliedFormat":99},{"version":"168e0850fcc94011e4477e31eca81a8a8a71e1aed66d056b7b50196b877e86c8","impliedFormat":99},{"version":"37ba82d63f5f8c6b4fc9b756f24902e47f62ea66aae07e89ace445a54190a86e","impliedFormat":99},{"version":"f5b66b855f0496bc05f1cd9ba51a6a9de3d989b24aa36f6017257f01c8b65a9f","impliedFormat":99},{"version":"823b16d378e8456fcc5503d6253c8b13659be44435151c6b9f140c4a38ec98c1","impliedFormat":99},{"version":"b58b254bf1b586222844c04b3cdec396e16c811463bf187615bb0a1584beb100","impliedFormat":99},{"version":"a367c2ccfb2460e222c5d10d304e980bd172dd668bcc02f6c2ff626e71e90d75","impliedFormat":99},{"version":"0718623262ac94b016cb0cfd8d54e4d5b7b1d3941c01d85cf95c25ec1ba5ed8d","impliedFormat":99},{"version":"d4f3c9a0bd129e9c7cbfac02b6647e34718a2b81a414d914e8bd6b76341172e0","impliedFormat":99},{"version":"824306df6196f1e0222ff775c8023d399091ada2f10f2995ce53f5e3d4aff7a4","impliedFormat":99},{"version":"84ca07a8d57f1a6ba8c0cf264180d681f7afae995631c6ca9f2b85ec6ee06c0f","impliedFormat":99},{"version":"35755e61e9f4ec82d059efdbe3d1abcccc97a8a839f1dbf2e73ac1965f266847","impliedFormat":99},{"version":"64a918a5aa97a37400ec085ffeea12a14211aa799cd34e5dc828beb1806e95bb","impliedFormat":99},{"version":"0c8f5489ba6af02a4b1d5ba280e7badd58f30dc8eb716113b679e9d7c31185e5","impliedFormat":99},{"version":"7b574ca9ae0417203cdfa621ab1585de5b90c4bc6eea77a465b2eb8b92aa5380","impliedFormat":99},{"version":"3334c03c15102700973e3e334954ac1dffb7be7704c67cc272822d5895215c93","impliedFormat":99},{"version":"aabcb169451df7f78eb43567fab877a74d134a0a6d9850aa58b38321374ab7c0","impliedFormat":99},{"version":"1b5effdd8b4e8d9897fc34ab4cd708a446bf79db4cb9a3467e4a30d55b502e14","impliedFormat":99},{"version":"d772776a7aea246fd72c5818de72c3654f556b2cf0d73b90930c9c187cc055fc","impliedFormat":99},{"version":"dbd4bd62f433f14a419e4c6130075199eb15f2812d2d8e7c9e1f297f4daac788","impliedFormat":99},{"version":"427df949f5f10c73bcc77b2999893bc66c17579ad073ee5f5270a2b30651c873","impliedFormat":99},{"version":"c4c1a5565b9b85abfa1d663ca386d959d55361e801e8d49155a14dd6ca41abe1","impliedFormat":99},{"version":"7a45a45c277686aaff716db75a8157d0458a0d854bacf072c47fee3d499d7a99","impliedFormat":99},{"version":"57005b72bce2dc26293e8924f9c6be7ee3a2c1b71028a680f329762fa4439354","impliedFormat":99},{"version":"8f53b1f97c53c3573c16d0225ee3187d22f14f01421e3c6da1a26a1aace32356","impliedFormat":99},{"version":"810fdc0e554ed7315c723b91f6fa6ef3a6859b943b4cd82879641563b0e6c390","impliedFormat":99},{"version":"87a36b177b04d23214aa4502a0011cd65079e208cd60654aefc47d0d65da68ea","impliedFormat":99},{"version":"28a1c17fcbb9e66d7193caca68bbd12115518f186d90fc729a71869f96e2c07b","impliedFormat":99},{"version":"cc2d2abbb1cc7d6453c6fee760b04a516aa425187d65e296a8aacff66a49598a","impliedFormat":99},{"version":"d2413645bc4ab9c3f3688c5281232e6538684e84b49a57d8a1a8b2e5cf9f2041","impliedFormat":99},{"version":"4e6e21a0f9718282d342e66c83b2cd9aa7cd777dfcf2abd93552da694103b3dc","impliedFormat":99},{"version":"9006cc15c3a35e49508598a51664aa34ae59fc7ab32d6cc6ea2ec68d1c39448e","impliedFormat":99},{"version":"74467b184eadee6186a17cac579938d62eceb6d89c923ae67d058e2bcded254e","impliedFormat":99},{"version":"4169b96bb6309a2619f16d17307da341758da2917ff40c615568217b14357f5e","impliedFormat":99},{"version":"4a94d6146b38050de0830019a1c6a7820c2e2b90eba1a5ee4e4ab3bc30a72036","impliedFormat":99},{"version":"48a35ece156203abf19864daa984475055bbed4dc9049d07f4462100363f1e85","impliedFormat":99},{"version":"2a80ab285da5ec06299594edb456abd51ee69a7506278cca24e1ab494a86952b","impliedFormat":99},{"version":"5cd9fd926e2034c7eeec3de6138e18bafe092e0672f8bccdc1a0669393af60db","impliedFormat":1},{"version":"13d7630be2b4951d99f5ac0bd83e07b4ab9e8b4f3a97e9ad5210ea6eed86fd82","impliedFormat":99},{"version":"a8edf6901be3952dd6ce40004267994165eeb9a51dd48363f43f206a5afc4547","impliedFormat":99},{"version":"865e26608ad2160d9ffcb981dc4649119471855f0467893934e3ab7c22b132e9","impliedFormat":1},{"version":"2bf40a9b2a42dc6f0e2a740fbc1c88c1998d25727b87ed0cf885284cb1e16c44","impliedFormat":1},{"version":"678ce9e1aaba570c9e5bcb5ecfac009720a60ec616bbbc9825fd04d63b53b751","impliedFormat":1},{"version":"b79cc2fb1ad4a842bbb8eecdc632a7f18ee303bd3fa58e972fa3720189859132","impliedFormat":1},{"version":"44338602a65a3e3fc8dfb35b09e6116d05d2c8019e90c8d0237b203cb3b5beb6","impliedFormat":1},{"version":"b2af1e9faa4f6750ca01407fadd7a90eac3f4615df984170cc53f6d7902d3250","impliedFormat":1},{"version":"690872b554003d24a4f905afd2a7bdd6ca9e3f1ea3276eb3dfa43290e7fa57c5","impliedFormat":1},{"version":"20b1ec36566c5915f77b422691e3ce8e467c195af9c9fe2adee1b9f95cfe59ff","impliedFormat":1},{"version":"54e9dbc82c0d74af574f927f8cd1b567be6d275b23984bd1ac602b3f0d385a63","impliedFormat":1},{"version":"ad53bd475d89e449c6539258e64745d35a8ad4eb75ed20c52b2979ba27eb799d","impliedFormat":1},{"version":"fa46c917a8cd50fe346b4646a7b52d9d9223b1d746056bfdac0153f4ea7c62e3","impliedFormat":1},{"version":"95bb7829186cdf1f69e548c9a5cdfa7776e85322ead227812293702128b7e45b","impliedFormat":1},{"version":"fe656648cc1b58e401fa0d0492bf16c0883663c82a819feef879483d20a04da7","impliedFormat":1},{"version":"dae408255bd416b2717a0be18188a64a4530a9440a662b9b470b0a136c75965b","impliedFormat":1},{"version":"1180af664bda92e8c27b788976e0b3c7483201b27efe6f64300c8fd5dfdb7089","impliedFormat":1},{"version":"6d0a1eb807e4f7c63f42c1b164d2c44f7ded4b058ae9232221f14af24869a5d2","impliedFormat":1},{"version":"2b6891c13b74886d1bb32cae8b8531997717eb279cbb147932bf204220db1f69","impliedFormat":1},{"version":"7a7cf51c1625984c330021ca597a88cbf727ab2643f7db8a3bfe22aa84084942","impliedFormat":1},{"version":"ff4b5d69e379c7d2763d952ffcd1e38d95c697658224c7f612735c0c67811834","impliedFormat":1},{"version":"513299726fe81a4e8b949fc555495cc40808bbfa84cde96534773cfdcf459ba7","impliedFormat":1},{"version":"33a29f53161aa4d0778b333128b8687b743fc77173f8ade3f73c13659cf14134","impliedFormat":1},{"version":"98b9efc8d590ecc3762c6c93735bf24266c7f1bfc06f983b5098578352075b64","impliedFormat":1},{"version":"748bc14a2fb8c21ff58b57c87a21bdb9d049bb0266525050d35384c30c44bbde","impliedFormat":1},{"version":"59ee3a45a164d5c29d135c8e713c484f154f421141c614b72b3c8103bff2f816","impliedFormat":1},{"version":"de346ee3e7c0e57a62ee18acd9b9cda57c596eca1fd7162cee0323f55366c0fb","impliedFormat":1},{"version":"df6163feb8cc511ace0d25009ed44f526e91f74b8eac78986bf3a56fccbdadac","impliedFormat":1},{"version":"d559cc752ef17b882fef1b5a2cf5cef76669620f28a0d6098e57b4b5da5eb6de","impliedFormat":1},{"version":"752c7d54e9d328c8aa47c89520fdb38c99ef0132e089cb7bde73bbcddc0b48ed","impliedFormat":1},{"version":"731160a68d1380ca76430a673f064d1b9b567524807f6015b477cd64d36c51fe","impliedFormat":1},{"version":"70a29119482d358ab4f28d28ee2dcd05d6cbf8e678068855d016e10a9256ec12","impliedFormat":1},{"version":"869ac759ae8f304536d609082732cb025a08dcc38237fe619caf3fcdd41dde6f","impliedFormat":1},{"version":"0ea900fe6565f9133e06bce92e3e9a4b5a69234e83d40b7df2e1752b8d2b5002","impliedFormat":1},{"version":"e5408f95ca9ac5997c0fea772d68b1bf390e16c2a8cad62858553409f2b12412","impliedFormat":1},{"version":"3c1332a48695617fc5c8a1aead8f09758c2e73018bd139882283fb5a5b8536a6","impliedFormat":1},{"version":"9260b03453970e98ce9b1ad851275acd9c7d213c26c7d86bae096e8e9db4e62b","impliedFormat":1},{"version":"083838d2f5fea0c28f02ce67087101f43bd6e8697c51fd48029261653095080c","impliedFormat":1},{"version":"969132719f0f5822e669f6da7bd58ea0eb47f7899c1db854f8f06379f753b365","impliedFormat":1},{"version":"94ca5d43ff6f9dc8b1812b0770b761392e6eac1948d99d2da443dc63c32b2ec1","impliedFormat":1},{"version":"2cbc88cf54c50e74ee5642c12217e6fd5415e1b35232d5666d53418bae210b3b","impliedFormat":1},{"version":"ccb226557417c606f8b1bba85d178f4bcea3f8ae67b0e86292709a634a1d389d","impliedFormat":1},{"version":"5ea98f44cc9de1fe05d037afe4813f3dcd3a8c5de43bdd7db24624a364fad8e6","impliedFormat":1},{"version":"5260a62a7d326565c7b42293ed427e4186b9d43d6f160f50e134a18385970d02","impliedFormat":1},{"version":"0b3fc2d2d41ad187962c43cb38117d0aee0d3d515c8a6750aaea467da76b42aa","impliedFormat":1},{"version":"ed219f328224100dad91505388453a8c24a97367d1bc13dcec82c72ab13012b7","impliedFormat":1},{"version":"6847b17c96eb44634daa112849db0c9ade344fe23e6ced190b7eeb862beca9f4","impliedFormat":1},{"version":"d479a5128f27f63b58d57a61e062bd68fa43b684271449a73a4d3e3666a599a7","impliedFormat":1},{"version":"6f308b141358ac799edc3e83e887441852205dc1348310d30b62c69438b93ca0","impliedFormat":1},{"version":"486ce5135771d0b249145f0a1560d8766b35e5e215c0be86eff8b41f80bbcb9e","impliedFormat":1},{"version":"53c917a6d42ee959dfa8f842d612b59f5ac03a72905371fbd5371b1131d7d48d","impliedFormat":1},{"version":"2dc807c070380e3e5402f2f5ff635482e6f9fb43c244bd3a66c682a4aab7a2f8","impliedFormat":1},{"version":"39b4475e6e998885a7a0e69dc1c67ee6facced3ec7234109cefadfc7ef31e276","impliedFormat":1},{"version":"7f4bc4c6f05fa992e11f8b335db63589c556cf683a822f071c01a46d59912e49","impliedFormat":1},{"version":"b38cfb3dc5ce58b0993a9686064c31ca5b8ced1781043249089d171fa1c4fd70","impliedFormat":1},{"version":"e787c7a8b0854d8cb32d48450f95b3737b61a8be697c65d1241ba445b4261e70","impliedFormat":1},{"version":"61359565523e1c4e5b7f8af67e9a69ef177aae2903fc55db2029efa71c42f295","impliedFormat":1},{"version":"973fa3744879daa9ed6a4095b8da2cdd2bc4acd6007aaa87be9b2eab1d6ddc15","impliedFormat":1},{"version":"5cdecf081bf87b64f0afc929d9bf6ddd8731e550f6eb1846dd4513b441301890","impliedFormat":1},{"version":"65d5005eae8ea5af10b8416979cb6fcaaca374d3bc753fefb2aa0ad951e2351f","impliedFormat":1},{"version":"86feb3cb6b01919550f5c846eeae1b36707fe420d16ff7b603d27e53af450e70","impliedFormat":1},{"version":"115619837222e0263791637a3bf476060a93c7236c2b00109b0f0ab33cd6c7c8","impliedFormat":1},{"version":"e4b7cc0c48b817e78119edc65f0607d535bd537ba8a77a2937405f86393b08bd","impliedFormat":1},{"version":"6af30731a08e7b04632d135097de6b5e180bbc447d21771208415fab7489e4e4","impliedFormat":1},{"version":"12388dc354e536eba298cb55914496c389ef554ea1ab749e6b7aa6f39c74bb94","impliedFormat":1},{"version":"d1980619beb34b5b0fd0cdd3cd98c32fd38035127b4c2720b43b002a3377a842","impliedFormat":1},{"version":"46a7f13ac080593e33d76cf5de4fc9db639a9122a6a085bd12d2f3e61c9c46cd","impliedFormat":1},{"version":"efd20c2f4fe04f9965905ad50fd35e5ab0d3611ab9a077bfc1b12eab6f9cb9a3","impliedFormat":1},{"version":"316edc2773a5c40f66de00cca4f35ba671206988e31ea8c1df8e8ff871973917","impliedFormat":1},{"version":"2ae22d6b87836aeb67c823c619e0c66403ae028651f14f34d3cf0430f8fa9ec3","impliedFormat":1},{"version":"c2641eef9519484b19625ff9b9e71310da39600963da25dc0f0de11a8073612e","impliedFormat":1},{"version":"00d2e6fca85d766650ff9de68c0306afa4964823912a4dccc8e7bec80f38fd58","impliedFormat":1},{"version":"d2889f3ed0406f47012b39d59f2a9872b65465d0168f240296a6aaa23ba0e14e","impliedFormat":1},{"version":"99fcc7416501b8dca3e40581e320ef4c72e173317a539d895a2e8cf2640987b7","impliedFormat":1},{"version":"31dea6e70acd25ff078d08104eb2ae41eac598dcc305f7aeac2fbc7859246fff","impliedFormat":1},{"version":"3e3f11e1874771d8d75b18b9bbffffd2b464d2a44b3dcff3325041a7001ff62a","impliedFormat":1},{"version":"b53b302fd7ec7c441269b5cfd4a58de0bdf0e2847c9f8292b133c7c6dbecffee","impliedFormat":1},{"version":"3354fb95230a3d2f23bb4e086ab9fa29bb1fd4ade71ed7e4e15bd7fd175f08da","impliedFormat":1},{"version":"db03c5d3709cbc3f89024de53d0319e49fab02a016c9d3aef5308b44041afc77","impliedFormat":1},{"version":"5c2ebf20d132caae1c4b35d28bacf76384275937924cf72e4efbc2bcbba3cad3","impliedFormat":1},{"version":"054790666d9ed7c5a3cf292503e6a61780f7169fe3863e970d35702cb428e501","impliedFormat":1},{"version":"3095e62f6d48235298dcb23cda5fce12ac58d636b0f7d4ffbc80c84f694c5d70","impliedFormat":1},{"version":"25df3178f9bac06afb08eb57b6bc94989f5354f4ff4d1c43afc3627864446247","impliedFormat":1},{"version":"e3b4b27ff971ec37a4c0a6e1c9c044c206d68f57dabffffa71f2df80b5c8daa0","impliedFormat":1},{"version":"bed7c28681ba3141a429aa0d2660fbb6449f9bf4d7bf368efd4137a8c538c7f3","impliedFormat":1},{"version":"236c2a6aee18331ff39e29a6285aec02350cb1bddf3ca5d1e1235d6b0f059ac9","impliedFormat":1},{"version":"aa192bb83edaae4348184eaf12294dd4c1ed228cbad6da008a01369a557b097a","impliedFormat":1},{"version":"d6eeac6c763ef772e8626bc335568c325851afe57f9674c153046103d13e8569","impliedFormat":1},{"version":"5926e2e5298a0746ce33aa7c33200cf089e684b277f3e3b75cc190d145d3b78f","impliedFormat":1},{"version":"73a0ee6395819b063df4b148211985f2e1442945c1a057204cf4cf6281760dc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"d05d8c67116dceafc62e691c47ac89f8f10cf7313cd1b2fb4fe801c2bf1bb1a7","impliedFormat":1},{"version":"3c5bb5207df7095882400323d692957e90ec17323ccff5fd5f29a1ecf3b165d0","impliedFormat":1},{"version":"49a9fbfd1234674cb80daec73633a563d386b24af63e5297974cc2837a99e49b","impliedFormat":1},{"version":"293c077ae541a6628006aa6f6c2b31738387c4e8d033df81835656ed86655127","impliedFormat":1},{"version":"02e07de42da88aa986b2f47e9e0bd4573133a2240d42817f307440c700a7f04f","impliedFormat":1},{"version":"a5ecc724406ce58a8cf1dd766a2b75ac198730611a909374828fee9ca2c03b24","impliedFormat":1},{"version":"0f3b25a4a58bfbc81497a2560835ba48eb0e0d2cd00d976ac10cefb2214bcb2d","impliedFormat":1},{"version":"1c39cded7dede5be5fe3450179489d7e892e5e81590f5ca0305b063f85b04b8c","impliedFormat":1},{"version":"c94cd94329d2283c7ffaee91f3f9da4789060bfd12c18b1c87ca502dfe2e7e04","impliedFormat":1},{"version":"f82b4c8ad1a1bbad19bd2efefc6a4d80546f7ef1ea4500f2981e3d33a8844cf7","impliedFormat":1},{"version":"b15ae6501af260d0300f8148d9f6e356b16e72aad494b4d90817a60f794099dc","impliedFormat":1},{"version":"e689c521980a119665fbc52e3e9cebf182d76ba18f437710f421252b3f5d39db","impliedFormat":1},{"version":"575e8d070210e93cbb4ac3c18cea6d48b54d64aa8f658496296622d199c34e9a","impliedFormat":1},{"version":"ccfcb0348e378f0423e3b5b74eb23fea9893f9ed5396477a7f6b970c5c627063","impliedFormat":1},{"version":"171effe51e3f90facef73d7d9f3c43fb6723bf44df01740dc4d52c83a47fb70f","impliedFormat":1},{"version":"78d8ce9cc33fc80ba9339bf8018f282e1162d7bb8fd834ad4255cd111c208b4b","impliedFormat":1},{"version":"35a89ca4a11a983694a529c3c8bca9b2604dd39f1ce3be5812760c5d6bca4fcd","impliedFormat":1},{"version":"3343e2df866cc321345b51d3befd4f292fb00450f2e4cd530e6d979af1d3eae3","impliedFormat":1},{"version":"f02cac4bb6d304ead3570c7f78264af2d1fc2a5282fc8b4042dc1c1a8d0f4e61","impliedFormat":1},{"version":"cbc65ab4e61043907dc08a4062423da6e7d33109fda8a219ceda2ec98d0580e8","impliedFormat":1},{"version":"b22c5a59fad638037971add23c11d5b3fcb20b73b7687b595d57cb7c6c858c48","impliedFormat":1},{"version":"a36113daf1c07c21a0978bf3ea716d258eb8d13887c9a3bb394b4042989c1440","impliedFormat":1},{"version":"dfb8609c400499e11485d5933bb6a94029faa73626456f15b137d672f7ed3f0f","impliedFormat":1},{"version":"a1c564e2773dfb7d3bec40de87407ef36af9614ab36c23a2b20e9d07b175484c","impliedFormat":1},{"version":"974a296ae48132c94b948fefc6c41e766e75331f460fff1cac13fca48560f4da","impliedFormat":1},{"version":"8ed68c18be279b40d265f023f989dfe9bcd6334f65d5c35d15dc32e8929cfaa7","impliedFormat":1},{"version":"877353a33cf7651621d4a8d59b0e5d42745dffaa86f863fbad84a3afd3d0353b","impliedFormat":1},{"version":"6a6125d9da9c3516e5cdf26aa7e846ebbbd49cd7a964521074f85902f8df7d45","impliedFormat":1},{"version":"0462b4ed0e09fdb48ff4a70e895b563d75b413ba024f4479ef87760281b81830","impliedFormat":1},{"version":"23ace85c3d01c7d82bedd8fb95b7a7902237929b72a2a1b767fb563a24f2a323","impliedFormat":1},{"version":"53c8221dd71e9c0799e47a7b05bef62baba100e956d4e777c9617afae447aae7","impliedFormat":1},{"version":"f1361e3ed8ce7c3ed2aa9c9d0760a76a35391047e48e98685b04cbcf3d050c42","impliedFormat":1},{"version":"9f213f9495ee1bcbc95691a30711bc2274bb8b6407d55e139f7b551906de54c6","impliedFormat":1},{"version":"61d402fd5dc33411646456348996cd7d608ecf4e696c3a43ef476e64bc41d003","impliedFormat":1},{"version":"5f3f8d803300ea21de99a4e84c60af1ff808dabd9c7feffac2f0093fad064bc8","impliedFormat":1},{"version":"dbf286c3bf2c1ea48dd3d97d3d3265c36c51fd7fcef8fdc52624e5c4162d6ee6","impliedFormat":1},{"version":"e403a118d7064bd836299d296df2a1d4fdb3d35afcabc9c3e6ea9a5151b47afd","impliedFormat":1},{"version":"fd9e3764702b2863636ff175122790c065e39449fd2d2ab66c05c2452a444447","impliedFormat":1},{"version":"a2788a6aef1c55e94d8a3a51c53be474f7f766c3c3e4856940be9e689e7845da","impliedFormat":1},{"version":"57acd378108b9b4ed2a50beb0068a4ec6548a44284e2431f529225fe1c119568","impliedFormat":1},{"version":"ec4fb6bada4aa2161e89b82f1d19c23c9069a0967b3e41469b60fb1ef2a947b9","impliedFormat":1},{"version":"47ca5f288b6d09c737f95e75c952ec80601e425eb5e32a51cff2ec2b235025ed","impliedFormat":1},{"version":"3d53fcdcfc5e04cdc803c4f652f1ed7cadabccbf70b13c6f248da3ddd1fb588b","impliedFormat":1},{"version":"f6384fbd628e78839ed1d4eac7d30c438490e8501fce2671461101dc08cfb561","impliedFormat":1},{"version":"b48fe4141f082032b504b0bbf90e90200e72d26e130acdac7d4728b6d5cf9927","impliedFormat":1},{"version":"ceb82c3f651bbd2e8112df5c9101d18ecd81110157540b729f2d91fd2476af22","impliedFormat":1},{"version":"56dd0a3de5847ec09014c58e99e85b110730e9359a2927a543976625aa521ee2","impliedFormat":1},{"version":"1a996dbaf0bdd2acfeac97fbac98dba2046ec5692326099a51460c4d0f5ae9a1","impliedFormat":1},{"version":"cfc287e2eab581b5aef74288ab12a38dfedad4c7f86da8f9de05866b971260d4","impliedFormat":1},{"version":"b55a10a07d9e89f3fbc84f5adf660106de38c1632187ee89ce4722e3114bab1e","impliedFormat":1},{"version":"b76aa5f6ae4f664f6698f457d512a43424d0b89ecfae92f3862b11a59c356c96","impliedFormat":1},{"version":"7aeadcd6f891a60cbd7398d4efa6bfa8c6abf0d0d3b1c0957271b14835223add","impliedFormat":1},{"version":"ef808080f524a438cee5c18a3037659f772d77d868184073536ee14e505cfefd","impliedFormat":1},{"version":"789e37de9d9be63d4a831c44e1872c0d9973969710622c73e85e5ee488e46bc1","impliedFormat":1},{"version":"aa59e48528cf4a7f0de9db27f8fb1279a57831c87db377494dfd9909d5edd460","impliedFormat":1},{"version":"a7e9abded6309efc8a2dcad525ad862570a55344dcd96bf0e75726139ea46371","impliedFormat":1},{"version":"94095684562e04c69a3c508c15a4e379910a38781301bd05a098f563d1b2077f","impliedFormat":1},{"version":"b909d40ae0a49dc8cf12bef3675e7540f74eaf0f19a9b2fc310b91d0ac95b003","impliedFormat":1},{"version":"18517e95a9b285fa18c0218a1a6dce13c1e02584c4315710f4c29a36a87a4984","impliedFormat":1},{"version":"1554b903cb17787aed9b5dcea80358d6ea248c58933ee515aeb98c830b566347","impliedFormat":1},{"version":"758463ca4e500e663796adbf74833192d3b7b8de4854b63f45bd008f8a85e5a4","impliedFormat":1},{"version":"7731e44e65a7b3e20f506f6342e873ccae6129eecc0cbc02d1b3d30510642981","impliedFormat":1},{"version":"cb13dff5aa56155ed496db2cf084fc6a6e062d33fb0a8b72f2606e12cc3b1bba","impliedFormat":1},{"version":"dedbbcaff7747f2ea2677450351d36e7cfa30a56960a7fd261667eea2d4531aa","impliedFormat":1},{"version":"49620a7bb5ead5e646a697e4ab417a540a57b150efb8a107629eac48b13eb161","impliedFormat":1},{"version":"f07d892242e5d82ac0ed9a58ffe4056cdfbbfe8c4eebd2580e27635d7be65f66","impliedFormat":1},{"version":"2d48cb08bb8a13dc0fb00c829dae31d3ebe48bb060cdcc99a0079b4ac05c673e","impliedFormat":1},{"version":"8ad7581069b5fea9c14f35fa273b79c1eeed3248c15d8e3b3cc3014a60990622","impliedFormat":1},{"version":"96d049cb9f1a5fa296e00be2680394ac6ae91bcc848d98cfc374a469852ec23b","impliedFormat":1},{"version":"554dc5a72dea714b595395a4c12d519efccef1ce0dd5d7f41ae484401e50ff37","impliedFormat":1},{"version":"59dfd66db064bdc4a8167a4d5e6cba56213e94157fa89071f0289f07e3d95b5b","impliedFormat":1},{"version":"d69d5cbcb746e136acdd8e81ccfe00182dd9617bfd6c6c344e09a895e09eeed6","impliedFormat":1},{"version":"0a6182ba6bcbced44384aad64ced03428a44068db6e396627902d55452b63a14","impliedFormat":1},{"version":"f636e08e2de274463127a2adc5e8ca24304a2cd6ee5fe9483e35c8164bf35712","impliedFormat":1},{"version":"437f4518a56c655ee150fb75f821fd0684be16e6459204907fe8eb80ccc48cb2","impliedFormat":1},{"version":"dae796cfb059d6636e718f5e326c8f6243050c6d13f02b30e89522a05798dc96","impliedFormat":1},{"version":"852919a8c9f948a1120e26665877f445c5e979229cd9690926a4c1056ecb67ae","impliedFormat":1},{"version":"a533a88c900177a8bd724a8716d902609e7ab790e77afcdae1043ce882d6214c","impliedFormat":1},{"version":"61921a01ae678fc55f80344dc8770e257e8c3574abf42d94a0fb114439a360b6","impliedFormat":1},{"version":"620d192a20a0fdbb5f75562b2fb174e0df6762c53e0b3f3f9a905000983770f0","impliedFormat":1},{"version":"0d3d5ad7978ea95c0329ace8fc70d541f115393631c56b89b094edf9cc0e0267","impliedFormat":1},{"version":"9c4ff4b26953272dfd3fd9e37d46dbc5a1efa4ded8626b8f0bc79fafe2dcfc98","impliedFormat":1},{"version":"feb35d74e120494bfbc4c4c823da971a5b4b96e663513f68fe3c349fb8a592bc","impliedFormat":1},{"version":"c121aa1a348e834f829fd317dc6944f98169e0698c15f7db107798be1e0da78f","impliedFormat":1},{"version":"e751b5fdb543639ac55a0ad688e74c82ef24b9e712c9f1000399b63d7fc284bb","impliedFormat":1},{"version":"a3f6163afb8f4458c2a935747b1dfb384fa03f4f399a46b162e48d8b92aeb369","impliedFormat":1},{"version":"115dc68151cc74405c37a5199c2d42e5592d594c4788663c74bda8fc5bf0730a","impliedFormat":1},{"version":"d0c62b638bbf6104e0d50483239e212601576e246030b01d1b4b40918e7febab","impliedFormat":1},{"version":"de4227d3f974cb37120411c592819624c9da2bcabbb58082cde7df8dce2a89d7","impliedFormat":1},{"version":"a5c48a6fbf1358a5fe9b947a525fb353498792caa599ef33cb618b92eadcaf86","impliedFormat":1},{"version":"eafa5d831783eb6262f72363582b5a6f0e3a5ce7bcefcdafdaf372b54edcde3c","impliedFormat":1},{"version":"33d2092b9488d738d8c7a733d63affa819fb02773ba3212cf3426f4513e91eed","impliedFormat":1},{"version":"3a81f7ba793511be763ef2fc529b0779ad68aa1a4d8ff061f5b31ffe5338ade9","impliedFormat":1},{"version":"db92169fcf279dc7b08bafe78bbcffc4fe4e5e0fc66d00ea403b740e7a81b46b","impliedFormat":1},{"version":"11916ebd92fb285e5aaa3ad36c3df329057b53097370d884729507ebff0f8332","impliedFormat":1},{"version":"2ed240886fdad836469258df5fecc174ccc8823d619a07b0b0dbbc1a1616e48f","impliedFormat":1},{"version":"0b9214f3b1fe766c6e8ac26c685f5cd54155619f0e163c4e1a60118a7fc3419f","impliedFormat":1},{"version":"69b78d12bbf6f3f26065075189308104c8987988bf9ee57118670ef23c91c0a1","impliedFormat":1},{"version":"b11ec773a6f06effa0e041aec31cace90f3ed3f952d031a3f4e654bf8a313636","impliedFormat":1},{"version":"a9df4cac8ad59067b0bcf991f48ef9dd98f7fc3e7d1e3a36c3fb58073e1eac4c","impliedFormat":1},{"version":"f7e0529012b0baf35c8864fd60994e829a60acf05fb8a206deb405815a731b40","impliedFormat":1},{"version":"17831f179acf5e3b1a81da11b9b6fbae22e0f4eb996ffbac6667bac607fcd121","impliedFormat":1},{"version":"6a312ba9dcdcc637b946bb3d0ba6cc34b26cdc36f582167241e66a15a155512d","impliedFormat":1},{"version":"d10f6923085f763958dbfcedfbee643dd784a2a1489adab40825b7336d095d1a","impliedFormat":1},{"version":"1bb4ddb08f558faa5ada460dc8456be86a1f1e922a680fa37320ea24486a30e3","impliedFormat":1},{"version":"04b1eee9cd36515fc7e7c5ea54086c335c752c110f52e4f73e4f0cdde2cc3087","impliedFormat":1},{"version":"a236a69e4c0d1447040588861899788c718b4cf7d6254a3120a2ebcee95fb3d3","impliedFormat":1},{"version":"44a4531588aecec33f47aa6006da8a679340937d96e03013d05fdee5d8c2e81d","impliedFormat":1},{"version":"5ddef1c7f4524767aeeeda30bf8280d4b01d2c24c87735d0e8fc51455cef3c5e","impliedFormat":1},{"version":"dc31857a04afe1b49ff3fb722e8b4678210a1357003b626b9318448edf8f4880","impliedFormat":1},{"version":"00f09f305a5c82ff104a1b3c58360b4cd2557cff9ff37cfee6d5ed718a2077eb","impliedFormat":1},{"version":"ab57460a0acaa740c9a47c8fd19f22406eaab943992bdb27008eeb819da32d89","impliedFormat":1},{"version":"8776163e9a5556d318fe81de8cf8bb892e4b74d433ebd04edb8ca4856dda236a","impliedFormat":1},{"version":"2414ffd43aa41911f4a88803340a55bfd0e124a13a1a2d7dbe8eb3c619aa904d","impliedFormat":1},{"version":"163f6c701bb1665196f3b4cf5e3d1ca719f35e359c2812f186f3c86e495a13fc","impliedFormat":1},{"version":"4a1d0b807917c0c94767c261008fa1913304cbe959f44bba375dc1e60a74e7a1","impliedFormat":1},{"version":"90d3fc3f0fb18babdf4de1451ca218e36b30edb3105a58700954e33568075dd1","impliedFormat":1},{"version":"2b4276dde46aa2faf0dd86119999c76b81e6488cd6b0d0fcf9fb985769cd11c0","impliedFormat":99},{"version":"38d4cff03e87dc58bfd50ffe5a3fb25e6e6d4136a1282883285baf71d35967c5","impliedFormat":99},{"version":"5ecea63968444d55f7c3cf677cbec9525db9229953b34f06be0386a24b0fffd2","impliedFormat":99},{"version":"6ea9c8bf2ae4d47a0dbc2a1f9ac1e36c639b2ac9225c4d271c2f63a2faf24831","impliedFormat":99},{"version":"a2a6960ef524509846b1ad24f36f6d9ea7e5ec7f0e55f943f8db09a598d99391","impliedFormat":1},{"version":"3d76957cf49167aaf2df848fcb2d95db411523d0025e9bc414006f641f407e17","impliedFormat":1},{"version":"594895eb74bdfe0a5174b5fd7811a8c912f2121347d773e56c28b7fb98642610","impliedFormat":1},{"version":"cf39c3aa36608091ba07df403bfb6fe43265a10b6ca43237ca5cd8dc2215c50b","impliedFormat":1},{"version":"ba7c1fd630f5175e41e24b44e2510aac50e98a2605d55bb4727e52c8bbc61505","impliedFormat":1},{"version":"a1c8b811348d3806581f7c5830d0d663eb910a828a69b5f49b7e3d219f6f200d","impliedFormat":1},{"version":"5fc020e4d3e29a0158977caa3b4ada841116bca7e95f1e3bd81972a973fa3e52","impliedFormat":1},{"version":"2a1f679af017f22773696f5f8a50be7889a256796e1e9c4639bb9683b85eee94","impliedFormat":1},{"version":"5c0896b0a5d08e905ebf5e5d644fcfceeef6b981864241ce87ad44c6d38b7037","impliedFormat":1},{"version":"33082e49dfc7aa882cac44fc860c9a0df4e71b869cdea78920a87c5f9ada3f35","impliedFormat":1},{"version":"37c9b58a44c587bba5fb17937cc009f7c8b11c5e1d034adbb6149fc7edf8f194","impliedFormat":1},{"version":"7a591b347f2956a5fdff47763b18e81f199d59ac4214a0eb10b527f668af3a14","impliedFormat":1},{"version":"18f8fbcb5964b00f0b9a59b9a20818140d256a0c13c40b27a84cf45039cd7ae3","impliedFormat":1},{"version":"7ca3766a7b61700680621bcaddd75095b2f6f1d5fd54054d455963e0b01a5271","impliedFormat":1},{"version":"3c210d785849c58fe7876040224d842318acc311170b36fa1fdecf6705e90b2e","impliedFormat":1},{"version":"931d881e641f8c6205ce766b5b0f4c334b4e44b400ddbd58a65f4225d6e55ae5","impliedFormat":1},{"version":"10b5802a62730e203b023f17e4aa7db9c8bac2fa557c0284362eeb85dd3db33c","impliedFormat":1},{"version":"ac6eb3be3381810472a2fc7056a9f736288f4492acb5e245804ee5275e12fa9e","impliedFormat":1},{"version":"1c7ddf03f8b22aafca004e06eb11ef870c6c48bb210cddf8f723dd634fc4b82b","impliedFormat":1},{"version":"8a62958b8a7962aa876a6554db15b6a40491e28b9772fd939254756dbd69d600","impliedFormat":1},{"version":"9354e4dbaf9540cfffa55762429274f2491c52780856a69df5f2bf1953638a7b","impliedFormat":1},{"version":"597d714b88fb4838f4eaf380e288889686168d0eb4335b03084fed54d71717ea","impliedFormat":1},{"version":"be7f71bc32c002bb28c81860665ac30fdafd9bf8631d3110f2ed5e9cf64806dd","impliedFormat":1},{"version":"ab5265c757bf45df980370183488884c0e6b04ecafd4476d07336fbbfff4a3c0","impliedFormat":1},{"version":"1b95d53b3cf18c5cb3998105b4e2d2db7f786406e194a935f7a4be03e3c98b3b","impliedFormat":1},{"version":"8dcacb13baeb9e2b3f548b81493d484f2bb95a6384e6aa311ead14fb87a7b14c","impliedFormat":1},{"version":"2b924655747dc77d6173bb706d427b89233969c68886301b97f0ec22d38cb948","impliedFormat":1},{"version":"cd532224c54d4c8df7e7fe6df04b9db97bba3c764ec06307f8063923d0ada85b","impliedFormat":1},{"version":"5ab9aca80383397243ab240ebc38ccadf85b566f670b980aed6e777eb3bab1e2","impliedFormat":1},{"version":"1a8452dc75d92ee4fa82455bdecede05171b837b023f374052f58f1bcf5b4da1","impliedFormat":1},{"version":"5290bcde06d2a1d393225c2464ef8a7cf6e3b68ae3ece13c4a48c10f0dbac1c0","impliedFormat":1},{"version":"9dc2e706663c027d2047a7371608bd1aaa0f76a974940f85e101a9f3dcf77f99","impliedFormat":1},{"version":"1a2f03003d76f913c21a1105408fb3af3184ab55dacdd7866e1fb5eb1f4a2934","impliedFormat":1},{"version":"25fed060cca7fcb097bc0a62dc5a71f60ccfbd3efa1bb3584e4b38d441ec9ac1","impliedFormat":1},{"version":"b636d739980b2e9a24b4e73251adf464e2ec0457ba998007b89ce7977ac2ce7b","impliedFormat":1},{"version":"411ed25e4d8e230ee295227a763e32a395bf1eb250e20af71a9c06a7e96a5ceb","impliedFormat":1},{"version":"8fb43d72aa54443abd069be799aec92b354ad28990f5f5f1acd7857773b54bd7","impliedFormat":1},{"version":"fe8e8c8df9218e3e0a418ddb058a81e895bc2ea5b548571b79594eec7d573628","impliedFormat":1},{"version":"2070abe224a2071f224fd7783212d020ee6d3f71c6f48405070a0b2fd9bfe479","impliedFormat":1},{"version":"a18875ee326a56d20c87ea0e86ff11a9d767cdee9cd5feaf60dd61c5b64caae6","impliedFormat":1},{"version":"df9d5f06a1692717762ca9f368917924fdaccfdfced152804d768eff9baeb352","impliedFormat":1},{"version":"34fec0d3b9abe499f5d53f1ae7a6c28d34ac289e5cff6f17587da846823cecb0","impliedFormat":1},{"version":"9ea3742314159f08b93e3dccb7fdba67637ba75736c12923d4df3ec9f40590ab","impliedFormat":1},{"version":"bc55f374f2b27277afd0ebdf0e503faa20ac18e81d15ac106e443ab354d3e892","impliedFormat":1},{"version":"ffc7343ac667843634241465fd8bb2fe5000964873434558f82c0e670d2b7d1b","impliedFormat":1},{"version":"e35562032ca67f79d83bb8e2b86b61dfcbac6a914ce15b0e2235e6626dbd49f7","impliedFormat":1},{"version":"0810fe9c952efed2e4372b734baaaa946c975c7e3114b9cb1e31179bca9662f2","impliedFormat":1},{"version":"18b2b9e3a3c86ebd23ac27a8f966b1870b8ab29a2857dc1c524a08a49b3aedf4","impliedFormat":1},{"version":"7078f3696ec34e21ccdddfd668eb9f679478964b739082f1d2f4ec286e27e324","impliedFormat":1},{"version":"2ef538c8ab12d795cfb3759aab16593d97bf8d1f491ce4a7cec2f452c30d312e","impliedFormat":1},{"version":"7ffbadcb4cd98d917e23f35a803795404e302f2e5ed3c69fbdddcbbd0190d2eb","impliedFormat":1},{"version":"8de84288a2bb7428bb031ba2a5b6ccf5415a06826b902f704dbfe0fbd8c60745","impliedFormat":1},{"version":"d5da81f56f3189ba0a2f7fc2c38915b741a5d4f9c1d56749bae3cd821eb11dbf","impliedFormat":1},{"version":"ba6514678ba39cd24e45efb38e18d25274787fb031b49b7f9dc2ef5857330ecd","impliedFormat":1},{"version":"2dd0a4aeef324625f4ff674e2cfa14e0e3a45202ae2d2c2ab882ec164589ecb1","impliedFormat":1},{"version":"6c9e1fdd65d24d365a746e8a47f8f367650dac5e9436ef0c0f20237e204e072d","impliedFormat":1},{"version":"7f79adbfc34dc2e7fdbb76ed579a4e1944076baa68b62cab9c05a81780088c36","impliedFormat":1},{"version":"b5979ba9077be6b986d0a6c8b6904fb32ebacf0d58fe66f5595a83af055c9f23","impliedFormat":1},{"version":"a883088486a65513998935f6444e0448820478b0f4783171138e3b8d3e92ed9a","impliedFormat":1},{"version":"1a09ea0b80210733d1c5fc284ab10291e9cc2d6c4b70764d05cfdfbe4116e71a","impliedFormat":1},{"version":"3da00f0c6f5f4bca013ced5172164a08e83f33ddf969b893c9cca734f97abfca","impliedFormat":1},{"version":"2ee1fb806f0b0f44313b46de861b55649634ebd9757c5514c3ea93cf1255d45f","impliedFormat":1},{"version":"580f7dd2752bb6468e1eae47c8465d681e8016614cd2d20bad21680401381560","impliedFormat":1},{"version":"3e6c1a8e7d9a2fa9e6e515cbf2eac07eee953a6ecc134e8fc565ed914d288a05","impliedFormat":1},{"version":"aefc07a7a75a93e46eabf563f85ccf13fc5674fb2575433dced13d86cce102d6","impliedFormat":1},{"version":"39593c50b59d3f35738f1d04978755d746aafd90d90f2f088ae072e38c98d753","impliedFormat":1},{"version":"e09e37a97deb2318bcc307e56eec9e74307bf4e185c5028cd61fb7b7a415091e","impliedFormat":1},{"version":"d58164beed48baed6bd4e8b4f1d6d35379bdcb50d79874efc906db8177e99dcc","impliedFormat":1},{"version":"fd4d66024e28ba8eac39b0d79e9932c1e7ab2cce39c3c8d776a10c2d8d550c95","impliedFormat":1},{"version":"0bf65d13cc32a5456a5983b40038f2df29676c568219ed7a173d322a7a7a1046","impliedFormat":1},{"version":"0e174986b721b6f8e0ae71473e8ecabcd27a72a1eb0c6a5b245641c92eb1f548","impliedFormat":1},{"version":"5195fba3a9190c1ab07ebdce0c43ef1215513fceee989230ba26b560db68b9b1","impliedFormat":1},{"version":"6e888892c110c9d9f5dea5cea9d73a7ffdc9539ef33e2c909c71aedb89ad6306","impliedFormat":1},{"version":"e98b949511cf978e1416c23635e4a7af49fb7e906a3aaad78639d0354ca3f91f","impliedFormat":1},{"version":"9fb0f57f4aaa5a7f6f47999bfc60d46fc8624174e5ec1db2eee681e7a7c5b7ac","impliedFormat":1},{"version":"6e5f47bfa10432c13f71a1f65d4c22fdac37f5b466250b200be575b044e466a0","impliedFormat":1},{"version":"9f902e8b6ab7cf1195f7dfd4ba76ab1761d27dde27140d8e4334d664ff5095a1","impliedFormat":1},{"version":"b6597583353a27878d178eff7cef1df25cd47b52318fc8c1df887778f39fb5b3","impliedFormat":1},{"version":"89499fdc926291e337e6befdfd4b3796a5090c8f7d88f670186a3478f287e049","impliedFormat":1},{"version":"f90e0e3dd84b892c1166fee0c4d07fefe1c975aa335249369198e9e303150c8c","impliedFormat":1},{"version":"0dfb0943c928ae130a9b563a0d95d19a654149c63afc5eaeb0bdab22a2e4cf92","impliedFormat":1},{"version":"f1acea90ee99fa895bfc2be16d42d010afccf581f0a4fd81af05c1e33ba52d30","impliedFormat":1},{"version":"eb7f78707b148715913878ab073771c2711636f81d9edacdc23741c5c4676409","impliedFormat":1},{"version":"69b302f58e27871aa18c35c9f6e54e182c7b5e093d680e90dcb271ac206f65b1","impliedFormat":1},{"version":"6bbdaf306a56f31d1780c457a169c54856444cd0e38bea9302ee7f719216320c","impliedFormat":1},{"version":"3764e1710ae3be641878c48688a6064b50f88bdfab8270477421e0ed0370c20e","impliedFormat":1},{"version":"b4039afc53de6f76bfe17e9667c52903e2c3522cf7e2adb48bdb0e9801c53ae2","impliedFormat":1},{"version":"0097a7bca0c500ea9ea03fbe979b864aba32f8add469ab5755f9ca20bffe146b","impliedFormat":1},{"version":"e4128e408464f38961eb93e466b10f0b70a5347bed31a306567de8a9d2cfa2e2","impliedFormat":1},{"version":"6c2913d56a401a786605facc3696159a4334fdde5e3cf3cc99606d63eacfd77f","impliedFormat":1},{"version":"ba9d942ce82486a429051ed695bbdc82922154b1867968bc3cd528fef4b1db0d","impliedFormat":1},{"version":"5065d8794b4d58da06eba6c467c5ce628227fcee5b378bcb513928e5f4351d3d","impliedFormat":1},{"version":"d96916253cf5b59873d497bda35bf1f60ca574a7611c288416903f6da67dadbe","impliedFormat":1},{"version":"1f08d836cb44ad9eb02e5437333eea1422bec0fbeedbe2ee637ba5f85c776df9","impliedFormat":1},{"version":"747978ad044367d203290e385379ba6fa13094707cdf93e7c46a28b557d5ec55","impliedFormat":1},{"version":"085986a624337952d77da5b7f4606715ff736293c0cd1ab2bd3bcaad20948100","impliedFormat":1},{"version":"42052a992a6973092850f23f4010d7137d202c1f56a8e8c515afa5de03b38506","impliedFormat":1},{"version":"80aa8bd81499eeab329bf5cd4cdb47cb6a1e55ce8c381c73ca0b34504dc98c31","impliedFormat":1},{"version":"73041c005eaace48167bab34c90c22873c23cfe7143a8a1e4830325611b8a432","impliedFormat":1},{"version":"1b8e481079ddfa96fa74e13195d09a3042427deeaef5e489c6953d033790e0c8","impliedFormat":1},{"version":"fd8c6a9b6efe0982844a362276267f4a8a0d0eac3f6c0105e07ae448baa089b2","impliedFormat":1},{"version":"671375a441525dfd1dd0d6205596b89cd5e36e43f5d5bd55241a5ebb1f9f8536","impliedFormat":1},{"version":"0ddf0a53aac62bec6bfbb70acd8ec414e4cd406e456d90b927d68589a1bc11fa","impliedFormat":1},{"version":"6b67e49174c6d0b293d10173bd4a1cc03006e5e34982a27e411474d6ad4ab08b","impliedFormat":1},{"version":"bbe077c6b64b00be512cf103a2b162d07e062bd192d27a80e6af5e640883efa2","impliedFormat":1},{"version":"6d8c163fa3b2767df0be2f34a5766f2f84400f855004dee35978668ea8c643d6","impliedFormat":1},{"version":"67901cbfa0e5b836fff44d6433d388ee08d49e861dce861c46089e85db76d1b8","impliedFormat":1},{"version":"cd3637aed7763ba22d12a386349eaa3ac394187d7e62ac5ac2f2b21959f2c92e","impliedFormat":1},{"version":"182e6dc43d9db5b02d97da9ad1a1f33511698690d075aa094a323e5596ee4151","impliedFormat":1},{"version":"03daceaa4fc85ddb4578c3e00c76d06b08354f67d3488fc0d3ba70f5b7bebe5b","impliedFormat":1},{"version":"a61a2b837dd119f4bb6328ddc2a75d2991268ad3f3c7fb057f5647659e8f7a0d","impliedFormat":1},{"version":"1d56fda4de62aa710b03933ed8886600db20fed547fc82fdb1e3172890b911fa","impliedFormat":1},{"version":"cdda9aef8ea456f57dbc7a1dbc992775635f35d1f16bc6ba5eec62582eb95c97","impliedFormat":1},{"version":"809f7de42db29764819db01936dd61260c36bb46da14a2dfd0d9cff433119c97","impliedFormat":1},{"version":"5f5a37e3d8f88da4365d633ba046b4a6fb20295417527e553f64a4b09e3fe7c3","impliedFormat":1},{"version":"5b76ebb3f054e884e915f113277a51baf59e648c63704aecd893b03d59f1a1c7","impliedFormat":1},{"version":"94db31e5feb97be7603749e699e2c7a149c1757ef3a7f9409527a11be2886780","impliedFormat":1},{"version":"80bd39fb5dac4905e90d9d2d2ec1bba058e4c5e65606263d76fbcef5499745fc","impliedFormat":1},{"version":"c814167f5da5cf413798dd7364096bdc04e1880118cd0d6fc7b1c8a13cdade31","impliedFormat":1},{"version":"ddca3180cc80853cbd1fd0ff049b4c174243110a4a2f231ac52f808369e10fb0","impliedFormat":1},{"version":"fdbff9f09e335506a85070891d2a7d370c151b50733742e4d2a7fc16900e4a95","impliedFormat":1},{"version":"b2b44b7e7d9e497466c0af940cb970eeca779ab831550078a0520aedc0ac3460","impliedFormat":1},{"version":"86dc4fb96df154d94b170e083ca293c38c12b9db881d04a4da308b7116fb75df","impliedFormat":1},{"version":"964e5c21c9795282e320431952f8399a76cc9c680516bc05940f6521f82c8495","impliedFormat":1},{"version":"35c15cf54be7051ef44f508d9da9c27c547f6e81d52bf477b0f809e2327ee8d9","impliedFormat":1},{"version":"b8d0deccc242126e1550a2ea3cc2661d7b174ea120559e1918e06b9270285ba6","impliedFormat":1},{"version":"2e52952ef8cf48a372827fa45cdc5fb094c91421f4feab9c803129ee078edb8f","impliedFormat":1},{"version":"a9337ad54903029d34c273ee605be5716e7832e281f6fb66715f661a93c10776","impliedFormat":1},{"version":"d907dd40369128bd18eee0e92d883b919aae330aef5edad23b8bc267c46e1ecb","impliedFormat":1},{"version":"7b877947ac19bfe5039233596c2a10b10f773acbf9857c8354e47e16b319e1c2","impliedFormat":1},{"version":"73ebc746aa0a19fe29c826702d37419fba934262c4c1a3b04d37ed2a20fc15b5","impliedFormat":1},{"version":"a7a1e121728c2e212f90d8d2f305f472b5a88c30dedfdef781ed9c75f2c8b3a4","impliedFormat":1},{"version":"e5531569cb6d4fc5ba2eccbb67ce8f8bca6f569c6f0702a625d5bfd0ef364854","impliedFormat":1},{"version":"5fcb4b897e8ea1ef4d40a6f42a93c329685f29b4c6a3639a02176d9ca9cb4686","impliedFormat":1},{"version":"e8dc672b15bf2e1e35a81e45140d830be8c98111325530e5f0eb7c5863245e82","impliedFormat":1},{"version":"9e8fd5b597e56e984d9ace2f8b5036c52ce3db8bd99c9d0a0e2a6be437eadc85","impliedFormat":1},{"version":"5a4a8f7317fc4821e7a46178c217733bdcf29c915a4919289292438e15de4607","impliedFormat":1},{"version":"5e238dda917cd2472b4f01de26b108974e55284bb214a4bfad978a5be34be7cc","impliedFormat":1},{"version":"5125b5b048d60035522ae201ccf7525e2f6a2ac5b2e68b6607ae54c715c66900","impliedFormat":1},{"version":"f55b6c21681fb9bb17f61ff9368fbd4e71a79693ce295a14151b4f325413b0a4","impliedFormat":1},{"version":"a5b2f909b4117accaca01cabe73871cb9077b9f93d292dd232f10892d146de43","impliedFormat":1},{"version":"9618adb3ebc25306662e030f883eba7057eaf4bb2c6d5879dfd6676129815c02","impliedFormat":1},{"version":"01270a9f63529e308eddd085993c4f25c1cb594e69f47ed3b289fb097af55a6d","impliedFormat":1},{"version":"d92d2527e59d91387d208c266a49524fc263cda8f6d54beb9b85f98b75493617","impliedFormat":1},{"version":"de0d38c21863792de0659e01e8e76615be53fa586ac1dd5b54f6042ec6348feb","impliedFormat":1},{"version":"a55439c4098a852a7dff67fcc3309065f8bf6009e02273e0cf7f6e165fc959c7","impliedFormat":1},{"version":"3e2f969b9fae540fcefdbdd76fd18c9743a369759730c66c775bd7dea5c151e9","impliedFormat":1},{"version":"fd1aa5b5f3c10cb19d3e0ead864d193a5fcc7efb837e47212255bcab2847a173","impliedFormat":1},{"version":"3abe9c7635bdd2ddbbd9f1a4d98ff44c2ebf780e13e17187adc98ec82ad0c7fb","impliedFormat":1},{"version":"ba6fdc7d3a3d6fc4236d491103cdb8b132c151b2dda4b06fbd38698ac0e3d2e4","impliedFormat":1},{"version":"32a3a19d049ef0b2539e525c862760158d6d16345835f2bd541e8f9a45380b50","impliedFormat":1},{"version":"7fa7fb68cea5734bfe2091ff218d302f0a3066f4a78ba26078322358765cca8e","impliedFormat":1},{"version":"11248c1e632fadd67c22d561754c30265e785edd66cdbfbecb227c3a9b1ebf99","impliedFormat":1},{"version":"93b6da74507103bee98e39f0d02cf6849c0cadbfc813f26804bf9ae5d0d3f75c","impliedFormat":1},{"version":"29675992f9e94f7f721674c8d07bc2042ea7a6bb8cf602b0ded185edd0c557a5","impliedFormat":1},{"version":"daec5d2d52be233262c80013e18d57be920152412de99ddb637700410ee7fa7d","impliedFormat":1},{"version":"e1e1837b07bbeb81a00d1b0b7edebf8f3e2b44ad148d5faff905ba17a0005813","impliedFormat":1},{"version":"c01d685b9634c875d18f81b643cc1fa5c01a1c740ad19a2578811aaa8f12f414","impliedFormat":1},{"version":"a896dd450b58d96d34a2b565c4d0db365eebd39cebe6e34fffbb2e01065d3013","impliedFormat":1},{"version":"7fc08eaeb2ac34f87eb2336270f2368e66eb83796d5bee2a96438f01d088cf68","impliedFormat":1},{"version":"d6d4654b5db43b43d857d245c054f359b8aaccf6004bbc4324f320ff2a507a87","impliedFormat":1},{"version":"628cc9debf7b2c1828d01d134506fae17eb26b0196d82184df3b6d9494b43ca1","impliedFormat":1},{"version":"a3d8178c385250d74effd5936477f4d5d2ebb9afb5a342bae1b928f621af63b1","impliedFormat":1},{"version":"02124f773917b14404ea6b1c87bd84e701136ecf91ea1a447cf93ede4bf04983","impliedFormat":1},{"version":"e4d4ed8aab4e61f8ed7656baa565ef07cb0e6f8418d81766721cf2b591845243","impliedFormat":1},{"version":"e2a7ef3681c1d61e11203e8dbfd77e25f23d7560c8fcdfa37490899d037c0ee7","impliedFormat":1},{"version":"8bcac2d5ace8feaeba195f476351a0f09841ba69a1b6175ab6574300fd70c9d0","impliedFormat":1},{"version":"53ccb10a74e6de7b5ee83cb44a12834f823fb78ea0ab3ce51475cee1779a8d9a","impliedFormat":1},{"version":"88751f9db85c13a404f3fd8348ba1ffd606715ac60572aa7b20de442049b0fff","impliedFormat":1},{"version":"d82aa6e7f1decca5179d57d12f94a9ca9b3f7f77048aa20ca98e154c3019c1fc","impliedFormat":1},{"version":"444a93f528d1b023dd00c1b46dd3d474a0339b50599b2e819ab13fb6b2c915cb","impliedFormat":1},{"version":"70c415e2ed25afac403f2828c67743154a8252945ef24e9343e6a3a55431de7a","impliedFormat":1},{"version":"86add54a494cb66d630e4554b9a2552fa2488b491549cbc2a7ca0e538e1d9f1d","impliedFormat":1},{"version":"3039c7975bb1035041e6abac5c71cfd0c2531ac20f8a3c521891d18d21b831ac","impliedFormat":1},{"version":"6a8111e8e43cffcaf41372315ae6cbc11d8596cec0cff4c6c70b27da75cbdd25","impliedFormat":1},{"version":"e75a6771bec31aeb2e8258df9f6c6652d1659648eb53dea7773562660a6fb5ca","impliedFormat":1},{"version":"4c3438e7cc5515323f5846d72b84fec9fe2e6d5fef50a517542c7a9bdc51dbf0","impliedFormat":1},{"version":"1d86876dc1a10218bcc482d392b3b86a61ebd4ae5f591a4755beb074099e4e95","impliedFormat":1},{"version":"80ca9dfd51ef8727912344fa6dceb3ffbda52c4a2ffb2182b704480a5fd7ee8c","impliedFormat":1},{"version":"770c2dd0ac11667883a3ebc682899c068c48ebd57663e4c50949e5652dad80fa","impliedFormat":1},{"version":"feb908fca7ebf8a474b20dcd1aee71d49ecde939d2f9d6dc9e8c9de589cfcfca","impliedFormat":1},{"version":"50849d34df4de824de2907e963279d49ab22f1914d47135cbca6fcb5685d49e8","impliedFormat":1},{"version":"7dc02705f75ddc71b0e2f18351d3696e41f6e07d790c18afe5b78c89e67ad387","impliedFormat":1},{"version":"79ca6338c68397a7e0f0b7ddaa3350c9764b8a2c4f4638251d316f72cccdf1cc","impliedFormat":1},{"version":"d4268aa638387a5d8219b3f8ebf0973ecaa4b2814f4e036248bd189654e510dc","impliedFormat":1},{"version":"7e6aa259bd4b2bfea6fbee6aad9811aa9b0c40ba71cd53e9db77073f41ff3aeb","impliedFormat":1},{"version":"4d19bf8ff0030c8c06c5b006baf9f7627e9f76216138eb45966583d0d5724b13","impliedFormat":1},{"version":"59a25169e290be34736885c06d5e29b2c2af1d6bb0afda1c3126a57a87c0dc4c","impliedFormat":1},{"version":"16adda3678b1f885104505504ff3f705f92cb071152b6826143a6578b18a12da","impliedFormat":1},{"version":"b773a29e6618e4ece53d0984eb455fca116799a6f658f4ab9de40c58d71f2dcd","impliedFormat":1},{"version":"f3b403e6482d63c3f00d1a5e77f8dc02c85bb324fbc35689f94f657ff678cf3e","impliedFormat":1},{"version":"eb1dc31de2323373220ddaa9e35f12eb2e2528ba2ddba760496b5e02f94e83fa","impliedFormat":1},{"version":"80d5e377dbe2d879fd58b903c81cf8051794a2457346783ccc5219088af95229","impliedFormat":1},{"version":"2f011e16e37f62fd4a7a00986fe5678fd7318af48b733274adebc2a1096f4701","impliedFormat":1},{"version":"7af34691e03a05e1cc3ab659fa0eb97df924dc12219b9e0d42df1b1b4944556b","impliedFormat":1},{"version":"d179af5c4c1785302bdf44967a0298b40a055290cbdf49b8b1f6821b5ac45d13","impliedFormat":1},{"version":"715c6cfb5c918ebaf7a4ac12fe7036354c7737ee53f27e953b0c6b32ea5c7fed","impliedFormat":1},{"version":"c14033543f143ff973b992b5cc84a8ec179fbb26c55d021625400bce08693062","impliedFormat":1},{"version":"e0b68ef2073c5ca07054a7569bd426b18eba0a13bfeebd987edbc1c08e9858ef","impliedFormat":1},{"version":"79122f57117b9579f963bf6db860c90f43c61fb3695b7b9709733dd36caacb53","impliedFormat":1},{"version":"4f1ac03c089109e65116ab3c7d6cab25fdb6a39de4261276224e87daad49a416","impliedFormat":1},{"version":"668f9948d2ac4073c890e9085c0a0121e91829b12e7dfff1bc97c2b22febab66","impliedFormat":1},{"version":"95d3f7dbf440ee15105ed62b06ffeece7c6b2e9c8d7cafcf926a02732b0651bb","impliedFormat":1},{"version":"08c35dd9786948e567228b7981fd7fa898635f0ad07dd474d19315a4e4cf8752","impliedFormat":1},{"version":"7c95d753ce060546ccb96db36e36bdc1ee5527a99b81deae23537cc059b728b9","impliedFormat":1},{"version":"f02a70ce1d93ea668934465feb287fdae9fb9fd89ffb175e3641b505d123f1b4","impliedFormat":1},{"version":"ecfa1490baf58bb547cbffd35055a8d37350e5a4555541ef9ca594f296adf0e6","impliedFormat":1},{"version":"17fc7881515e746d2d626fe263fc89224c51c87d12cdd1de0ea18faf297b29b6","impliedFormat":1},{"version":"2676d7da626cfa5bd5c71bb1bebc049e6f2a2b68aeaa3759e052dacaddec2e7a","impliedFormat":1},{"version":"1f252a0e6a399dfcb9c151462a942d3c3640aa024748e2357bc2e50b525dc66c","impliedFormat":1},{"version":"76163722f8e959ab91ff15bec1df8b2af77e12c975a41fe696f3a14fd3850da6","impliedFormat":1},{"version":"121237ae57eaac5ebf646f81cde270eb093e12ee4d3954f9d8595eacdcfd9cb6","impliedFormat":1},{"version":"9a84eebd6e526afc2fc38392b0c507b9c373159bf9565b5a192d53abe9cca1ba","impliedFormat":1},{"version":"1745ce89aa62ddb61b342a63c563575d750207b9951f256c42c15cb825e5df99","impliedFormat":1},{"version":"6762da06aef84aee250f90a6e8d65ffa470c6b5bf7c7a2d4de68077858605417","impliedFormat":1},{"version":"88782e4ead68723b1353d3cbd8eeecb2b88577809d6920714ca3d61f755b6e14","impliedFormat":1},{"version":"95448492f7f7db2368809190d29c7472ed3f6f898614360ec2ded6cd710c5bf6","impliedFormat":1},{"version":"638fd06e4ac9a0f7f80cb59b2acb9ad82d90d4595b791576078500da430cd691","impliedFormat":1},{"version":"532fbe381f6980f5f96c526f5fbb6e2393093ec4a6947af24b2ce4f0c64d464d","impliedFormat":1},{"version":"59262b81348ab6c3b8648eb84d869d359ae5c2ad69a4e0022fd917e936389f9a","impliedFormat":1},{"version":"980bc0f948c0b2cdcdcfce30cb6a67ac7357e9a04a5a5377a4b603ec5ff3ed44","impliedFormat":1},{"version":"08dfa3925bcaf3217ad1cb48e967b334371258446f410a2bfc0647ead3b53958","impliedFormat":1},{"version":"c4de9078f00e95ecf7eae1756d21022683889dc2f7dc359ac1a401eebbccfca5","impliedFormat":1},{"version":"cc0a459bdc4e9cd5fe034a62fa83a8737486b0bf40b11190e82ed4a0d803cd55","impliedFormat":1},{"version":"e159fd8868a308bda44f504d5804f730bbc7f35c7c163c9d3f04d36a1f3eccd5","impliedFormat":1},{"version":"48c16c377d293408b0b9f8ad3822c543728924dc82caaad11d271cb5a43c8b0d","impliedFormat":1},{"version":"a35768b4aa61e5cd551016c91f2da9666c485fd32cb85063a395f55a74932df5","impliedFormat":1},{"version":"60c94b45d32c09deec9a19ba3f7d8f680767992c1724e20386d786ded16668a5","impliedFormat":1},{"version":"d8815d7ac98bac1d4d476b6de5c837913368a909f1d417738c621be550483037","impliedFormat":1},{"version":"efe5226c10cdbdf02bcccdd55ab7eaa546d9d20f8631b71eac14a171b6856115","impliedFormat":1},{"version":"25182a16410182f105e3d4f7ce47704868692d82b810145a1fd9214dd68e39fc","impliedFormat":1},{"version":"5d802fdd246b92e92cceae486384778d2e70099364e3060458ebca3db6c9537d","impliedFormat":1},{"version":"25911651d3fd103da84f2da6089c5796c2cd3bc9b885de8d518538ee0b2502d7","impliedFormat":1},{"version":"b1d4486f4041635f978e24b6aa7aa26a8b1df81ff6d7fe82e8315d436ce4ea4a","impliedFormat":1},{"version":"697ee35ed13099d7b2a3bb7828a581d2b6d1b23574a4213802620429c973ec27","impliedFormat":1},{"version":"595c172dc0edb928be05bac0fc3010d9fe5da4fa92e404083f2749e693138882","impliedFormat":1},{"version":"573082b6780a37ef0f3c4507fa954e09f748f710bc50754437f0394639402520","impliedFormat":1},{"version":"7ae49abce785a8816bbb49dd5fb301ee5522f02014aad1095639a342a4aabb26","impliedFormat":1},{"version":"c8ea14372521ab27bcc17db148bad457dc802b6a7aa95a3e67efabe67831143b","impliedFormat":1},{"version":"8e4209d2c93131a8ea06006841fb7c08043a444071f094927b2e160d67ed3ecc","impliedFormat":1},{"version":"72618877b1e15de4275dfda49102c6240811bcec30e4c9f8bfce889edf18187e","impliedFormat":1},{"version":"3a699715c6b195cd9b7fe96bc4c6482710c5026380ec32ddd49e60a42cd8b9a1","impliedFormat":1},{"version":"13e631d64e1710522bd93bb90235dfbae228d2b6fb762dcf9cba641bd748829b","impliedFormat":1},{"version":"e965e9e03bcb2366b03337dcb8c82a7217eab605f3db90ee942302bf98db340a","impliedFormat":1},{"version":"e384122e4fb7bd3ca8e36b92825508beb73784446e40adc1f747dd331074c35a","impliedFormat":1},{"version":"b331bafdaccff6ab5ea40b3526457cf25f80e3a418958f8b8737450df8ac95cc","impliedFormat":1},{"version":"bc756ad9380c772b2a0090e370516abc6566781684d87560fdc69fd746a22eac","impliedFormat":1},{"version":"8acf5e34281b6896a32f263576144711a1e0c5aec82deb593d8675c18147f546","impliedFormat":1},{"version":"b9876d7df3a4ec58dafa1eeb1e5ae104d3326e5d0ea50fd34e8e67b58e52e98b","impliedFormat":1},{"version":"213891ead7f95efed458988204d6d328fbfa6680dbd071a833e8e8ece091c162","impliedFormat":1},{"version":"42ded6282e32871a3f09fb7a75c5a4fe7b15b567ed26240a9423a66d4b86d208","impliedFormat":1},{"version":"e96ca53a2b2ad48b5bf88acae2eca9b0abc169fc5247ff50b859bcbb1decf17d","impliedFormat":1},{"version":"e498682b4351711ddaef48cf3188cfdecc0283f4f5f73bffdb9cf362a3e7e050","impliedFormat":1},{"version":"ca483bc36f5d4562f841c69ef35ffd4aea406b4279ed20731f09585610e0a802","impliedFormat":1},{"version":"60481d85fed75823dda60351102d97dc8a9da90fa02e3d0a99b87a0bab04e435","impliedFormat":1},{"version":"ee3ed2930c509a2c67f2d5cf2674d4a6492bc76732b3fc68fa7130685e9c8b01","impliedFormat":1},{"version":"321df1633735c87d46c5eff22d8088cff4bc306d1d2ed4ad4dc7a86da66f58ec","impliedFormat":1},{"version":"0d88fdcd81ecbe69ca9653d9d539cdbdb9149c581a21b4baf57de562f8cbecc8","impliedFormat":1},{"version":"fd5dbcb25c0b40f7cef69a0978cb5d0dd024354e8563fbc99ad60ff022b40737","impliedFormat":1},{"version":"0d9e9751713270c684dfd3d0f60d4fb5903ae06ddf5bdfa0f2661b37093f8bee","impliedFormat":1},{"version":"1275c436f0b1b256189ce3a87019fee89f1c7c6194df24f25658ef92d2a75727","impliedFormat":1},{"version":"37fd9ef1c7c0650bf00c918fcee22d682ef3c6976edd858d63d74309afb37f3d","impliedFormat":1},{"version":"ac14166d41facb50f3ef111f7b9e66a5fbb2010724d8bacc3aef62d28c1c981b","impliedFormat":1},{"version":"1b542dc311c5c6c197920545b5d997095d4f81f41fedbab1658ab244db05410e","impliedFormat":1},{"version":"39bb8abea90bd4f0e0f196b26fce0fa7dad2e84d09ebd55cf26f66ed085d4c1e","impliedFormat":1},{"version":"15c3d2438362bc387bc7d7d4f8465d12b292d59d4ae45eb6a5f3a3714aca0533","impliedFormat":1},{"version":"98c26ed17796f720fd2ae16640a41139d13989848387eb78dc1dd4b3fd0c732c","impliedFormat":1},{"version":"1e875cc927e244f0c29c70bab63d90f20e71064565049b8ebffc90552f12776e","impliedFormat":1},{"version":"6129817d361cd2300a08ee34f5fa2b777a4fc90c3febb79c918ed1c40f7a25b1","impliedFormat":1},{"version":"d62158cb30f91935a8d0a410a869a70a6a0940cc2e98177616d74f037688bf92","impliedFormat":1},{"version":"427ffa97d275e77497fad3d24fa95fab369c2cf4709f27620a8673c22d0c151e","impliedFormat":1},{"version":"1a6b8d2e110bc4f4589963c97a3dc4a08b662e59738d59dca2565f7c3b35dd9b","impliedFormat":1},{"version":"451554fa5b756b144bedd2950aef7795728c37e619b141f18ba5efe721aa34fa","impliedFormat":1},{"version":"f63e5fffe7540b043e714c2d9cc1be520fb6fe5b9f8b709eac7523af40195186","impliedFormat":1},{"version":"0315812a5654097cc200625d27fa287f9447b750075cc2d33705198a14066e3e","impliedFormat":1},{"version":"8d0abb60d6f019de7726b136a8276990dbed686409953ad2cf6d79ee8b90d3b2","impliedFormat":1},{"version":"56badaca43104914e6e299612de820bc66a69e43ca7fafd1f340ed70c09cfdbb","impliedFormat":1},{"version":"203d186ddc779e35e7dfa7193735254529d252ef7f52e813f259e6ed479e9507","impliedFormat":1},{"version":"4386fccebced3e526ea7e601e54cfd712b1ad1ac40c21158d053d4bb1e55b951","impliedFormat":1},{"version":"cd965101939d557c184a81cf8e773e31146873382cf1547d035cb5e6cb57dff9","impliedFormat":1},{"version":"c037102606e032569c026474a95c31a63f7d752cfe6d5123e71c09b9fa636d56","impliedFormat":1},{"version":"77588f8d6566b6bac03479322cf55570e8f9eeb8f27ba8b5af2ab907b573fc45","impliedFormat":1},{"version":"522129a86f52ecd6236a4e59be4542a8b2c6a452ec6317e53c82b6ef5840ba89","impliedFormat":1},{"version":"4d1fef84811f86e8ba66ee6af1c97ec67a94d9b74e7e1e8f21a23e47f65b56af","impliedFormat":1},{"version":"3ae84bacbf3da888f2e9faeeec5b1adb9755acaed2a4cde11f2ed34b64201864","impliedFormat":1},{"version":"6df7a162ffc842b6695684de0ee5184aa970fb570a38e702d200df659808fa66","impliedFormat":1},{"version":"7557a2a4e6b0b6a6545d5d65284ebb38bb67d53bd2c0f5e99ad54dea57f67500","impliedFormat":1},{"version":"0d93012bbf9e0a40727e36369752819c387f0a32f30e863c727e9da25b773f6a","impliedFormat":1},{"version":"ed6f91479c0538f25686a80ac97d4b485a3f0f8b06937dcdbd85d458f183db4a","impliedFormat":1},{"version":"84e25d7608672366e55fe39acb592e228f6819686c208a7cb4dfe46ebdb1d6be","impliedFormat":1},{"version":"949ccaac85986e407f0fb6f02519070804470897d50f4c29fdea344f714acfe1","impliedFormat":1},{"version":"5e63b02f4474647dc7bc40d809695e3812af40a0a05b72f23729983d97d91c91","impliedFormat":1},{"version":"86e11b587490cd8365421eca18966a59d89cd4846d5a84a6a0572ee283513902","impliedFormat":1},{"version":"c3dc0d9cff2d4456c574888110720b7a9582282971b907865e323356786cfb42","impliedFormat":1},{"version":"952fcddfcc7b49df167140b9f81b7c62cc6ef29dcd4fa5f12dc0f4f13ae98240","impliedFormat":1},{"version":"e93d9a364b61d50b9ee14554b5f48ea46dd8c557b94bdd637b196afce4fb3e69","impliedFormat":1},{"version":"9d6b766c92985ca30cfc521ca650d1007c9986f8fb8b9dae720d9f55a0f3d351","impliedFormat":1},{"version":"7bf52da3f2b777152c701a9b4dc97008ab0a0f9db3311a2057fe041e021f5f35","impliedFormat":1},{"version":"42feeb1901957dfa282e8c1fe359fb42376abb894e609628dd9cb1edbcef7b5b","impliedFormat":1},{"version":"2e0840eadf33be01dc61f4f62887a8ebced1b8008610885b777265cd09b5a22c","impliedFormat":1},{"version":"f1bacabb70c87fe9d05595db6ec80afb0c16f0437e9b3c01c8e860e3de342a81","impliedFormat":1},{"version":"a82fcd992077e23a2b8f34a245a5785eae074a4c4cf00e295ffcc7e6fbf2b18e","impliedFormat":1},{"version":"7e847c37d924926f5540e2db0362e46e520334823cf889557d2c9a5c7fc7dde0","impliedFormat":1},{"version":"42738fe88686c67006137210788ff9013bcd961e494f015f3aef70ea663bd6e1","impliedFormat":1},{"version":"76703404ab0c7442e3e1920476f9540fd66c1367cde3e98bee8773d20e14d214","impliedFormat":1},{"version":"848670bf9aedb7ed67960ead4edb7a422a9add15e0f18ad3fbdfefbb47500d84","impliedFormat":1},{"version":"168150c074102ffe35603b43705a4dea7660cf01c88dd88740686b943a61acb0","impliedFormat":1},{"version":"900f3e87a9e7270634bbaadf57ec15dc3f02db69d25f9bb325c7c8f99303880e","impliedFormat":1},{"version":"aec5946f6fbf0fe023537cdf7f4f904ea76ffc8976d508d8409da52d0ba6e1fe","impliedFormat":1},{"version":"5b51d210d61b20c944cec24254d20110ef279b79c5e457c16d35395e979aa371","impliedFormat":1},{"version":"547bbc28cbca3e4e26af6b00ac131fad91fd0bef3ecd56e204ba1c66277a27f4","impliedFormat":1},{"version":"88730dd27c119094a269b3319036c4d60adacb10f819e9f0817ff1826709a42e","impliedFormat":1},{"version":"09efdecdb0a3f448be675d83b687d2f6e1d0f6bd756ec36fbf430b2c6840ee70","impliedFormat":1},{"version":"46a4c5544edc93b22ec2d704197c5cd684e6ac5ea491dd9b33ba531867e94e4a","impliedFormat":1},{"version":"a40299fb32c3e734190df64c5e577983616d988f9a0661d2d8092fd66db53634","impliedFormat":1},{"version":"5c568ac086f9156633b8fe8c85366e2d90de49914c81fecc8f0409605459a22e","impliedFormat":1},{"version":"072edfb9947a2eeaba872bea4a2b22a73ea932d51f8c9b19c71c7345a2a636dc","impliedFormat":1},{"version":"a88c164bbd33edea01c4934613ef625f946be8fb7e7df876c7518e8d8b258b11","impliedFormat":1},{"version":"11967bc391eb0ec437202643f3f8cbcdf5e97439cfb4af8ab5215f9be37abaac","impliedFormat":1},{"version":"cdd01be7d5d7cd2388607e6e89bad1dea3bd6d5024f67dd03bc9eabb8f8cc7b2","impliedFormat":1},{"version":"b0417940c1c63dca7f33dee7c7c0851b3443f0b5a12d385b562f1cb5c39720d1","impliedFormat":1},{"version":"cdcf2268514c3b52d909f39fea338b3d670b9b2145b66306e362e59ce921394f","impliedFormat":1},{"version":"0dc8fe7d045ef79a8d61e221b76dc5db793cfedeadaf8fa8bdbb4a717a6b978f","impliedFormat":1},{"version":"bc12f789eea7c7667dc8c1a6664600c696783cbfc854480db157d2b6b9ecdb59","impliedFormat":1},{"version":"75b4143645ee1d64a23f9d18a3ab534ff6682379dc2c239c947f0f83c0e45012","impliedFormat":1},{"version":"fd745003aebb0f7b47e684ba22a118e0d59cffffa86a097714933b4f613aa08f","impliedFormat":1},{"version":"0971815c5614f9c4d36d55a3d1d4a45f062e78cc9a3d97ef6a3b23c86b665475","impliedFormat":1},{"version":"76728d3561f3d4f3e8810fad1178ad402023d55e8a5c5da872303bc8e9c4d79a","impliedFormat":1},{"version":"4acb6230f22875f6defa3584d10c817831affb136ae94f5d2c0d9457b7050936","impliedFormat":1},{"version":"f4e5b51de3c73f0f093739ad5b4a1214d9d8ad3b3d6d01522f1ad6831d60f80b","impliedFormat":1},{"version":"4ade309af02a50dc157394ee7162c88476980b5efb0aa7304d6c618a0112a89e","impliedFormat":1},{"version":"2d3516a828f8ef63b2f2eb3ae1f0570265744df44d6eb9fbe8352bd5ab7f2a62","impliedFormat":1},{"version":"f78edac82d00a3d169adcf1fc70c705be387dd2c18be7d6a7c1e54ef084cd641","impliedFormat":1},{"version":"1f11139bcbbebe3283f0a33b647aafbf272afe86163d9554fad80f6c040b64bc","impliedFormat":1},{"version":"ee0fc780ee45cff7ee13c49ed43d4875c0155da4cd17735113611db6a1665b1b","impliedFormat":1},{"version":"b9e1050114f422013d0f534b4475cdab7126b7217af20f15bdf83cc734d1ead7","impliedFormat":1},{"version":"e231c9fb03ca8893b43f055c5d651d55e189b48ad9351bd2729720671790cd83","impliedFormat":1},{"version":"a97a804c84d0cb7b1c015bc06a005613e1ab5ce58c27528dc9f00fa6a8655f28","impliedFormat":1},{"version":"090eb938f60728f4bbb7f94f6ef48ce4481bf9205aee390c4223ea9acef7a780","impliedFormat":1},{"version":"2348b5c42c8dc9255e5ed9029c102c3f37d25f8289d84b4c711d6fcd3548a05a","impliedFormat":1},{"version":"3bf3b2e2a29b895dfb42b380f61bb60419ce9f733eb26f61809b589de790fe49","impliedFormat":1},{"version":"c8d3fc06cc42c173a363bbad4e392a325867812b47387d1dc2940ab555bfdadc","impliedFormat":1},{"version":"f8890f41d665b98dbc2cfce66719aa64c358af705b183a7f682a5229520e0fde","impliedFormat":1},{"version":"9cd88c0017d85f46e694a13c201bd75d7c404c5b07615b2de57739d645988618","impliedFormat":1},{"version":"f8dc4c538eff6d92330223253dbd66c4354324f411b39de2b7fa520fe41b658f","impliedFormat":1},{"version":"2407b5c4ed19bf2edb4a7459c672627003236d0912947e2a0b03a7fe353c85d9","impliedFormat":1},{"version":"506e91ebd08f2cc0b49a69568329a51bedb0d9bfe2a9417ed1a9b3481841ddac","impliedFormat":1},{"version":"f63da73a8d858871cc7aafaf3146347de5a3504ab99667324172edf79622ad45","impliedFormat":1},{"version":"b877adbe66d8db5350fd60ba62ffb7f9f1e185709f41cc6c79e26314656e7966","impliedFormat":1},{"version":"ff3d1594665d0ea1e8e3367ca1be065cb29e56b544a98ae990150806381e26e0","impliedFormat":1},{"version":"24dcc6ab1b47dbef6db80f0d0406029fe49a5803e6b3a6a2733ca097164839cc","impliedFormat":1},{"version":"76ee5e01370001a08093cb98e98beba007176e5c8c0af5b3b17ad1b8470d3c87","impliedFormat":1},{"version":"1f8822081ce52fdcf13d2ab47d840ff28216abc2ecdd8b3892b3d8dcb66ddf4c","impliedFormat":1},{"version":"e266998f32d1e7bb4127d9e87d48c84d6aa5200df46e1266065f54d969cfa699","impliedFormat":1},{"version":"742ec7d93e66311678aa6f558561245b2e12399fe6a98d849944f161ec6a857a","impliedFormat":1},{"version":"c953ca81f374296b0e0ad9307f854aec1cbd22240bd7676e852c31bbf84d33ab","impliedFormat":1},{"version":"d2380b72ed2f0e19af8291a6e1ac6aa7a60e6ad455d838705ee3b4bf667840b9","impliedFormat":1},{"version":"25d84120721134c846a8733a46e05903f3b109937dd819e5ec41ac8af893899b","impliedFormat":1},{"version":"09870b1892653e3854208cc345b6a7f055a875a06fafbff9a1888abc2ba1a404","impliedFormat":1},{"version":"437c2c7fb5da8738335aa9a739ff4e797039504fa6c5cd10664dcd1f30577095","impliedFormat":1},{"version":"a9d20cf42a783baf00f171b23f89bbc28e5101c2eba461f54708e16ee20a3d4d","impliedFormat":1},{"version":"e54407eec308c19f8e3992c66bcfc893f4b1f5aa478f05a55de3e348ee015c69","impliedFormat":1},{"version":"815a703ea91f25df5ea36696478f59b242f625f45fad37c6873c28c1591dc031","impliedFormat":1},{"version":"07af686616d30fe4caecd19ba83f2b5830e3633f5994e027de90daed22e07319","impliedFormat":1},{"version":"d476ad2c31b6a37660a3b0d90cdafa6cc70e6da342f70f92c8b8994da9606153","impliedFormat":1},{"version":"c601ed82e8c11c2d98fc04da79201eeeb8c6f95927e348d5497bc0c2ad85c6b5","impliedFormat":1},{"version":"7803117fcb92af605e9d0bf5aab04f8fd5959381e0b826ebb05365ece4868ae1","impliedFormat":1},{"version":"025a8cef62e0fdfa4c32995a93e3ddd4f9d6e726477e753781e99179662b6c58","impliedFormat":1},{"version":"dac9e0310cac6c0d3815208ed585b6ebb2a19ed44536d04ca5a2cb81188906d5","impliedFormat":1},{"version":"329dbb853695003974005f642063d2ab083d8c06f7d8f3bb2cbb15f68c892487","impliedFormat":1},{"version":"c1cbd9cd690158fefa1c7b8b285c1862d4064cc61eac7226d937e62ed01db785","impliedFormat":1},{"version":"1804788ef733867ea378a6e571eb60d92ea9ba87ce23f9aed8a6cc5a174f5471","impliedFormat":1},{"version":"d5c6618af14518cfeba225d4dc6180271a423e24bee7ab64eaef5c70bfe63992","impliedFormat":1},{"version":"2abd00c6b8e284cb92d2caf3f93f3170729d68cf4a51fb53ff92078b1455bfb9","impliedFormat":1},{"version":"c388233f176333d0ba84350a79cf88f1724bddd685b2eb9fd9d62533f39850a7","impliedFormat":1},{"version":"85388e4257101bfe0f0e5ffbba40fadea704e576d64f2e83ac1e8f042ec521ba","impliedFormat":1},{"version":"7ffec597c82ed1cfb06d7ffdc36d71d77a564bd55eee6a2cf9c72384736e3726","impliedFormat":1},{"version":"6d72cd0e28e6b157b2b21131891ba29ef596f9d3d0463316955a1ffc4a5c89dc","impliedFormat":1},{"version":"72037f13e369d619e0842119af97d6f6905fc470124ba627c44773aaacae9ba7","impliedFormat":1},{"version":"bf8c812958db10404d946309002674de28f9e300416d7b39a773c98bc51c7475","impliedFormat":1},{"version":"94f3baf5e3e2bacc4d21f9308045913aefa2ef87b44153422057d074d5f7084a","impliedFormat":1},{"version":"293d1aa6c28408e0bde5e4d0b55b9be782e00e2f702d4044530220314e382685","impliedFormat":1},{"version":"e79c77ecfd439075c20dcf9785bb7255706dee26ff6431673932309a2ae624a0","impliedFormat":1},{"version":"f18ba2828d2c1bfaedbcb734d561604784d65fda9d290fb93bdf71015549b920","impliedFormat":1},{"version":"eadc908b2f4e6e8edeaf0970ec92a47129c289d5b4e19bdbafd6d6f70bdc907c","impliedFormat":1},{"version":"407a11241e9056524e24ffb7899d73e819f8d44010db091d473acb4348a82cb7","impliedFormat":1},{"version":"60f9fe665ff16131a8f07a38d2b4277e96a7b11049deaa1c2ff85b8b2cb08abd","impliedFormat":1},{"version":"121ca5c164ad18f6fccd49dc61333dd06ee8e4984c4b127c59744c2d6ac953fa","impliedFormat":1},{"version":"da883f2b97696813d06993a22351cf2f402fcaa29dc446f62fd09b05bf12fef5","impliedFormat":1},{"version":"48964bec72afdd3809f8bc1d5df95f3270e29e03c8d315685db3636535e6d3d8","impliedFormat":1},{"version":"6e13dd30ba8a2a783d41ff51896cbf8a310ebad22d06b9206ebc8ea814d1c440","impliedFormat":1},{"version":"1174c675811ff10caaab514bfd3a7720bdc8cfba524a0eba62d8c1c9563adf80","impliedFormat":1},{"version":"2066017f176fb877854da8afa1585591c67963597af3bfb828974547894e850b","impliedFormat":1},{"version":"0fb7ade7ade491a02022472999f472f84f304f4738a19f2efccea1551a13101b","impliedFormat":1},{"version":"b38bfb03cc99b72e403ce60382cb45bc9467641181a1dc775ee4238dea847b5b","impliedFormat":1},{"version":"f0c93c00af504f52e837bdae5c8d0dd16eb0358372a90bc03fcd2096f22e1e93","impliedFormat":1},{"version":"89e015b6421345ff59eaeabd2ddfdf4d4efc53fadddd0dfa6fb08791d4bc5396","impliedFormat":1},{"version":"275c59e7cc724033d8d962a68b604a827ca1d93ca63da907622ba4cdfdd138d0","impliedFormat":1},{"version":"6529e78e442adf060c2bbc460d4c585d8fff553eb06a09b6b9d4defba6a3e4bc","impliedFormat":1},{"version":"64ccb0668db4982770ccd3eae9982e9236d997f7848549968a59c06cfb2a8c85","impliedFormat":1},{"version":"15f4992579aef55c498805517266560cae989c94570067eb6f0bb1fda8db3e1a","impliedFormat":1},{"version":"1a5cb4225b0e5e65222f89d3ac4f11e1341c84362c34f64573e59aafdec65232","impliedFormat":1},{"version":"85280c9fd80e289ca3fb7cc176e7c56bd1b59cc87153e35b4ad67343a16963e7","impliedFormat":1},{"version":"69ec7481d640752a71598ad9e0cc9c28fcaaf3128a8e56e9f22d09aa75e48aba","impliedFormat":1},{"version":"f1c203586ed60b44b1b54f2d3d6d5489a32a3d08cd9b8430c804edb09374e29d","impliedFormat":1},{"version":"396b9cfbf84f6d62c56eb78313118d33b2b4b112c65452856049b234e91ea782","impliedFormat":1},{"version":"beeb53644fb37efb6c8fc859d7df72d7bf9df52b027169ce087f8ddb8fe43c5e","impliedFormat":1},{"version":"0b10af13b23b16a86decbf9dced96c5412e742f1e1cbbc7e38521f3272699a18","impliedFormat":1},{"version":"5d8912088adc90f54b80df0454cd6b67c1a4a5c08b45e42f6306414f92179e58","impliedFormat":1},{"version":"2bf6f81bff3aec45692cf7df2ec4f6bb955c15db4d7a0b16f5fc0aca638642f0","impliedFormat":1},{"version":"5e1ac93dd33dabf032ae7d26e7d376e25dcff407b285ebed3f08bb440b5a21ca","impliedFormat":1},{"version":"9cfa1b7b61b310b77c8291afc7567f0269982273f5c1c056ea2a6594cc966d74","impliedFormat":1},"34a34be82c301bd36b11967f64793e25c452f683f66eb63a2c9b9382291013cb","212f48de57c8459697680ebcd00c6f6e3b4938a5868e0ee67d16120c06005fab","7a25c2a8996260ae0959bc33b7311de3a098a4e4c250b213ec425d1d038b6280","67faf30978b58f810624c8e9b2fa1e5758fe9b5b400f2419f166721b16e3282c","4d5e09bf879145dadc2707ff2c877c702cad5de8ea5b6e0eb4ec29d4fe9bd3f4","f489209d1449424ca707ef2852f4c732cf3e568c5aeab21cc37c67f4c401ef1f","34c2a35ec8db5ff54fa86d806b8540cd330792a1a977942ae2c203df2411ee44","e878d835f888a25df33826880ab51b23dc0f3a145ff522dcb6df86c19749b479","cea4f6104c14a2de217034c55d5e0c5d108800b8776791277bec0f3a491d6c7d","5d59f5b83155be3893bb5b8f6bd3df7a85157dc2184b21442b5c104603149ea1","aac543d234cd796c6a6ae3a76cd9961480d5b22cd00dc1a64c4a56025310c212","437755bf7362625845340e775422362c249132b5ce85bad8e0863de1442c1ea6","a2325ec154d19da8a7231b9bc4c615650417258d2f887edc0c91f9d9dbc255bb","b8e0a9ce934b5cbdaf505c3028677700753443e9766ff07734db197abf42200b","cee3a191eb553499713a69f5f4728d3b1e917ec9423ad976b4bb576dca530245","29771068febe7e8f360713fbb4f2d0142b7220f099a328759f3f5339dddc460b","100ebc14d3b3f2d9437681da4e37ce15eecf8d0bc50c562f61d43cbedfe9dd89","89e8081e7bb10a1985583264b6772b401c888f0da9efb63deb3dc671bc730900","83b2471c82779e1444b63942a2469bf40a155ed4e646dfc9e1583772ef1cf554","7121f8a3d7143ca81e758e5f4924bb60730a03268151ddc0688f144b03d427d2","df1170274f174c97b713e922dc2b14bd41978f0b128108c4f1d8b52c5ad750f9",{"version":"73a0ee6395819b063df4b148211985f2e1442945c1a057204cf4cf6281760dc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"d05d8c67116dceafc62e691c47ac89f8f10cf7313cd1b2fb4fe801c2bf1bb1a7","impliedFormat":1},{"version":"3c5bb5207df7095882400323d692957e90ec17323ccff5fd5f29a1ecf3b165d0","impliedFormat":1},"242d2da324880332769e3302925f3db9ae112f1fbee32b877f48ee86ad030891","fb402f271e513395909e4074fc569d1b15d1e06f343af3ee9571ffc25a3f047b","cf6141331e337e09f4fd6cd8297af4a54e606a9f9f26945a09302b335b03c2e1","0b5086f10b4c808eb6d57ffc8e682c7093b3b5172854fe2ca7497b48ad85b769","679a0f3e894d5d408147a6bf9e2112d47312b7d303d0dd27b403c62dc24ccac3","22544b339213bdd7af6899eee2730a28850900acec2117e7d237149d9cf45a6c","384d53819d8764fcf034acb61dd5e0b882a508a4be079e78a25622ef25c62f97","cca8499d96e4f5780d93adc94af96c4b5ae79e427ba0a9116a10a8ea00273562","e1bf802ca7e71ed86729c08ae0bdee184247ef7733c03211e6161e1e7e604bfb","a28136f26720706488db65c5c52f3645079dd581645d3ca810ea3072b6e6b6ab","99b36a6ea4e3ca84501d637d622a29a910ce014d8297be057c560557e128ba8c",{"version":"c7fb0a48fcb8cb3a72d6cb6837ff92565cc42317729ec6aa0018990492e5b004","signature":"6f781ec08e81f634bca08c06d58a5893742afa14e6563f6a5d005cd37129da0e"},"9ddc3dab94e0287994822df05f09bd9cf417563fe24b290decad01c0d2eb80ca",{"version":"52f5c39e78a90c1d8ed7db18f39d890b2e8464a3f44d4233617893f6648e317d","impliedFormat":1},{"version":"9891b4e49d435c7ac14fb3cc769e97077bbd946100c952df08eda117c3b5b68d","impliedFormat":99},{"version":"2d45f7ff55036e74513af142af1f414924ad337cc00e612bb37bb55473c70b30","impliedFormat":99},{"version":"3a6b10911970b0588c5a287642e4c6be91c16b96407a499c6dc81a96daf1085a","impliedFormat":99},{"version":"6392353adcff7db02a3f5dcacb5637b791dbbcb76125aac3075da2519af9785a","impliedFormat":99},{"version":"1f3952b74b8c766a2e602a0ba2db19d3d872d00bab4e01746c6b7229c585086c","impliedFormat":99},{"version":"19726a169a4000cba269c284b97043faa0593de45865c43553c233f6825af0fb","impliedFormat":1},"92f966f8184f9cc5f531fdaae3caeabde238a82d783e50713eb015d70e187914","9f44604e67cab8b4618fb0743d41ba9aceb886285f0fadf7fd6c6ef2f3ab913a","19e1a22fe32da3d48906bc7b8c517ada6b58ee44a030331d469155a8af66b348","23154637425b907a992c377203f4c618eee4d12421ac52cec263a83b8173572b",{"version":"1c97ee9a298f6c15c3e637015ee8ce3020a07329105d430d4ec45a5b6cecbb3c","impliedFormat":99},"f136e76a35d7b96a3f826ba6250b2dcf984aab4583006014e9e091d36fca490f","aa0e467a4a77ca517ff1ae8282f91f4ddb28c3acd441f93eedf1aabd07b68b41",{"version":"adf20cc38eff5b498d071cb684fef03bd46a419c65cd33ce39a2308e33cd84ca","impliedFormat":1},"31a5ddda427bd1fbb2c7fe1ca559db8bc393d7f42592452f29f4928603d6bd92","6020c483cbe9b111c42dc146f31f3c269fa44f9666a7bb289f33d4e1d415a5f4","c9d1b88aa2c8cb759d8592fa78e56015a156cc8fcef9acf694d49c646076eda0","a58068f7fc51a4d70f59eaa8d9f6b79440f71287c3988707f6d82e8493cd8c47","baf0f41a91dece70a701d19fd82b1b54c48a22eb94807f9bb0718f0252764aff","579b34fdf9e3f0a6229729e86cefa990d4c9653025a9260ba0b029d04e28696f","79acf870259d9ea9915fd272eb3ca5709361e8a86f80551588c1c97da9dd33b3","a4e143cf77873e6c0ae83b4015a892684338bacaf91ec384803fea0de1c8917b","a98f4bbc7a5f4f4f7df0f1f7cba27eedc34d3852bc4c8d6eaead40a106341848","9c3d1ca00d7911dcd4ad62ca95be97bc253099773a23f452d2f215d235c2a18f","08c8705cd2aba74079347b327a048c0f427024789f41cd6bf732a636f95d11e1","f4a266cbe60a450d84f26445962f7a62e52e73e2c82bfd2e642ebd07cc97f426","f1c8cbd870edf8abf542d3a9eaaf15540a37e9248e4ff06eb0643986e0f4d82c","de454fe663b6815d06e3512a1ca1af2a1f28a2534aa8a997b0ed2b5217dbe836","6fd221dedf75176a02b338de6a8bb4ec34ef023d84d5d95a534ae6d68b4c70d7","d5f00e1719ac4c6ec915553af50c4ceeaee17e76113d763efee65cfacfde01ac","edb9845bc23f34e9718510206fed90eb7e010633a08e91bf92323d5c938435ee",{"version":"c9c42d5948aa033c444cb6a3c188bcd925997bcc2bd8e97928af480ee356417f","impliedFormat":1},{"version":"f4bb2d3708ccd853dac13f97ede135d721bf5c2586f73ab8f1170f439e44b5b4","impliedFormat":1},{"version":"fd5649816766f52b1f86aa290fd07802d26cbb3b66df8ed788a0381494ebd5ed","impliedFormat":1},{"version":"269a13226bf6847c953f01ada5aefe59a3963a3a74f98c866ccbf08679d16b86","impliedFormat":1},{"version":"b769494ac41040c4c26eb6b268d519db4cc8853523d9d6863bee472a08f77f80","impliedFormat":1},{"version":"2fe42f88e2d318ede2a2f84283e36fdb9bd1448cd36b4a66f4ead846c48c1a33","impliedFormat":1},{"version":"cb403dfd16fdbdfd38aa13527bcbb7d15445374bc1c947cfcc3a9e6b514418ab","impliedFormat":1},{"version":"60810cf2adc328fa95c85a0ce2fd10842b8985c97a2832802656166950f8d164","impliedFormat":1},{"version":"de54c75cad3c584e18a8392a9a7e0668b735cd6b81a3f8433e18b5507fd68049","impliedFormat":1},{"version":"c477e5c4e8a805010af88a67996440ba61f826b1ced55e05423ad1b026338582","impliedFormat":1},{"version":"6b419ab45dc8cb943a1da4259a65f203b4bd1d4b67ac4522e43b40d2e424bdd6","impliedFormat":1},{"version":"a364ff73bf9b7b301c73730130aed0b3ca51454a4690922fc4ce0975b6e20a33","impliedFormat":1},{"version":"ef113fa4d5404c269863879ff8c9790aa238e577477d53c781cdae1e4552a0cf","impliedFormat":1},{"version":"5bfa561404d8a4b72b3ab8f2a9e218ab3ebb92a552811c88c878465751b72005","impliedFormat":1},{"version":"45a384db52cf8656860fc79ca496377b60ae93c0966ea65c7b1021d1d196d552","impliedFormat":1},{"version":"b2db0d237108fa98b859197d9fb1e9204915971239edbf63ed418b210e318fb8","impliedFormat":1},{"version":"93470daf956b2faa5f470b910d18b0876cfa3d1f5d7184e9aeafd8de86a30229","impliedFormat":1},{"version":"d472c153510dc0fd95624ad22711d264097ff0518059764981736f7aa94d0fa6","impliedFormat":1},{"version":"01fdef99a0d07e88a5f79d67e0142fc399302a8d679997aac07a901d4cf0fc83","impliedFormat":1},{"version":"ffcbdda683402303fa8845faf9a8fbb068723e08862b9689fc5a37c70ef989b8","impliedFormat":1},{"version":"208c5d0173b66b96c87c659d2decb774be70fb7a5d5af599a5d05f842b2e8d74","impliedFormat":1},{"version":"ec3b09b073a5e8a14fd5932cc4c33efaa0280c967d15bbc4c0c5b73a0d2f1a68","impliedFormat":1},{"version":"4b4c884e11985025294a651092f55dcbf588646d704e339674dfe51bdeead853","impliedFormat":1},{"version":"78c8b34f69c45078c6a3a3f10a24f1a03ea98495b6d75b945c1a3408a3ce5a26","impliedFormat":1},{"version":"0b1a08da571520eb288eb75843aad95d07fed423aba18b1149b5a0c767baf688","impliedFormat":1},{"version":"9c4708e703c8deb525e95946b3fdd8d5caaf724b3ac4a1cd6c2cab759b53f76f","impliedFormat":1},{"version":"ed14fb238769ed0b0dff6b78bef5263f0f50f403878ecd609fc71774b2113b12","impliedFormat":1},{"version":"59405847661d05bec9243efe9498211cb7e66d2620fe946e40750ffcb9e7d56a","impliedFormat":1},{"version":"ef95961bc90e8972bc9d88bee5264544d916929c0240e8c3c8ae220568b26ead","impliedFormat":1},{"version":"3f64230713c989e5f2d1d46c13fc8b2d9193b5dd59d393d5e70098c221894b1e","impliedFormat":1},{"version":"e49eeb0f93ea6a311a22f5b66a155c368e9cdb3585695fd951945df1a4192eb7","impliedFormat":1},{"version":"6f704837b406e4ac6ec5942018691ecc10e2d079cd64706d8ed1e86826d0671e","impliedFormat":1},{"version":"ee2229f4fc2d2306c864e5c2399aaa5958e4b3e1c964701fb8a84709237c9f47","impliedFormat":1},{"version":"6e5563614d424223f4748c6b714e1e197c8422824ff42fdc16f64484e1a863a6","impliedFormat":1},{"version":"8f31673ebf988cfc4b7ce2adb6a6c489dd748025600d8e2b7d922f952d7d21af","impliedFormat":1},{"version":"fd3715f87964b5fc26f4c333422969da8ca45e69e3fb6973ba6c806f437eb012","impliedFormat":1},{"version":"97b1e695f57dd56a6495f7bdca876981cc8db1cc4a555c3964aa14ce26e0f4de","impliedFormat":1},{"version":"cf32c06d23f373f81db3e93d47b7006f5bfc005df4d92bf5407b7792adcb3c47","impliedFormat":1},{"version":"eacc624e44f4b61dae0502e59ca5c0307dee65e7c257ee3eab4b2c8c6f156cd9","impliedFormat":1},{"version":"6041c1c22cb701abf3d98f153f878b12280f3b2213144588209b66ad5f5915dd","impliedFormat":1},{"version":"d95c6fb6552ca855ed11cdcaa5c68ad484bdc6325fd86fbadccdebfe57ed841b","impliedFormat":1},{"version":"0063b3ff097c4542be10322c67ca804e9e4504545b46ae8d620ceab59349ee84","impliedFormat":1},{"version":"9ff44b788f5d8d86f6fa34abf3faec8c425ecf1838248318acb0c5a4c88e62e7","impliedFormat":1},{"version":"4169cb216a6b361ba3caadf4a13670354e2a68ce055f4ec77ae7688902d2ab2d","impliedFormat":1},{"version":"e642a86d8e0956bb7c76aec21b83bde20409b19eb22786ed72ac5515aa9268c8","impliedFormat":1},{"version":"879e2a34d0139f04a32974fdfa44c5720619afd28f8bde0e5860f371d5f65d34","impliedFormat":1},{"version":"8e04860bdf072d4270b09b33b2b91ec4545297f23cc580041cad3e738f58d92c","impliedFormat":1},{"version":"bff595611ce25571f0cb50a83b7dcd7599559d6d3e98bf4fe87ad77b9c347664","impliedFormat":1},{"version":"2eced6af832d4e69811e353c7751f73bba07dc3b63189e0fa963e8264f341c12","impliedFormat":1},{"version":"a884b3560c8a29e5cb7f1263d880ff5c8b017991009edc20f450027c4a112b3f","impliedFormat":1},{"version":"6775c3e28d13ee126ec2c2e0827ec76422b0e11d9d5c2cfdfa7b982d48455fff","impliedFormat":1},{"version":"2ab0ffd4cdaff94c5cb8701f34442f8a018a2b62623528a66ad1ad8172ac6626","impliedFormat":1},{"version":"ea8215cf7cab1015579eac88e2f16fa1fabbe9f84ce4d2848c10f36d7df8ca1d","impliedFormat":1},{"version":"cc894fd562a73055ff72dcb7821729cef909b85bca4d0e2e2cbd0c1a2ecadeba","impliedFormat":1},{"version":"ab058bf3dbdbde6571f97a57a3b52b14be9d7e19f23190e9a551d5d6f6b6563f","impliedFormat":1},{"version":"142892cddebce23312318d79014de94e64a1085b8b0d73b942b4a6ce40a1b18d","impliedFormat":1},{"version":"db84257986e870ab22b304a80b02ea5e079c13a7f7be7891c0950bfd9e33f915","impliedFormat":1},{"version":"24cb43d567d33ac17daaad4e86cd52aba2bb8ff2196d8e1e7f0802faeeb39e95","impliedFormat":1},{"version":"dc6e0137694a7048ceba1ce02e6a57ab77573c38b1d41b36ae8e2e092b04ced2","impliedFormat":1},{"version":"aca624f59f59e63a55f8a5743f02fffc81dd270916e65fcd0edb3d4839641fbe","impliedFormat":1},{"version":"ce47b859c7ada1fbb72b66078a0cade8a234c7ae2ee966f39a21aada85b69dc0","impliedFormat":1},{"version":"389afe4c6734c505044a3a35477b118de0c54a1ae945ad454a065dc9446130a4","impliedFormat":1},{"version":"a44e6996f02661be9aa5c08bce6c2117b675211e92b6e552293e0682325f303e","impliedFormat":1},{"version":"b674f6631098d532a779f21fa6e9bdfca23718614f51d212089c355f27eea479","impliedFormat":1},{"version":"9dbc2b9b24df7b3a609c746eaada8bbc8a49a228d8801e076628d5a067ff3cc3","impliedFormat":1},{"version":"d6ea60339acf1584f623c91f5214be0ac654c0692c0c3abd69a601fe0ff0e165","impliedFormat":1},{"version":"d08badb0bbee55e449ea9ea7e7978cc94859804c49bdc7dc73e25d348337c0da","impliedFormat":1},{"version":"b116a03deacf70767f572c96a833e3c1adf01fff5c47f6c23e7bcb60c71359ba","impliedFormat":1},{"version":"023aedd02204fce1597fd16d7c0f1d7be13fcf4bc1ed28fb30a39587715ea000","impliedFormat":1},{"version":"b18adf3f8103e0711fbe633893cfbce2897f745554058cffa9273348366304d2","impliedFormat":1},{"version":"f41fbddb4a2c67dbf13863507b50f416c2645e7440895ea698605541d5038754","impliedFormat":1},{"version":"636a0fc7a5ee207de956241b8cc821305c8cc72b9f0bec69b9c9de15a9eafcfe","impliedFormat":1},{"version":"c326f85f762b14708a25b9f5c84691562f5cf39ae9148c00f990b8b4a2a4461a","impliedFormat":1},{"version":"caef5b191982cd88619282b10e1c52c3cde8c81d4eaf4650b4e62d73f77483d4","impliedFormat":1},"275fff84ef0f8d1ac70e0fb88edccc29e56397cf1ecc07e988987ac2b619cf97","4e8edf729e0c2a04169b79534daf9b66f9976173a12c8f5339c80b9bc23367ff","d2a8f67c03a19b1a2756a9203f0f4b37cac1cb53800cd6c8153780f2ffcb837c",{"version":"9ff194a196707954313c197ff74831edf396ee89f6b6e50cd5fe9e07b8d7d46b","impliedFormat":1},"5c744b1c4ab4cc215e7021244a9f34d2c84119af2e368648df49e9c91dc74256","7e02783dd585896e4d934743044105b4bf7d98fe9ea128b3b2be8e7862cadb7e",{"version":"3312f7d9eb01483f9e392733e461f06755fdc624b5f2318e01f686a6a036ed7b","impliedFormat":1},{"version":"34491a67ae33c8bdacec1f4c07008f01d2ebe588ed8b7b1bd8f940f5fe953f2a","impliedFormat":1},{"version":"cc0e6f2705c8fd9eb831790840c08be6a3d3108d7c7043c4a1c0a97e3e9e289e","impliedFormat":1},{"version":"273928f388427cb6d6859c6b29d760de7612a110f8a50afe092d3a6440ed0cd3","impliedFormat":1},{"version":"54db43f6a831781a4587d81802277a9686bf34680c586fc0496e32088f2d8942","impliedFormat":1},{"version":"0f53259dab3f0531bfefb89211d4be171821c855980a843b396e9dcf06ab23a3","impliedFormat":1},{"version":"b1b1faeb576467d84ffaab5942f6bd5a024bb715dae28aaeeb22b37cc0f17030","impliedFormat":1},{"version":"a7380d88b8153951784d10b663b949986aa02c238d7aba129d378bc8f0bd2900","impliedFormat":1},{"version":"2110f6c3b26b0d0af8f4d0d7bf8fe89cafbe2a200cc2187db2e446c57628b67f","impliedFormat":1},{"version":"b2d0ca3686d89f74053a1d0d90e8088b9d48869c9814db2cce4554585c83094a","impliedFormat":1},{"version":"6491db94d895853640fd0c6814aa5decc2458a6085193abbd7a83a0a65736a30","impliedFormat":1},{"version":"ce8cd3fcda8947836cb52af1f9a5958fb9cea1ed5eb53466227a82c079ba5622","impliedFormat":1},{"version":"5a081b7e2596e450b5bbcd5c5556806b85bf2c0bdb6b7fbcd640dfa6339a0bb3","impliedFormat":1},{"version":"36022f5544b27ac66385e56350834423923403574cbe6efe1c982649f9452c54","impliedFormat":1},"bba6cfc527c19857aa23b84e8a2046f44b996307563a7ecc22a92fbf20010a14","62c0acd226346f4a785c9193c6c45545ec3fff1979ee8df3f588846f6d19c861","80053711b514e246668987e2ecf81e0d07cac02d4df0fca9349d93a8524c6eaa","e0eb841ca5a2734b2dca0fd51b36db487be2bcb099a86026c7618eb198b4428b","56795690506e9f971e99867981d6d70728826072ac326b5b42a84b32e83b7be3","b0cb22b5146d40d089e9237e00d20889285581a146d11b1673ff0477801f4250","22725615aa6f29bc460cf104925d37da934ce0a070a75ec2f27bfb904e44a42b","63847c8863d58d05b6de39372b3286da63c1848d142966fa4fae49a494b273bd","c8f48ba45f7cc5d21200a73e2299637e9a132be97fe32b5420b41c9083da8f26","5765ff58850bc8f51c7480818910df84df56d86c80a036e347d0d9a169a0be97","069f758baf9f6d57335d108a40043d61cfeb8258a68b1a9d9b9bc5923f26a95c","4dfe1b2c2c969247671df680b24a9c967a241ba8efb8f560d38efbaa68b69dcb","297ba6d7e4e8c638f366363cb8d85141fdb1c2daaa6b06ba257eac005ac978fb","a55b60d594c2c7ca9c2ec78557f60cf80afe36571bd0f17be3b75f22755a6457","403d308ff3ea1212bb55bbc619d813d03fc9515198e13e04dd224607eba4a75c","b8b7ed302e941989201e22112bb8b2c8edeeb9d3fe677f3ec3b155ad1bf067dc","de3f5544642634ae186a297e5f0f64c1ec8455fd0a9e6419c6a0215e2525e534","ea79deb2c6f4040dc55bd04e4a37ea36858d7e59ae354ebc0eccaa2698fcfeb5","91883e5a7e00b0bc6e87ac5989af4c21de2377268e6bc15379ec1eaae601db50","904206fa7cad3d3da7d04805aa61f9ad2438c6812bd7cfe494711195bb042f1f","29a5c6db1d280d9d1608f0445d11b9894d8b689a5464db6e6b9107ae12ef0a67","2985b5a8371b42b78a230fb9712cc3c53692cfb8490b75bd27e41f9f3ed3bdb8","a48607078976e0d9aa652912f678f0dc38782b0735d1e2e15f78addecd97a932","5134195fec4d019251817043345bf7280c10145fe777078f0b7b10d29af0833b","02465a9c5305147d02b7b8055622109c4a4aa06a7c2cbbe36c8d94d5113f492b","e9c20c57dd7f0282aead93fe090788a197d28817d47cc0ef9f5159b74abad69d","dee13f5af77af9731e0cd98786da6170b21b94996bab2e782cfb315788fde9bc","132679bcb51ed20109bded99dfdc0a065b4c9037c2cacc4dfb4dea623830c17e","4d5c9922ad0be23e51e85f9d8f8b7e5d9a1962e98d7eebacfdbb9d8b8a1cd32f","bfd4b5cd77a389957c8aefef945b2dd6bae4cb79cf094c63cc5b6198e5213b05","9bbdca4053c688b71dd5a2cd64c6c3ded916be13360c723c8c6cee23d1978a13","e23fbb983beeaefb3a412da7b4fb0a44e2c35cb4b7afb09aa465f73f1daa974d","64f29be229c7719a5883a31911beda7970aff4336d375ad1feb4304278d3b828","6a8f4a5aa81b64b18130401a3266c15e74b46d8d06d20a19c4105c51672d3362","2cb2f33d92c9ba1402d1dea4a99e1c68ae5ab11c33e1d5c8743a1e49813d63d2","035d3e4f3d656d5427955191ffcb1ce1f8ee9443aba2fccefc0d8ce34328cba1","97b2b5bc1e1474b8d180a47999ae6fdfbff2366235b4f068917f514103ec8ade","2bf0208ac551b03a24141ab9dedf0fdd508290105fe5e7d1a6fa0ac4de014a1b","97584f8cc5c4e9d6bf87c6be28c4326750b7befce0702416ef2e58e269838fde","b57cc712fd0da58bfeffdee5b34a1732536c0a5fdfb588d7ff5e3105049c21af","8e7c8d0c43e90710a47330829989dd888115e708ecf2e93e131af642ff4d894d","f16582e71182d6e9a11d07efd60222ab148716432d333b229c66f9d26bec92a0","e70cb4b742890d3f9c1ae7965918f04cec997b7f339676b9a36bdc4c6a44c707","58eda13626bd8ccfd3069303532127ab52ddeb9f4bbfd6d5f133b83dfb188a0c","987ebc0d0cd29b95188a2b6cf4a1b69b4e780029f64f1de793f519e6f9f4b6ea","2f1f5761db10d675f86c4cdf82014c18a6feba42ffda5233014d031fa65d3270","ffa264a84c0af2ccb222dbfe84f0034c7c5182674d807c0a2c44741c85018959",{"version":"55a914fba7f17f73eb971e012bcb90221d5dca20751852c217428a5511db57a4","impliedFormat":99},{"version":"d9b54195cd22859480b70a2e287c41e654c812b0d3945652bd08c8943ddef78b","impliedFormat":99},{"version":"73b32be132963c6e06bb2f833ea0c21116581a3aafc8ac9145cc89a0b6f54bc0","impliedFormat":99},{"version":"73597a22736b6efce7cb30e380705cd6572d9e3f9816068130ec09550129996f","impliedFormat":99},{"version":"04504c465aabfed05529bf3b314df66c4eb449b188547c51edb962d8eb6069e0","impliedFormat":99},{"version":"09466b34e26295ee836861fa6348aff7b2275c6220cc0b41040c9949421e052f","impliedFormat":99},{"version":"242ce683695df72f1cdd40ae2ac06c569412e533528de95d956b26218cd195f5","impliedFormat":99},{"version":"d75a572cfd779c99cbdab5f8f44f6ce465367c057c07e33364d186de41ad9b14","impliedFormat":99},{"version":"8d12c3032607835687037e28dc245a4af486ef4aa6e6cb13744dcb0a3b074ab4","impliedFormat":99},{"version":"7ee2d1edc6f59a50eaeb12ac61a74ab4832f64661f795131df23ac8256df2329","impliedFormat":99},{"version":"8fea385f7e21a39e857e3fae89eabde7b0960083d205177430be507b38413579","impliedFormat":99},{"version":"7fdb8950d8a019940182ff1f50d02809a45832121b9a7899677a497aaba506ce","impliedFormat":99},{"version":"530e23db4425868edfc20e35fe2d8acf047af5b6f14afa46ee2e0e71e40c8df1","impliedFormat":99},{"version":"7cf421c4c6e223d2b648dae0ea51a134c4c8a5d8d55db1287372c4c1569c656f","impliedFormat":99},{"version":"ee662f8ffa58a60ca3ca8c141d4910043216efe63f696146b6fa0a455a4f9034","impliedFormat":99},{"version":"4eb4f2e56895129861a971177f8e9241ccf633daae3a6ac7343b92e973381c26","impliedFormat":99},{"version":"c75223aab2bfbe3fe85211fe56cfc844dd93d33e503e22e9911fd0d3e6f6538f","impliedFormat":99},{"version":"8fcea3d952a8129821d4060969f305a341706c256cb8002aba8e5b07088c24ed","impliedFormat":99},{"version":"2a6cef87ea83b5bdbc862e894329ba11002e76d5fb6ab24247502ecad2c6fbe7","impliedFormat":99},{"version":"39248c14bedc3e2d734739452408661523228ec790d7142a4de185ae88904da4","impliedFormat":99},{"version":"c14433af8654964ed33f9cc16f9369e05ae543d56bbc6a1c3b393fa7077f08a1","impliedFormat":99},{"version":"d867a5469eabe8abab25b27abb7125ef2ba019ef42dd1ca2b5d0871513042629","impliedFormat":99},{"version":"89fc4cad6ac7ac6d922523b3ab51462b050189ab335766149e5cc777483d4e1b","impliedFormat":1},{"version":"c031417387ddbb2923f41e3fc94b49157745785281c8949a221cd69368610086","impliedFormat":1},{"version":"73ef706b29d220404677226880137ad0da0145b6a2332d5427b9517dee295e70","impliedFormat":99},{"version":"89fc4cad6ac7ac6d922523b3ab51462b050189ab335766149e5cc777483d4e1b","impliedFormat":1},{"version":"27b14b091ccf309c79f3d2cf226edfa4d533b131f19bc0cbe855adebd464c285","impliedFormat":99},{"version":"50854b8ef4c29f3e952f170aaa045604a9d90360b680ddaeff542d1f5bb5fa8c","impliedFormat":99},{"version":"caa3a0be5c051f52e27b91642c8b31037c09ad0b65288498f4c55e33be7ea249","impliedFormat":99},{"version":"48020f2aa87dd71c26414f9afdf172159a6c31186705417da52add9d6cfe2153","impliedFormat":99},{"version":"f4e5a6883146482d6b49c1406f99a38b1ef883382b169bb5fc6cf7cf9f2ac70c","impliedFormat":99},{"version":"8b7b4f82a54a847a29fa481af4ea74372c19b75379bd27658c2a819149f21871","impliedFormat":99},{"version":"4f7faca5821e340342ea0feb3d478126659ece37d5dfdd6d9c9536bfd48def34","impliedFormat":99},{"version":"99878cc85152e70be715546f165826d83cf033547b4647cc3cc9cbd6d4df429a","impliedFormat":99},{"version":"7677f5595e7bdc2e6e42ebe8b4df4f4b520b28f6f175c839b73a208e6f3c8907","impliedFormat":99},{"version":"fd7faa9225e2e61a0a3d786a7a859af52dcb295c06bce7dfca140037655dc095","impliedFormat":99},{"version":"af0f7e3281ab0774f26ca8bc36d6aa37709f3510c8c1eb0ab122e7063159be01","impliedFormat":99},{"version":"960096f9e2ff9e9019e1c23a04916f2005d4c8dbd43f96b196d754b6c8a16700","impliedFormat":99},{"version":"c7c18305c761411b3c168f2b3376101b60d7a7d7c0505e81c6d8193a418f3d63","impliedFormat":99},{"version":"6b9a76dbc0ac3a427aa7370981cea9aea0e8286453b189dd03776f1034f7847c","impliedFormat":99},{"version":"3e48026dd0f58d4668dbfa9c6747302dcbc52e3aec373ec1f95c2ba78c308f33","impliedFormat":99},{"version":"053f54680ea9b4b1a8e9e5fe9f4a1fdcbc00f8f9b6d895109eb0d169915dfd11","impliedFormat":99},{"version":"3b0f440d9e4227285cec9159b1a472bc885687baf227a7b4126e2ba6dbef96fc","impliedFormat":99},{"version":"656e3a4ac005fcb1513ab1224eacfd55ae04b6f16d21d66c971dc901dad62c66","impliedFormat":99},{"version":"ea4891706f147e494a2a7028b2376110c2e85b7561b27448d51a7d1277c6fcf2","impliedFormat":99},{"version":"7f9bb3e6bb8d0607f94d1498c5fa8ac7445fcb4af52d0775a857d0986e0d0c84","impliedFormat":99},{"version":"c98c85d5b894c8955950338b1091f0febdc6c6702cf3b67a171d29d80fb2dfce","impliedFormat":99},{"version":"d00addf28fd877e3f8109b592b1918084cfb831268a0fd052fa72e6e01390cca","impliedFormat":99},{"version":"0cc0f30db3c4a2577606c6930eac2814d0463148d1bf02be9eaa318d6cb6d40e","impliedFormat":99},{"version":"21fb062824012292b09e9357aa7ac3231a0d683a7fbb9bc8e2b027346c7bcb32","impliedFormat":99},{"version":"9aa939dd1371c068dcda7d17c32fcbee08fa994890fefac8ad39d8cd5a294d92","impliedFormat":99},{"version":"8c0e829b03024d1905dba908ed55a5808d79159709770fe7a3b0395fa78125c6","impliedFormat":99},{"version":"15e6253aeb724521fcd0fd8bab60ac00b40e1b6c39aabb0de3b3e45ebe2d584a","impliedFormat":99},{"version":"4d3a0370e69c2d70d62a2eaeb40512474e38b4dff1a4e7ac98637f954ec5c143","impliedFormat":99},{"version":"b0094b81741504d0282359218e3659f5282b9748ad0e80d9a1c634bc1c88af4b","impliedFormat":99},{"version":"2c8e3d7848994c490cace467a6aae3fc4908e5b577b5ab0996200497062bb80b","impliedFormat":99},{"version":"6db32445cedcfaf6f6a4dbb922cdaf87e1cfc0422e4a31efeebef3fb0eb1a93b","impliedFormat":99},{"version":"b5102cfc507fe0c916a9ad45f4f52e00e3959b90eb90c5873e9527cb37eadb78","impliedFormat":99},{"version":"21e3abbcf80dc69638d138f5c6d07f596f8a162a8dca3bd71286403a96f8d0ab","impliedFormat":99},{"version":"20eab98ea24e9bf8834db1a339abb373e6f6a268537efa1fd571cd3809839eb1","impliedFormat":99},{"version":"796885a2efe76d5bef797516bd3a798b275f81075da8497fc1f6a9d3e085f2a8","impliedFormat":99},{"version":"b5a2192e328273da5a8279add3052bbc33b1adecb15f34a577c69c4dd2766d8e","impliedFormat":99},{"version":"20126c8c53f22550e68edb187f5d4d477b79a2effe7801fff3aa47949219d67b","impliedFormat":99},{"version":"8b63cf9a4a5bafaa3d2e157e6d07bb20d0d73fe0c5ddda715342a48d18534154","impliedFormat":99},{"version":"369dd195a978dcb88d63f1f1878e5dabb90bbc79b3e5fb0f16cf06209ab9e7aa","impliedFormat":99},{"version":"090b7d0fd37b238e003029b9137d5dff073791e21adaac556dd7524ed9ed977e","impliedFormat":99},{"version":"efedab846f4656f034814230fc05513b8cefb5f95994faee4f9b174c98bfef41","impliedFormat":99},{"version":"4f8876f00aa99ae0b39d6bca9da9e86f426dc6c458558773a647100a85fc3312","impliedFormat":99},{"version":"a13e1f68a2a1f29ceac30f51562e13677a5b8615377af952f0b7d1f9edff34f4","impliedFormat":99},{"version":"06f1e24d4146a779e7fd7a0f0cfdcdcb878da25e271e1e7d5d7f81d874f2dbec","impliedFormat":99},{"version":"0a3ede23be099f3ad266a10b4ad0cfb6efd446b9951f553274706348c3b56dae","impliedFormat":99},{"version":"c7b05cafd385f8988babecd476f4f9c817ecc68141dad54e2dd3ae458878a8f4","impliedFormat":99},{"version":"8fc8726fe9d96e0440518b06451181cabba87bdcb60a6e854b77e2b6dab52890","impliedFormat":99},{"version":"6cb381987d43f853d8d01c2fd5f32627e0c0f3a4dd1a11d5e3f94ff5832aff2b","impliedFormat":99},{"version":"ba0567434dbadd0fb8e80c4e00fb9c30449497f8bf07e82b2b857db0029f9b18","impliedFormat":99},{"version":"f72e417b7d49a5dec2d4f3857f6925ee78608cda1c42655d0179ccd38c66c15a","impliedFormat":99},{"version":"fdbb1158637d3ca4d209c7174270e5eb1414b4ee5324e9c33b1fae88e83bfc14","impliedFormat":99},{"version":"436cdc04f8ad3a54d2194b9926f52d564157ca162dcf3c9f71fa4711d057190b","impliedFormat":99},{"version":"73d9180a0b84dfb4c1a95bf72028103bd81472595617dd7ce788ea21639bcee4","impliedFormat":99},{"version":"55c1b951a4d7289a3056e2edea9855671a9d1f8f09632916ed1fb2aebb57b5c6","impliedFormat":99},{"version":"09b1271f73d90a01c889b4963a350825cff11493498b4141fde2399ce09de43a","impliedFormat":99},{"version":"bb9c7998d6def957496260f4c881ccc5b3d4eb4084ab00fbd8abc8c1e1ba67b7","impliedFormat":99},{"version":"340efc3f335a2a3ea2ca1899755906bcb6ebcbddf14306e66d0f16746db98273","impliedFormat":99},{"version":"6a691651e2748bf7792a251d820f00e8d9d3e4da1cdfbea91c33beda2bdd8b89","impliedFormat":99},{"version":"c3096b0c0f579462e17c525ee6835d82952c32b35061a1d32ac32d7e0f191da1","impliedFormat":99},{"version":"91b3c513f0ca4e2d0c5bc9ba1f43b169e1da7c49ff2cf5ffe730009c229f359f","impliedFormat":99},{"version":"ea0b435818ce832634961d1b65e972927f65a3c29a3e2c0cec3aafa0d7fe4ea0","impliedFormat":99},{"version":"50fe63347779cd2244429e0d54148fdb5d230dcc11f2bb8c7efc9d12c1e573d2","impliedFormat":99},{"version":"7adac175e5942f34a34f223d213bdd9869935ec6083dc6da836b996b7acdf7d5","impliedFormat":99},{"version":"2af0e322d1c39e8b16436cd9bd9c97b6013b75c179281df61afa10df0c722a1b","impliedFormat":99},{"version":"09b1271f73d90a01c889b4963a350825cff11493498b4141fde2399ce09de43a","impliedFormat":99},{"version":"0ef3eabd40fcec506413988e397ff7dcbed2aebfe4f88c486e2ba8dd1bc0ee0b","impliedFormat":99},{"version":"44dce86f2b5ef5e38fe6c068bc629afc04221adfa039f0dd649ae10f799f9ec8","impliedFormat":99},{"version":"5ad41356543df4a83b3ce069a7e628d2ba648399db0bdd4005bd1dfef26d34e2","impliedFormat":99},{"version":"0b448474270be29ded59bb946ac311c40c579ef0b9cf358a54750eef34359088","impliedFormat":99},{"version":"d7ddde645d6ca5b97f75923b3946e96495f81d7f4fd568201653f1939a3312a3","impliedFormat":99},{"version":"fb1148873f0d706261f8517b7ce3574b369c8213e8304c7c21cb9ca248b8dcc3","impliedFormat":99},{"version":"0637ec66edeed3f9ee0da72c0d5ab2c128db9e5a6226f8aca5672aa617db1726","impliedFormat":99},{"version":"ee49e1206cf12b67d5b72a98eaab773481130b87a9eeaa262086a4314d1cd991","impliedFormat":99},{"version":"9fa29d6f0b05ee8f619202c07680a46025b166da55e431a49c5badaa2983429b","impliedFormat":99},{"version":"f53857d23110842c0c62416b09caccb9286b3ba52fa2b6bbe254c58123d9bb09","impliedFormat":99},{"version":"89c02b0ad4fc44d10576b3e37c2c5262a37f2db171a486d2d5960ee60323bb96","impliedFormat":99},{"version":"59348badf356a43f7e1847364a8fdb8a914b9977a517b41f3ed206db36b875c1","impliedFormat":99},{"version":"ff0c09d8b0c8c0ffb09ef9250fac17c98eb4dd5a4f4955d53fc3880d6553b91b","impliedFormat":99},{"version":"07146d909fcbc1d33c5fc02f74dab3750d075a4de305a6c078fff8265e089c5e","impliedFormat":99},{"version":"b323496b42ebb7f2839ef1acb04947c74cc586c8ad20cc936c069d34b98a29ac","impliedFormat":99},{"version":"62159930f535b73f265f98f669c7f7bbdaef719ebc2de3a2bc4835e71ed68ba0","impliedFormat":99},{"version":"6ae1d121a8c1ff3398eff8af6e398868b631689d120076d7004c787479eacc61","impliedFormat":99},{"version":"d23bfd5a61fb32048f370f988a9772966651be1380c1a93c199d7cb25b7b0cf0","impliedFormat":99},{"version":"7344e1d823581d72124f6a328669abbeec44910c2045823bf7e7bef79ca49f73","impliedFormat":99},{"version":"af4a6e7559998dac4978f02c572d0f391928b6f40c62459c1e4ae5afc12995c7","impliedFormat":99},{"version":"b0a2a4c5ca7f6f874de72e39be8f470b348ec062c005cb5a7acc840fd7f67807","impliedFormat":99},{"version":"75083e759d8b09bcbf201a250c918a35221d05c7524cbb67b2b4d8959c919252","impliedFormat":99},{"version":"d89f7811a420d990b817f383c3fec421559063a7cb744fae619e8bba20dd151d","impliedFormat":99},{"version":"abd03428933117fdb9db45ac492eaac24d9a77c37c3944d26dba044b7fce6870","impliedFormat":99},{"version":"97050f022128934adae6a773a63be3c5bd5726f153fb72e9a8d34f2656135de2","impliedFormat":99},{"version":"3901f637d5f111593a5ea39a31d27e7a5f62195251f4ed6a50b77a020bc6e416","impliedFormat":99},{"version":"7edffa8d9c968f6a96b6ffc774be07717378ec619777e78510a7b6de4bfe67df","impliedFormat":99},{"version":"8f8d24c887f993b6c131075ac4f82cefbb246747b22c50491dc64ffd2cb340d9","impliedFormat":99},{"version":"5ffb8c07f5474d45bab306b6267ef2777ad786a841e0942416f485125cbd2385","impliedFormat":99},{"version":"e0d7a3cdfaa21621610dc3b74f8ccd59a5cd8617843ded1d610f05bf790adde6","impliedFormat":99},{"version":"b8f4165a3fa8fea167bb5016ad7629581d8fffb16447217d480c8a7ea438ed8d","impliedFormat":99},{"version":"b936b8e4ad57e3be1407c74e36645d31bebe7f1183d926a0c438cf416ec708f5","impliedFormat":99},{"version":"13fc27c27bc9a42e5e0c4cc08b64e7693b225c565bdab45ace16c179760f3cc9","impliedFormat":99},{"version":"8ff87eb5acdf565af022fb9145942b2207ac8cd0644917bc7d44efb91f4115d3","impliedFormat":99},{"version":"616ff480886a32cf50f73c4ee5fdd9672a5f21428eadcac34c41acb06035c214","impliedFormat":99},{"version":"f08e5842644a8e03da9efdbf89bf4eb61ea906a3bbc255bd7d7583756cb3dc61","impliedFormat":99},{"version":"562682efb4f43e58eb779a742f3e26c1fd796da0b785620de601202a38764785","impliedFormat":99},{"version":"264f935450101e4b000eb351cf75c9d799ca20a278b260a9e5770303b5f2b6a3","impliedFormat":99},{"version":"f6f171b23ae6db93454343f1b788960f799c8f37043904874a752c0990c6fca6","impliedFormat":99},{"version":"304e41926d3299c9b30bfd418c35fffd2bd9e5ac726d6f758fb4e0f40a738d51","impliedFormat":99},{"version":"7d3b1ddfce35445b76298090a9dcadee8acf20f4c281eb1f2ce14fc7232c9470","affectsGlobalScope":true,"impliedFormat":99},{"version":"02ab5dbcaa58da1d58c46c7cdfa7f94792c5ccf0fc7c0622ef33755fe415366c","impliedFormat":99},{"version":"e689cc8cd8a102d31c9d3a7b0db0028594202093c4aca25982b425e8ae744556","impliedFormat":99},{"version":"478e59ac0830a0f6360236632d0d589fb0211183aa1ab82292fbca529c0cce35","impliedFormat":99},{"version":"1b4ed9deaba72d4bc8495bf46db690dbf91040da0cb2401db10bad162732c0e2","impliedFormat":99},{"version":"cf60c9e69392dd40b81c02f9674792e8bc5b2aff91d1b468e3d19da8b18358f8","impliedFormat":99},{"version":"3e94295f73335c9122308a858445d2348949842579ac2bacd30728ab46fe75a7","impliedFormat":99},{"version":"8a778c0e0c2f0d9156ca87ab56556b7fd876a185960d829c7e9ed416d5be5fb4","impliedFormat":99},{"version":"b233a945227880b8100b0fec2a8916339fa061ccc23d2d9db4b4646a6cd9655f","impliedFormat":99},{"version":"54821272a9f633d5e8ec23714ece5559ae9a7acc576197fe255974ddbd9b05d6","impliedFormat":99},{"version":"e08685c946d49f555b523e481f4122b398c4444c55b164e5ac67c3ba878db8d1","impliedFormat":99},{"version":"3c99d5232a3c8b54016e5700502078af50fe917eb9cb4b6d9a75a0a3456fcd5d","impliedFormat":99},{"version":"9d8e34ec610435ee2708595564bbad809eab15c9e3fa01ad3746bbe9015faaed","impliedFormat":99},{"version":"7202a89bea0bdab87cc0ae60912b9e631a48f519b6a1f323dba8bc77a02a3481","impliedFormat":99},{"version":"f865343c121abc3516abf5b888d0c1b7596ec772229d8e4d4d796f89e8c9d0c0","impliedFormat":99},{"version":"77114bdbc7388aeeb188c85ebe27e38b1a6e29bc9fea6e09b7011bbb4d71ec41","impliedFormat":99},{"version":"3df489529e6dfe63250b187f1823a9d6006b86a7e9cac6b338944d5fc008db70","impliedFormat":99},{"version":"fe0d316062384b233b16caee26bf8c66f2efdcedcf497be08ad9bcea24bd2d2c","impliedFormat":99},{"version":"2f5846c85bd28a5e8ce93a6e8b67ad0fd6f5a9f7049c74e9c1f6628a0c10062a","impliedFormat":99},{"version":"7dfb517c06ecb1ca89d0b46444eae16ad53d0054e6ec9d82c38e3fbf381ff698","impliedFormat":99},{"version":"35999449fe3af6c7821c63cad3c41b99526113945c778f56c2ae970b4b35c490","impliedFormat":99},{"version":"1fff68ffb3b4a2bf1b6f7f4793f17d6a94c72ca8d67c1d0ac8a872483d23aaf2","impliedFormat":99},{"version":"6dd231d71a5c28f43983de7d91fb34c2c841b0d79c3be2e6bffeb2836d344f00","impliedFormat":99},{"version":"e6a96ceaa78397df35800bafd1069651832422126206e60e1046c3b15b6e5977","impliedFormat":99},{"version":"035dcab32722ff83675483f2608d21cb1ec7b0428b8dca87139f1b524c7fcdb5","impliedFormat":99},{"version":"605892c358273dffa8178aa455edf675c326c4197993f3d1287b120d09cee23f","impliedFormat":99},{"version":"a1caf633e62346bf432d548a0ae03d9288dc803c033412d52f6c4d065ef13c25","impliedFormat":99},{"version":"774f59be62f64cf91d01f9f84c52d9797a86ef7713ff7fc11c8815512be20d12","impliedFormat":99},{"version":"46fc114448951c7b7d9ed1f2cc314e8b9be05b655792ab39262c144c7398be9f","impliedFormat":99},{"version":"9be0a613d408a84fa06b3d748ca37fd83abf7448c534873633b7a1d473c21f76","impliedFormat":99},{"version":"f447ea732d033408efd829cf135cac4f920c4d2065fa926d7f019bff4e119630","impliedFormat":99},{"version":"09f1e21f95a70af0aa40680aaa7aadd7d97eb0ef3b61effd1810557e07e4f66a","impliedFormat":99},{"version":"a43ec5b51f6b4d3c53971d68d4522ef3d5d0b6727e0673a83a0a5d8c1ced6be2","impliedFormat":99},{"version":"c06578ae45a183ba9d35eee917b48ecfdec19bb43860ffc9947a7ab2145c8748","impliedFormat":99},{"version":"2a9b4fd6e99e31552e6c1861352c0f0f2efd6efb6eacf62aa22375b6df1684b1","impliedFormat":99},{"version":"ad9f4320035ac22a5d7f5346a38c9907d06ec35e28ec87e66768e336bc1b4d69","impliedFormat":99},{"version":"05a090d5fb9dc0b48e001b69dc13beaab56883d016e6c6835dbdaf4027d622d4","impliedFormat":99},{"version":"76edff84d1d0ad9cece05db594ebc8d55d6492c9f9cc211776d64b722f1908e0","impliedFormat":99},{"version":"ec7cef68bcd53fae06eecbf331bb3e7fdfbbf34ed0bbb1fb026811a3cd323cb4","impliedFormat":99},{"version":"36ea0d582c82f48990eea829818e7e84e1dd80c9dc26119803b735beac5ee025","impliedFormat":99},{"version":"9c3f927107fb7e1086611de817b1eb2c728da334812ddab9592580070c3d0754","impliedFormat":99},{"version":"eeae71425f0747a79f45381da8dd823d625a28c22c31dca659d62fcc8be159c2","impliedFormat":99},{"version":"d769fae4e2194e67a946d6c51bb8081cf7bd35688f9505951ad2fd293e570701","impliedFormat":99},{"version":"55ce8d5c56f615ae645811e512ddb9438168c0f70e2d536537f7e83cd6b7b4b0","impliedFormat":99},{"version":"fa1369ff60d8c69c1493e4d99f35f43089f0922531205d4040e540bb99c0af4f","impliedFormat":99},{"version":"a3382dd7ef2186ea109a6ee6850ca95db91293693c23f7294045034e7d4e3acf","impliedFormat":99},{"version":"2b1d213281f3aa615ae6c81397247800891be98deca0b8b2123681d736784374","impliedFormat":99},{"version":"c34e7a89ed828af658c88c87db249b579a61e116bea0c472d058e05a19bf5fa9","impliedFormat":99},{"version":"7ae166eb400af5825d3e89eea5783261627959809308d4e383f3c627f9dad3d8","impliedFormat":99},{"version":"69f64614a16f499e755db4951fcbb9cf6e6b722cc072c469b60d2ea9a7d3efe8","impliedFormat":99},{"version":"75df3b2101fc743f2e9443a99d4d53c462953c497497cce204d55fc1efb091e0","impliedFormat":99},{"version":"7dc0f40059b991a1624098161c88b4650644375cc748f4ac142888eb527e9ccd","impliedFormat":99},{"version":"a601809a87528d651b7e1501837d57bb840f47766f06e695949a85f3e58c6315","impliedFormat":99},{"version":"d64f68c9dbd079ad99ec9bae342e1b303da6ce5eac4160eb1ed2ef225a9e9b23","impliedFormat":99},{"version":"99c738354ecc1dba7f6364ed69b4e32f5b0ad6ec39f05e1ee485e1ee40b958eb","impliedFormat":99},{"version":"8cd2c3f1c7c15af539068573c2c77a35cc3a1c6914535275228b8ef934e93ae4","impliedFormat":99},{"version":"efb3ac710c156d408caa25dafd69ea6352257c4cebe80dba0f7554b9e903919c","impliedFormat":99},{"version":"260244548bc1c69fbb26f0a3bb7a65441ae24bcaee4fe0724cf0279596d97fb4","impliedFormat":99},{"version":"ce230ce8f34f70c65809e3ac64dfea499c5fd2f2e73cd2c6e9c7a2c5856215a8","impliedFormat":99},{"version":"0e154a7f40d689bd52af327dee00e988d659258af43ee822e125620bdd3e5519","impliedFormat":99},{"version":"cca506c38ef84e3f70e1a01b709dc98573044530807a74fe090798a8d4dc71ac","impliedFormat":99},{"version":"160dbb165463d553da188b8269b095a4636a48145b733acda60041de8fa0ae88","impliedFormat":99},{"version":"8b1deebfd2c3507964b3078743c1cb8dbef48e565ded3a5743063c5387dec62f","impliedFormat":99},{"version":"6a77c11718845ff230ac61f823221c09ec9a14e5edd4c9eae34eead3fc47e2c7","impliedFormat":99},{"version":"5a633dd8dcf5e35ee141c70e7c0a58df4f481fb44bce225019c75eed483be9be","impliedFormat":99},{"version":"f3fb008d3231c50435508ec6fd8a9e1fdc04dd75d4e56ec3879b08215da02e2c","impliedFormat":99},{"version":"9e4af21f88f57530eea7c963d5223b21de0ddccfd79550636e7618612cc33224","impliedFormat":99},{"version":"b48dd54bd70b7cf7310c671c2b5d21a4c50e882273787eeea62a430c378b041a","impliedFormat":99},{"version":"1302d4a20b1ce874c8c7c0af30051e28b7105dadaec0aebd45545fd365592f30","impliedFormat":99},{"version":"fd939887989692c614ea38129952e34eeca05802a0633cb5c85f3f3b00ce9dff","impliedFormat":99},{"version":"3040f5b3649c95d0df70ce7e7c3cce1d22549dd04ae05e655a40e54e4c6299de","impliedFormat":99},{"version":"de0bd5d5bd17ba2789f4a448964aba57e269a89d0499a521ccb08531d8892f55","impliedFormat":99},{"version":"921d42c7ec8dbefd1457f09466dadedb5855a71fa2637ad67f82ff1ed3ddc0d0","impliedFormat":99},{"version":"b0750451f8aec5c70df9e582ab794fab08dae83ea81bb96bf0b0976e0a2301ee","impliedFormat":99},{"version":"8ba931de83284a779d0524b6f8d6cf3956755fb41c8c8c41cd32caf464d27f05","impliedFormat":99},{"version":"4305804b3ae68aebb7ef164aabd7345c6b91aada8adda10db0227922b2c16502","impliedFormat":99},{"version":"96ae321ebb4b8dcdb57e9f8f92a3f8ddb50bdf534cf58e774281c7a90b502f66","impliedFormat":99},{"version":"934158ee729064a805c8d37713161fef46bf36aa9f0d0949f2cd665ded9e2444","impliedFormat":99},{"version":"6ef5957bb7e973ea49d2b04d739e8561bca5ae125925948491b3cfbd4bf6a553","impliedFormat":99},{"version":"6a32433315d54a605c4be53bf7248dfd784a051e8626aeb01a4e71294dd2747f","impliedFormat":99},{"version":"9476325d3457bfe059adfee87179a5c7d44ecbeec789ede9cfab8dc7b74c48db","impliedFormat":99},{"version":"4f1c9401c286c6fff7bbf2596feef20f76828c99e3ccb81f23d2bd33e72256aa","impliedFormat":99},{"version":"b711cdd39419677f7ca52dd050364d8f8d00ea781bb3252b19c71bdb7ec5423e","impliedFormat":99},{"version":"ee11e2318448babc4d95f7a31f9241823b0dfc4eada26c71ef6899ea06e6f46b","impliedFormat":99},{"version":"27a270826a46278ad5196a6dfc21cd6f9173481ca91443669199379772a32ae8","impliedFormat":99},{"version":"7c52f16314474cef2117a00f8b427dfa62c00e889e6484817dc4cabb9143ac73","impliedFormat":99},{"version":"6c72a60bb273bb1c9a03e64f161136af2eb8aacc23be0c29c8c3ece0ea75a919","impliedFormat":99},{"version":"6fa96d12a720bbad2c4e2c75ddffa8572ef9af4b00750d119a783e32aede3013","impliedFormat":99},{"version":"00128fe475159552deb7d2f8699974a30f25c848cf36448a20f10f1f29249696","impliedFormat":99},{"version":"e7bd1dc063eced5cd08738a5adbba56028b319b0781a8a4971472abf05b0efb4","impliedFormat":99},{"version":"2a92bdf4acbd620f12a8930f0e0ec70f1f0a90e3d9b90a5b0954aac6c1d2a39c","impliedFormat":99},{"version":"c8d08a1e9d91ad3f7d9c3862b30fa32ba4bc3ca8393adafdeeeb915275887b82","impliedFormat":99},{"version":"c0dd6b325d95454319f13802d291f4945556a3df50cf8eed54dbb6d0ade0de2f","impliedFormat":99},{"version":"0627ae8289f0107f1d8425904bb0daa9955481138ca5ba2f8b57707003c428d5","impliedFormat":99},{"version":"4d8c5cc34355bfb08441f6bc18bf31f416afbfa1c71b7b25255d66d349be7e14","impliedFormat":99},{"version":"b365233eaff00901f4709fa605ae164a8e1d304dc6c39b82f49dda3338bea2b0","impliedFormat":99},{"version":"456da89f7f4e0f3dc82afc7918090f550a8af51c72a3cfb9887cf7783d09a266","impliedFormat":99},{"version":"d9a2dcc08e20a9cf3cc56cd6e796611247a0e69aa51254811ec2eed5b63e4ba5","impliedFormat":99},{"version":"44abf5b087f6500ab9280da1e51a2682b985f110134488696ac5f84ae6be566c","impliedFormat":99},{"version":"ced7ef0f2429676d335307ad64116cd2cc727bb0ce29a070bb2992e675a8991e","impliedFormat":99},{"version":"0b73db1447d976759731255d45c5a6feff3d59b7856a1c4da057ab8ccf46dc84","impliedFormat":99},{"version":"3fc6f405e56a678370e4feb7a38afd909f77eb2e26fe153cdaea0fb3c42fbbee","impliedFormat":99},{"version":"2762ed7b9ceb45268b0a8023fd96f02df88f5eb2ad56851cbb3da110fd35fdb5","impliedFormat":99},{"version":"9c20802909ca00f79936c66d8315a5f7f2355d343359a1e51b521ec7a8cfa8bf","impliedFormat":99},{"version":"31ddfdf751c96959c458220cd417454b260ff5e88f66dddc33236343156eb22c","impliedFormat":99},{"version":"ec0339cf070b4dedf708aaed26b8da900a86b3396b30a4777afcd76e69462448","impliedFormat":99},{"version":"067eed0758f3e99f0b1cfe5e3948aa371cbb0f48a26db8c911772e50a9cc9283","impliedFormat":99},{"version":"7dfb9316cfbf2124903d9bc3721d6c19afbf5109dfbc2017ca8ae758f85178ab","impliedFormat":99},{"version":"919a7135fa54057cf42c8cd52165bf938baeb6df316b438bbf4d97f3174ff532","impliedFormat":99},{"version":"4a2957dfe878c8b49acb18299dfba2f72b8bf7a265b793916c0479b3d636b23b","impliedFormat":99},{"version":"fad6a11a73a787168630bf5276f8e8525ab56f897a6a0bf0d3795550201e9df5","impliedFormat":99},{"version":"0cc8d34354ec904617af9f1d569c29b90915634c06d61e7e74b74de26c9379d2","impliedFormat":99},{"version":"529b225f4de49eed08f5a8e5c0b3030699980a8ea130298ff9dfa385a99c2a76","impliedFormat":99},{"version":"77bb50ea87284de10139d000837e5cce037405ac2b699707e3f8766454a8c884","impliedFormat":99},{"version":"95c33ceea3574b974d7a2007fed54992c16b68472b25b426336ef9813e2e96e8","impliedFormat":99},{"version":"1ecb3c690b1bfdc8ea6aaa565415802e5c9012ec616a1d9fb6a2dbd15de7b9dc","impliedFormat":99},{"version":"57fc10e689d39484d5ae38b7fc5632c173d2d9f6f90196fc6a81d6087187ed03","impliedFormat":99},{"version":"f1fb180503fecd5b10428a872f284cc6de52053d4f81f53f7ec2df1c9760d0c0","impliedFormat":99},{"version":"d30d4de63fc781a5b9d8431a4b217cd8ca866d6dc7959c2ce8b7561d57a7213f","impliedFormat":99},{"version":"765896b848b82522a72b7f1837342f613d7c7d46e24752344e790d1f5b02810b","impliedFormat":99},{"version":"ee032efc2dd5c686680f097a676b8031726396a7a2083a4b0b0499b0d32a2aea","impliedFormat":99},{"version":"b76c65680c3160e6b92f5f32bc2e35bca72fedb854195126b26144fd191cd696","impliedFormat":99},{"version":"13e9a215593478bd90e44c1a494caf3c2079c426d5ad8023928261bfc4271c72","impliedFormat":99},{"version":"3e27476a10a715506f9bb196c9c8699a8fe952199233c5af428d801fdda56761","impliedFormat":99},{"version":"dbb9ad48b056876e59a7da5e1552c730b7fa27d59fcd5bf27fd7decc9d823bb8","impliedFormat":99},{"version":"4bd72a99a4273c273201ca6d1e4c77415d10aa24274089b7246d3d0e0084ca06","impliedFormat":99},{"version":"7ae03c4abb0c2d04f81d193895241b40355ae605ec16132c1f339c69552627c1","impliedFormat":99},{"version":"650eddf2807994621e8ca331a29cc5d4a093f5f7ff2f588c3bb7016d3fe4ae6a","impliedFormat":99},{"version":"615834ad3e9e9fe6505d8f657e1de837404a7366e35127fcb20e93e9a0fb1370","impliedFormat":99},{"version":"c3661daba5576b4255a3b157e46884151319d8a270ec37ca8f353c3546b12e9b","impliedFormat":99},{"version":"de4abffb7f7ba4fffbd5986f1fe1d9c73339793e9ac8175176f0d70d4e2c26d2","impliedFormat":99},{"version":"211513b39f80376a8428623bb4d11a8f7ef9cd5aa9adce243200698b84ce4dfb","impliedFormat":99},{"version":"9e8d2591367f2773368f9803f62273eb44ef34dd7dfdaa62ff2f671f30ee1165","impliedFormat":99},{"version":"0f3cef820a473cd90e8c4bdf43be376c7becfda2847174320add08d6a04b5e6e","impliedFormat":99},{"version":"20eed68bc1619806d1a8c501163873b760514b04fcf6a7d185c5595ff5baef65","impliedFormat":99},{"version":"620ef28641765cc6701be0d10d537b61868e6f54c9db153ae64d28187b51dbc0","impliedFormat":99},{"version":"341c8114357c0ec0b17a2a1a99aecbfc6bc0393df49ea6a66193d1e7a691b437","impliedFormat":99},{"version":"b01fe782d4c8efc30ab8f55fae1328898ad88a3b2362ba4daac2059bd30ef903","impliedFormat":99},{"version":"f8e8b33983efa33e28e045b68347341fc77f64821b7aabaac456d17b1781e5f4","impliedFormat":99},{"version":"8d3e416906fb559b9e4ad8b4c4a5f54aeadeb48702e4d0367ffba27483a2e822","impliedFormat":99},{"version":"47db572e8e1c12a37c9ac6bd7e3c88b38e169e3d7fd58cb8fb4a978651e3b121","impliedFormat":99},{"version":"a83a8785713569da150cded8e22c8c14b98b8802eb56167db5734157e23ee804","impliedFormat":99},{"version":"cce1c8b93d1e5ed8dcbaca2c4d346abb34da5c14fa51a1c2e5f93a31c214d8e9","impliedFormat":99},{"version":"213a867daad9eba39f37f264e72e7f2faa0bda9095837de58ab276046d61d97c","impliedFormat":99},{"version":"e1c2ba2ca44e3977d3a79d529940706cef16c9fdd9fd9cad836022643edff84f","impliedFormat":99},{"version":"d63bfe03c3113d5e5b6fcef0bed9cd905e391d523a222caa6d537e767f4e0127","impliedFormat":99},{"version":"4f0a99cb58b887865ae5eed873a34f24032b9a8d390aa27c11982e82f0560b0f","impliedFormat":99},{"version":"3c8a75636dc5639ebd8b0d9b27e5f99cdbc4e52df7f8144bc30e530a90310bbe","impliedFormat":99},{"version":"831ec85d8b9ce9460069612cb8ac6c1407ce45ccaa610a8ae53fe6398f4c1ffd","impliedFormat":99},{"version":"84a15a4f985193d563288b201cb1297f3b2e69cf24042e3f47ad14894bd38e74","impliedFormat":99},{"version":"ea9357f6a359e393d26d83d46f709bc9932a59da732e2c59ea0a46c7db70a8d2","impliedFormat":99},{"version":"2b26c09c593fea6a92facd6475954d4fba0bcc62fe7862849f0cc6073d2c6916","impliedFormat":99},{"version":"b56425afeb034738f443847132bcdec0653b89091e5ea836707338175e5cf014","impliedFormat":99},{"version":"7b3019addc0fd289ab1d174d00854502642f26bec1ae4dadd10ca04db0803a30","impliedFormat":99},{"version":"77883003a85bcfe75dc97d4bd07bd68f8603853d5aad11614c1c57a1204aaf03","impliedFormat":99},{"version":"a69755456ad2d38956b1e54b824556195497fbbb438052c9da5cce5a763a9148","impliedFormat":99},{"version":"c4ea7a4734875037bb04c39e9d9a34701b37784b2e83549b340c01e1851e9fca","impliedFormat":99},{"version":"bba563452954b858d18cc5de0aa8a343b70d58ec0369788b2ffd4c97aa8a8bd1","impliedFormat":99},{"version":"48dd38c566f454246dd0a335309bce001ab25a46be2b44b1988f580d576ae3b5","impliedFormat":99},{"version":"0362f8eccf01deee1ada6f9d899cf83e935970431d6b204a0a450b8a425f8143","impliedFormat":99},{"version":"942c02023b0411836b6d404fc290583309df4c50c0c3a5771051be8ecd832e8d","impliedFormat":99},{"version":"181655e54e8b288d671457be112383e6c51502cff5c4e39020c89f281a987307","impliedFormat":99},{"version":"27d7f5784622ac15e5f56c5d0be9aeefe069ed4855e36cc399c12f31818c40d4","impliedFormat":99},{"version":"0e5e37c5ee7966a03954ddcfc7b11c3faed715ee714a7d7b3f6aaf64173c9ac7","impliedFormat":99},{"version":"adcfd9aaf644eca652b521a4ebac738636c38e28826845dcd2e0dac2130ef539","impliedFormat":99},{"version":"fecc64892b1779fb8ee2f78682f7b4a981a10ed19868108d772bd5807c7fec4f","impliedFormat":99},{"version":"a68eb05fb9bfda476d616b68c2c37776e71cba95406d193b91e71a3369f2bbe7","impliedFormat":99},{"version":"0adf5fa16fe3c677bb0923bde787b4e7e1eb23bcc7b83f89d48d65a6eb563699","impliedFormat":99},{"version":"bf4a06264e6b80cc96fa5e6f11b05825126845563efbf5a68a5b18fddee833b1","impliedFormat":99},{"version":"560a6b3a1e8401fe5e947676dabca8bb337fa115dfd292e96a86f3561274a56d","impliedFormat":99},{"version":"70a29119482d358ab4f28d28ee2dcd05d6cbf8e678068855d016e10a9256ec12","impliedFormat":1},{"version":"869ac759ae8f304536d609082732cb025a08dcc38237fe619caf3fcdd41dde6f","impliedFormat":1},{"version":"0ea900fe6565f9133e06bce92e3e9a4b5a69234e83d40b7df2e1752b8d2b5002","impliedFormat":1},{"version":"e5408f95ca9ac5997c0fea772d68b1bf390e16c2a8cad62858553409f2b12412","impliedFormat":1},{"version":"3c1332a48695617fc5c8a1aead8f09758c2e73018bd139882283fb5a5b8536a6","impliedFormat":1},{"version":"9260b03453970e98ce9b1ad851275acd9c7d213c26c7d86bae096e8e9db4e62b","impliedFormat":1},{"version":"083838d2f5fea0c28f02ce67087101f43bd6e8697c51fd48029261653095080c","impliedFormat":1},{"version":"969132719f0f5822e669f6da7bd58ea0eb47f7899c1db854f8f06379f753b365","impliedFormat":1},{"version":"94ca5d43ff6f9dc8b1812b0770b761392e6eac1948d99d2da443dc63c32b2ec1","impliedFormat":1},{"version":"2cbc88cf54c50e74ee5642c12217e6fd5415e1b35232d5666d53418bae210b3b","impliedFormat":1},{"version":"ccb226557417c606f8b1bba85d178f4bcea3f8ae67b0e86292709a634a1d389d","impliedFormat":1},{"version":"5ea98f44cc9de1fe05d037afe4813f3dcd3a8c5de43bdd7db24624a364fad8e6","impliedFormat":1},{"version":"5260a62a7d326565c7b42293ed427e4186b9d43d6f160f50e134a18385970d02","impliedFormat":1},{"version":"0b3fc2d2d41ad187962c43cb38117d0aee0d3d515c8a6750aaea467da76b42aa","impliedFormat":1},{"version":"ed219f328224100dad91505388453a8c24a97367d1bc13dcec82c72ab13012b7","impliedFormat":1},{"version":"6847b17c96eb44634daa112849db0c9ade344fe23e6ced190b7eeb862beca9f4","impliedFormat":1},{"version":"d479a5128f27f63b58d57a61e062bd68fa43b684271449a73a4d3e3666a599a7","impliedFormat":1},{"version":"6f308b141358ac799edc3e83e887441852205dc1348310d30b62c69438b93ca0","impliedFormat":1},{"version":"b2e451d7958fb4e559df8470e78cbabd17bcebdf694c3ac05440b00ae685aadb","impliedFormat":1},{"version":"435b214f224e0bd2daa15376b7663fd6f5cb0e2bb3a4042672d6396686f7967b","impliedFormat":99},{"version":"5ac787a4a245d99203a12f93f1004db507735a7f3f16f3bc41d21997ccf54256","impliedFormat":99},{"version":"767a9d1487a4a83e6dbe19a56310706b92a77dc0e6c400aa288f48891c8af8d3","impliedFormat":99},{"version":"198f2246a78930833c24db9c42da7ab40c084c2e2132a899f9c03dcbe59d207d","impliedFormat":99},{"version":"eb07eea29499b56357f7593fbdbc6d2312d8afc32c14396952db8d897ea0c4c2","impliedFormat":99},{"version":"06efe54b5ceaa113fbc649424419746efde6dcd5af2a7d4472efb62d751801b3","impliedFormat":99},{"version":"39613fd5250b0e6b48f03d2c994f0135c55d64060c6a0486ecfd6344d4a90a7f","impliedFormat":99},{"version":"8dfbc0d30d20c17f8a9a4487ca14ca8fab6b7d6e0432378ba50cc689d4c07a73","impliedFormat":99},{"version":"4b91040a9b0a06d098defafb39f7e6794789d39c6be0cfd95d73dd3635ca7961","impliedFormat":99},{"version":"66b67d15116c453abd384a1ec73ad2cb90b19fff4c08289360c4f3f573465838","impliedFormat":99},{"version":"5805f6ee9c3a5369ba7f37a809e226f0b217d2059d6f699cc242c9907671143f","impliedFormat":99},{"version":"2f0578c52f2b95a2a2187ad6d1d8fa4e835278871c81747c500bf04bbe0301a2","impliedFormat":99},{"version":"ee9811c1b947c37077408d66bf61ca0f7e6ffad850ecec1e246e643c51fbb5e3","impliedFormat":99},{"version":"4e919bdf4100bc0338598352ad2778d4750fb0d5facbd1bc7c5210340a1f756d","impliedFormat":99},{"version":"4b54813a405270d710da2c598f57cc0c512aad7b5f34f8d2e109862020568a58","impliedFormat":99},{"version":"ac29a9fe4dc4829c7f3f693c7667483f9903ead6ac67abf8d6a5744a5578a7a4","impliedFormat":99},{"version":"5429b7f938113b40fa315e0f100220a5801992497bc3eb05e3b395055033a93c","impliedFormat":99},{"version":"aac828f821e824489c3f10a5452e05b7abc084894dcf6cef1855fe44c88d8556","impliedFormat":99},{"version":"9dda93662ba9cc072a048ed9717df4869820cdc84ebd33db3db6e1ef354f521a","impliedFormat":99},{"version":"a769f4df15ce86d72fdc646ef33bf9ad634e2d7f544399ca030b61d61c781942","impliedFormat":99},{"version":"e1848b9ea5d00c149eae78db2141cb099cd5cd0573064c03f24fada82b2a0d94","impliedFormat":99},{"version":"535dc92c4a20901f7dad384f1fd2b19735bb33720fad67283f4c2b06c4735777","impliedFormat":99},{"version":"2aee0f37dd7974c93900bbda19ff133f2ae270938d99c50f3c6c944260d94ac2","impliedFormat":99},{"version":"e30accdbef6f904f20354b6f598d7f2f7ff29094fc5410c33f63b29b4832172a","impliedFormat":1},{"version":"d8e3ef4fff7d0d3ea72616214977dc2e8407716fb2075e48c61a930d40bfc003","impliedFormat":1},{"version":"9b7f0e34eebf9d3b7196bb340fb2b0013db8bd22fad1a5baaf394b1ad27a0adc","impliedFormat":1},{"version":"b1e5f3a55aa219247976db1b0c6af31d07673e8085197aef925f25ca08fe12c4","impliedFormat":1},{"version":"99d035e265fb5d783f128612f410c7341eac318c75a53cad0012cb2d2cf005f1","impliedFormat":99},{"version":"c609560ed4b5a840f9515229fdf7522440cfacaf2b6f21e1c3e6b46bfc4431c6","impliedFormat":99},{"version":"43980aaf3d50729108658c84a9325fb3341186024247f2af90a9114206577d06","impliedFormat":99},{"version":"a59b6920d3cd9ac94aa10df1c8f2aa9c76c91d73e4af0e745821424e73bbffc8","impliedFormat":99},{"version":"26de2510ef97324e48304cad246786f786be6b9d067746ba672724fe99eb4a76","impliedFormat":99},{"version":"8b57037ca744bd60066cb4daeb239264ae4bf833f87edb3db2d59b4ef3d745d3","impliedFormat":99},{"version":"ae650283eb740cc6f195b89c1d341c03eb93a2fbaf3f7dcd5d01e827e23cd3e3","impliedFormat":99},{"version":"a9422b34f43cc9ee3352838bcd6fc2aec4e388dd6af7f4909df84067ef5b827b","impliedFormat":99},{"version":"88729bf6ce9df1a17ce52112cfe4af935cf1463c9128d4c7dde0a11ad10cfcbe","impliedFormat":99},{"version":"3e0d929622db87b5431036fec53dcf6f98fef5c6dae84570ac1c0c7b3c005ffb","impliedFormat":99},{"version":"53090b74e67c3dde2e97a5f3deaf1f1d2184d5caba7124193ebfc3be2daa667d","impliedFormat":99},{"version":"269966782bfaa41f1f629936d53d6ac01020c60abde7a1f70196a4405018f0b2","impliedFormat":99},{"version":"a507cef707a17f4f58b0f106ed3bf5fb044a9cab3f7c24eaeed10e1fdbab6151","impliedFormat":99},{"version":"a14cb49589c589d4e1257bf7bb457548785b619d37e245fe2a6c1b942156584b","impliedFormat":99},{"version":"272f5f51201ffbd79dbb3533503dd3e20d7f8d1040ad42f33068bf9d0b163e7d","impliedFormat":99},{"version":"85a6e5140a3bf1abbba9e6184d732d25648d20007116cbf39bd3baa9312441f2","impliedFormat":99},{"version":"bb9e472d55badebf8969025cc126eb857874252c58795ee5c6e74d686700ed21","impliedFormat":99},{"version":"7be935d17f4f54e3263e1526bae0128ebd6b15835e6c22116a44d8e0ada5a74b","impliedFormat":99},{"version":"b4aece44eaa3781d058e4f0790aa4a4e1d2012a1d62c73ad05e6a5737a7ee293","impliedFormat":99},{"version":"8519f682ce37f2d021cd6072049a7ac2db5fdef449afa3a2a226d346c25d5962","impliedFormat":99},{"version":"a43478ba83037f64bb87ea8471a7e8a407efa910a75540b384593bcce2d38c48","impliedFormat":99},{"version":"9bc917d7e01d56dfae1f76108a8cad4957f961cb51aa23c5d2e69ef3db286e20","impliedFormat":99},{"version":"b0fc879036b6a62cc7cbd27ea444f6fbe57fbef1b1d039b0d566df2117ffb499","impliedFormat":99},{"version":"f321683ba426eff0d826901b147eabd2d23428147643c869ec99c51da801290d","impliedFormat":99},{"version":"3c1183883c83dbb1be210210e1c11a878f87d60f8afc1b3972cc6388c87e7971","impliedFormat":99},{"version":"3c1183883c83dbb1be210210e1c11a878f87d60f8afc1b3972cc6388c87e7971","impliedFormat":99},{"version":"0b4125a4b9bc524a75e880a6f31849624262d8c97cde4a5da1d34256c95f5bfe","impliedFormat":99},{"version":"0c95bbcf76de3e231a4288d81d9e897e10c73da899277da633b44a08eb8eefba","impliedFormat":99},{"version":"d0ca01ffa779f381a0ec9d9efe34ea3cc98b45e4056ab44b5268766d63aab647","impliedFormat":99},{"version":"b5738f6245eee46675619b44f6af0d70f7586be229fb360532a80c44b1b49ff9","impliedFormat":99},{"version":"517171e44831ae1b5c34ba7aa7c7f1dcb21902c31d3f7b2abb51e497a0b99e6f","impliedFormat":99},{"version":"e2e3cde2cec99e82ea98a82c5bd92ed12e4fea8cf402a6e035d5bd2a7cca281a","impliedFormat":99},{"version":"2639caf99c5969ac53c622f5fafed83ca12d53fa87f406aa2cb7467a1103877b","impliedFormat":99},{"version":"a23d0164a568e779958e7643d81d88dc9027e80ed65e3a54da2505af249d329b","impliedFormat":99},{"version":"2131b5fbfbb47e80581e06e8bd11c7bfefcda71f088aa5f1d137d289c20a2222","impliedFormat":99},{"version":"c0c57f6c7ed346d12352f55865e539621bdcad36045d2b9e71be0e168b1192aa","impliedFormat":99},{"version":"11fd3ff2c4379a9f482f0d7c8591fd679d4f8dcab82046db3a1812f8713f2373","impliedFormat":99},{"version":"36f2ab77365fd65ee3261475892dba15c0fe452077a93a19a63aaf2acb62fc98","impliedFormat":99},{"version":"bb9cd6cc3af0b5e3ffa70cb1de85fe6946b3a3f1f10ebed7ed8c772f7ae50466","impliedFormat":99},{"version":"5b3a8b45bba54d7ef198eefa8c61eed06ec95d267108353c1517742be9eecb88","impliedFormat":99},{"version":"8081faa1962486c7e9e5fc2dff88fae24d868c5a585cdb2c38ba1c15fce4deae","impliedFormat":99},{"version":"9f57322db1a5da7c827f95f23fc860c2296730373a87436ad2ee23644c3c86a3","impliedFormat":99},{"version":"1ee555a004b7194196d6d51cf73227cfc1c0f0d043da9a649e5e867a25d1a2fc","impliedFormat":99},{"version":"1d6201fba84d7d56be10c34ef4f816988da4bfd1548902300f3e031a4f482833","impliedFormat":99},{"version":"51e530ae5cf54f398bee91699fa140199f96f2f55b8fa23901815b02c9721fde","impliedFormat":99},{"version":"18cc29fdaa42892eb79f03b9f00bd4619a35bb6dbc1805a7c5f94d9b0e96bf6a","impliedFormat":99},{"version":"b00e3cca08af70a9cad820cfc0c78e477d67b3f72d5f2d6ca967172e3a971f8b","impliedFormat":99},{"version":"9151c2db5ef596dc764093003dc730d6d3d1f75eaf5fa117f6caa2474e98a634","impliedFormat":99},{"version":"12b545c39034ef75d9b4b66d21324cfd2d37ca0f33c563fdd7e32a9f02839ab6","impliedFormat":99},{"version":"a178ef7d260e3ae2d4bb5ef46000ac0ad00c79a454a80b1e03615ae4e410596a","impliedFormat":99},{"version":"bf48205fdc00bea0ed458cf81a57e4cdb09e740669370be0e17a92e0a89338fc","impliedFormat":99},{"version":"b5873d1c47eff986c60cb5d61878fc2734a8c3e8cc64b7e183fbcdae3676aec8","impliedFormat":99},{"version":"3d1354d536d8ea970fca6ea675d5932b2d5720ac458fa85afcdd80f3b708c763","impliedFormat":99},{"version":"a06839234f46aa66759cd492ce3f716a9f32fc30d9310e1b7618c1f5cc075a62","impliedFormat":99},{"version":"92929866d4c2be4b9510afc8ce088817d8a2f5b58398cc032aa3e587fb700a42","impliedFormat":99},{"version":"6483a445bd97d8cc1545cebe5b4b84e7611c5f2ac65adf4fba8188e1758cb1b1","impliedFormat":99},{"version":"4cdce6d44ef612092168edba4cb736735dda79314c8d816bb376d2d4a4aa7f0c","impliedFormat":99},{"version":"d8ef707d006fdf8e64a9ea3673c4748374cac72d794b632dd6868e7973de3b55","impliedFormat":99},{"version":"695dbe57a9f1686b727ff8112def7376b69da4a9f92a6b4660cfc7adfeb4fd57","impliedFormat":99},{"version":"e30accdbef6f904f20354b6f598d7f2f7ff29094fc5410c33f63b29b4832172a","impliedFormat":1},{"version":"5fd2267cea69c19286f0e90a9ba78c0e19c3782ab2580bfc2f5678c5326fb78a","impliedFormat":1},{"version":"2a628d887712c299dd78731d2e18e5d456ac03fb258b8e39f61b2478b02481ee","impliedFormat":1},{"version":"b1e5f3a55aa219247976db1b0c6af31d07673e8085197aef925f25ca08fe12c4","impliedFormat":1},{"version":"e9f80c5934982b97886eadab6684c073344a588d1758b12fba2d0184e6f450a2","impliedFormat":99},{"version":"c609560ed4b5a840f9515229fdf7522440cfacaf2b6f21e1c3e6b46bfc4431c6","impliedFormat":99},{"version":"43980aaf3d50729108658c84a9325fb3341186024247f2af90a9114206577d06","impliedFormat":99},{"version":"a59b6920d3cd9ac94aa10df1c8f2aa9c76c91d73e4af0e745821424e73bbffc8","impliedFormat":99},{"version":"26de2510ef97324e48304cad246786f786be6b9d067746ba672724fe99eb4a76","impliedFormat":99},{"version":"a822bb869dd9dfdb4b1b5c887b90373d5a1e900191772646b6211541a5ea13b8","impliedFormat":99},{"version":"ba56cf294acda8f40e97bdf8f102617b57c914664476e1f900db307ad0e8c3f2","impliedFormat":99},{"version":"92be2c8229c02b140324d56906af58882ffd87ead115a34380580e9dedea4a18","impliedFormat":99},{"version":"a507cef707a17f4f58b0f106ed3bf5fb044a9cab3f7c24eaeed10e1fdbab6151","impliedFormat":99},{"version":"a14cb49589c589d4e1257bf7bb457548785b619d37e245fe2a6c1b942156584b","impliedFormat":99},{"version":"272f5f51201ffbd79dbb3533503dd3e20d7f8d1040ad42f33068bf9d0b163e7d","impliedFormat":99},{"version":"85a6e5140a3bf1abbba9e6184d732d25648d20007116cbf39bd3baa9312441f2","impliedFormat":99},{"version":"bb9e472d55badebf8969025cc126eb857874252c58795ee5c6e74d686700ed21","impliedFormat":99},{"version":"7be935d17f4f54e3263e1526bae0128ebd6b15835e6c22116a44d8e0ada5a74b","impliedFormat":99},{"version":"b4aece44eaa3781d058e4f0790aa4a4e1d2012a1d62c73ad05e6a5737a7ee293","impliedFormat":99},{"version":"8519f682ce37f2d021cd6072049a7ac2db5fdef449afa3a2a226d346c25d5962","impliedFormat":99},{"version":"a43478ba83037f64bb87ea8471a7e8a407efa910a75540b384593bcce2d38c48","impliedFormat":99},{"version":"9bc917d7e01d56dfae1f76108a8cad4957f961cb51aa23c5d2e69ef3db286e20","impliedFormat":99},{"version":"b0fc879036b6a62cc7cbd27ea444f6fbe57fbef1b1d039b0d566df2117ffb499","impliedFormat":99},{"version":"69b3e0b9435c37d191bce1a4d38c8d18e8add8cb99835eab8f566b95ad9de828","impliedFormat":99},{"version":"3c1183883c83dbb1be210210e1c11a878f87d60f8afc1b3972cc6388c87e7971","impliedFormat":99},{"version":"3c1183883c83dbb1be210210e1c11a878f87d60f8afc1b3972cc6388c87e7971","impliedFormat":99},{"version":"0b4125a4b9bc524a75e880a6f31849624262d8c97cde4a5da1d34256c95f5bfe","impliedFormat":99},{"version":"0c95bbcf76de3e231a4288d81d9e897e10c73da899277da633b44a08eb8eefba","impliedFormat":99},{"version":"d0ca01ffa779f381a0ec9d9efe34ea3cc98b45e4056ab44b5268766d63aab647","impliedFormat":99},{"version":"b5738f6245eee46675619b44f6af0d70f7586be229fb360532a80c44b1b49ff9","impliedFormat":99},{"version":"517171e44831ae1b5c34ba7aa7c7f1dcb21902c31d3f7b2abb51e497a0b99e6f","impliedFormat":99},{"version":"e2e3cde2cec99e82ea98a82c5bd92ed12e4fea8cf402a6e035d5bd2a7cca281a","impliedFormat":99},{"version":"9382e32237e08424b2642d1d9ea4af3a76001cef48888273f769af0c95cf169b","impliedFormat":99},{"version":"45a95142d20916e8510b2d4c42b09aaa3d8ca3d0c3dbd7f915da870ad182380c","impliedFormat":99},{"version":"2131b5fbfbb47e80581e06e8bd11c7bfefcda71f088aa5f1d137d289c20a2222","impliedFormat":99},{"version":"c0c57f6c7ed346d12352f55865e539621bdcad36045d2b9e71be0e168b1192aa","impliedFormat":99},{"version":"11fd3ff2c4379a9f482f0d7c8591fd679d4f8dcab82046db3a1812f8713f2373","impliedFormat":99},{"version":"36f2ab77365fd65ee3261475892dba15c0fe452077a93a19a63aaf2acb62fc98","impliedFormat":99},{"version":"bb9cd6cc3af0b5e3ffa70cb1de85fe6946b3a3f1f10ebed7ed8c772f7ae50466","impliedFormat":99},{"version":"5b3a8b45bba54d7ef198eefa8c61eed06ec95d267108353c1517742be9eecb88","impliedFormat":99},{"version":"8081faa1962486c7e9e5fc2dff88fae24d868c5a585cdb2c38ba1c15fce4deae","impliedFormat":99},{"version":"9f57322db1a5da7c827f95f23fc860c2296730373a87436ad2ee23644c3c86a3","impliedFormat":99},{"version":"1ee555a004b7194196d6d51cf73227cfc1c0f0d043da9a649e5e867a25d1a2fc","impliedFormat":99},{"version":"1d6201fba84d7d56be10c34ef4f816988da4bfd1548902300f3e031a4f482833","impliedFormat":99},{"version":"51e530ae5cf54f398bee91699fa140199f96f2f55b8fa23901815b02c9721fde","impliedFormat":99},{"version":"18cc29fdaa42892eb79f03b9f00bd4619a35bb6dbc1805a7c5f94d9b0e96bf6a","impliedFormat":99},{"version":"b00e3cca08af70a9cad820cfc0c78e477d67b3f72d5f2d6ca967172e3a971f8b","impliedFormat":99},{"version":"9151c2db5ef596dc764093003dc730d6d3d1f75eaf5fa117f6caa2474e98a634","impliedFormat":99},{"version":"827f0158dcf51b4afd0bf7867d30ac9436535fb4422b891a16b88799f9caa6e8","impliedFormat":99},{"version":"a178ef7d260e3ae2d4bb5ef46000ac0ad00c79a454a80b1e03615ae4e410596a","impliedFormat":99},{"version":"6e477dd31a5483cbab13f1f907b29474b33a5140dd4e8672a7ebe00aa27984cf","impliedFormat":99},{"version":"b5873d1c47eff986c60cb5d61878fc2734a8c3e8cc64b7e183fbcdae3676aec8","impliedFormat":99},{"version":"3d1354d536d8ea970fca6ea675d5932b2d5720ac458fa85afcdd80f3b708c763","impliedFormat":99},{"version":"a06839234f46aa66759cd492ce3f716a9f32fc30d9310e1b7618c1f5cc075a62","impliedFormat":99},{"version":"92929866d4c2be4b9510afc8ce088817d8a2f5b58398cc032aa3e587fb700a42","impliedFormat":99},{"version":"6483a445bd97d8cc1545cebe5b4b84e7611c5f2ac65adf4fba8188e1758cb1b1","impliedFormat":99},{"version":"513d0b8895a905e579ed2baebdc817a23dae16e78ecd925400e3142a8096f33e","impliedFormat":99},"fce0bcc6a86782ed4eda9ed21c4843dfa3c0845db64634867034d249ac0933ea","51caf311b5397bb74553bc28cc85973db9f9a7a327c68866e7e7750b72dca42b","d392af7961eda9588aed6392908f014fa318daf9e8a952339ed3db69e9ce5273","2778747ec5f0fa749a66df42831ea70270ab3a17a94f1313e01905b794f92a47","925bb05a1ae6a8d137cf092bc8b31e54ebaa5559a444583eddcff605647d5544","01dd48041d3b0d86d198e58cb750852eea8f0a78d40cd52f7e50bf6f33a06dee",{"version":"89fc4cad6ac7ac6d922523b3ab51462b050189ab335766149e5cc777483d4e1b","impliedFormat":1},{"version":"27b14b091ccf309c79f3d2cf226edfa4d533b131f19bc0cbe855adebd464c285","impliedFormat":99},"d41171d9f336c406532c26d9706a7f3dbb54d757e4dd418d1f21623e8871c740",{"version":"5276ee82ef96770571bd5aae9f4f5cdd474c3d4c1a068f1e1d9ab9cf16529975","impliedFormat":1},{"version":"cdb1d174036ebdb04b5a61461ff523efaeefffd87b093f43fdf20196024b2003","impliedFormat":1},{"version":"23c2c70dd974c3b8b66be4f3d6c9351fd41235d9c038b4d57d334dda8f753819","impliedFormat":1},{"version":"dffa09d0911ebb2639cae47397e011cc195de4a3ad83b53efb2651cfa0e0b75e","impliedFormat":1},{"version":"7d2c1ce36b9370a3af266ca6c663fe62e82671f9cf41337bda0efd837a5e2de9","impliedFormat":1},{"version":"6e45f5dd809aca05301c8e1b9f526096fe89b3369da10fe34f9c037832f103a9","impliedFormat":1},{"version":"0db63cf288cd71a85b06be8065db706797fb7d368a2315bd34967070c880facc","impliedFormat":1},{"version":"755ee0128a813468af08c5e673655a068813c92f4179978fd37ac3df1688c2f8","impliedFormat":1},{"version":"f183da4c889c90d5060aacc1c247c6cd68cc0024b9891402bb1c07a492d18018","impliedFormat":1},{"version":"da1c8718353e2981fa5981328a2d5cf6bc70da59c51967924d032a06177bce50","impliedFormat":1},{"version":"cba87731af3b8e51151ab6b3ba2d9604739649cf132885dff49836d5369ae387","impliedFormat":1},{"version":"3965bb091883ba173f7742c16ec8efe81207d75774d3a809385edce6841adca0","impliedFormat":1},{"version":"108fd0cab464e528dfa511d982368df2c9d9964e1e66f8921ef40accce9dfcf7","impliedFormat":1},{"version":"8d48c98fca3f013fd2872810d7168a9c405c4037962637aaa0a094571e731757","impliedFormat":1},{"version":"9898a7c6ed78c9656079244ea2318282f42ffd1cb5d4aa5753decaa7f3eaafa2","impliedFormat":1},"010bd7696850423d70a40aa6a4968cde67ec4f7f1a113a107d0a7423eeb58dd2","92a71fd81ccd1c569d4922967f10b4bf8e680ee7e97b9caadb5426a70249263e","132279ec90347f347997306254f472ccf473cf7ec59e6cbc358c8b3e3d917dd0","283bbcc38c91737aea86f8d5362b4fb48894b64ae12a7341563a1ce7372eb39c","8c3a4923961d532c332df2f3915a4a70441449f099cea296ca91a02bf6b9f310",{"version":"b4f89206c8e318e5e65294ae7925a52a5bc13508809c5c699d7ebfa14e0509eb","affectsGlobalScope":true,"impliedFormat":1},{"version":"d51500cee65d776a8591b72c1019b0dada25d6f7ea39685130ccedad2e8b1eff","impliedFormat":1},{"version":"e733b8a7d2ecce20916d95d75a0c7cdfff7e8371879006902d77969da1550d65","impliedFormat":1},{"version":"d9d5884c0b7a87c6b0b319474eac7987f915f7460a04012d54689c14c800d69c","impliedFormat":1},{"version":"42739f43f21108aaa8b2e9d1246c537c88fc193694d5c3660b49ab5ed87bec60","impliedFormat":1},{"version":"8c4c212cbe640024a5076e006d5ed48c6856bf3a79880c52d0fe453495b84e7d","impliedFormat":1},{"version":"8dbd432facc1bfd211d58bbbf86a405dd55cdf04d6425037171282ae5e1bd5ae","impliedFormat":1},{"version":"bd0ae662720de3f141b078c64de498113fb13faec0c1cbec62f1630f7b8954a3","impliedFormat":1},{"version":"517fee0f998ca443a8eedaed7ad143753cd7ed6c9fc97a62200c09b21ea661d7","impliedFormat":1},{"version":"e94e5a0936bba407a0d0b7846ff8a7960667f09040b575b5035bc30298510781","impliedFormat":1},{"version":"f6a3229a9d452117bfc85b50e955b836c8c91b1244dd8d3413c2824333022982","impliedFormat":1},{"version":"75d3a0dcb75b27ae7f6d3bc06ebacc608c5145b2f403264b64d603d0be929bca","impliedFormat":1},{"version":"28732171a9e5a176e9d8b9bb417b32dc885591bc2642232389a44167bc5ec581","impliedFormat":1},{"version":"90ebe8ddee75b7e87baf030d45d49e13a91dea47fa4cd8494ac85e5ea35779c8","impliedFormat":1},{"version":"6ec1d690b2213c008b55d31778e6c4f13141487fe26749ee6a0b4c2b6f84f9c9","impliedFormat":1},{"version":"43ae0b1b0a836f113aa973b1a4d114e2867fd320125e43a80805d9a80ab07c4b","impliedFormat":1},{"version":"1b6d1aeb6a58db9a9702623d7edaa31eda44cb33fe66f349f6156b20db8b6211","impliedFormat":1},{"version":"5ee542acb0e360c539bcf027de4389536fdaae8653e47b33eb0445ba85bf223a","impliedFormat":1},{"version":"8a0a53613cfa756a769e4514632acac0e17d80631af21a888daa46ac01ccdd1d","impliedFormat":1},{"version":"e7f9e4cf51627c95fdddff062c58c6b1c4e22d1868acbf3e7e663ee95e3790b8","impliedFormat":1},{"version":"449d082b398ad2a53c5def35397b752d61c968a2acacffb935d564b5ff3aa19c","impliedFormat":1},{"version":"1a3aa0fb5f9a2dc05a33faa6246f85ecc52c8af7a5257d8639e724a12ebc92bf","impliedFormat":1},{"version":"6480e9b0877e389c96e3b89c43fb2e4d84bb6ae8cea22f8ea2bf30ac4a4c4136","impliedFormat":1},{"version":"9cd1a75410c01f48f43befd40b47a7d2d42565b5593d5cf02b7472b04a1d98c8","impliedFormat":1},{"version":"d0144e7240c7f26030468a13211194d192316099ebbcee7782c6005cc393c734","impliedFormat":1},{"version":"095a402135de9fbfda29ba7c984bf54b9e65757396b4165706d898e9baa83ed5","impliedFormat":99},{"version":"0b6471168629b8a0cbac9f8f67bbbba83a1d64cf1424cd7d299439b3af88129a","impliedFormat":99},{"version":"3e0fa3b04086663fd406499ea37f0714b0d7cbc296eb81e244f2bf0ba4938bb2","impliedFormat":99},{"version":"3d11abe325e68a5b76d9f53ecc0b4ea29685ccbd8690b279f2177e0750d87f8c","impliedFormat":99},{"version":"f1952d24cb1344241341230924197977764249edcde80605e96454f073ebb35a","impliedFormat":99},{"version":"3b5b37b56d81802168c5b8df2f1d4a7ee018d67e7463f221d49b6ea20af00060","impliedFormat":99},{"version":"f3a6db8faeb959400a4d0e1100b9d5c54eb494800e6dc9a2452bb2e00a27397c","impliedFormat":99},{"version":"d278699a1c7e06a195ecc065c4965d1bbfb5bc2d67176e63bebf58b273158023","impliedFormat":99},{"version":"261ffd2f7502d9387324715c7dcb9f3a30c8d044b6dc3abc7ff80737c366476c","impliedFormat":99},{"version":"28729ff7b2ea98a9ba6ca4490c5540be744a4d73b4199ff6094cb65c9db33607","impliedFormat":99},{"version":"6ac889647435812fb7ced7035daf90c1f307710056e4b496a3fd5cb97c87daed","impliedFormat":99},{"version":"29f60d17027d6bc8891797f6ed95ac84ee42313e6b03ddb49beff6f22f49f8c6","impliedFormat":99},{"version":"f71579228be8825267577e970c8f0ee2869cebae0bb7603b00644fec924c6717","impliedFormat":99},{"version":"e50f096cb424b63343ad5814622623f15cf3830f41710376bebb3c7f71554713","impliedFormat":99},{"version":"69ebae4354b59ff1ba38419d6033e22d0db6ffe6c1d562e78914f88f06ec517f","impliedFormat":99},{"version":"45f0aee62dc187cbde99b10987e1f8649a30bba8bf9c95957e37d1551d0626da","impliedFormat":99},{"version":"919b048385b82efca27e5adec2f61f17a2b219582f2deb8a13b4648c7c8fafbf","impliedFormat":99},{"version":"47747eabb3c64620a12f707bf30c7f7a211e25754a2da1f98267068f49bd0947","impliedFormat":99},{"version":"2dc1bcd6a132924a89f965b60edd5b5333aaa7eb28ba5af44a0a0a328756e9ad","impliedFormat":1},{"version":"ad117b97b2eb65daeeabf0adb13573a8f1d12d5ce21c312eb7eb588106b92560","impliedFormat":1},{"version":"683f7d52795b5e2c0a269c4a202f212d147eee850b6d74050af619cea7638605","impliedFormat":1},{"version":"bf338c88f9e91b1700029f806a2d8bb447f19d3e39fa57dbba16ce8bf43902c2","impliedFormat":1},{"version":"d3c9c7df6fe4c7905f73578af2542e2f303da2b0565abb10ccf8a75626da1bb5","impliedFormat":1},{"version":"a16c041923053317f99708de244e50f0c563de0ee22313739810b67cec8af89a","impliedFormat":1},{"version":"b64880a77efc0fba08ee595d277a52e7abbdef2dde51a163376f03d6d3a67c7a","impliedFormat":1},{"version":"817d7ba9b41a1f3f7d15e8c1067bc32ce0044aab0ba05e2794294ed25959cdf7","impliedFormat":1},{"version":"6e6d52eece8b335d10a436ca59f91cbf0727f9f2ac0521a0b0ffc32da2006948","impliedFormat":1},{"version":"98e70d3105aa56ac3e2a34a78f10c6d352ff9e3148b1bc2bb11c1787f0176d26","impliedFormat":1},{"version":"144ffc9e0632f167247b8ebc6c12b690555b27930cb2d92edceea7df51e54bbe","impliedFormat":1},{"version":"cb6b2bd587f4d8b0299840be7cedf422fb895d3c7f6cbd8c18c041518ba82fee","impliedFormat":1},{"version":"849b51d422f1a846684da755840ffe68f65701b7b7703ea9622847df65dfb2cb","impliedFormat":1},{"version":"3b17eebfd6fea2320c3d3ab55e26bee41e6745fe51432da7901e898249a8c186","impliedFormat":1},{"version":"5d9c054ecd5fad83e0ec5e117196acdcd4b1cc5b8d28f5df752a416c27052aa2","impliedFormat":1},{"version":"949c8eb79434b05b6d1c10d2010216fbd6c920ee376d08627f717d24b6572454","impliedFormat":1},{"version":"25495d26470692e2591e386c1dbffe4aa0b2d8c00af6ac9c8c69657818262dd5","impliedFormat":1},{"version":"abee0197420ed0849c7adbff50fc13f54ccb52f9a8c906e298c28321bf736cd9","impliedFormat":1},{"version":"3af7286265437a7488193d0ab0b56a6e20e1a5e08831a6c3fe0880212c2c6c75","impliedFormat":1},{"version":"d7eadcb936edf325912a70d1c4874c29b92463ba1eecdb302858763db6a68692","impliedFormat":1},{"version":"04fe6e4f5bd35c234cd04ea88ada66b718aec4b3edf611147b0ec9ea216b3cd7","impliedFormat":1},{"version":"7aa826d09dcfa85af6b2cfeeb6a7f340d417968632695fa8eacf4186fb71e8ac","impliedFormat":1},{"version":"ebbf2bf006f21fc203f1a555ff0fdcd8542d1546d7cab60aa835ff5902db0d2d","impliedFormat":1},{"version":"12aaf4e3c85225c710acd6a9f41532bf8e06bf180e54c1bedc60fa9b9c1a7d23","impliedFormat":1},{"version":"7814f653054116409bc9a36968b77c878c2013ef8d8873328e8f6fcd3348d8d9","impliedFormat":1},{"version":"ff4ade9606d1b3fe1a10bdf6ab944e1bb1d5ac86035228ddd3ecb5fbe51d4d47","impliedFormat":99},{"version":"608ffc65e122c3eeeff832a9007ecc00fe71bf1b03a3069a44e8c565ee8af368","impliedFormat":99},{"version":"40b54b241bc79a986a5ac364f7f11c60af8c68ac8d45c80501ed31af7e587a74","impliedFormat":1},{"version":"0d1a503605c35a53f49ff2b6506704b289bc33d9001d2244044c91fc82315c8a","impliedFormat":1},{"version":"96d1d70759af66ea4404f7c18130ef478e5052de8863e2bf4467cfbc2fc7176a","impliedFormat":1},{"version":"fcb4542949fbf132a400c60cc53b79dde681570147af3a5798aa732798c6b0f1","impliedFormat":1},{"version":"9332e2b6255fd361167671093522351ad5e2d0e3a78d9bf8f0959d779f6d3246","impliedFormat":1},{"version":"5be2e2b5ca39c4fc74b0273674a3e7705088513872fa3de1e4f75357a507a988","impliedFormat":1},{"version":"fc8bef71b44a15c1c6afe97e2ce74c7beb10d0a3c45d19dca5b9d53cf81cc744","impliedFormat":1},{"version":"41dd7695c5e11ca31e40bb8d9a2edc9c2b3e262d1007fc7471ecb91516874d98","impliedFormat":1},{"version":"262efb4650083ac514f3119534d502211d0270140057698e7d4978caaf4b6f97","impliedFormat":1},{"version":"b5e98f1f4e64ace252ae743df592ff0187aac817efaf58cd97c63e243fe15951","impliedFormat":1},{"version":"151f53de4563905919248ae634d857276a8491e62416b6f2cccbfebfe6794a72","impliedFormat":1},"8f7f0fe9723363d03731e2af36efe952b9c8dfae8c9c4feca85f917c8d38ee95","7ecd76861caed403cf1c2e800d380817179703bb003a7e94141e51e9e520a16e","dcfa51263066f8d4064c483762236b3257512c2d88434e8a2f1010fc8d77a729","9811c23f18ed827f5f95f59ac41d59c24e048811741bc97ef4751a6e4b588c93","764d3e4fb632118dd99a7e8109e64f2663f14cf970b4d45e8b9b74ba705f68c2","a993b6a3db6a2d2963115b8eb8e4e04ff6e4de394170571a5b703e482ff5314c","767f21b5b918baaab7627cedd23e90e96c6988f86477df1208b5111f41aee03d","51b6fd7947e721d16a909d057b5d9b008e7c467c94efb5cfbca51edaf10454f4","f846a25a6ad92fae372999fc49fb5fe1febd68ca3eea39ef83425a46cc016776","409ffeafca5a6a110031899b1ede663a3c3fa929124893367f4934e32700d68e","21adf40e2fb8b0a48342d2eaf4125363d94acb49cc59f5ac369749efe683990f","05da203db76a7efb938df54d8cf7db7946fb7c89099b5c41c78662d95b8f7fcb","79b4596a792ed6cc9300ab60c2d21d820f4a13717d14e573b55816cdfb245de2","6c96ec3120fd9f90fe1afc383f6b2f92b824907883c6f99268b5167185b0a3d8","4bb6f6bbc4448a16ffb70812aa37b20ca3941b27443ca36d9d3a499a8bf1d564","ced87fa12049ceb1366ca1f09f6513cc7eea164e6922411dc96af74f9d44cc3f","d2e4a17c63760596ff90b4309942c815d06024e25e7a60bea36d17393602bc79","21e7c97a4a252f6c062480252b3f885ec2e7b67ac56664d2779d4874d1d1916e","aba51eb73c16adbc21fd09bf64b6014e84c469284c501a3c9aacf242aa29279d","26b123b60d4d748e6ad048813295f4c368d46faef228690732d8d289a1a5af8d","5d83ba0eae0798f047802f636c62c4189ef4079f2d017f33b14086fae18b0fd9","1d568d68dad90166c8e322e3a301441095b2e149d458f411209fe6e29f0ec1c2","2d995c15bd75d777ddb5e05b3e838750a7a0e229d9503204984aac0e36d886b6","6cad528e6075009933bc7ec3a49f1d4574995a45e5f1fdfe04a0c38dc693ef57","8c504f40166472fe55bb138187ade1677c14699b70731d3d862d5d19193814a7","7d1e53d013ca549fa99df6bb961822493e2878f2f2ba935e95210c9b7a24cd68",{"version":"5276ee82ef96770571bd5aae9f4f5cdd474c3d4c1a068f1e1d9ab9cf16529975","impliedFormat":1},{"version":"cdb1d174036ebdb04b5a61461ff523efaeefffd87b093f43fdf20196024b2003","impliedFormat":1},{"version":"23c2c70dd974c3b8b66be4f3d6c9351fd41235d9c038b4d57d334dda8f753819","impliedFormat":1},{"version":"dffa09d0911ebb2639cae47397e011cc195de4a3ad83b53efb2651cfa0e0b75e","impliedFormat":1},{"version":"26168183003371ceac063f0cdf62be889d0515a193444a99b176094565dabb0a","impliedFormat":1},{"version":"7fc99221160c51281d2b9095552be2b24b600b3b6fe305cfd068bf501f623ef2","impliedFormat":1},{"version":"e36eeb1297210f99ef4644a5028caa2f222cee56f5f577909470aae77924b7fc","impliedFormat":1},{"version":"755ee0128a813468af08c5e673655a068813c92f4179978fd37ac3df1688c2f8","impliedFormat":1},{"version":"f183da4c889c90d5060aacc1c247c6cd68cc0024b9891402bb1c07a492d18018","impliedFormat":1},{"version":"da1c8718353e2981fa5981328a2d5cf6bc70da59c51967924d032a06177bce50","impliedFormat":1},{"version":"b4b9c09ebf50026552009c501feafa8d69c58dd29cfee93f54d5783f8fc6d2b9","impliedFormat":1},{"version":"3965bb091883ba173f7742c16ec8efe81207d75774d3a809385edce6841adca0","impliedFormat":1},{"version":"c1eb69b3ec8f1080980c25c8244c4ba093af729f4dac451758e69026b20c50a7","impliedFormat":1},{"version":"f67870591872110fd6a97ec0d933972f21ccf433bfb9d8ed1f044740958c4e43","impliedFormat":1},"70d4ad847cb64eb83528a594bc5eba51fe712394c7b5c1de540dbfa1fbb252a6","0a598b4c856c45b4847ceb8cbf5e4dfb8eb164053ee407775363fad2b3689893",{"version":"a28e6fadb0b6e7a95cfcd29366f2b72a8e3193270d3f2b673e1876edf0159c7b","impliedFormat":99},"16db379ab816c2dcb506ece1955925fad9cf7e60a27e192f0ae274abeab0e4e5","c24ff7cbdbc36ed2758430652fd2c208c35f23a69b0204b07d6f3ed016eed9f6",{"version":"9be0dc6f4c5ebff5d838dc0d059f25e5a6ab1d224d5adc7ef46887ce8549e897","impliedFormat":99},{"version":"32aa20fd978847e617304582657723f0dcd1809de9b087ed0ad5b7090b1a47c1","impliedFormat":99},{"version":"1f37db92ea78f4d197a201f80a3c52ce6e2b759b19d3a1e9de5aab0c9026fe3f","impliedFormat":99},{"version":"c07898a85c15b3b636506443e88fe6d85bbd568c0bb504a9ae5cb371d58f6319","impliedFormat":99},{"version":"795d467a57e3a7c4aa3d645fa2edae9a2d0d44dde435bd1b222ab533da6fce44","impliedFormat":99},{"version":"bfc5aa7977557874fcbe1e96f7a06e46b3b568b955c82b74a85cc8f6c62060a5","impliedFormat":99},{"version":"f20bb3ae0de20cd6a4b73155cb506bae39e904b7e5ea4f618f5bda7b3ae474fc","impliedFormat":99},{"version":"44c5d9f47e85552ea141ddc1b0af65903297624f0ff2227372d5ce31ff0380c6","impliedFormat":99},"6bfb9aeb01e1f2a8f2b6196412ce85dc2b7cdc8dcf1962f2e1b6516093e8269c","e4a4f02927024f5fbf9e91abffcec93c3771168b5bc36dea3091b152d5f3186d",{"version":"a896cee6bbf43009c05e9ee4b0cfb1147ae49a4ffc2d814c6d7465806d76fe72","impliedFormat":99},{"version":"6bd987ccf12886137d96b81e48f65a7a6fa940085753c4e212c91f51555f13e5","impliedFormat":1},"8151759f968a478356f66626323955df04679687e8bded20e1ee7b29027fc8a2","476bb552263792befe628d5b588cfee6310e91d27d8e5e3135e3c64cfdf661d6","249a206e642fb5f7539f5127d3a5c6a49de3b802ca604e2b5fff4f38f844bfe3","4a9e0a7891dc98c602bfcdd97d00bfebe517011e39a0f88926cf619ee24d9aa1","4fab487193cffe755885c698cc1bdc01b00ecf4dcca0dddfc447d88970681c97","401cbeffc1cbc3427fc85070bb0dd35df981fcf82a30318e9b468a660a95f743","c84078b0f3b82c13b2e97be494c0f1071a89df00858c9035ea5444924a263884","7293106d19cf62705dc6f168cdb00e7e4c37d57f1019d73eab5e5633f002abfb","8bc0222adfdb85b62b1a3f1ac9fafb8e1116c6494cc86782ac2a7fb6d13bd09b","1de97be13cb6d21a4a1da963d41b6141b27f05786ffdb35713bf378328eac097","e538c60f67d9e7d463ce9fc6299a9c1e436fea994f03f14e436871f69659854f","19b53283228e93ccee1500899e42b4d22853555d91fb8f2efa3f82922cdbdc41","9c93d91720155376e598da843b36a77a24890972270195940569950846c0c7d2","8236d0455cdc0c5df74726e2fc7011e4d133b7df6180be669bad5e025d727308","3be0ff06250bdce15bd08cb9eda008ccabd85aa331a784dfb6d81838c470eae0","8278755295ae2604e765676713fb773b43b8a4c8b98b2bf33693c068b916ccf6","10d43e25bfdaf81335aa875387740a9e952a7f5e2f47f9bf6e473c42a7187564","22a90b05fdc32fa4ff466a5819128275749dee90a305858ef353246e723a2d85","51d4f6415cae0357ae923f7110e6f6962690e44c701589a65f2d95903e40e368","cb838c5fdd46f7f469fefa566e2b5c2fafe02be638ef02177bc1c7cbbd3bf879","53fa54de6d9b14ec6a35ac2c6e7c5dcf47ac17eb74741c57d6948db7a2ccc489","1a947f95ecc0f6a6e2ea8122470d6881b5dfb2592051b68ee8f72f8f8ee36d5f","bbdbdb42b704a60fa5d7177ef83346be726578ccf95e26add73999c1148dafea","71b2f6191be093ac9d84c9286a609f3414390ff88be50e2f01c9bcdb85d3287f","35635edf9f859027af3be25cd38a5d42e52c1258a1a3ced5703842d177dd805f","e5357f120b95cc70b91bff28981d75e63d381f96ddd12df8c6274ce209040c52","1142ae3be3921a530a00fbd2f4aa5e511375891f625fa098e2618ffbb804d3c9","3d93128631bbfed8da5aa5960e91a88249a6bfc7bd00dedc04f4d18cbffaf5ef","32377265da5db06811fb10303adbb6759f1dc0796f11c3509f8c368a394c89e7","6a374c778084795fc7a2aa1c15d20e461b1d8ace2990ecdf6ac8baaf25072b7c","90dec2351372005d3ccfe8cdcf628bee17dc7c48a6bacb3c58d13f376aa92abc","b889c9ec0f1e55e0129ce9d06f0cf10daa320f0161b7c992db8bb1ba99adb36f","f310657015f5c7accfa816f290a474674eedbbe3c79a15477d344da54f4c1c56","ca8aa1a3dec921d461a781d9f529d814dc6aff720b10f2e458cb2e0cc7058536","016017c4c67f193e806011e0f76de65cb3c4771f37a0197447ae00f4ec3d675c","f07b219d7d1e1cbe8d95d8a6e0decb00a1b6087ae186c5ebee9896e2ff413ac2","aaddc268703ab388bf6c44617543cc939831ad85d5dc0aa1984c26a6077e7d6d","1eccc6cef0e7c37d47eb03a97ace30d00bf819de8461786360bf7209960ea3ea","eb431d32ffc7698839b93fb185bd7748ce804f6ba334b5a0f84c926ca374223a",{"version":"029a3b78ae3effba758f50ff034bd7f21b02bb7399092d6af0f5144134d255ad","signature":"01fe9ce173f45a09b54f82b726959cff3d7af1f2e6596298f44b8476c86b1609"},"5dbe51f917f9a0e623f6d4e85168f0fb54590db471edb9a959f1f9c51af279b9","62ab67147a9b8fd96a09da8fdc2471a1ca66d1aecc0f02ef58277f52e4b7c00a","02488bf52002565e729cd29363490adbdfa45672e042fa65325f761e5a69e55b","0a9a76403ee45bcf4bd1afeec765c863db08efa2771089be74033c2c7d734fb7","860408a9ba970b6f1fba26ef47b2a8ba7f8aa79367ae11073285ee82fcc84f03","7f8f3adf0a4936bfe67843d2750d39f9a63001c3abfb2da07d80055807a0488c","ebe28f29d018162083aab8f7b08e66102326527cb3e6eb6adc9d5e3401a76c2c","d1171eedb570edf968f4ad673ae746b0bfa126c17e73e60402262bbf0c15918a","eab87a5108d9732a2508991e58ea5c32b90aa3d6b959eb62b4e29cbb7322bf9c","28d3f60af41a48022385a5619c49a4c799284ebadad30d987ec1f67ef84a1ffe","747e4ce9c28359c400ab94e506648be05de64c9d991b349123a4a8fc48b84b73","1b3f557087d532489d56388c31dd4195b775cc3f735975a4589d2f54aba467c7","4aeae8d8887e81c7698be984c3505a7099f25ee58a6ae215aa5276089924918c","593be32ac4f8fe372a6bd9ea4859ca1a84d6dc84fa630e24616cf24120d68da6","afcd168776c141a058fadc66872e0765bef97fb1c7fbf8a480454bdf30b84186","6da63471ad0749bf97b1e481c0bfe6a43ca8f3daba53269568f033fed989ddf2","8a15db08fb7d7b2ab4717156081b95d4ed32a770e4624b0722e8606e91c3df4b","ff10c6742f17c4ad02e6e18981c646eb136f034df6c6da769ce518bef035dac7","386502117ad2cf606bc88655cb9195b4644bcb8f97cd1e8c5c322ac7e4006c05","ab58c363da9bc405eb1f6810b28b3add09b3f610425615360e311c1198ebd73a","0873fbc7f9d6ab783ed2e6a73403a079cab3d122c7eea69392889eb706d5297a","593be32ac4f8fe372a6bd9ea4859ca1a84d6dc84fa630e24616cf24120d68da6","9e98458ea2d271f13b0d0b5d0a492005fb0ca454d24a2645e129a42a0ce5f3fb","7a912902c1c09e09ec8f2638a4d52f6fca012d1a4402753a604c310f680263f6","a4d0dbc0f6fcba705be0aa16752ba7df2a9a4cc98d03adcf0a70d2b70d0db7c3","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","118fed45cbddb3c9b4a4dab8c83967bd4f61d7b0afd8f148045b4287a4cef9a9","2a100a93d6afbe9e3363df7d206b8a3ce61e2c174e5417f825986bc8d21ffc69","8ea16a7310e3501565e2d32de8b9f985f79e462f655686dcab7d6b230fa655b9","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","b60413abb20bdbfafe6b5326d2b4e05f63dfdcf5d9b1246a3f86ece2ad562d86","b4478b686216adcc7a6255a930d419f33075d942195a00707d9cfe03e373e8b9","c36744b2651a62f52866b47c74545de84fdf6991e0a96920e0004642e4830524","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","2049bb071060b81c49c6cf96872f23632d6e4fa7f9a1c93e007dec52d77f8a70","907a3d799649a512646f1e6b70591b137a5f5923669ccf8673003ad498c42e75","b82efd290a7dd61bddb329a05b5d622ec9927cfc8c27b8178676c85875460266","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","6204a985b097ba214229d512959870ec0d74c7b6708b5bebd9f7c270d9ba3f42","234efca8a392e60b9c4d5f5ae51b20c7e593706ed542033427d7123f9ac00047","a21ce57317e583912540dad2b34d2762431c9f603a480affc58b03e6b5e8a369","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","ce0d2754f32697babe3c5ebccd63d627bc2fe2c47d02edc8fb52aefd67bf20ff","30c53f37fc9649f10cd59a98f43a9358878d7be661ace991325756c2d69eaebe","320bec3745b17fe114b018d64b01f1463b34ab3d0196319c3261710e908d3541","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","b48a58724e886fc741cbc9db68909d87f8102cdd102b34b8d011f40263f2eff6","481f5f7de3521edad947b39300f2978debd136ab602433d014e44f6e119dc242","87223c92d8c9f0f6d2163674475be7c4d2c8a4439c31fcf04d01a873c255361e","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","292d1124dff7d7313ac9d6ec5879a113e09acaf4226ab127cb024fd7d0d2131e","9bb30ee6833cc37825294772c9c67863ebf61c3913eb92abb3f259444c274498","693c946a6f66734a59fcb7a131f1f744645b92ba919aac02893161d5b7633964","aea1e4628bba7c088db32011bc0c10cef5543824a882f5e7abc9d480ed900b61","30c53f37fc9649f10cd59a98f43a9358878d7be661ace991325756c2d69eaebe","c52f0a0c1ada7b92b2dc03e2d68cede5dd7d0c3d5f6564dfbf8bc23c5dce603c","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","6983b0c80cc42153db35b6a4dc27c916c15ef43f07c5444754aa99d211e31f82","a09132cf4896ca4a291b30f07e0c2dfa420d4e71b5802f5d130123d20fe976d7","b223502c32cb7040a9ccc12fd30e4a5da2334cd9823920f33e449713eca4d435","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","e3bfcb48c23f5e17495e0050deddcfae71a2ead167760132a4c68bca3ea19f3a","30c53f37fc9649f10cd59a98f43a9358878d7be661ace991325756c2d69eaebe","9e544e6dfc01035c7f28297d2e7d966a655ef1869f6ef4a8a613cf0810113bfc","4b3707ee5c02dfed26946147a17ad487d954cb648a352417f7305f3a8b0b091e","40a717506493221f42ea61f37615fe241827f16309699a4f00d397742db73cb4","c34fa140427f097c7bf3b5b428756fdc790df61bf7c5826008107e2e772f2d1c","aadb12cc5f8c3160aac0f9dc62daa4386c30386ca82223d283f5ce64b486e81e","7b00f5001a9cc73872657547eaf8d736a5ee7d86a82281099111cb56078c45bf","4b80774707d45b293e210ad51549d26e73e44ffafb80874d1a16c232cb47a28a","1423249be76c3ea1e9f13797229a3f813675589513a4b6989e0291e5efd2fed4","f896934a55f792e6e48635ad510db4f9c8cf62d59ccb9076e3ddaaa058eb2299","c9d0eb2d0e962a44edbff2d4ef0d1bba177815b032347c6ca687199569391c16","3e4e710ea86a17244a493dd90c8540cae7c9c14902d004a9a5af29c33ae956a0","44c0d53011f4b029ae82ccf4b1ae9f79b50756aa374e66f63772d661348ef5b3","cef52f035785e353e67a7589e972cebb9768a1c7dee644e2048f14124222bb20","af47ec042fb2136af93235422654247a3988acf6407b643cf9e4c82a6223938d","6fb1d409092b2c60d495bcd219fbd259432787812615d018d34e3095a9779661","86d7666fdb51a41a2eec4b622ebb4e386827f51525d1c0eb39f142a3043cb939","1140fa6ed9e972caad948398ac3f0c66f7f1c3eedac3aebf5666dbf1e08c9984","b6e96a71d65e642f68e0d8c3affc3dd76e358402d629bba297aef9c01d865d35","65e8f650d059a9f6866c8d21277eb75f109c179e6662635e31c73f7314a15b47","973c1d4a8e79b6956e68a922cb0a17d5a73e0f97b9e83ddd320cfd4734260fea","f7047e6358933c7805013ebb85901582f04a55fcc40e9502c32f97513bf78412","8cdcb4c784cb0572917238dcefe583009adbf7797d4c4886ad4039982b5a21fb","07516dc144bbd2ca6c851b2c633c0531f07a8481c1b751e53572b36b4972f463","d1970db5ca2441b07bf3573094ee46114427df80ec4931ace0bdcf77aba69fe5","6dbf76049317057ff152b0491fe3252229cb9443bab1e44802735492727377b9","74e1e40bd50b34196d8a33446cd965f40bb47e5805ffdb95b3eab8a554646752","7747dc051cafcc0b8577ee408f4daf15c9be9259d88c26f2209a96f9eb546a13","f9fb06981b946167276f069cf5bab3d9c731443e9c13fc7d0b92176e5a214343",{"version":"758c90797a26e233e20b5ee506729d4f71e7959ec0abb9ae7480c6c361e56b50","signature":"01fe9ce173f45a09b54f82b726959cff3d7af1f2e6596298f44b8476c86b1609"},"29da1ad7f96472379fd04d511cf2ab58a6270ff73dbd5debcbd2c7933c8cb2b6","92168667f91a00af0f722ec8f8de41a56b81081946ef40734ba99f3bb0af1e87","b438026fd0b4d593a387291b3d00b5bc6005f00a6a82f8888501f835e89962d2","420e51b7c60bb804e685172b22bf3df94202b1d87f7b6c7e085aecc7064c5fd3",{"version":"20a29cf6c881415378d099cc95af09642981805439d0210eebdd87f3c01c32f9","signature":"b16f5a4e537eadbbf83dd27af4be91487d5870105bd733d3adca9509af620148"},"d9c6e8aa2aa261714fe5acf1d00d64a88c9403d59ef13cd88b4e382812ebca60","3fe553fb989b92e12ceba9573d25aa0c008ab476c63c450b83012f5623f2b74e",{"version":"3793b3c429626f29cee5acbc1bd7ebd20dcff7f8e8b34e05e5fe73850944ad91","signature":"6f430d362f1f5af632ba71a426099a73046c276296cece673d4da78bfde3b9d3"},{"version":"89a26c835c143998a3155eedd1b997fd3d5e319200db92d76970f4b82b52f785","signature":"ecc9c331029bef03a4617196ab916fc5d45b29c39898dd248787d7406751b46f"},"0c98f63bae22d46f99c3b9a463766e69bb6a33f7c2b739a425d23aeb0fc5a468","71336d2b229dfe87d375349ad48e56b50497bbe016aa6c5f5ab474c332a47fc4","b3d64e107af520235489c6ae5f27c4ed2d5b1e20bf14400a318459319372fb92","f570553cc117a5b10246f1baa14980d501e86fe29a3e3eb92a4ebc8bb5b586fb","b8a7c792da78d7c358243bc909f2386ded97ee47397aad6fbee8b81cc139e916","fbffe3cd9ee84ff85c569c2099baa96d7795df06c22940c10545488dd1a6fa96","ac02c5780d20a8bdcf91bec4a7d7f67c6ce3027cf25e1ffbc46780c379e499f4","18f97d316ded16682e0238de59e32672c77a29c5e427f9b532bfbd6e622a8344","89c67a901ab5e00abb6ae1ca5c97ab9da40d2bdef92413d730e8ada3da2449ab","b84bf8850597b6296f984612ea2775f6c17a51056c78dd05e037d7c5cb1b5c84","1d5613198f43052f404ec0d41155a8a33d6ec11ca3f7c3762422b123a3d79912","d65ee52c5f6a97afc1182e45dd4c0306a4b23935cd959162af0c45f95fbb6506","716c3c72272c620c83b73b7f3331e591b245dd1963a3f56b890202dc35e4a922","e929970d3b5f26baa81520defcb14d5736b906bd97c1944117c0b701774fe6b9","039c083e305f3bd6d2a1a79fadefa34e309ffa714a5b6d28d5e466176409fe32","908563083b6bc71fa2c9d13cdf89642cfc2bb2e25bf7ac0c5075c6b7ec0538e8","949ad82b645e715938818b7e88a461b0f449436248cfaf11041e194dcbe55df5","dd51bfc79ecaf436d787354b727c38477d7668799f537ce52c304ef7b7386b44","e2c3158e8c5b09e261905bb377ed06562ace98b9365e327544c925d72980ab95",{"version":"04d2351388e3703d9eea9b8d22ca4453d40c9c47673697dafa07bb80f250714f","impliedFormat":99},"5b169703744a581cc41ead96b91ff1ca203f598a0fbb7fc5c475442b44a49741","989ef2ce7e7d2b5fb7cb27c624b244ca3212adb649454146293af2dd3f47faec","6a6cbaccf66ec3a6ca2e2011da79a56aeef182f896d668d180372d03a4f15c74","8f0ff0f7f53aa0d040927159e547d2e201d6bf5bf80a9eccbf49b61fcf102f65","c4914ffabcf525b9bb8a93deb96740f8472b0f1657e17e8a674ecbf8ef6daa40","f81feb8c38d8e187025bbfd52bb52cbf250a736fd38570372ae9bbb5ee3e35d9","ba233f0f876ade2fb846230915b0f2e2cd7f2f9c850d0ae5031240b90adc9320","0800cf2618838a7259300ad750a6082625acceab6ae570f3cc86b894fdd8ac2e","82c7ebad97b9e7ea28d09327522976affdf6137d903127b3224943519fdbbeaf","638c696aee97d0a7c2c56599043f24d53e740439da60dc0d1c2656171fad84c8","a823842f755ebb9a5f53f17a1bf58af08e82d025489a738b294ccfe4cdb64f90","43ec53da0e417894fdae2f84ca2861ee785f9cc8054b1355cad458e32e758790","ee1712609c030f93f0193104a41e472b3b17838da6067fa7805478e81332b98c","20d70bea5782e468fb89759369709d156829e090b355915ff28730a506e1e2a1","d3b610f24e0d08a1079f42b995138866ce6f2681ed0b2d435e134d469cb8f67b","efc09ca98d6b6e72bc69f8bbdbfcdb01c16f24ee4fcda39e3add30a3416166dd","ce8f04f229a40d31b90a740e7b74aca3ed76b03b7f1585ca1323f1b80d6f7006","dbe95686b188aeb09b4f3041b2509d5cf543314b57e725372f351eaea25971ee","976c05f92fabbf396a18651da480b6b2d23195b3c9b5b6f37f27c1b5fb286b54","aa6aad25b2e56284705f8594a304ac31b2e74e6db9f67209b149c5882e4b89dd","e05a47f523b7792fa063e687e327bac6f00011da01c032003225c815eca79497","ae0ba394411502f58ba43cfffbbe5d12dbd312c833b3969b16bf1a94ec90e530","d15e9b66b65a440157551cde22c910c2e2b186e6c7f44324e895f291d629117c","4af52ca6c4b164c1f51fe78464d0eb5fdfbc89385d7628238d3ab6d8bd523da7","084e034e45167d15d154b2e7811a281d94885c71b3b01d4769a44f55c0f6f952","79fd7bba032eaaf7f726b479c7c83a2c8bb7c18cfb0c1772a13b23069dbdfeda","71860f1efab600e8405761b577df7e870dbfb8415d7899696d3b2128fd00a931","474f6272ee75a64d1e98271ae5b83cf4862adf6c141726433296b463a1c130a3","fe5a46c46f3dea2fb31b76edc5fdc14e3ee051bf4fa95cdf32c97d1b9518ff53","e10eafaac3c15258ed78fbef15a3f8692196f971d53f137e60315e5adf7459a3","39492b021fb0e38a2277b43b075781b34e6f4f189ea5f53ed082372ea96c1dcb","906e1e7266f5495194c95064d02829511c0fced58fb5811180488d7158b3ccb0","4c09210b68020d99169d29a1185e9ce81943bd1e313b703546f652ca02b873ec","97c87af69630762a38163d2433a905b297546eef1f7572f7e89f3720f3e8cdbe","7f392b3f1c1b62dc1b577810cea037562b2163d1dab33df28fe973c21007793d","2d5d18f62e794df536196bf7820fa9f3bf92c8fb62b64e7e83373a19ae1cd7f0","f45cfe5a4f8c43c95c9c11d87a58b105cd216f1ae3f59ec2a1aaa598a9cf52c6","68020d3d42f720106a089dca5c168cf04e5d349089fbc191c36f9cccabcb3c3a","94e34c7d90e04bd1de26495f460aaf1f00e7bb004ffec8797f617ea29ae837a5","7f863c4a7c54be9ac30b0575f918420a38ff2edde87b808e59c4c8902e2fe93e","0043c0a8c6d450739b60f14cf684806ae4241c91f3fca50f172665dd9adfde90","9ec2d2c25f1f8befa23ba16b01c401d73da979dcdda8532aa0600f37edbf743b","7232de6a2a92489a070d7701bc60ae747fb40107563e87eb59096c540c4c40ad","1103186962bccc2e2100b1135a8e288f614bce6617ed8a85170e06a3b69cebf8","16d86d734dd6e6ff0ddc33e0e599da535de9bbc5b63abe3b35050f41c00892a3","cd8ffeab689cf8a4b893cdf152bae8be5526afaa8c2eb4a0819dd3db60e14602","7d9e7e04b576f76dfafbb03eccc7781d7b545450be3b4df7015369a4901090a7","3f08732c3a69da9b77f7e626163bb2b84afad459b844e629e01282312c53d82d","de936b6eabc0ac5efe7656dcadf07e5b3baff23ac51c8ef8d301fe5f0647dcbb","44ee0be70278c636f36b993c239c08f0f01c71e16d083b0be9a70f9a66efff09","1b8cacc68f25d13d3bfff13b9dbf773d52e40dca350697b0c19ceb0bd913c22e","ddfbc2e8c681833765607dcbc38a0fa7c768ed7a7d82cfaab528a049b3a55642","96775c3bb0698311914ff1c422bc3c680e143a26f9625a591bcee4e3f0f5d78c",{"version":"d2c13e6de6161ee47ad9edd275f03910121f6d3488a8d36a63e16c6635634bd8","affectsGlobalScope":true},{"version":"ea8a445ae856033c4027b52f3ed2a225ad841dde1248b9d2f58283671dce372d","affectsGlobalScope":true},"73bd4ebe9409ec75ebb1a8f91f1564b92ee28695c995ea15095fc51e830405ab",{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"58647d85d0f722a1ce9de50955df60a7489f0593bf1a7015521efe901c06d770","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"80523c00b8544a2000ae0143e4a90a00b47f99823eb7926c1e03c494216fc363","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"746911b62b329587939560deb5c036aca48aece03147b021fa680223255d5183","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"035d0934d304483f07148427a5bd5b98ac265dae914a6b49749fe23fbd893ec7","impliedFormat":99},{"version":"e2ed5b81cbed3a511b21a18ab2539e79ac1f4bc1d1d28f8d35d8104caa3b429f","impliedFormat":99},{"version":"b8caba62c0d2ef625f31cbb4fde09d851251af2551086ccf068611b0a69efd81","affectsGlobalScope":true,"impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"52dcc257df5119fb66d864625112ce5033ac51a4c2afe376a0b299d2f7f76e4a","impliedFormat":1},{"version":"e5bab5f871ef708d52d47b3e5d0aa72a08ee7a152f33931d9a60809711a2a9a3","impliedFormat":1},{"version":"e16dc2a81595736024a206c7d5c8a39bfe2e6039208ef29981d0d95434ba8fcf","impliedFormat":1},{"version":"cc4a4903fb698ca1d961d4c10dce658aa3a479faf40509d526f122b044eaf6a4","impliedFormat":1},{"version":"19ee8416e6473ed6c7adb868fa796b5653cf0fa2a337658e677eaa0d134388c3","impliedFormat":1},{"version":"1328ab4e442614b28cdb3d4b414cf68325c0da0dca07287a338d0654b7a00261","impliedFormat":1},{"version":"a039dc21f045919f3cbee2ec13812cc6cc3eebc99dae4be00973230f468d19a6","impliedFormat":1},{"version":"3fbe57af01460e49dcd29df55d6931e1672bc6f1be0fb073d11410bc16f9037d","impliedFormat":1},{"version":"f760be449e8562ec5c09bb5187e8e1eabf3c113c0c58cddda53ef8c69f3e2131","impliedFormat":1},{"version":"44325ed13294fce6ab825b82947bbeed2611db7dad9d9135260192f375e5a189","impliedFormat":1},{"version":"e392e8fb5b514eafc585601c1d781485aa6dd6a320e75daf1064a4c6918a1b45","impliedFormat":1},{"version":"46e4a36e8ddbdfb4e7330e11c81c970dc8b218611df9183d39c41c5f8c653b55","impliedFormat":1},{"version":"370bde134aa8c2abc926d0e99d3a4d5d5dba65c6ee65459137e4f02670cbf841","impliedFormat":1},{"version":"6332f565867cf4a740a70e30f31cefba37ef7cebcf74f22eab8d744fde6d193e","impliedFormat":1},{"version":"2977b7884aedc895a1d0c9c210c7cf3272c29d6959a08a6fa3ff71e0aff08175","impliedFormat":1},{"version":"17f2922d41ddd032830a91371c948cd9ce903b35c95adca72271a54584f19b0b","impliedFormat":1},{"version":"3eed76ede2a1a14d7c9bb0a642041282dcc264811139d3dd275c9fe14efc9840","impliedFormat":1},{"version":"e3cf0611709328b449ec13f8c436712d62003620ce480139fae46ce001c2ee9f","impliedFormat":1},{"version":"8d369483f0c2b9ee388129cfdb6a43bc8112b377e86a41884bd06e19ce04f4c1","impliedFormat":99},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"bf6402a3cfff440801c3ea5835f08784aac18087016534b48741adbcee931921","impliedFormat":1},{"version":"71b110829b8f5e7653352a132544ece2b9a10e93ba1c77453187673bd46f13ee","impliedFormat":1},{"version":"7c0ace9de3109ecdd8ad808dd40a052b82681786c66bb0bff6d848c1fc56a7c4","impliedFormat":1},{"version":"1223780c318ef42fd33ac772996335ed92d57cf7c0fc73178acab5e154971aab","impliedFormat":1},{"version":"0d04cbe88c8a25c2debd2eef03ec5674563e23ca9323fa82ede3577822653bd2","impliedFormat":1},{"version":"aaa70439f135c3fa0a34313de49e94cae3db954c8b8d6af0d56a46c998c2923f","impliedFormat":1},{"version":"4ace083580c1b77eb8ddf4ea915cde605af1a96e426c4c04b897feef1acdb534","impliedFormat":1},{"version":"daf07c1ca8ccfb21ad958833546a4f414c418fe096dcebdbb90b02e12aa5c3a2","impliedFormat":1},{"version":"89ac5224feeb2de76fc52fc2a91c5f6448a98dbe4e8d726ecb1730fa64cd2d30","impliedFormat":1},{"version":"7feb39ba69b3fc6d55faca4f91f06d77d15ffedd3931b0ef7740e8b6fd488b15","impliedFormat":1},{"version":"acf00cfabe8c4de18bea655754ea39c4d04140257556bbf283255b695d00e36f","impliedFormat":1},{"version":"39b70d5f131fcfdeba404ee63aba25f26d8376a73bacd8275fb5a9f06219ac77","impliedFormat":1},{"version":"cdae26c737cf4534eeec210e42eab2d5f0c3855240d8dde3be4aee9194e4e781","impliedFormat":1},{"version":"5aa0c50083d0d9a423a46afaef78c7f42420759cfa038ad40e8b9e6cafc38831","impliedFormat":1},{"version":"10d6a49a99a593678ba4ea6073d53d005adfc383df24a9e93f86bf47de6ed857","impliedFormat":1},{"version":"1b7ea32849a7982047c2e5d372300a4c92338683864c9ab0f5bbd1acadae83a3","impliedFormat":1},{"version":"224083e6fcec1d300229da3d1dafc678c642863996cbfed7290df20954435a55","impliedFormat":1},{"version":"4248ac3167b1a1ce199fda9307abc314b3132527aeb94ec30dbcfe4c6a417b1b","impliedFormat":1},{"version":"633cb8c2c51c550a63bda0e3dec0ad5fa1346d1682111917ad4bc7005d496d8c","impliedFormat":1},{"version":"ca055d26105248f745ea6259b4c498ebeed18c9b772e7f2b3a16f50226ff9078","impliedFormat":1},{"version":"ea6b2badb951d6dfa24bb7d7eb733327e5f9a15fc994d6dc1c54b2c7a83b6a0b","impliedFormat":1},{"version":"03fdf8dba650d830388b9985750d770dd435f95634717f41cea814863a9ac98b","impliedFormat":1},{"version":"6fd08e3ef1568cd0dc735c9015f6765e25143a4a0331d004a29c51b50eec402a","impliedFormat":1},{"version":"2e988cd4d24edac4936449630581c79686c8adac10357eb0cdb410c24f47c7f0","impliedFormat":1},{"version":"b813f62a37886ed986b0f6f8c5bf323b3fcae32c1952b71d75741e74ea9353cf","impliedFormat":1},{"version":"44a1a722038365972b1b52841e1132785bf5d75839dbc6cc1339f2d36f8507a1","impliedFormat":1},{"version":"83fe1053701101ac6d25364696fea50d2ceb2f81d1456bc11e682a20aaeac52e","impliedFormat":1},{"version":"4f228cb2089a5a135a1a8cefe612d5aebcef8258f7dbe3b7c4dad4e26a81ec08","impliedFormat":1},{"version":"7870becb94cbc11d2d01b77c4422589adcba4d8e59f726246d40cd0d129784d8","affectsGlobalScope":true,"impliedFormat":1},{"version":"f70b8328a15ca1d10b1436b691e134a49bc30dcf3183a69bfaa7ba77e1b78ecd","impliedFormat":1},{"version":"d9030fc0c412a31e7e13d189b9ad032b5177c20217add0f24fd3fff0cf272882","impliedFormat":99},{"version":"2be2227c3810dfd84e46674fd33b8d09a4a28ad9cb633ed536effd411665ea1e","impliedFormat":99},{"version":"7f9c8c4fd31e6e0f137ded52f026f97934abcc4624db1c9c8120b91a170798e0","impliedFormat":1},{"version":"957a44f864ab3c182edc747428e8eec1765257deee7fac86c1147eeac897d832","impliedFormat":1},{"version":"3feec212c0aeb91e5a6e62caaf9f128954590210f8c302910ea377c088f6b61a","impliedFormat":99},{"version":"d27eadfc7a0c340fbbb62294e70eb5cf27751e1dcf47ee688ca38dd64d15502c","impliedFormat":99},{"version":"86d818ada2f5f0cfffca153af94205b67ba50f8e36524a413d66652f34ef19af","impliedFormat":99},{"version":"40afd49a15d0bafef682b42664ff21c274e02dcc60052f2df85dd53c70d9394f","impliedFormat":99},{"version":"5a5b1dd91662e93efae28d985e0e44d10f6a7e3c2c2ae8abc29bcfc406cb5310","impliedFormat":99},{"version":"66d0a61b3b0df6c9c2eb09dbe26e3c2aef71d9043fed17cd56de6669cb706325","impliedFormat":99},{"version":"f6692c3a1847d846bc4b7a690ef2ba096b2ca56bea5818f073eb8193ce33b5e1","impliedFormat":99},{"version":"1e4d27cf43aa16d164e958a220fee3c225b9dd146b1912cbc12083263f157ca9","impliedFormat":99},{"version":"a46147f499d4246998d1e44b43beecd2ee04c0a330c35863eaeccc827a737fdf","impliedFormat":1},{"version":"390140c96dcaf0831d24b5408d19af017e3a8f150fed140791d976ac20dd2da7","impliedFormat":99},{"version":"886c87489e99cbe6af5b1d83f147b04f96a2ae499d4302de7f9e4478cb93ccca","impliedFormat":99},{"version":"13e7c1f8ddda39d034935e667f3a314ec8b89b8be18fbd4cd987ea4312b4221f","impliedFormat":99},{"version":"370a3bbb8117e32fd7ae37d318e28cf63251013fe015c5dd382599614a3d5d59","impliedFormat":99},{"version":"daf09fb2571ee9e9251b08237852ed26b67257cb7997358935608f63f9fd2ecb","impliedFormat":99},{"version":"768fd34f23de8dc5f5df6cd45f044bb4193105b5964e4ef734dbfc1a1f8e6223","impliedFormat":1},{"version":"dc18b19797fbc286f2bd51e14eca66fb46bd07c0c567cb40fc04e6e805533850","impliedFormat":99},{"version":"5903ab9ed38b4d4f878e507f76020f75b7fc2285515ebdb7596393ce196eee2f","impliedFormat":99},{"version":"58395463e3fd8b466d5801cd73027f82bbf12e3d90cb4b27538e61ee9ff3427c","impliedFormat":99},{"version":"4d4804f5da06e47254d253a07e82d400c55964ea097016753dbd4372ce0eaab0","impliedFormat":99},{"version":"cf76eeea2b4ec3fe26520cd129cfc32352d1ddb22b6d4ff0c6a709656a4b1b37","impliedFormat":1},{"version":"fea0cb28540b473977c722853998d39d28575fa12e31b3371fcf1f324e3a9fb7","impliedFormat":1},{"version":"ee4ee9bf6c6d276343e7f0bce3a5374800eb4ec6b2d7c70fab6ae3ef840d9777","impliedFormat":1},{"version":"571ba264349552a1111ac0d6a5ed580a41c390aac43a70546c3a7374c77faa71","impliedFormat":1},"06f5c2408e959ccebcbef2989bce4a528a531aeddb4f3c7fb2324c03a00b9b19"],"root":[89,107,[124,146],[1401,1421],[1425,1437],[1445,1448],1450,1451,[1453,1469],[1544,1546],1548,1549,[1564,1610],[2074,2079],2082,[2098,2102],[2184,2209],2224,2225,2227,2228,2237,2238,[2241,2457],2646],"options":{"allowImportingTsExtensions":true,"composite":true,"esModuleInterop":true,"jsx":1,"jsxImportSource":"vue","module":99,"noImplicitThis":true,"skipLibCheck":true,"strict":true,"target":99,"useDefineForClassFields":true,"verbatimModuleSyntax":true},"referencedMap":[[2455,1],[2454,2],[89,3],[92,4],[91,5],[1035,6],[1029,5],[1033,6],[1032,7],[1028,6],[1027,5],[1036,8],[1034,7],[1030,7],[1031,7],[166,9],[167,9],[168,9],[169,9],[170,9],[171,9],[172,9],[173,9],[174,9],[175,9],[176,9],[177,9],[178,9],[179,9],[180,9],[181,9],[182,9],[183,9],[184,9],[185,9],[186,9],[187,9],[188,9],[189,9],[190,9],[191,9],[192,9],[193,9],[194,9],[195,9],[196,9],[197,9],[198,9],[199,9],[200,9],[201,9],[202,9],[203,9],[204,9],[205,9],[206,9],[207,9],[208,9],[209,9],[210,9],[211,9],[212,9],[213,9],[214,9],[215,9],[216,9],[217,9],[218,9],[219,9],[220,9],[221,9],[222,9],[223,9],[224,9],[225,9],[226,9],[227,9],[228,9],[229,9],[230,9],[231,9],[232,9],[233,9],[234,9],[235,9],[236,9],[237,9],[238,9],[239,9],[240,9],[241,9],[242,9],[243,9],[244,9],[245,9],[246,9],[247,9],[248,9],[249,9],[250,9],[251,9],[252,9],[253,9],[254,9],[255,9],[256,9],[257,9],[258,9],[259,9],[260,9],[261,9],[262,9],[263,9],[264,9],[265,9],[266,9],[267,9],[268,9],[269,9],[270,9],[271,9],[272,9],[273,9],[274,9],[275,9],[276,9],[277,9],[278,9],[279,9],[280,9],[281,9],[282,9],[283,9],[284,9],[285,9],[286,9],[287,9],[288,9],[289,9],[290,9],[291,9],[292,9],[293,9],[294,9],[295,9],[296,9],[297,9],[298,9],[299,9],[300,9],[301,9],[302,9],[303,9],[304,9],[305,9],[306,9],[307,9],[459,10],[308,9],[309,9],[310,9],[311,9],[312,9],[313,9],[314,9],[315,9],[316,9],[317,9],[318,9],[319,9],[320,9],[321,9],[322,9],[323,9],[324,9],[325,9],[326,9],[327,9],[328,9],[329,9],[330,9],[331,9],[332,9],[333,9],[334,9],[335,9],[336,9],[337,9],[338,9],[339,9],[340,9],[341,9],[342,9],[343,9],[344,9],[345,9],[346,9],[347,9],[348,9],[349,9],[350,9],[351,9],[352,9],[353,9],[354,9],[355,9],[356,9],[357,9],[358,9],[359,9],[360,9],[361,9],[362,9],[363,9],[364,9],[365,9],[366,9],[367,9],[368,9],[369,9],[370,9],[371,9],[372,9],[373,9],[374,9],[375,9],[376,9],[377,9],[378,9],[379,9],[380,9],[381,9],[382,9],[383,9],[384,9],[385,9],[386,9],[387,9],[388,9],[389,9],[390,9],[391,9],[392,9],[393,9],[394,9],[395,9],[396,9],[397,9],[398,9],[399,9],[400,9],[401,9],[402,9],[403,9],[404,9],[405,9],[406,9],[407,9],[408,9],[409,9],[410,9],[411,9],[412,9],[413,9],[414,9],[415,9],[416,9],[417,9],[418,9],[419,9],[420,9],[421,9],[422,9],[423,9],[424,9],[425,9],[426,9],[427,9],[428,9],[429,9],[430,9],[431,9],[432,9],[433,9],[434,9],[435,9],[436,9],[437,9],[438,9],[439,9],[440,9],[441,9],[442,9],[443,9],[444,9],[445,9],[446,9],[447,9],[448,9],[449,9],[450,9],[451,9],[452,9],[453,9],[454,9],[455,9],[456,9],[457,9],[458,9],[460,11],[986,12],[988,13],[985,5],[987,5],[2239,9],[1929,14],[1925,15],[1912,5],[1928,16],[1921,17],[1919,18],[1918,18],[1917,17],[1914,18],[1915,17],[1923,19],[1916,18],[1913,17],[1920,18],[1926,20],[1927,21],[1922,22],[1924,18],[826,23],[822,24],[809,5],[825,25],[818,26],[816,27],[815,27],[814,26],[811,27],[812,26],[820,28],[813,27],[810,26],[817,27],[823,29],[824,30],[819,31],[821,27],[2096,32],[2093,33],[2092,34],[2083,5],[2084,5],[2086,35],[2085,5],[2095,36],[2087,34],[2088,37],[2091,38],[2089,5],[2090,34],[2094,5],[1637,39],[1611,9],[1612,40],[1613,9],[1614,9],[1615,41],[2015,42],[1633,5],[1636,5],[1634,43],[1989,44],[1988,45],[1987,5],[1971,46],[1970,9],[1973,47],[1974,48],[1972,49],[1976,50],[1975,5],[1979,51],[1980,52],[1978,51],[1977,5],[2009,53],[2008,9],[1981,9],[2011,54],[1991,55],[1990,9],[1982,5],[1984,56],[1983,5],[1986,57],[1985,49],[1993,9],[2007,58],[2006,59],[2005,9],[1992,9],[1996,9],[2000,60],[1998,61],[1999,9],[1997,9],[1995,62],[1994,5],[2002,63],[2001,5],[2004,64],[2003,9],[1953,5],[2013,65],[2012,9],[2014,66],[1962,67],[1961,68],[1960,69],[1966,70],[1963,9],[1964,71],[1965,71],[1967,72],[1968,73],[1959,74],[1969,75],[2010,5],[1823,76],[1758,77],[1759,78],[1760,79],[1761,80],[1762,81],[1763,82],[1764,83],[1765,84],[1766,85],[1767,86],[1768,87],[1769,88],[1770,89],[1771,90],[1772,91],[1773,92],[1813,93],[1774,94],[1775,95],[1776,96],[1777,97],[1778,98],[1779,99],[1780,100],[1781,101],[1782,102],[1783,103],[1784,104],[1785,105],[1786,106],[1787,107],[1788,108],[1789,109],[1790,110],[1791,111],[1792,112],[1793,113],[1794,114],[1795,115],[1796,116],[1797,117],[1798,118],[1799,119],[1800,120],[1801,121],[1802,122],[1803,123],[1804,124],[1805,125],[1806,126],[1807,127],[1808,128],[1809,129],[1810,130],[1811,131],[1812,132],[1822,133],[1747,5],[1753,134],[1755,135],[1757,136],[1814,137],[1815,136],[1816,136],[1817,138],[1821,139],[1818,136],[1819,136],[1820,136],[1824,140],[1825,141],[1826,142],[1827,142],[1828,143],[1829,142],[1830,142],[1831,144],[1832,142],[1833,145],[1834,145],[1835,145],[1836,146],[1837,145],[1838,147],[1839,142],[1840,145],[1841,143],[1842,146],[1843,142],[1844,142],[1845,143],[1846,146],[1847,146],[1848,143],[1849,142],[1850,148],[1851,149],[1852,143],[1853,143],[1854,145],[1855,142],[1856,142],[1857,143],[1858,142],[1875,150],[1859,142],[1860,141],[1861,141],[1862,141],[1863,145],[1864,145],[1865,146],[1866,146],[1867,143],[1868,141],[1869,141],[1870,151],[1871,152],[1872,142],[1873,141],[1874,153],[1911,154],[1749,76],[1881,155],[1876,156],[1877,156],[1878,156],[1879,157],[1880,158],[1752,159],[1751,159],[1756,148],[1882,160],[1750,76],[1886,161],[1883,162],[1884,162],[1885,163],[1887,141],[1754,164],[1888,145],[1889,146],[1890,5],[1891,5],[1892,5],[1893,5],[1894,5],[1895,5],[1910,165],[1896,5],[1897,5],[1898,5],[1899,5],[1900,5],[1901,5],[1902,5],[1903,5],[1904,5],[1905,5],[1906,5],[1907,5],[1908,5],[1909,5],[1931,166],[1932,167],[1933,168],[1937,166],[1938,169],[1939,170],[1745,171],[1744,172],[1748,173],[1746,174],[1934,175],[1935,176],[1936,177],[1940,178],[1946,179],[1941,9],[1942,9],[1943,180],[1944,181],[1945,180],[2223,182],[2220,183],[2219,184],[2210,5],[2211,5],[2213,185],[2212,5],[2222,186],[2214,184],[2215,187],[2218,188],[2216,5],[2217,184],[2221,5],[2562,5],[2146,5],[471,189],[472,189],[473,189],[474,189],[475,189],[476,189],[477,189],[478,189],[479,189],[480,189],[481,189],[482,189],[483,189],[484,189],[485,189],[486,189],[487,189],[488,189],[489,189],[490,189],[491,189],[492,189],[493,189],[494,189],[495,189],[496,189],[497,189],[498,189],[499,189],[500,189],[501,189],[502,189],[503,189],[504,189],[505,189],[506,189],[507,189],[508,189],[509,189],[510,189],[511,189],[512,189],[513,189],[514,189],[515,189],[516,189],[517,189],[518,189],[519,189],[520,189],[521,189],[522,189],[523,189],[524,189],[525,189],[526,189],[527,189],[528,189],[529,189],[530,189],[531,189],[532,189],[533,189],[534,189],[535,189],[536,189],[537,189],[538,189],[539,189],[540,189],[541,189],[542,189],[543,189],[544,189],[545,189],[546,189],[547,189],[548,189],[549,189],[550,189],[551,189],[552,189],[553,189],[554,189],[555,189],[556,189],[557,189],[558,189],[559,189],[560,189],[561,189],[562,189],[563,189],[564,189],[565,189],[566,189],[567,189],[775,190],[568,189],[569,189],[570,189],[571,189],[572,189],[573,189],[574,189],[575,189],[576,189],[577,189],[578,189],[579,189],[580,189],[581,189],[582,189],[583,189],[584,189],[585,189],[586,189],[587,189],[588,189],[589,189],[590,189],[591,189],[592,189],[593,189],[594,189],[595,189],[596,189],[597,189],[598,189],[599,189],[600,189],[601,189],[602,189],[603,189],[604,189],[605,189],[606,189],[607,189],[608,189],[609,189],[610,189],[611,189],[612,189],[613,189],[614,189],[615,189],[616,189],[617,189],[618,189],[619,189],[620,189],[621,189],[622,189],[623,189],[624,189],[625,189],[626,189],[627,189],[628,189],[629,189],[630,189],[631,189],[632,189],[633,189],[634,189],[635,189],[636,189],[637,189],[638,189],[639,189],[640,189],[641,189],[642,189],[643,189],[644,189],[645,189],[646,189],[647,189],[648,189],[649,189],[650,189],[651,189],[652,189],[653,189],[654,189],[655,189],[656,189],[657,189],[658,189],[659,189],[660,189],[661,189],[662,189],[663,189],[664,189],[665,189],[666,189],[667,189],[668,189],[669,189],[670,189],[671,189],[672,189],[673,189],[674,189],[675,189],[676,189],[677,189],[678,189],[679,189],[680,189],[681,189],[682,189],[683,189],[684,189],[685,189],[686,189],[687,189],[688,189],[689,189],[690,189],[691,189],[692,189],[693,189],[694,189],[695,189],[696,189],[697,189],[698,189],[699,189],[700,189],[701,189],[702,189],[703,189],[704,189],[705,189],[706,189],[707,189],[708,189],[709,189],[710,189],[711,189],[712,189],[713,189],[714,189],[715,189],[716,189],[717,189],[718,189],[719,189],[720,189],[721,189],[722,189],[723,189],[724,189],[725,189],[726,189],[727,189],[728,189],[729,189],[730,189],[731,189],[732,189],[733,189],[734,189],[735,189],[736,189],[737,189],[738,189],[739,189],[740,189],[741,189],[742,189],[743,189],[744,189],[745,189],[746,189],[747,189],[748,189],[749,189],[750,189],[751,189],[752,189],[753,189],[754,189],[755,189],[756,189],[757,189],[758,189],[759,189],[760,189],[761,189],[762,189],[763,189],[764,189],[765,189],[766,189],[767,189],[768,189],[769,189],[770,189],[771,189],[772,189],[773,189],[774,189],[470,191],[2508,192],[2509,192],[2510,193],[2463,194],[2511,195],[2512,196],[2513,197],[2458,5],[2461,198],[2459,5],[2460,5],[2514,199],[2515,200],[2516,201],[2517,202],[2518,203],[2519,204],[2520,204],[2521,205],[2522,206],[2523,207],[2524,208],[2464,5],[2462,5],[2525,209],[2526,210],[2527,211],[2561,212],[2528,213],[2529,5],[2530,214],[2531,215],[2532,216],[2533,217],[2534,218],[2535,219],[2536,220],[2537,221],[2538,222],[2539,222],[2540,223],[2541,5],[2542,224],[2543,225],[2545,226],[2544,227],[2546,228],[2547,229],[2548,230],[2549,231],[2550,232],[2551,233],[2552,234],[2553,235],[2554,236],[2555,237],[2556,238],[2557,239],[2558,240],[2465,5],[2466,5],[2467,5],[2505,241],[2506,5],[2507,5],[2559,242],[2560,243],[2643,244],[2172,245],[2171,245],[2627,246],[2624,247],[2626,248],[2625,249],[93,250],[94,251],[2622,252],[95,253],[96,254],[98,255],[90,5],[779,256],[105,257],[778,9],[104,9],[2150,258],[2164,259],[2165,260],[2166,261],[2170,262],[2151,263],[2177,264],[2178,265],[2169,266],[2155,267],[2159,268],[2149,269],[2157,270],[2158,271],[2156,266],[2154,269],[2152,272],[2168,273],[2153,274],[2174,275],[2175,276],[2173,277],[2148,278],[2167,5],[2179,279],[2181,280],[2182,281],[2107,5],[2105,5],[2106,3],[2103,5],[2180,5],[2104,5],[1145,282],[1144,5],[110,5],[1452,5],[97,5],[869,5],[868,283],[867,5],[2147,5],[2230,284],[2232,285],[1441,286],[2234,287],[1443,288],[2236,289],[2229,290],[2231,290],[1440,290],[1442,5],[2233,290],[2235,290],[1439,5],[795,291],[794,292],[793,293],[799,294],[796,295],[797,296],[798,297],[804,298],[802,9],[803,299],[801,300],[800,301],[1392,302],[1391,303],[1390,304],[843,305],[839,306],[841,307],[833,308],[840,309],[834,310],[842,311],[847,312],[844,9],[845,313],[846,314],[851,315],[848,316],[849,317],[850,318],[858,319],[853,320],[856,321],[852,295],[855,322],[854,322],[857,323],[865,324],[862,325],[863,326],[859,327],[861,328],[860,329],[864,330],[874,331],[866,316],[870,332],[871,333],[872,334],[873,335],[878,336],[875,316],[876,337],[877,338],[885,339],[880,316],[883,340],[879,316],[882,341],[881,340],[884,342],[892,343],[889,344],[890,345],[891,346],[888,347],[887,348],[886,349],[1004,350],[1001,351],[1002,352],[1003,353],[1007,354],[1006,355],[1005,356],[1014,357],[1013,358],[1011,359],[1010,360],[1009,361],[1008,358],[1012,362],[1017,363],[1016,364],[1015,365],[1026,366],[1025,9],[1024,367],[1019,368],[1022,369],[1018,370],[1021,371],[1020,371],[1023,372],[1040,373],[1039,374],[1038,375],[1037,376],[1050,377],[1049,378],[1048,379],[1090,380],[1086,381],[1087,382],[1088,383],[1089,384],[1096,385],[1092,9],[1091,9],[1093,9],[1094,9],[1095,9],[1099,386],[1098,387],[1097,388],[1113,389],[1108,390],[1111,391],[1112,392],[1110,393],[1109,394],[1117,395],[1115,396],[1116,397],[1114,398],[1121,399],[1120,316],[1119,400],[1118,401],[1056,402],[1055,390],[1051,403],[1053,404],[1052,405],[1054,405],[1124,406],[1123,407],[1122,408],[1127,409],[1126,410],[1125,411],[1137,412],[1135,413],[1136,9],[1131,414],[1132,415],[1133,416],[1134,417],[1141,418],[1138,316],[1139,419],[1140,420],[1154,421],[1148,422],[1147,423],[1152,424],[1143,425],[1151,426],[1153,427],[1149,428],[1150,422],[1146,429],[1142,430],[1130,431],[1129,432],[1128,433],[1157,434],[1156,435],[1155,436],[1160,437],[1159,438],[1158,439],[1393,440],[1374,441],[1373,9],[1163,442],[1162,443],[1161,444],[1167,445],[1164,446],[1165,447],[1166,448],[808,449],[805,450],[806,451],[807,452],[1062,453],[1061,454],[1060,455],[1379,456],[1378,457],[1376,458],[1377,457],[1375,459],[1366,460],[1363,461],[1365,462],[1364,463],[1362,5],[1177,464],[1175,465],[1171,9],[1174,466],[1170,467],[1173,468],[1168,469],[1172,316],[1176,5],[1169,470],[1382,471],[1380,472],[1381,473],[1059,474],[1058,475],[1057,476],[1385,477],[1384,478],[1383,479],[1179,480],[1178,481],[1182,482],[1181,483],[1180,484],[1185,485],[1184,9],[1183,316],[1188,486],[1187,487],[1186,488],[1389,489],[1388,9],[1387,490],[1386,491],[838,492],[835,493],[830,9],[827,494],[837,495],[836,496],[829,497],[828,498],[832,499],[831,500],[1191,501],[1190,502],[1189,503],[1199,504],[1198,505],[1195,506],[1194,507],[1197,508],[1196,505],[1193,509],[1192,510],[1202,511],[1201,512],[1200,513],[1205,514],[1204,515],[1203,516],[1209,517],[1208,9],[1207,518],[1206,519],[1076,520],[1075,9],[1071,521],[1070,522],[1073,523],[1072,524],[1074,524],[1361,525],[1360,526],[1359,527],[1358,5],[1234,528],[1225,529],[1221,530],[1219,5],[1224,531],[1222,532],[1223,533],[1233,534],[1232,9],[1226,316],[1231,535],[1229,536],[1228,537],[1230,538],[1227,539],[1239,540],[1238,541],[1237,542],[1236,543],[1235,544],[1245,545],[1243,546],[1244,547],[1241,316],[1242,548],[1240,549],[1249,550],[1247,9],[1246,551],[1248,552],[1372,553],[1371,554],[1370,555],[1369,556],[1368,557],[1367,9],[1252,558],[1251,559],[1250,560],[1258,561],[1256,562],[1255,563],[1254,564],[1253,565],[1257,5],[1261,566],[1260,567],[1259,568],[1294,569],[1284,9],[1273,570],[1264,571],[1293,572],[1274,573],[1281,574],[1276,575],[1271,576],[1279,577],[1282,578],[1272,579],[1280,580],[1290,581],[1289,582],[1278,583],[1287,584],[1286,585],[1269,586],[1288,587],[1262,5],[1266,588],[1275,589],[1270,590],[1277,570],[1285,5],[1292,591],[1265,592],[1268,593],[1283,594],[1267,595],[1263,596],[1291,597],[1085,598],[1081,599],[1064,600],[1063,601],[1079,602],[1069,602],[1083,603],[1080,604],[1065,605],[1066,606],[1082,607],[1067,608],[1084,609],[1068,610],[1302,611],[1301,612],[1298,613],[1297,614],[1299,615],[1296,616],[1295,617],[1300,618],[1000,619],[999,620],[998,621],[1305,622],[1303,623],[1304,624],[1107,625],[1101,626],[1100,627],[1104,628],[1105,629],[1102,630],[1106,631],[1103,632],[1308,633],[1307,634],[1306,635],[1313,636],[1311,637],[1310,638],[1309,316],[1312,639],[1047,640],[1046,641],[1043,642],[1042,643],[1045,644],[1044,645],[1041,646],[1357,647],[1351,648],[1355,649],[1356,650],[1354,651],[1353,652],[1352,653],[1319,654],[1316,655],[1314,656],[1318,657],[1317,656],[1331,658],[1329,659],[1330,660],[1336,661],[1335,662],[1334,663],[1333,664],[1332,665],[1328,666],[1326,667],[1323,668],[1322,669],[1320,670],[1327,5],[1324,671],[1321,672],[1325,673],[1347,674],[1337,675],[1346,9],[1341,676],[1340,677],[1345,678],[1344,679],[1343,680],[1342,681],[1339,682],[1338,683],[1220,684],[1217,685],[1218,686],[1213,687],[1214,688],[1212,688],[1210,5],[1216,9],[1215,687],[1211,689],[1350,690],[1349,691],[1348,692],[147,5],[152,5],[148,5],[149,5],[153,5],[150,5],[151,5],[1394,693],[1395,9],[1398,694],[1078,695],[1396,9],[1397,9],[997,696],[996,9],[893,9],[894,9],[994,9],[990,9],[982,316],[895,697],[896,9],[995,316],[979,5],[989,698],[993,459],[897,9],[983,9],[978,459],[981,9],[965,699],[967,700],[968,9],[969,316],[966,9],[991,9],[980,9],[972,494],[970,9],[971,9],[973,5],[992,623],[974,9],[975,9],[976,5],[977,5],[984,9],[1400,701],[964,702],[899,5],[900,5],[901,5],[902,5],[903,5],[904,5],[905,5],[906,5],[907,5],[908,5],[909,5],[910,5],[898,5],[911,5],[912,5],[913,5],[914,5],[915,5],[916,5],[917,5],[918,5],[919,5],[920,5],[921,5],[922,5],[923,5],[924,5],[925,5],[926,5],[927,5],[928,5],[929,5],[930,5],[931,5],[932,5],[933,5],[934,5],[935,5],[936,5],[937,5],[938,5],[939,5],[940,5],[941,5],[942,5],[943,5],[944,5],[945,5],[946,5],[947,5],[948,5],[949,5],[950,5],[951,5],[952,5],[953,5],[954,5],[955,5],[956,5],[957,5],[958,5],[959,5],[960,5],[106,5],[962,5],[963,5],[961,5],[1399,703],[777,704],[780,697],[158,5],[163,5],[159,5],[164,705],[160,5],[161,5],[162,9],[790,5],[781,5],[782,253],[783,5],[792,706],[791,5],[784,707],[785,5],[786,5],[787,253],[789,5],[788,253],[154,708],[165,5],[461,709],[469,710],[463,711],[468,712],[156,713],[157,714],[155,5],[464,9],[465,715],[462,9],[466,716],[467,9],[2567,5],[2240,717],[1449,5],[1471,718],[1472,719],[1470,5],[1526,720],[1478,721],[1480,722],[1473,718],[1527,723],[1479,724],[1484,725],[1485,724],[1486,726],[1487,724],[1488,727],[1489,726],[1490,724],[1491,724],[1523,728],[1518,729],[1519,724],[1520,724],[1492,724],[1493,724],[1521,724],[1494,724],[1514,724],[1517,724],[1516,724],[1515,724],[1495,724],[1496,724],[1497,725],[1498,724],[1499,724],[1512,724],[1501,724],[1500,724],[1524,724],[1503,724],[1522,724],[1502,724],[1513,724],[1505,728],[1506,724],[1508,726],[1507,724],[1509,724],[1525,724],[1510,724],[1511,724],[1476,730],[1475,5],[1481,731],[1483,732],[1477,5],[1482,733],[1504,733],[1474,734],[1529,735],[1536,736],[1537,736],[1539,737],[1538,736],[1528,738],[1542,739],[1531,740],[1533,741],[1541,742],[1534,743],[1532,744],[1540,745],[1535,746],[1530,747],[2176,5],[1958,748],[1957,749],[1954,5],[1955,750],[1956,751],[2595,5],[2631,5],[1543,5],[776,752],[2620,5],[2628,5],[1077,5],[1739,5],[109,753],[2584,754],[2582,755],[2583,756],[2571,757],[2572,755],[2579,758],[2570,759],[2575,760],[2585,5],[2576,761],[2581,762],[2587,763],[2586,764],[2569,765],[2577,766],[2578,767],[2573,768],[2580,754],[2574,769],[1740,770],[1743,771],[1741,171],[1742,772],[2564,773],[2563,774],[2608,775],[2589,5],[2609,776],[2591,777],[2616,778],[2610,5],[2612,779],[2613,779],[2614,780],[2611,5],[2615,781],[2594,782],[2592,5],[2593,783],[2607,784],[2590,5],[2605,785],[2596,786],[2597,787],[2598,787],[2599,786],[2606,788],[2600,787],[2601,785],[2602,786],[2603,787],[2604,786],[2161,789],[2160,790],[2163,791],[2162,792],[2108,790],[2127,793],[2120,5],[2111,794],[2109,790],[2112,790],[2110,795],[2113,790],[2115,790],[2114,790],[2117,790],[2116,790],[2119,790],[2118,790],[2121,796],[2122,790],[2126,797],[2123,798],[2124,790],[2125,790],[2143,799],[2129,799],[2137,799],[2128,5],[2145,800],[2139,801],[2141,5],[2144,802],[2132,803],[2133,803],[2135,803],[2131,804],[2138,805],[2134,803],[2130,803],[2140,799],[2142,806],[2136,807],[2568,5],[2632,808],[1930,809],[1563,810],[1550,5],[1560,5],[1556,5],[1557,5],[1551,5],[1561,5],[1562,5],[1559,5],[1555,5],[1554,5],[1558,811],[1552,5],[1553,5],[1624,812],[1623,9],[1669,9],[1618,9],[1619,5],[1620,813],[1688,9],[1689,814],[1690,9],[1692,815],[1691,9],[1625,9],[1693,9],[1694,9],[1722,816],[1723,817],[1718,9],[1695,818],[1696,818],[1698,819],[1697,820],[1699,9],[1700,818],[1724,9],[1726,821],[1702,822],[1701,9],[1713,9],[1714,818],[1715,818],[1716,818],[1727,816],[1703,9],[1631,823],[1628,9],[1629,824],[1630,5],[1622,825],[1621,5],[1670,9],[1717,9],[1725,826],[1641,827],[1639,828],[1640,829],[1668,830],[1720,5],[1721,831],[1706,832],[1673,833],[1674,834],[1675,820],[1676,835],[1728,9],[1729,836],[1677,820],[1678,837],[1679,838],[1730,820],[1731,839],[1732,840],[1733,841],[1666,842],[1667,843],[1707,820],[1708,844],[1734,845],[1735,846],[1647,9],[1680,820],[1682,847],[1681,820],[1683,848],[1685,849],[1617,850],[1737,851],[1736,852],[1948,853],[1947,854],[1738,5],[1950,855],[1949,826],[1709,856],[1710,857],[1627,858],[1626,9],[1687,859],[1686,820],[1712,860],[1711,861],[1951,862],[1952,863],[1632,864],[1672,865],[1671,866],[1704,867],[1719,868],[1705,5],[1653,830],[1659,5],[1658,869],[1662,5],[1646,5],[1648,845],[1656,870],[1657,5],[1644,871],[1645,872],[1635,5],[1642,873],[1665,874],[1650,875],[1616,5],[1638,876],[1655,5],[1661,877],[1660,9],[1643,826],[1654,878],[1651,5],[1649,5],[1664,879],[1652,830],[1663,5],[1684,5],[80,5],[81,5],[15,5],[13,5],[14,5],[19,5],[18,5],[2,5],[20,5],[21,5],[22,5],[23,5],[24,5],[25,5],[26,5],[27,5],[3,5],[28,5],[29,5],[4,5],[30,5],[34,5],[31,5],[32,5],[33,5],[35,5],[36,5],[37,5],[5,5],[38,5],[39,5],[40,5],[41,5],[6,5],[45,5],[42,5],[43,5],[44,5],[46,5],[7,5],[47,5],[52,5],[53,5],[48,5],[49,5],[50,5],[51,5],[8,5],[57,5],[54,5],[55,5],[56,5],[58,5],[9,5],[59,5],[60,5],[61,5],[63,5],[62,5],[64,5],[65,5],[10,5],[66,5],[67,5],[68,5],[11,5],[69,5],[70,5],[71,5],[72,5],[73,5],[1,5],[74,5],[75,5],[12,5],[78,5],[77,5],[82,5],[76,5],[79,5],[17,5],[16,5],[2621,5],[2483,880],[2493,881],[2482,880],[2503,882],[2474,883],[2473,884],[2502,244],[2496,885],[2501,886],[2476,887],[2490,888],[2475,889],[2499,890],[2471,891],[2470,244],[2500,892],[2472,893],[2477,894],[2478,5],[2481,894],[2468,5],[2504,895],[2494,896],[2485,897],[2486,898],[2488,899],[2484,900],[2487,901],[2497,244],[2479,902],[2480,903],[2489,904],[2469,905],[2492,896],[2491,894],[2495,5],[2498,906],[2633,907],[2629,908],[2630,909],[2635,910],[2636,911],[2634,5],[2640,912],[2639,913],[2641,914],[2638,915],[2642,916],[2644,917],[2645,916],[88,918],[2619,919],[2566,920],[2565,921],[84,921],[83,5],[85,922],[86,5],[87,923],[2617,924],[2588,5],[2618,925],[2226,5],[1315,5],[1438,9],[108,9],[1444,926],[102,9],[103,927],[2623,249],[99,928],[100,929],[2183,9],[2637,5],[101,572],[2097,39],[2081,39],[2080,5],[2048,930],[2047,931],[2046,5],[2030,932],[2029,9],[2032,933],[2033,934],[2031,935],[2035,936],[2034,5],[2038,937],[2039,938],[2037,937],[2036,5],[2068,939],[2067,9],[2040,9],[2070,940],[2050,941],[2049,9],[2041,5],[2043,942],[2042,5],[2045,943],[2044,935],[2052,9],[2066,944],[2065,945],[2064,9],[2051,9],[2055,9],[2059,946],[2057,947],[2058,9],[2056,9],[2054,948],[2053,5],[2061,949],[2060,5],[2063,950],[2062,9],[2016,5],[2072,951],[2071,9],[2073,952],[2025,953],[2024,954],[2023,955],[2026,956],[2027,957],[2022,958],[2028,959],[2069,5],[2021,960],[2020,961],[2017,5],[2018,962],[2019,963],[112,964],[113,965],[111,966],[114,967],[115,968],[116,969],[117,970],[118,971],[119,972],[120,973],[121,974],[122,975],[123,976],[1424,5],[1423,977],[1422,5],[1547,978],[1577,979],[1595,979],[1585,979],[1586,979],[1596,979],[1597,979],[1435,979],[1598,979],[1579,979],[1587,979],[1427,979],[1425,979],[1431,979],[1453,980],[1588,979],[1548,979],[1467,979],[1589,979],[1434,979],[1599,979],[1600,979],[1461,979],[1601,979],[1602,979],[1603,979],[1590,979],[1591,979],[1592,979],[1593,979],[1604,979],[1605,979],[1606,979],[1607,979],[146,979],[1608,979],[1609,979],[1594,979],[1433,979],[1610,979],[127,981],[1581,982],[2075,983],[2076,984],[2098,985],[1580,986],[2099,987],[2100,988],[2101,989],[2102,988],[2190,990],[2191,991],[2192,988],[2193,992],[2195,993],[2196,994],[2194,995],[2197,996],[2199,997],[2200,998],[2198,999],[2203,1000],[2201,998],[2204,1001],[2202,998],[2206,1002],[2185,1003],[2186,1004],[2188,1005],[2189,1006],[2187,988],[1468,1007],[2207,1008],[2208,988],[2209,987],[2184,1009],[2074,1010],[1544,1011],[1455,1012],[2224,1013],[124,999],[134,999],[107,999],[128,999],[125,999],[126,999],[2225,1014],[2205,999],[1415,572],[143,1015],[1436,572],[139,1016],[2227,1017],[2228,1018],[1583,572],[2237,1019],[2238,1020],[2241,1021],[2243,1022],[2245,1023],[2246,572],[1416,1024],[140,1025],[141,1024],[142,987],[1403,1026],[144,1027],[145,1024],[1402,1028],[1404,1029],[137,1030],[138,1031],[1410,1032],[1405,1033],[1407,1034],[1408,1035],[1409,1036],[1411,1037],[1584,1038],[1582,1039],[2244,1016],[2247,1040],[1571,1041],[1570,1042],[2242,1043],[1578,1044],[130,1045],[136,1046],[133,1047],[132,1048],[1446,999],[131,999],[2077,999],[2078,999],[2248,999],[1469,999],[1566,572],[2249,999],[1401,1049],[2250,572],[1457,1050],[2082,999],[1454,1051],[1437,1052],[1574,1053],[1572,1054],[1576,1055],[1573,1056],[135,1057],[2079,999],[1406,1058],[129,999],[1575,999],[1419,999],[1420,1059],[1418,1060],[1417,1061],[2251,1062],[2252,1063],[2253,1064],[2254,1065],[2255,1066],[2256,1067],[2257,1068],[2258,1069],[2259,1070],[2260,1071],[2261,1072],[2267,1073],[2265,1074],[2264,1075],[2263,1076],[2266,1077],[2262,1078],[2269,1079],[2268,1080],[2270,1079],[2271,1079],[2272,1081],[2273,1082],[2274,1083],[2275,1084],[2276,1085],[2277,991],[2278,1084],[2279,1086],[2280,1087],[2281,1088],[2282,1089],[2286,1090],[1464,999],[1465,1091],[2283,1092],[2284,1093],[2285,1094],[2287,1095],[2288,1096],[2296,1097],[2292,1098],[2297,1099],[2290,988],[1429,1100],[2298,1101],[2291,1097],[2293,1102],[2294,1103],[2300,1104],[2301,1102],[2302,1105],[2299,1106],[2304,1107],[2305,1108],[2306,1109],[2303,999],[2308,1110],[2309,1111],[2310,1112],[2307,999],[1428,999],[2312,1113],[2313,1114],[2314,1115],[2311,999],[2316,1116],[2317,1117],[2318,1118],[2315,999],[2320,1119],[2321,1120],[2322,1121],[2319,999],[2324,1122],[2325,1123],[2326,1124],[2323,999],[2328,1125],[2329,988],[2330,1126],[2327,999],[2332,1127],[2333,1128],[2331,999],[2335,1129],[2336,988],[2337,1130],[2334,999],[2339,1131],[2340,1132],[2341,1133],[2338,999],[2343,1134],[2344,988],[2345,1135],[2342,999],[2346,1136],[2289,1137],[1430,1138],[2348,1139],[2347,987],[2349,1140],[2295,1141],[2351,1142],[2354,1143],[2352,1144],[2353,1145],[2350,1146],[2355,1147],[2356,1148],[1426,1149],[2357,1150],[2358,1147],[1414,1151],[1413,1151],[1412,1152],[2359,1153],[1432,1154],[2360,1155],[2361,1156],[2362,1157],[2370,1158],[2371,1159],[2363,1160],[2368,1161],[2365,1162],[2364,1163],[2366,1164],[2367,1165],[2369,1166],[2372,1167],[2373,1167],[2374,1168],[2375,1169],[2376,1170],[2377,1171],[2378,1172],[2379,1167],[2380,999],[2381,1173],[2382,1174],[2383,988],[2384,1175],[2385,1176],[2386,1177],[2387,1178],[2388,1179],[2389,1180],[2390,1181],[2391,1182],[2392,1183],[1462,1184],[2393,1185],[2394,1186],[2395,1187],[2396,1188],[2397,1189],[2398,1190],[2399,1191],[2400,1192],[2402,1193],[2401,5],[2403,1194],[2404,1195],[2405,1194],[2406,1196],[2407,1197],[2408,1198],[2409,1199],[2410,1200],[2411,1201],[2412,1202],[2413,1203],[2414,1204],[2415,1205],[2416,1206],[2417,1207],[2418,1208],[2419,1209],[2420,1210],[2421,1211],[2422,1212],[2423,1213],[2424,1214],[2425,1215],[2426,1216],[2427,1217],[2428,1218],[2432,1219],[2431,1220],[2434,1221],[2429,988],[2430,1222],[2433,1220],[2437,1223],[2435,1224],[2436,1225],[2438,1226],[1549,1227],[1460,1228],[1459,1229],[1564,1230],[2440,1231],[1456,1232],[1448,1233],[1447,1234],[1445,1235],[2441,1090],[2442,1090],[1458,1236],[1568,1237],[1567,1238],[1466,1239],[1451,1240],[1450,1241],[2443,1242],[1463,1090],[1546,1243],[1545,1244],[2439,1245],[1565,1246],[1569,1247],[2444,1248],[2445,988],[2446,1249],[2447,988],[2448,988],[2449,988],[2450,988],[2451,1250],[2452,1251],[1421,1252],[2453,1253],[2456,5],[2457,1254],[2646,1255]],"semanticDiagnosticsPerFile":[[1432,[{"start":1799,"length":4,"code":2322,"category":1,"messageText":{"messageText":"Type '\"\" | \"info\" | \"danger\"' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type '\"\"' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tag/src/tag.d.ts","start":414,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type '{ readonly type?: \"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined; readonly closable?: boolean | undefined; readonly disableTransitions?: boolean | undefined; ... 6 more ...; readonly onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & R...'","category":3,"code":6500}]},{"start":7767,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined'.","relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tag/src/tag.d.ts","start":414,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type '{ readonly type?: \"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined; readonly closable?: boolean | undefined; readonly disableTransitions?: boolean | undefined; ... 6 more ...; readonly onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & R...'","category":3,"code":6500}]}]],[1450,[{"start":4562,"length":16,"messageText":"Expected 0 arguments, but got 1.","category":1,"code":2554},{"start":4647,"length":12,"messageText":"Expected 0 arguments, but got 1.","category":1,"code":2554},{"start":4725,"length":9,"messageText":"Expected 0 arguments, but got 1.","category":1,"code":2554},{"start":4800,"length":9,"messageText":"Expected 0 arguments, but got 1.","category":1,"code":2554},{"start":5010,"length":19,"messageText":"Expected 0 arguments, but got 1.","category":1,"code":2554}]],[2076,[{"start":1300,"length":5,"messageText":"'attrs' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.","category":1,"code":7022}]],[2077,[{"start":10172,"length":13,"code":2339,"category":1,"messageText":"Property 'captureStream' does not exist on type 'HTMLVideoElement'."}]],[2190,[{"start":888,"length":28,"code":7016,"category":1,"messageText":{"messageText":"Could not find a declaration file for module '@wangeditor/editor-for-vue'. 'D:/web/zyt/admin/node_modules/.pnpm/@wangeditor+editor-for-vue@_d49ef1161b4f4b880c450fdbfe3a0001/node_modules/@wangeditor/editor-for-vue/dist/index.esm.js' implicitly has an 'any' type.","category":1,"code":7016,"next":[{"info":{"moduleReference":"@wangeditor/editor-for-vue","mode":99}}]}}]],[2257,[{"start":8667,"length":6,"code":2339,"category":1,"messageText":"Property 'remark' does not exist on type 'never'."}]],[2284,[{"start":104030,"length":19,"code":2322,"category":1,"messageText":{"messageText":"Type '{ name: any; code: any; children: any; }[]' is not assignable to type 'never[]'.","category":1,"code":2322,"next":[{"messageText":"Type '{ name: any; code: any; children: any; }' is not assignable to type 'never'.","category":1,"code":2322}]}},{"start":104298,"length":989,"code":2322,"category":1,"messageText":"Type '{ name: string; children: { name: string; children: { name: string; }[]; }[]; }' is not assignable to type 'never'."},{"start":105302,"length":471,"code":2322,"category":1,"messageText":"Type '{ name: string; children: { name: string; children: { name: string; }[]; }[]; }' is not assignable to type 'never'."},{"start":105788,"length":471,"code":2322,"category":1,"messageText":"Type '{ name: string; children: { name: string; children: { name: string; }[]; }[]; }' is not assignable to type 'never'."},{"start":106274,"length":803,"code":2322,"category":1,"messageText":"Type '{ name: string; children: { name: string; children: { name: string; }[]; }[]; }' is not assignable to type 'never'."},{"start":114787,"length":17,"messageText":"Cannot find name 'searchPatientsAPI'.","category":1,"code":2304},{"start":68312,"length":6,"code":2322,"category":1,"messageText":{"messageText":"Type '(value: string[]) => void' is not assignable to type '(value: CascaderValue | null | undefined) => any'.","category":1,"code":2322,"next":[{"messageText":"Types of parameters 'value' and 'value' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'CascaderValue | null | undefined' is not assignable to type 'string[]'.","category":1,"code":2322,"next":[{"messageText":"Type 'undefined' is not assignable to type 'string[]'.","category":1,"code":2322}]}]}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/cascader/src/cascader.vue.d.ts","start":2156,"length":8,"messageText":"The expected type comes from property 'onChange' which is declared here on type '__VLS_NormalizeComponentEvent; props: TreeOptionProps; effect: EpPropMergeType<...>; ... 48 more ...; cacheData: unknown[]; }> & Omit<...> & Record<...>'","category":3,"code":6500}]},{"start":51818,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | null | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-number/src/input-number.d.ts","start":907,"length":10,"messageText":"The expected type comes from property 'modelValue' which is declared here on type '{ readonly id?: string | undefined; readonly step?: number | undefined; readonly stepStrictly?: boolean | undefined; readonly max?: number | undefined; readonly min?: number | undefined; ... 19 more ...; readonly \"onUpdate:modelValue\"?: ((val: number | undefined) => any) | undefined; } & VNodeProps & AllowedComponen...'","category":3,"code":6500}]},{"start":64632,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | null | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-number/src/input-number.d.ts","start":907,"length":10,"messageText":"The expected type comes from property 'modelValue' which is declared here on type '{ readonly id?: string | undefined; readonly step?: number | undefined; readonly stepStrictly?: boolean | undefined; readonly max?: number | undefined; readonly min?: number | undefined; ... 19 more ...; readonly \"onUpdate:modelValue\"?: ((val: number | undefined) => any) | undefined; } & VNodeProps & AllowedComponen...'","category":3,"code":6500}]},{"start":112955,"length":1,"messageText":"Parameter 'r' implicitly has an 'any' type.","category":1,"code":7006}]],[2288,[{"start":160795,"length":19,"code":2322,"category":1,"messageText":{"messageText":"Type '{ value: any; label: any; code: any; children: any; }[]' is not assignable to type 'never[]'.","category":1,"code":2322,"next":[{"messageText":"Type '{ value: any; label: any; code: any; children: any; }' is not assignable to type 'never'.","category":1,"code":2322}]}},{"start":224456,"length":15,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./src/api/tcm.ts","start":17286,"length":15,"messageText":"The expected type comes from property 'medication_days' which is declared here on type '{ id: number; dose_count?: number | undefined; medication_days?: number | undefined; }'","category":3,"code":6500}]},{"start":14551,"length":4,"code":2322,"category":1,"messageText":{"messageText":"Type 'unknown[]' is not assignable to type 'TreeNodeData[]'.","category":1,"code":2322,"next":[{"messageText":"Type 'unknown' is not assignable to type 'TreeNodeData'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","start":27789,"length":4,"messageText":"The expected type comes from property 'data' which is declared here on type 'Partial<{ lazy: boolean; offset: number; teleported: EpPropMergeType; props: TreeOptionProps; effect: EpPropMergeType<...>; ... 48 more ...; cacheData: unknown[]; }> & Omit<...> & Record<...>'","category":3,"code":6500}]},{"start":30726,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":221199,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":31214,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":245332,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":31670,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":221199,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":32150,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":246213,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":32596,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '{ id: number; express_company?: unknown; tracking_number?: unknown; ship_mode?: unknown; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record' but required in type '{ id: number; express_company?: unknown; tracking_number?: unknown; ship_mode?: unknown; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":229341,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":33061,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '{ id: number; diagnosis_id?: number | undefined; pay_order_ids?: number[] | undefined; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record' but required in type '{ id: number; diagnosis_id?: number | undefined; pay_order_ids?: number[] | undefined; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":241940,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":33521,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":244963,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":33975,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":237117,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":92405,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | null | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-number/src/input-number.d.ts","start":907,"length":10,"messageText":"The expected type comes from property 'modelValue' which is declared here on type '{ readonly id?: string | undefined; readonly step?: number | undefined; readonly stepStrictly?: boolean | undefined; readonly max?: number | undefined; readonly min?: number | undefined; ... 19 more ...; readonly \"onUpdate:modelValue\"?: ((val: number | undefined) => any) | undefined; } & VNodeProps & AllowedComponen...'","category":3,"code":6500}]},{"start":104708,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | null | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/input-number/src/input-number.d.ts","start":907,"length":10,"messageText":"The expected type comes from property 'modelValue' which is declared here on type '{ readonly id?: string | undefined; readonly step?: number | undefined; readonly stepStrictly?: boolean | undefined; readonly max?: number | undefined; readonly min?: number | undefined; ... 19 more ...; readonly \"onUpdate:modelValue\"?: ((val: number | undefined) => any) | undefined; } & VNodeProps & AllowedComponen...'","category":3,"code":6500}]},{"start":142032,"length":10,"messageText":"'__VLS_ctx.detailData' is possibly 'null'.","category":1,"code":18047},{"start":142126,"length":10,"messageText":"'__VLS_ctx.detailData' is possibly 'null'.","category":1,"code":18047},{"start":142223,"length":10,"messageText":"'__VLS_ctx.detailData' is possibly 'null'.","category":1,"code":18047},{"start":147974,"length":1,"messageText":"Parameter 'r' implicitly has an 'any' type.","category":1,"code":7006}]],[2300,[{"start":325,"length":8,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ modelValue: any; }' is not assignable to parameter of type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & Record<...>'.","category":1,"code":2345,"next":[{"messageText":"Property 'itemData' is missing in type '{ modelValue: any; }' but required in type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; }'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type '{ modelValue: any; }' is not assignable to type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; }'."}}]},"relatedInformation":[{"file":"./src/views/decoration/component/tabbar/pc/menu-set.vue","start":4006,"length":8,"messageText":"'itemData' is declared here.","category":3,"code":2728}]},{"start":454,"length":8,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ modelValue: any; }' is not assignable to parameter of type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & Record<...>'.","category":1,"code":2345,"next":[{"messageText":"Property 'itemData' is missing in type '{ modelValue: any; }' but required in type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; }'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type '{ modelValue: any; }' is not assignable to type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; }'."}}]},"relatedInformation":[{"file":"./src/views/decoration/component/tabbar/pc/menu-set.vue","start":4006,"length":8,"messageText":"'itemData' is declared here.","category":3,"code":2728}]}]],[2313,[{"start":195,"length":6,"code":2339,"category":1,"messageText":"Property 'height' does not exist on type '{}'."}]],[2355,[{"start":5709,"length":5,"messageText":"Parameter 'depts' implicitly has an 'any' type.","category":1,"code":7006},{"start":5738,"length":6,"messageText":"Variable 'result' implicitly has type 'any[]' in some locations where its type cannot be determined.","category":1,"code":7034},{"start":5777,"length":4,"messageText":"Parameter 'dept' implicitly has an 'any' type.","category":1,"code":7006},{"start":5946,"length":6,"messageText":"Variable 'result' implicitly has an 'any[]' type.","category":1,"code":7005},{"start":6044,"length":6,"messageText":"Variable 'result' implicitly has an 'any[]' type.","category":1,"code":7005}]],[2358,[{"start":10278,"length":47,"code":2769,"category":1,"messageText":{"messageText":"No overload matches this call.","category":1,"code":2769,"next":[{"messageText":"Overload 1 of 3, '(callbackfn: (previousValue: unknown, currentValue: unknown, currentIndex: number, array: unknown[]) => unknown, initialValue: unknown): unknown', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type '(total: number, count: number) => number' is not assignable to parameter of type '(previousValue: unknown, currentValue: unknown, currentIndex: number, array: unknown[]) => unknown'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'total' and 'previousValue' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322}]}]}]},{"messageText":"Overload 2 of 3, '(callbackfn: (previousValue: number, currentValue: unknown, currentIndex: number, array: unknown[]) => number, initialValue: number): number', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type '(total: number, count: number) => number' is not assignable to parameter of type '(previousValue: number, currentValue: unknown, currentIndex: number, array: unknown[]) => number'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'count' and 'currentValue' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322}]}]}]}]},"relatedInformation":[]},{"start":10485,"length":47,"code":2769,"category":1,"messageText":{"messageText":"No overload matches this call.","category":1,"code":2769,"next":[{"messageText":"Overload 1 of 3, '(callbackfn: (previousValue: unknown, currentValue: unknown, currentIndex: number, array: unknown[]) => unknown, initialValue: unknown): unknown', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type '(total: number, count: number) => number' is not assignable to parameter of type '(previousValue: unknown, currentValue: unknown, currentIndex: number, array: unknown[]) => unknown'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'total' and 'previousValue' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322}]}]}]},{"messageText":"Overload 2 of 3, '(callbackfn: (previousValue: number, currentValue: unknown, currentIndex: number, array: unknown[]) => number, initialValue: number): number', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type '(total: number, count: number) => number' is not assignable to parameter of type '(previousValue: number, currentValue: unknown, currentIndex: number, array: unknown[]) => number'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'count' and 'currentValue' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322}]}]}]}]},"relatedInformation":[]},{"start":4702,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined'.","relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tag/src/tag.d.ts","start":414,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type '{ readonly type?: \"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined; readonly closable?: boolean | undefined; readonly disableTransitions?: boolean | undefined; ... 6 more ...; readonly onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & R...'","category":3,"code":6500}]},{"start":6901,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined'.","relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tag/src/tag.d.ts","start":414,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type '{ readonly type?: \"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined; readonly closable?: boolean | undefined; readonly disableTransitions?: boolean | undefined; ... 6 more ...; readonly onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & R...'","category":3,"code":6500}]}]],[2360,[{"start":7613,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined'.","relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tag/src/tag.d.ts","start":414,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type '{ readonly type?: \"primary\" | \"success\" | \"warning\" | \"info\" | \"danger\" | undefined; readonly closable?: boolean | undefined; readonly disableTransitions?: boolean | undefined; ... 6 more ...; readonly onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & R...'","category":3,"code":6500}]}]],[2385,[{"start":397,"length":10,"code":2322,"category":1,"messageText":{"messageText":"Type '(opts?: { silent?: boolean; }) => Promise' is not assignable to type '(name: TabPaneName) => any'.","category":1,"code":2322,"next":[{"messageText":"Types of parameters 'opts' and 'name' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'TabPaneName' is not assignable to type '{ silent?: boolean | undefined; } | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' has no properties in common with type '{ silent?: boolean | undefined; }'.","category":1,"code":2559}]}]}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tabs/src/tabs.d.ts","start":7614,"length":11,"messageText":"The expected type comes from property 'onTabChange' which is declared here on type '__VLS_NormalizeComponentEvent; readonly closable: boolean; readonly tabindex: EpPropMergeType; ... 4 more ...; readonly addable: boolean; }>...'","category":3,"code":6500}]}]],[2388,[{"start":56480,"length":34,"messageText":"This comparison appears to be unintentional because the types '\"supplement\"' and '\"normal\"' have no overlap.","category":1,"code":2367},{"start":20344,"length":28,"messageText":"This comparison appears to be unintentional because the types '\"supplement\"' and '\"normal\"' have no overlap.","category":1,"code":2367}]],[2389,[{"start":742,"length":5,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'value' does not exist in type 'TreeOptionProps'.","relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","start":25072,"length":5,"messageText":"The expected type comes from property 'props' which is declared here on type 'Partial<{ lazy: boolean; offset: number; teleported: EpPropMergeType; props: TreeOptionProps; effect: EpPropMergeType<...>; ... 48 more ...; cacheData: unknown[]; }> & Omit<...> & Record<...>'","category":3,"code":6500}]}]],[2394,[{"start":1732,"length":5,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'value' does not exist in type 'TreeOptionProps'.","relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","start":25072,"length":5,"messageText":"The expected type comes from property 'props' which is declared here on type 'Partial<{ lazy: boolean; offset: number; teleported: EpPropMergeType; props: TreeOptionProps; effect: EpPropMergeType<...>; ... 48 more ...; cacheData: unknown[]; }> & Omit<...> & Record<...>'","category":3,"code":6500}]}]],[2435,[{"start":5402,"length":4,"code":2322,"category":1,"messageText":{"messageText":"Type 'unknown[]' is not assignable to type 'TreeNodeData[]'.","category":1,"code":2322,"next":[{"messageText":"Type 'unknown' is not assignable to type 'TreeNodeData'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/.pnpm/element-plus@2.13.7_typescr_8dc22b845ba8de11448ecad5177e079a/node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","start":27789,"length":4,"messageText":"The expected type comes from property 'data' which is declared here on type 'Partial<{ lazy: boolean; offset: number; teleported: EpPropMergeType; props: TreeOptionProps; effect: EpPropMergeType<...>; ... 48 more ...; cacheData: unknown[]; }> & Omit<...> & Record<...>'","category":3,"code":6500}]}]],[2438,[{"start":31652,"length":6,"code":2349,"category":1,"messageText":{"messageText":"This expression is not callable.","category":1,"code":2349,"next":[{"messageText":"Type 'String' has no call signatures.","category":1,"code":2757}]},"relatedInformation":[{"start":31652,"length":6,"messageText":"Are you missing a semicolon?","category":1,"code":2734}]},{"start":32437,"length":2,"code":2349,"category":1,"messageText":{"messageText":"This expression is not callable.","category":1,"code":2349,"next":[{"messageText":"Type 'String' has no call signatures.","category":1,"code":2757}]},"relatedInformation":[{"start":32437,"length":2,"messageText":"Are you missing a semicolon?","category":1,"code":2734}]}]],[2440,[{"start":14749,"length":34,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type 'number'."}]],[2453,[{"start":24819,"length":1,"messageText":"Parameter 'd' implicitly has an 'any' type.","category":1,"code":7006}]]],"affectedFilesPendingEmit":[1577,1595,1585,1586,1596,1597,1435,1598,1579,1587,1427,1425,1431,1453,1588,1548,1467,1589,1434,1599,1600,1461,1601,1602,1603,1590,1591,1592,1593,1604,1605,1606,1607,146,1608,1609,1594,1433,1610,127,1581,2075,2076,2098,1580,2099,2100,2101,2102,2190,2191,2192,2193,2195,2196,2194,2197,2199,2200,2198,2203,2201,2204,2202,2206,2185,2186,2188,2189,2187,1468,2207,2208,2209,2184,2074,1544,1455,2224,124,134,107,128,125,126,2225,2205,1415,143,1436,139,2227,2228,1583,2237,2238,2241,2243,2245,2246,1416,140,141,142,1403,144,145,1402,1404,137,138,1410,1405,1407,1408,1409,1411,1584,1582,2244,2247,1571,1570,2242,1578,130,136,133,132,1446,131,2077,2078,2248,1469,1566,2249,1401,2250,1457,2082,1454,1437,1574,1572,1576,135,2079,1406,129,1575,1419,1420,1418,1417,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2267,2265,2264,2263,2266,2262,2269,2268,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2286,1464,1465,2283,2284,2285,2287,2288,2296,2292,2297,2290,1429,2298,2291,2293,2294,2300,2301,2302,2299,2304,2305,2306,2303,2308,2309,2310,2307,1428,2312,2313,2314,2311,2316,2317,2318,2315,2320,2321,2322,2319,2324,2325,2326,2323,2328,2329,2330,2327,2332,2333,2331,2335,2336,2337,2334,2339,2340,2341,2338,2343,2344,2345,2342,2346,2289,1430,2348,2347,2349,2295,2351,2354,2352,2353,2350,2355,2356,1426,2357,2358,1414,1413,1412,2359,1432,2360,2361,2362,2370,2371,2363,2368,2365,2364,2366,2367,2369,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,1462,2393,2394,2395,2396,2397,2398,2399,2400,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2432,2431,2434,2429,2430,2433,2437,2435,2436,2438,1549,1460,1459,1564,2440,1456,1448,1447,1445,2441,2442,1458,1568,1567,1466,1451,1450,2443,1463,1546,1545,2439,1565,1569,2444,2445,2446,2447,2448,2449,2450,2451,2452,1421,2453,2646],"emitSignatures":[107,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1445,1446,1447,1448,1450,1451,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1544,1545,1546,1548,1549,1564,1565,1566,1567,1568,1569,1570,1571,1572,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,2074,2075,2076,2077,2078,2079,2082,2098,2099,2100,2101,2102,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2224,2225,2227,2228,2237,2238,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2646],"version":"5.7.3"} \ No newline at end of file diff --git a/app/.env.example b/app/.env.example new file mode 100644 index 000000000..1459c3147 --- /dev/null +++ b/app/.env.example @@ -0,0 +1,21 @@ +# 后端根地址。程序会自动追加 /adminapi;也可直接填写以 /adminapi 结尾的地址。 +DOCTOR_API_BASE_URL=https://api.example.com + +# 首次验收可设为 true,使用内置演示数据;生产必须设为 false。 +DOCTOR_DEMO_MODE=true + +# 当前只支持 embedded。browser 在后端提供一次性 handoff 前会被明确拒绝,且不会自动打开系统浏览器。 +DOCTOR_VIDEO_MODE=embedded +# 可选:本地 dist 缺失时由 QtWebEngine 内嵌加载的可信 HTTPS 页面;不是 browser handoff URL,禁止携带 UserSig。 +DOCTOR_VIDEO_WEB_URL= + +# 生产环境必须保持 true。仅内网自签证书调试时临时关闭。 +DOCTOR_VERIFY_SSL=true +DOCTOR_REQUEST_TIMEOUT=30 + +# 日志级别:DEBUG / INFO / WARNING / ERROR。日志会自动脱敏 token 与 UserSig。 +DOCTOR_LOG_LEVEL=INFO + +# 可选:仅供企业部署/自动化验收隔离用户数据目录。 +# DOCTOR_CONFIG_DIR= +# DOCTOR_LOG_DIR= diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 000000000..24b350c7c --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,21 @@ +.env +.venv/ +.venv-build/ +.uv-cache/ +.uv-python/ +__pycache__/ +*.py[cod] +.pytest_cache/ +.ruff_cache/ +.coverage +htmlcov/ +build/ +dist/ +!video_companion/dist/ +!video_companion/dist/** +*.spec.bak +node_modules/ +video_companion/node_modules/ +*.log +.DS_Store +Thumbs.db diff --git a/app/Build_DoctorWorkstation.bat b/app/Build_DoctorWorkstation.bat new file mode 100644 index 000000000..606721eb4 --- /dev/null +++ b/app/Build_DoctorWorkstation.bat @@ -0,0 +1,22 @@ +@echo off +setlocal EnableExtensions DisableDelayedExpansion +set "PROJECT_ROOT=%~dp0" +set "POWERSHELL_EXE=%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" + +"%POWERSHELL_EXE%" -NoLogo -NoProfile -ExecutionPolicy Bypass -File "%PROJECT_ROOT%scripts\package_windows.ps1" %* +set "RESULT=%ERRORLEVEL%" + +if "%RESULT%"=="0" ( + echo. + echo Package ready in: %PROJECT_ROOT%dist + if /I not "%~1"=="-ValidateOnly" ( + start "" "%SystemRoot%\explorer.exe" "%PROJECT_ROOT%dist" + ) +) else ( + echo. + echo DoctorWorkstation packaging failed. Exit code: %RESULT% + echo Press any key to close this window. + pause >nul +) + +endlocal & exit /b %RESULT% diff --git a/app/README.md b/app/README.md new file mode 100644 index 000000000..163273d02 --- /dev/null +++ b/app/README.md @@ -0,0 +1,126 @@ +# 臻阳堂医生工作站 + +一个以 Python + PySide6 编写的跨平台医生桌面端,面向 Windows 10/11 与 macOS 13+。项目按现有 `admin` 源码的真实接口契约实现,覆盖登录、接诊台、我的处方库、已开处方、患者列表、问诊列表和腾讯云视频面诊。 + +> 当前版本提供完整的演示数据模式,便于在没有后端账号或腾讯云配置时验收界面与流程。切换到生产模式后,数据与权限均由现有后端返回。 + +## 一键运行与一键打包 + +Windows 直接在项目根目录双击: + +- `一键运行_医生工作站.bat`:优先启动现有成品;没有成品时自动使用 `uv` 准备源码环境并运行。 +- `一键打包_医生工作站.bat`:自动同步锁定的 Python/Node 依赖,构建并冒烟验证,最后生成 `dist/DoctorWorkstation-Windows-x64-<版本>.zip` 和 SHA-256 文件。 + +英文稳定别名分别是 `Run_DoctorWorkstation.bat` 和 `Build_DoctorWorkstation.bat`。分发 ZIP 解压后,可直接双击其中的 `Start_DoctorWorkstation.bat`。 + +macOS 在 Finder 中双击: + +- `一键运行.command`:优先打开现有 `DoctorWorkstation.app`,否则自动准备源码环境并运行。 +- `一键打包.command`:构建、签名检查和冒烟验证后,生成 `.app`、可分发 ZIP 及 SHA-256 文件。 + +Windows 打包机需预先安装 `uv` 与 Node.js 20+;脚本会自动处理项目虚拟环境和锁定依赖。首次打包需要联网下载依赖,之后会复用本机缓存。如果 macOS 传输过程丢失了执行权限,可在项目目录执行一次 `chmod +x *.command scripts/*.sh`;若 Gatekeeper 拦截未签名内部测试版,请使用右键“打开”。 + +## 已实现范围 + +- 账号密码登录、token 会话、记住账号(不保存密码)和退出登录。 +- 登录后读取 `/adminapi/auth.admin/mySelf`,按 `permissions` 动态控制页面和操作按钮;`*` 超级权限兼容现有后台。 +- 接诊台:今日待接诊/已过号、患者详情、医生备注、通知医助、完成接诊、发起视频面诊。 +- 我的处方库:主方/辅方与公开范围筛选,药材动态编辑,模板所有权和增删改权限。 +- 已开处方:处方号/患者/审核状态筛选、状态展示和只读详情。 +- 患者列表:复用 `/firstvisit.myPatient/lists` 的服务端数据范围,不在客户端伪造医生或部门过滤。 +- 问诊列表:按日期、状态和患者筛选,支持从有效预约发起视频。 +- 腾讯视频:沿用现有项目的 `@trtc/calls-uikit-vue` 主链;UserSig 只从后端短时获取,客户端不包含 SDKSecretKey。当前仅支持隔离的 QtWebEngine 内嵌模式。 +- PyInstaller Windows/macOS 构建脚本、macOS 摄像头/麦克风权限配置与自动化测试。 + +## 手动运行 + +先安装 [uv](https://docs.astral.sh/uv/),然后在项目根目录执行: + +```powershell +uv sync --extra dev --extra build +Copy-Item .env.example .env +uv run doctor-workstation +``` + +macOS/Linux: + +```bash +uv sync --extra dev --extra build +cp .env.example .env +uv run doctor-workstation +``` + +`.env.example` 默认启用演示模式。演示账号:`doctor`,密码:`doctor123`。 + +## 连接现有后端 + +将 `.env` 调整为: + +```dotenv +DOCTOR_API_BASE_URL=https://your-api.example.com +DOCTOR_DEMO_MODE=false +DOCTOR_VERIFY_SSL=true +``` + +程序会自动在地址末尾追加 `/adminapi`。它与现有管理端保持相同约定: + +- 登录:`POST /login/account`,请求包含 `account`、`password`、`terminal=1`。 +- 鉴权请求头:`token: <登录 token>`,`version: 1.9.4`。 +- 响应 envelope:`code=1` 成功、`0` 业务失败、`-1` 登录失效、`10` 需绑定企业微信。 +- 权限与数据范围:完全以后端 `/auth.admin/mySelf` 返回为准。 + +环境配置不会保存密码、TRTC SecretKey 或腾讯云长期凭据。登录 token 优先存入系统凭据库;无法使用时仅回退到用户配置目录中的受限文件。 + +## 视频伴随页 + +腾讯云没有官方 Python/PySide6 客户端 SDK。本项目因此采用 Python 业务主程序 + 腾讯官方 Web TUICallKit 伴随页: + +```powershell +Set-Location video_companion +npm ci +npm run build +``` + +构建输出位于 `video_companion/dist`,由桌面端内嵌加载。生产 UserSig 必须由现有 `/tcm.diagnosis/getCallSignature` 接口签发;不要把 SDKSecretKey 写入 `.env` 或 JavaScript。 + +当前仅支持 `embedded`。在业务后端提供服务端签发、一次性消费的 browser handoff 之前,`browser` 模式会被明确拒绝,QtWebEngine 不可用时也不会自动打开系统浏览器。这样可以避免后端已记录 `startCall`、浏览器页面却没有通话票据的“幽灵通话”。 + +```dotenv +DOCTOR_VIDEO_MODE=embedded +DOCTOR_VIDEO_WEB_URL=https://rtc.example.com/doctor-call +``` + +`DOCTOR_VIDEO_WEB_URL` 仅用于本地 `dist` 缺失时,在 QtWebEngine 中内嵌加载受信任的 HTTPS 主文档;它不是 browser handoff URL,也不得在 URL 中携带 UserSig 或其他 RTC 凭据。 + +## 测试与打包 + +```powershell +uv run pytest +uv run ruff check src tests +.\scripts\build_windows.ps1 +``` + +macOS 必须在 macOS 机器上构建、签名和公证: + +```bash +./scripts/build_macos.sh +``` + +Windows 与 macOS 的 Qt/媒体权限和签名产物不能交叉编译。首次生产发布前,应按 [research/tencent_rtc.md](research/tencent_rtc.md) 的准入清单完成摄像头、麦克风、设备插拔、休眠恢复和弱网实测。 + +## 工程结构 + +```text +src/doctor_workstation/ + core/ 业务模型、权限、会话与异常 + services/ HTTP 客户端、远程仓库、演示仓库与安全 token 存储 + ui/ PySide6 登录、主框架、页面和对话框 + video/ 视频请求规范化、异步生命周期与隔离的内嵌窗口 +video_companion/ 腾讯 TUICallKit 页面 +packaging/ PyInstaller 与 macOS 权限配置 +scripts/ Windows/macOS 构建脚本 +tests/ 不依赖真实后端和腾讯云的自动化测试 +research/ admin 源码审计、架构和腾讯 RTC 官方资料研究 +``` + +详细的接口/字段与权限审计见 [research/admin_audit.md](research/admin_audit.md)。 diff --git a/app/Run_DoctorWorkstation.bat b/app/Run_DoctorWorkstation.bat new file mode 100644 index 000000000..2505faea0 --- /dev/null +++ b/app/Run_DoctorWorkstation.bat @@ -0,0 +1,16 @@ +@echo off +setlocal EnableExtensions DisableDelayedExpansion +set "PROJECT_ROOT=%~dp0" +set "POWERSHELL_EXE=%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" + +"%POWERSHELL_EXE%" -NoLogo -NoProfile -ExecutionPolicy Bypass -File "%PROJECT_ROOT%scripts\run_windows.ps1" %* +set "RESULT=%ERRORLEVEL%" + +if not "%RESULT%"=="0" ( + echo. + echo DoctorWorkstation failed to start. Exit code: %RESULT% + echo Press any key to close this window. + pause >nul +) + +endlocal & exit /b %RESULT% diff --git a/app/SECURITY.md b/app/SECURITY.md new file mode 100644 index 000000000..7dbdbff52 --- /dev/null +++ b/app/SECURITY.md @@ -0,0 +1,14 @@ +# 安全与隐私约束 + +医生工作台会处理患者身份、病历、处方和音视频等敏感信息。生产部署必须遵守以下基线: + +- 客户端不包含腾讯云 `SDKSecretKey`、COS Secret 或后端数据库凭据。TRTC `UserSig` 由服务端按当前医生和单次通话短时签发。 +- 不在 URL 查询参数、命令行或日志中传递 token、UserSig、患者身份证号和完整病历。项目日志过滤器会遮蔽常见凭据,但调用代码仍应避免记录完整请求/响应。 +- 密码从不落盘;“记住账号”只保存账号。登录 token 优先写入 Windows Credential Manager / macOS Keychain。 +- 生产 API 与浏览器视频页必须使用 HTTPS 并验证证书。`DOCTOR_VERIFY_SSL=false` 只允许在受控开发环境临时使用。 +- 页面可见性与按钮权限来自 `/auth.admin/mySelf`,但客户端权限仅用于界面体验;服务端仍必须对每个接口执行身份、租户、数据范围和动作权限校验。 +- 本地不缓存患者列表、病历、处方和通话票据。演示数据是完全虚构的静态数据。 +- 通话录制、截图和报告上传属于单独的合规能力;启用前必须确认患者告知/同意、留存周期、访问审计和删除流程。 +- 软件发布必须签名。Windows 建议 Authenticode;macOS 需要 Developer ID、Hardened Runtime、摄像头/麦克风用途说明与公证。 + +发现凭据泄露、越权、患者数据写入日志或视频房间被未授权加入时,应立即停用相关凭据、保留审计证据并按组织的安全响应流程处置。 diff --git a/app/artifacts/ui_acceptance/01_login_1280x800.png b/app/artifacts/ui_acceptance/01_login_1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..eeebce30c3609646d5d0650025e3d91611b2024d GIT binary patch literal 64695 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 Iw;nb08VUPS!x8Ku0`6&xtj?GOJ6 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 literal 0 HcmV?d00001 diff --git a/app/artifacts/ui_acceptance/02_reception_1280x800.png b/app/artifacts/ui_acceptance/02_reception_1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..2ad36db43342ff9e4d9aff7dddfe7157b793a127 GIT binary patch literal 113081 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%0D!TBN1B zJEgn3k?!t#2S4BEcfJ34c@F!`o;`cbTI-J4l~HMDf(_VG#Nlu$vO){0<*`*ZB|+p=%f=NgM&Cv6t%L&HcWss@bdF>JcN zc;9KTI=po-zgiEaAe1)3&CSiu|5@exZlG_V(Q&8alxgJ>_P%4j4(DTHhhfzG2dmCM za5-^!Z5nc^?V~29W~S6J7(TDZ8|7?PRuULjr?1Qq zc7PC(kgd!u^3pO;p~?OEipt{RstOv1)Q^<2KF9Bi2DDC{oWc_MV^w|>xl+@->Fn!r z?WjI_FK+C7KFpH!@QbbPt5~4Wa;+9O7XMT*6%`P>@6A@k>sQdYSZn}h8=jPeQZ1~YiIIVaMq)_HVv*!y-@P4`fRrnXl=G;8=vQ~v7MSlMJ@47wyxnVNn<(V_{;Tq4GS1KREGB=3ck0t$hIr zC8~+`Ep?O_IkIxWkZC#@!|u}B-pKEE+E0s)Il{pW54TZL|-zC-1it zXO)eOX(^PixO&$I7|Nbi%D&Yscdoe2`0Sq6WIP}tcI$d~&-;og((l{HYiePOm6_a7 zi@e(w|GlT^;E4z%HCb^N+t?QIUDwvKxsgy~-5dqPd=@=BGpBs;*`0S%#nK>v4qf6i zGSVrq$l=?pOX})Mispfl4NKvCFbsR8D&nhGVzIuMBlDJno<83SX-NG^QyQB#JdzG} z|xlV;z&T0B?E>z&u-d__4U zt3v|8wziZLm`8_tQz>+Qry)>PPPP`d%G#N{b~=#Dy@L+tcA{q`T_{&}!qUZPzurU% zWU*w&9`Jj=f`HLO~bs2xLRlIZCYH8UjBjj?l-8}4X?FZ7H z2O{2&8DO_p>DQ4xA2Y+lQ|U$i_87$#2dT=Y)Ly~ZRy)oAAXy4&|Fv6-=F2uVZjpG*vd4k4+faw>>mnGU75m z1TRT>b7zZFEsHF*1^<*FZ+N)uO-wW*BuaDdud;fK7`pAt+^YuGhglk%iDZcT(^iFy zFud)Wso#=uJc)U=H~Lyk=q*-{-KutjmqzZl;MC>QqZhe~R?^xF;9|8dyHgoj9_&F5 zw|_rzMiODKHt}Kou;Pr)9Nk>gmX=lB4AgrKH8Z?rz4pKl>RZLsxlkAvt?;}C4@=qN_ zzyPV%-&rqB#)ep#*pryNfA3~pbj{!OezLtF;up>EaN3$_=@6CqU?P_6{akLC@^h&E z3(Wo6n*Ibvzji~C23u)0wVdFijZA0DQA#%6I|Ye|vnq|**jJdr=n0%^){XU=S7CII zTZv+FPVtnQkhfOVZ%i@yngI{rn#&C|YIK!CZ61MFh<}GeHVDy700b+zoZ5PWYI|`$ z<94YVq+BptVJd!hCcZM;xz7L!Fg>pupQ6gJBfEjZsvGB>;g*gkP_5G@Ii@69A}^cW zcPM_;>@>qH#OfCa$-GGQ+6%oBghvKo*p6i4_zFYG zE-HZ*l`?O|z;muWe$vBnd!)pP0NNbRDFYrWuIs1i;c2J2mwxH#8AgUiW)@~59c{q7 zBvdl?fX~^mC!0wfAKwVMs^xgAV9U|H>!zzp&=0w3-pAta;dAyFW#~s_ zY}G;AQ31_E#xY!L3#_nkc6nThI0DSWR&Q*h%a>MTxJmo6sUcq&_c{W>dMEWBG$ckGN%H*mY)vQ4IF z@yf}1enQ}2$9NiTk6WFcsp(`@?!9BVSD7&dkGATV2ZVtLKV4G;EuC34y-k$1F`D(1 zJkkAt?_$d)?oZ;U*B`MC+GVkN-B~&Z4_BC?9N)VRSewjm9QYzz>7<~ z$zNaFc$1Y8L;d3Ui-P>@YUg20=*!LN)_Us=|CzXFw2tcK$juo~r`ed~VoLLuO;c*( zJWM~?&GQl7x3rEepi~JB&A4i)<1)1{PpWoJjkaQ zO<_PuO~)U_B=A`bO_iOc4+_zsC0s01qkFe(c5w_8E+S}vO9!Z}*oMXvxs9lyZ-noL z`r23-X=%x*?8K5A;RP+Hn^fFm{9A;ujnk zoG|q@uj{pINT2paofp7?smB*{K>M~R4$BZz$BMkBIJFM7jm4f~iUpC#w~?upM= zBt=AR|9XF$O(XJ3kgq7cAX6H3A{d78I<5ZHn+^l1SrmPd;o72&W5qmo)B{^kvE($x0$_z4qGYU8r}tK-b7F$QTz8Y3F#GB6WfT{m}Rkn;7{TBRE}w zg95W#i=%4!j(-yGn6ITLzm_GBgvVo~XP_{5zRZaC;uPa+VDCm>T8A%IY*hZu;s71Z zz0!}^s)|x}X3Nv1D+LCfMLx87Y6T5#@B7X`SLp3qYUZ&?mIr3c%dV@k5wf8dpF?D;agj%d8XFAWWjs!Be`b4O`y z>lzzPCKF<|AA+9b!SkZ&Dnywx~j=F4UX(C z_NEj@GR|(h)0g35efmrkfq~bU(x8dRN452*?9CWe;bL9qa`BaCqrlr+3=)-G82ysf zoU9Ky?b(noxi}nABEsUiD+!lJZFV(0B((T}&-2K?2PMSa#!|Oh_ZlS`dI)Swwyh1{wMadNzeGD{9e#n$T}wJD}LF`$$`17w748!Q(LB=aldlN<0^5q zT7-cXJ_UZn<5iav6g*wTAZAmi(!?0oL0kdeifX=Eh-Y^$Xg3oVGn zt;P=@+rS?WyJVZtE#3iiPz5a-+qLTYUhW7aj%0QV16q*otlym_ znnr1OI@m??i9HF&yI-6m!0M z_;#Y;$!~{zc!q-PflG)8sc}vZmz1=(Q^Y^a*6D6LDq&+2C;MziM6Ud_TO{}fVD$wK zQr+vz;E!A@L*Zy zojm$z>`VUHF%PR|3J08rWl0J_dPc%ofMGgKco8mrHzv5?nY1I z1;GL~&b4tDV-s)X%@>OIS4y6LvbPom0mVq!*|{)`MCqQcTmgd&vv(awpU>&q*L ztRl@{eAYraFW-@}t}ZBWfb8heMoQX_XMgp*7~&@e8Q}%^dXL+Ttn%z?RY7e(Q8>P2 z8573zGe@h*KdHh&^|zi1X@ddTZk|c?2?^H1d+Fs-3Agn=lv3eI^xPaA%v`kw@$9gv zhf=-|zvIf@(N1J&aDWs#4uvvOO&Zd)LqEJYyyVHXxLz2|qTnHp?~miPJHE1@=V>J6 z=E(9Z?OAp(5s&B_=pU92p zMd?2Vd$Be`zL4A+U5316R6C}vq>L|U(eIs{tJhI`30hyHt8!_QXP=KQZxe&i<+mE= z-62R21FSOaQwUCgMx!o=9Ge64l-HBYW2-n2yh%J^A?g zsD{NBA?Wk@-Un<2Ib{Gi-_7h|xx@bjcl=lx5;beEsT% zfH1jVGeF2s#ZE@H>h->p-AdcN$$BO|xYisFDrUCXUOvgRs6$)(9Gl_p8}c>eBAE*Y z3K~qjib~Mjuc#_7QL-5FRX3RhVcDESmku>lgvIzODA2X(Byr2vdSn?JM(qiJ z*Qqlx!Looh_MRoERUdq3&g`Lf`gABSkeR*`v z)xwKTENra%xZSRtn*L}1^6EFLj-SJYqA&Ds_il}07-dLb);oXY9_Z^QAt2mx zAIGnGI?q>Io0yN(T}|?vs3hDTGJGxzsBYipvBT{2DEe3^GJ?bPBIuLz{~Y zozWUqG5z-+xGqNc$ye6{ZX!Q~#?WunxvuY)Rx}_Z0Y}qh4yTz5=?`=tZau;i;pRG1 z3E0%s-(r1g^x-#XA&(Rd%@zg^Q|(1ob@c)c(x(wLj2wmoAd2tEZp$}DGZCH!R`7^J43->p6icdHhL7iDmmS1gi;Y9z6^4_ zErKr;5gXb?zT~gd($qd?iqXb=X+Q6`%$P;=k&wU&Zp#=D!Dy>}*ux5LSKOu3%E;HO zBH@jiHTtZ?*6aIzbO5{pK)25=tLfXnRF(&-z@Tv@x*yeuB zY@`T>f)6x5>kql#FvyT%dQ(Nd#KNI0Y9<<~I{+`NwAGBUu?Y(v%9i#7xwv+X7Yi+Q zuEGxcUF}8olKtZ|4cuBxi*nORpA zj6avwx4`i)-WRCH=K7I$S4eLFK54XGnz|L&wb2Bvreb%5NIONTN3(pXy?vuf62nq* z_3D_IPLWTT{eAVK^Af-B*9oR4zF?I`kZ8DDs*1QX6GqF>;v*mXQESnA{Pb5BJ&tjB%M->5F2j+@7AYH&TTu)c&OK zLS#Yx16>39-p?YCL%t@tyL)~Ki|4gNif&C|DJyjliy#+gW}ht>k7+pMIE23!{xF9~XpfnwwqD&JtT- zeo+uF*DW3!Ta?k852Ywf7d&Izh_k1$##{Q!&`rlf*JD zH#077XXkW=3ap~JcZ^5MI>9?QQKDd^PJG07+`?uuogj6?SEM#Cws`oa@_laeICr7< zAHh;iM=r0kfxS}B0?R#7bb6DVEPJM(-;gH@m1T8rhx96yCyY)+UJd_BoQ3hF=_KN? zdq12+2=ijW>je$}%O9VH!;P;l+ zGu5EE1KD=&mDmUf(A2FXd=dev#9#ZhUoYc760s-?OM#wk;D?5$qb2JNcB^ezLa5VRQa5J~cPH`1G{fs8!Uu+A-B9uX3f% z*@*Eaxwy5Hoj1{QZ{uNo-m@ZJ>5XJQ?8u0%hU?q+ujOtQ=6y7?zlF)@OgIYPvjW>* zS{#RWgwt%vAe{fwh<$OHIurgg!SiMqZn_{?EMl(O#pPMphqU2xR#s7TLfSeKr)Ug# zxt5iZY0D>x+E*F5|3aiJf;kn$cd;w3EchqQ#rs!JPpH$`lM1WJ^;zpF32L^dt`GCG zF;7C>*{T-*dWy&;)wv$ZLO;uGWE}1F7h?(t%uFc^jc5tDG~eP3a=N?f?o6!II@3Hq zM4z*>N=awU*9x+lOlZaYTP2euku@AqRvJ-O7Fk;M_z#EDOQGSO<=0Q|cBw!3u%P^( zarl`69jYHa^)jBRDdC-owyVB>PUUwO!&R_l%74GPSi`}FZSMW?BMp6DE{-^rtg?er zS~6z-*qi7V27iW$40Py5a@7<+X>z``IJ@8t#y>-isvL?B2f>i=xr@Ai+hd15-;kD7 zn3`2sn3id5VflML#jjEwPK0y+@8}y=C8b%myHQHj|3KQnp~ajSSY7aKjA0fEu;a^RqLGOr977vwY{ z3`t&MQuD0d`Z-ltM{Z^4B->__w=+!^)t2Y2F5WlRi*xU+Unv-i;DseV&{Q;kd;iL; z#PnXK{C}+QK-mT*Nf^d}KdP*zo4*BxeKgBQSfio|-cn2R9wuj`rVie8m4(EJp+9T? zdpcKNfy;nmHhDi%iVYnyv7HSya3j?J1)p~nVuk+iCN>$4xc7jwPq4#Rq^(1@`{JBR z>!*@=!06%q8;WP|f2Um>gznFczX!lX>G6pqyysJbcuFp=h4AN9+D-RSaZD8|$qVP_ zMp+~-8fCeaMgJ7gV0vT=ZW3Xa8mg@4&X0)4YORdD?{8mxP^vyI=<9!oXX=$zkfaT- z4tiqKw9ZpmChWpp=LYvw&PL7tnmo3jc(}xX;3RWV!)>R%lIR^g{(rb=;Js@_IXdID z#}eQFbP%c6!P=9k|8dvAkD9|hdHmoVss_jZaRL6_<~`EO|L5I*O`{9_pI`rGk?(&S zA^28mQ;W=#W*)vK<5|CZ6dt~!!ubD*AcWR#x}kS8+;#sxiBr35|KAUeD*!u*5AE+K zExCu1$+qFVnf`BOjDbrLFBDl+5^WAHZS84IO8xIoQjhNpq1~;$=!h8gGAY5Px~OtR zbep1D>;Hon~q$G{kp|!v}o~nA<}_OkE-S&26+pY6M1iD=m~V8LQG#}{SA-( z_Y;i(Z=C^-qB;+^2`3tAd0BZ)#g<3|2Q2K>Xsqa$C|r>PDWi687z4fe^}9{ddf#;-HXm#wu6lhJ))mb!9Ykc)pO;w#Nm5Aaq1S0>^0DlOEI zUQfNq3?u^ZNTe67j8vWFSTuyP^UY`pqr9)W}@3iGd~-LF^qjvZU-F`W+SSIw_kU9%JMT__uSnfl8SK`d^jn>`84FBE zk!O7!=yKF}d7N|@|H9wa}t`F@SDx3#yoyr*Qdaffr_N&)Lvl0*!h zFO#0Cn5N{*w;5&_ZDdo?l&LAz{aI#s0%F1`N46jI5^8%j?0|l;LA=i2G;Kad9JwzyF4+Xrpv&t?l+$V53&}h-+2Bk||z{ zMJa*JnT9^#zbW%lj;nKv25-wfs|W=Tc1H3XJObJ28#y_7+P`HKYA? zrN@p-8e*UjCwq`+YmFx&S<2`ZA*IIQUBS$M3nq8N+m)lp{u7(hbD=Xo0djf8A4NOL zq=DPW2qFlnvX>2Mmm!Y;|F{qKVt*bIobKrd;O|dsY~*tP9`WvI3MEsP_I^R`_TRg= z-SqWfUFp-~Z;FXU{Aspf6WU~X5=lnZSm#6fzhUXLyPV{<5b%SqAU=y6$o}ugC=6#PGSeQUJk|cg7`u zZ0)~MpH{U%z^33bD5!t26qIbA@wfGc4`Lr|Zv5B?%vjZ@BlL#lT$1?_F zn4+L1rirGNnAf3>e+Gdc0tYI%UTnSSOkj8p&*XIZ7MKd_^Bo*7z^%m6doJDckWrZp z_9*rD(e*USNea);O_f^$Y>`u@-IVngpc@AzqeCcr;~(73-xfXnN%O`eB@GT56WAHr zyqJ|COhuzhVlJ?3{)Un3fa#ABA_4(OJnozQ{c8$wc_7V!5(jjd@|=*@k>TwVj!F6+ zqiR4nrr-M?YLZ%w*c<_|152hOFPoSNYe8u2h(sRjHPiv*B4=dRci+g#{Xa%v-BlZUJ;sDt zDa{hs-H5Aj5`)@G>zlv+CtvuyOupgIE;Nb&yS$cy_;NP317iLL^9e%ANT;Lyy@3_c zq{e;u#8EAuOVF@8-K6X9?i+yd&7PVn{q)R#%4MH5@{cXAd(XzNyg@bZuW>0}(2iVOUanB}6_wKQ>Nt&}fcI6BMUJq3aG*Ob zn-ti}WW59s?YAXQCCQ!%{ZN<;&BiB$4ZU}6;Bvl?N+`A7_uQiHLE*Yv`V}g?F|a#c z!V)TKFl2f{`H^@y>p?K9j89N7?FKc~OCeHWrrH72Dq{E8u_#x{vXutfsR4d7_Bp8Y6lm z8O3Ur_@S8vsl!u4o2^-w-*$JitHVMG@ZO}8`+NzzIiw<^+}x}BQGNP;HMogZ?i1ryp^?$OT7&=%=}i-Q_Z^5D}09|#J9m7c;BXT)7qleMz%PAm1psC=Z9tV)eZs{HPklmuk+sf7y( z<1|IY+*{R#f4;y3w7n|nou6%Cs2e!lo0u0+xd3RuSTDWRY(;U!tjk~394?iC#Dle) z^NM7Kv(oUS``UKNECvnDJBv6*Px!FGrmLlU8Ev|2BT6)UF7M{0n)t~@&tp~g#mt;f zH?ti3Hj82oXod4#U=KRA>5vK(X+jV2*0~x*-JNJXn~v-(;-O!xV{y97<`DE7i+w}N zLkq-qQc5D~%w!a98{KID10E=fT?u@cu&h4%vdv3x(oYvSL?Vn|6!Uk@UO^{MPt#uh zwO0dr@?RL;)8B4xpFqE7tHk6__;SUNGzf|n->_m8ZOa)MT8$oFp%T4*vBM6Pe{1_` ztHa^{1M)3Z7d~0n8s!slTi~59Hwx1&s)G*6R-Gg)RhzmkAOZ3vwTi7h=QST87@MgC zEp_)y1WvQ6?**_>q_I`BVukkViY9wJZau}Zf8PHTUldeLZS&MWG;>B~?ejbNQ_tl|s+dg9j$AnJOm%YPq1>38Qnb=B(y>-@ofHwDgt}$>gEJNuHql}^9UG0qPI!RuMjv=2 z_JjjdFadeCR*0!O-$)U|FC7r6i3~tn6rp7heG9Y_9kEJSRVfhV)qRDshSl=FPK@mG zSd*g)oV!^VOLL|T^nLr*|4r(>zTNa9P4Ij9?equ+RQe5!0VGkxRQF8({l&JQDco5T zz1=ib`RsnyZaI6cTACVZ9(PO7T2v)|c{9z=`*`TN+^sLGPhaV!bU!n@B7CJcHPH2>7+6w~!JnbvZXpt+aDKGQXEmSNm%wm5y86-9sS`(8=rx z(FA`?9?WOh@5WE(Ym_U##iUO>Lyr`6@mcY@TbMV-iIF1Uh-0kJK8d)PTdxOLNDU&mg(aM{$} zmljh}NBAWa4fslugFVh(=U5OsgKDYn&gV#a6-qQ>%DZ?c*^4AmcXznDGYERE)sT~? zBG&d7JlE{JT;;oKV1m*UIa!ohpe;vz;yYRcC!IX`M_ySGFz2Y1mbP|ODCfC**IBE| zYkmI4-=yRSzNTSec_{v|dg=&~_JoKLm}gg&SF!=8e|CLL&#gWTWUH*iFfQw+hacBcFwHaXJ!toiSL8V;<0sQyQ1bs>Xz zG)2E^#KqMq*%C1f+$-y)C@1MU&%Xhm7vh- zo%74via{UvU9G0znV^n=nP1(8+T3CDo%$LYAE|{4&iKhD0%m|hfBlh8H{h^C?!9y zPq*xcD*AX}Zn3Fyd4H?|mt`#``K__o>sO7}Vx9b`nRi2Yg$V_3it0_bE(lqii*qM*LU*ztx@CnNUrUBH&RTd`YwBirTz)5 z>_K@JhHKs@Up`lc*M65%B2Y#j-^MU4B&-@6i5f4l-!X<#+l zCYSrqb=c#t=AL{{0Ou`cQ*0HlNzh09valp95xj@Zj zZK6P4A(z^XZZwu|e=Kv)H>n|e;`d^2^oO=GGET2_Ubb#u&@9`59wt0n2g39mF^qzVObqyinB8>~b-3_syeMAYI_1KW}o#^74mUga?Kj0n!JH955{3Vq)jy6Z)l- zkerc{Zwz}fVhxf`L#FtBh8Y)_ez$$*7k1ZHfPl9_Ktp`o_?>apszxHP35 z(YEhuBq~~x;ns$vLedtTBr~ElOI*!wGPL!9!?L8TI6}GNY%_Hgn9aBn5JKR%lb-Q< z?ZBbI5-W2zqXR*R6!G`kAQyfTH`zF zH70K!OU=_dSLZzecYTzA_8y6l*mD4Ti|ZxHHiw}dlT+vii)E+$<}=;?{B1St6%7CK z9XGZUQ2?bgxp)M5PWEr<1`!dh*?hMRd?}hp6@toWTToZa1O#q^mSCo&9k0}qt z`RxBsu(iCERe0T zmlY$1e2?Hu5Bu_6yEn7;oZ76QBxfK%h;&P%khn;G{4Nv=VzU> z|5CgPG@puZhN!O*d*Le;AbI|GBbglg>ZFY3Dq~u6+%OS&pkN@QSSFQV6oE3LY z4GO$qLXC4YsL+iKF>m>P$JL0)8oKJfcXg1=J5W;H|E1KuwN;hGSL@ly#za@4crPB? z3o1Of6C=zY1)SCkK*HjKgMa5yW_2Td%R$z&xCq4A^&WP-m*ew#4$kb%He@HtPoj%= zc;1t~6~D#E&(BOtH8`c>((UW(=ju>~NSCnR)cfG>-=r_LDHYU)y5AkPWNrHDmAOc$ zjO1qPHHFO}`<^*D(e=mg^E*heD~QXL6lWi9P|rE7VnEq>ITa-~S5%yFzyd}U@I%oP z_^$p|#Kr}i0s7{Ml$WI2?MR}8?UZGztn2En8dQD1wC``mg6B9>x0GV89g_52T3*5& z92*)B`A|Rg@bzH;p^wpP^=IkL7cndKV%JgsgZ<}sONLuY{RT<(>6m+a8uiXKYUccU zNC3Aj*DVPoed)*r^}XaY28sT+V~NUg>xq$CHHtzwGDU)j(NU5{&(!pkX5*65ljH1< zE+hwWJIcw^_xzLrc4xzPmr?0{^X}vs8L$Ge$^`+hS|93cJIp25;8$;v8%udxs6MCjUNtT>fh)o-ooCr>PqWa+}B~n2#XlZ{JZupwKWjnj< zuRlxnn9oF;sY+=X&}C;pKil;g;+S^6&#v71!%lmGcf#L48O2vpPEnSS!!SGC@6W6+ zq-ACGctB;YtBlB3knSBCRV~PLQ*}If;Nq7>dgmF{SXn7cKIe3N+09Vq{kE)AidG|4yY+L>gcXz>w zk%PiHzUO!KN=%p;4x8K}m91+<7zhhDkSy?2+8=M18Q>5>P}2r|$+FE;saeCB{Q0nf z(+a)u>iijH0+?cd9+&BSPQc5icd>?pRKC-6E@R=~I!yIB(`g`l4pPoK2Ky3bu&RjK z)nd)b0k0QGqeOt;sjx;>CnfpMxSt)AZEylC4wB{-)PNfW$*%T9vf?KXmQ`4bV#um0 zb{R5WyBtjCNls$VRyvwZT0eBqSran^w6s3V*TzX_y?_@?8-9uMB&a{PuflO>>c}d^ zM*wIqt{l>(+KIs&T)+1Ec)NPML<~8ajZV-k5kaaP?8(fIt8Hr`ZJ5D9$%7Gl8o*Wr z?3o^w2h}HSauDd}`=|t2gb`bEx^FHVv9RJ7SXN|I3aY>BKC14;4q~@@`p)rSxbby- zJ3QdzLJ*J}8iLz5dd8Cwji6VXc6!Q(L?OuK2TDzZPbdyMH_Y6dMkz@&iv zsPrn-ii^E+3z7Vp&i?y?+Ay>6yLjek^QnV0cGxAr=%XZmqf>7e>i*8ke9UyVXB-lU zFa*5NFm0ZP8gsh-K6ZL7!K^>6xD3b0NXmOtqH7!2s|W8qZMX8LEpbe`JDi@lyJwsO zR<}0VJY^Um0^|wv&=Q&lFF2#7K@EIF=Ii|!Fg(A7d90medUOtG%~ni~49WgbNx5fr z12~MTs$!f4la-<4)kNsFmnCRAdZQDd-M@(u1N7Ub0W<>i`wvFW*5mFg{_RN&Q@`iSZ;Chv@p<=yOgNVu(IDcc;~(_C7rdZ_ z3QS>sSjSNI+Fgn*4lQjg6oICr!@8mA>CM`xG1q+^sMcWxJZ^9#GY2qKGCg1(vCcH6 zRq!fM<&;<%8RgP%a9SEI_ACv(%*YxaGXVu=vQy2g8|K}+o8?iWEfg-nANnPiS$Uyf zz7w-qT)Uu&NNLpm+^*^G>qbLFO+6;5X@XoJUk&twIzDfpwn|4uL_|hKyqUozdV!1k z;=+l5fHD9E`pZmE=zX9rQSeiw=4#1%ya*GFq`?_<|6NFIAXA$~Atg2O^B*h4;oyiR zVlJD^K+@HB3Eje?kgtFMLbDJza-Q)z4)9#(mLc33$#nv~{-$iuok+$tjasqAsy^Ou z-krA9U98cVglPsX;}=CLW9j+^ymyiDF3g*!$xTc^MtC_ zM^sU&pb(ahB1SCbBcs|%&pemV`de{~=!V`{RIet^)14v&Fwncx{odA5wX}{S1fgkR zK<417=cl4Wg)&25&I^d(LD|fnsSva-^OMzKo;p?Royp3z#~W!HTN->JV`EGG{33LS z$IjG0;F&EdZ}tayfKt2A}Mk;$d>)q8@0X6-XS~ikwU3Ew55T|V3A(bbae>h zPnx}{qNKLgvj32cBhhIP>8pWF3dSRpR`QZiDwwoPyRDg(DI|w%lK3Fn`I2ZPUk(PTCUcAtJQ9?`J@Go*u1lk`Woa?L27)i=mP$x@K6(n6 zL!p24YzZ*^6LgqyYN`8E9LBusHgO?aKeflYtyRWMqWdJlNwhjzR;OusU**5qCH z43;SR#ik;s4fA*sOdu&FP}|;I%ZZ%bCaFVWo?ASYvqKL$Jc}+24f3L@A6cV^CMT$7 zle(tD&V_Fn=1bUaTQ~F>JQrkxaVFRmg~)Lj<|^gz?_dSYMLU)_S?b|#!9m4oa(1qE z;^H9pz8ms8VK2J49Z2$j95P90hkh5EVVBu(+*eloyz|QCjA1iYoWz{2AEV%dTcR|b z=EoQ-l>O^GU(?7$4}n>a4)T-`PsMEDb|N0H;*ZX(^??yMG%9wqAeg0U6-{Vzf`fjd zWTv-tb3;o6n1nbTRXMr;#|3zS07>EFndL^a>`}jAs0!?KaB~e4P20P2krI+Pe!(EK zEgL&w1w#tVoYrTQwC}wY*P)>O!TN?vSV2L#;c6q~2aO7A)4>JvTxwAAA&7|N;Niih zE}biIgsaZgDD5O)+5%Yc?iK6jxr2&pMP9#u>;gqP#ZzRR^$U4+I@SE5G>7Y7CyhRn z5-gzKiA<~D;7bL(rw-8$4@Pr#dg98A^1w=oX;fV8391iEXjncuKW=rupsHeu(=oo? zHnV_ho=6LN|LQs9XgMsQA-rPn_f2QCB(Qe*-2;v^^jIeET)KF!aIX~;o=AroylyiM z%=t3YauSoGQK6!{yPSwn$Ftn?R8lalXPEzxOxgaWqpMN|lW&A9l@9{uhb$s9BDAwA zw4KY<#M~5hme`+Wp8k}GJ#_6%WFTqWeJ@39J<=ss>wp>1oq`D**@ zuL}C=4RA$i%Z1?#Cjv7);8-wekd;}a)*T(mU1^s$S?4k~XJGDS2ANtLDNW0O=#G)w z2@vAP_4?Ve$+{-}@sv@$c8ZLMQH6|QhEUOX9>>e=X$K>YkNEtqU7(Zn{;v)D`Oaug zNb2|f7V+<__yDl=oGev>ik*&1pX5@5qqQGnLR`3A&WoJ4)LPRXKcur*Hcyj?xY(=8 zk#0xgEKT%`%ym_}pFA3M{KK2Q0vN)vfY1TJ2jV}fpBj6;&l-LyurjoT^f87oKyI>M za5GQ-28vZ#atQ3ZkrSr^^IX^|9jf-Os3!XC_E{ty0SA>*b8g9WWErjvpIbsg5+xa; z5ds3YWZrTE-ynuIT0kl%BkP-C zwgO<0Y(ooB$fmk~pC~S{(yD?XySzL#3LT3~h`Sn{$9fgfg@Xtmm@caBZ~ioBKz74c zwW9Kx{~8sfO6gfSYWu0%xB6qu&jcAaFL{Ab=QPOUk(`kw#loF^XsxZ}${~UX2?&Ud zT=IPL_Tj!n54y*E`OjFI4b~O)BNgyhyZ2~kqi(f7QZuuFF`Z>zP>*WDJ~Db{KN05|6!EaAtFxm@QN&7DgKh+ z{)f{0Fg^Z>w7}BbFn=KA@gLVt_R}L(fcx3f?jk?@y~01nTk2P)omv>gaVE|C?J&QG zsO$j|uUp%bKX>EEIOE;Z8@F}0n*;OXMJ7O?=fPoJSl##Vose+B=SNPs+%$k8SA9O9 z^(Qh*iKqqlJOgJWA|oa6S;K~kM$*;nHT%@K)nqU~^B+@Gd2qRJG1r0vqdO(~58`Hf zO-kN2)tqvDmf+M#NOYsO@e6e%A*y_g;Nqa2k{lz@Q1!u2Yt{vVHfA|MZOL6>rc(J? z#b%K_BmEl@S3PrrI8f|EseIh9w*BLy~BEdiw3LO07j}Uh2X>?PoEWwW1f& zi7-HCESn|>hi#OxBE2!n!u*pKN6Gl+&mC|*PpmMzYU+_lHdqm1G1=MK>`^|WqB`o? z(^yNQ;G`P|S`Z+U+0I41cH9~6Sh$xAKmeX#Xh_Hg%r6sX$_b|Osw`#i$msXa)1Cq) zTwdR!&BJC`(0`E=PAmfDJ7PSaw?5mBxU}RM`ZHxf99cJ9H$33Bn@bgb+R3!?UY{vZ z`(!lM-EnKCK==)HgX79I8#1oK7H*Nwv&LN}oO8b8>v?WPt}4=pZzm!+0U|%(ABB@} z?&mO2$@}BJm9=ldk=gpA9WrmR7xy`x-=DADM|Sq^!O&NQYxD87UZW08jDVEZzIIeU0D5NTAw`1-f}&Pv+fFKS>N?&j(dpP|8u;pO_3CXu))@OqV2KG zBX49qSC^NbK2>MIVTOiAU%;kfJr9JRk9P{1ao-d9KdeOx9A9}B65>MY)6=1N%=r=6 zz+k}Kzzq9>O8b`s&~Bb|09E9sQZ9K=e+@u13TF+rGyLmskNcCkL)-Q3cGl0Mo4%S5 zGc4A7e8}iMhZM|qGI1uP=(1Va;MIkt?!YV?QLF{Gez1Q>2)Qn=nHeo8l4BC{IDGBb zPpt72pMm?>-7^s3rItawv<&x@2?&KYK{LLhuJG#0jZ0nqlSsR_pkE#?t$E7t5do15 zuigopg)4cO!_XTSFzt1fI~c@gjmIQ_GndLw0QRsuW9PZL(Mmf5>g$4faC{DpCOzHe zXl$>(B+Jw3s-Irx<(a?j9e`fs@XNQ`sKkuEH9kb7U7N{zc&O75u&EVH*Q%eLQ8 z@e`Z2nN51eddAc;hG6f??OH{@5wOET1GSoF**Viq9x~MYWK>59C()t3D#|(Ri_H*m z*kXf$i5WzT6Cw;ukM2H@O!zbx-@`$^q+jIcTlntpsmyYsc|fOT-Y_|->l~7t_qqjI zH`VJ1c>BfRw2w~|l+-x+n{;pd9-!vAa?om#9~lLn0A;4@yFer$L&7h3Fw2mdUupsa z33~+`@TTc81NJixHg40YcfqJ^T}jC^h@9L@zihg8hD#Ce#p~A$O;zBCr6D~{&V7Oh zmw(|R;*kNg7#tGj;_iLFVD~~tH1NRNl>{P(57*F~^BJViZ4S<1IUOHMUrP>rLgI7( zO(M^Bt&@cFeMT0ykIZRF1pWg-&Gl~^7fTaUAuHJ+V%|A>(K724S4WW%py15CfcO$?j;9+N{ z5HzXD4=JkvDwsmmP2*|6Cs31xM8~^BBBHaJuVlH++uO{O%3X&JHc| z($4LbtN+69;PCFFSyK(xJz`;#yb9LFq*l_B#_!m#}cmpE)KDTE+RCDnnu9#t|A`!iNb^~tFBv40;{#?W9Fa0P**TYwP?|8&jRr|zQ8XEu&}(X3VlvV`V$rA2 z5eCMdkS`jDPQ8Ji4td~6vDW}DrJ}5!@ZJbLlhg6yfjtz*>mmRFEdE-%a z8MWP(r@Qhvb8GEQ3n{sr9a8Vgocvi%Pa8Al&nv2?ju%tH(w`CBD)4(SGji7!+Z;<+ zlA`l#t$*kx454-EPbPV9W>=Ky<+`@>*){@X0@$}D3z{it~rt0&|F~O>rFJHEt z11*WTM4qCw*ILYkvhr$`X6r@DRH6-s$DnFlW3ihk)_eCA8zbvlw}aM#g3v?kn*}1D zjcWFKuZYQ$lT9-PTMB;9e}~Wc+r(ia$qM_o&AYI=D6Nr74y#=`VHcs|8e&L@h9=zS za(kSUV>nwm^O*C#_O_pwi^0KhofTR4xdtPD_*|Rtyv?-eVR8?vQ*}`MoLC1^8z=AOanL(s9Gi+gFf;zvS-N8E`1wl zx@IDJe&T*`6JJ?ddoI{)y0G9D*k+{M8f@y}-rV0eU{G^r<+hRJ7pq9lUl(0S5!kwP z=nkWM^8|=2y~$}lJjV?CmLzIJ_qmJDe(N0wfO_TRA0hq*bx22{7&+1B_F1#Xh%Et6 zpTjLcJQby?8Z!{z6QjijK@yM2ks;|k2DV0n`~A*0Q*VVR4K&t|@n`k*$aCL$8)XP- zeEe-vQ!7f3_NmPTJ>b(|=YbLBK*QmBT6Ib8OFkMQcc)GC10j+7#c>MwwBi$F5dQhj zSa6Xh_Mt#XK0ZyazbD1y=M*AARLjd@SoZ_-dL3#WjR=sREzw+9RtQa6#;1^=xv)8Q zv)(w-YLarE}bstFqARbfxTYlJkkB&yU)~SHs=&rdCu=F6F|$)nB^y z_xFT`gsqlLmIk9sprAbVR12h;xY_qY6p>pEla~{6Ih?KAj~UA4VvL?{t6#1yh^335 z#Drq)=75}&c)F7Jw8wSDG2ONzrSRF{CLT^|fT^k3wc8$t5y*^)H*I&OBM5t;EYz^4 zne7|iqChRJ2PHsj0eX@c_vC12bESpdnsECque@AL|84fpvZq$6$bZ?zfIOxZ(Z!~JEpwyq@0ibT|V=<-n4ho7nf|5Rv;O! zXM^HMNqF5{MZ7MD1D<}o6n|vMmeNOjUQ4eGhQRVK5Yx;3?S9GQvK&_$8cvDekM4K- zgAL!@mO+g%9X4$?ay8CVg`ajnYs3mnoV!nG>BECf%D!cYVfuWIzjiG^bNQhBBe^u# zpeF|N`sTQ{Tn7+lvBT+G-xj}XN*H2!uQcOY8oysXSJULwT@ga3ohfjJ1Dr*1vo zr%Ewbm6arMx+H{+1zM^~MhJTHnD@oVdkP4&qGB`FlMsUg8iq~Rg2qjZd3_gEMtSWy z-vcbfW+uysoiEPOUfuX$mwe9K94cPd3k?yv2KAIA2Ffpg8mC7@9Xo2^Fg3F)=D`Hk z2k%k}XBGQ&S`1$mi;LSfI-CL?HT!iTJ!L>($X}zrO94{GXc@X#PU4fKPeQ;srmQ-j zyB6Ok9Cax@T`{$;whnu1PJ{C@rehU*cS1BxcA~(|HWeM4lK0<8y`kFQM!3#YR4MV} z_JAKB@gz`U3Zvp8$??6FH8eVgisECv5?g-1wK^LhO@6YFwOVIKe?@Y)sCImN1AWR%Y!{tZoxq! zsBjs50W2_--n#JeTrFmz>a;5w4KvBA%DcE=c{FTZyVh&X2uVv%8+=&J(S>&}W2&cM zl1^9M{+Mz?pyuXv>qsU;3^rN#Hs$KBuaHc`SPNuS-coL4DCKv@5FN^@+gt&?X=fJ+ zEK-#-^-8+fjDe;7k=of0J*1v>bqT6@mU>R~>(QaH-oAnfeXTP!m6prn`A6MA1&M0E zcx@=Z@&l?xWblut{NHrxMZIx}vxB^`-CLcE)+jRTF)io9!;Zu-S`e_@M46VUF5l&GHs zt#bJ3@R~Utmt^r0=?lrSy-ZqLXmqnWcf4jyXAA3CZF}*e(}ZJufr*9t2m@2Uqa&P> zLkOrXy}ZaM{V@av&AXvdKI|KKRTo{yQ~S4>JcO@|m35I0*CBMVG+BBCyW?L$WH}}v z=l|3)Hy6Kqhf?_3T052P$${ohZKG$@s!owX?Zr_Wb#c|D*wUv=)YC~_JNg`!Wx6R6 zGA6ZrRCEV2Rz2dGJg3(M<4#_u&!{fX{wlLZ@&BnemZUe6^Qp|xBa7%z{6kczeR#+M zD&pGjJ3 zS5zKwmvp*MM)O^7XV|Hc8LFv9Wd!3dFBPiB1fl2hy4p-^g)AIjBBgT-$7Raa)$OiR zuO#TA@@yRy~S z;{yW*ibFqrAq|XJ7xfcK()};+&ibhHAIkY~uvy}QT~(fffF6gJ@Io>8f7nkT`YX#V zbAK(>=K#0)4=BoYbgA|{n3*!@X!LNpo!2{(l+>vwz$6;bI%|Z{6*?paR`0$aj8AQ7 zGb~rXyONa?`;=KYw{PWl6)`zpB;$Kc2sI@NimptJ46YA!I(k_pMu#>fmuB6>2a?(r z^>tuTG+7?EN1PYF!Fm)bqn3M+TFm~QyKy)9zXmB)jw&PWjQ0K>DXc8`ygVr4gFwwm z-!V9-1Xs7ysSp2kurgNgIY&{wda4U^O~cu0I{`=9&Qjv)dtMau9;gbsR`K|ePb$X5 zUjG;!Zlm3Bv>!u~l2b6^AlYM?qcJwlClku2cXyV^lgZnCsl>84WH0*aKX?olUw6@v z+d2}@VR^#K6g!Y2Nyh zm)`pL6zfjFyF~rpiS=B9LJsQgJSN0N>N8fHD1&_C=;BJjU$Nc!3@RzFy0h5Ci6ZPR zh>n$*HtjW9m7=x$H0Vm5`!yFo?8ciHM!gThg;8qjZ$s(-lC8Cc}3-5ik3f5S-RzY_& z>4e>|^ROEp7m3d4)QERB841d#N?)Cjo^;Su3R2&f) zxv1Mto2M1$6c?=TE^Y2E6$>SRC6;)$C z)(zBD-1cYH@UoICT{@3*ns={ck3(3ov1Qj`H4H@g_r&=5j}o7&0aIVN99#wABhsH! zylAm>gfHTmhvp|TWX?@($WHq;Vd z5Ze?l5-I_22nzX?WlF}xRK3PhwYQ*CrKBM#smb^&tmVJqc{l+?SeTQ%NDsUFr`OKM ztmwnYT~_y!IW<^awpTbER&q(X#Pgg#g|@vYZWI;@JHZ0m0FxI)EzH^Td%UV7 zD?lL!!9PUFuVIAX^KV_D}xmLrS4G z842+$rq67)X-~tSKeIQw0?F*T8mR?tb`xn@A9E{`1L+gnV!E?dZMEVP-43kl*EgO) z2j{2BT#hGK6gtr|rsDEL78MA>o~L_j%_r+FbKc%nMfz^XOP@O@C-?odW#KAgmcWKD zeaM`d&bUj%325>wJ~DtH?8Md&r2#ZgL#59x_9>o{>3!A*xhzXAd>Ki<`x~>B@t^DC;Z?19>2*^6ee&{tT4%;G z(=&g6u7Dl6QCc1WqKjhBQfvn6dTV>Do$iH*?^y*3OQ4X~bg@^&Nd1|&cPMpG&X3|0 zNpaT$OR_=u_WAY%U>L%NVTm!eb#(#@MS8T+T`Kd9J~uBKB#A`*s0=vq@F-(}Q4TPc z*9=n9Oo)m1II(_GYd)11e>&riN{{c(-%l2W=T$gUc;}Cw zYf>_&B)w~2v!}yBXuO{k;n#RIUnuq?&cD4p&$3D>js^c~Rx|hNp(kIR^(ODTnWtmO zZ4FU@RmK;()`Zu~ys$j6bQq)MHthx%DfCh;^@u&F7e!`ARu>L(|y z1i#lUn^?t0r4}ox*Ca>F!Dapt&1~=n@5GuE+Wq{?7OC+{>+!SEcPqg%8VmJf8y&tq zS`OcRDvWx6(fq>RT-0y*|*n!}`Z zaK#_3L0S%m#QxkK_bnvC!G`T}cHJ-0brBHTzQ*O5X?H%J%3E7rb5O=$&6Gzq*!5m9; z4_0lR3yGpnOE%|`?4#*$M9@gPP^Ki(k(x#;C5jGY;&eYLli}Gvh}el{@ld1d|KkGK z{_0t^Cy}>9M&i~r3f6oP9YkyNR%{v&vx;m`3pjW$cjdJS9v?TxC9o>1Y00U(%-hemS!x za?OK#)}yz^P-k~vxU}cUpWk_Pn5x?Y(pBU4 z&HU+A)&uR_l4+eV?lwcBrF(X`v!x^?u+nmLCd#_N<&62^j8me0m=-TM@>B{PZPv1O zUq8v`2DaE3a21tR2Iu>=ciym00#=Xz_Z4K9!E1orFr{;N?$7UaM_UI>iw#KBxP=eN^mH zPIi(~8%#)Q#qo#Shl~PDh=sY3H;lqSvKcWzDQcnvZfc-WEv_-31~1cmW~P+a@jUh1 z)naI1Y}eZwA3BKZ9V{mF+Pe@}?VIQ~RFXZXvejq2-cf8s5%EhUB&RB5m=d)9RhjbU zzSVC`MPrLw&R+sWOi6k%JuZ` z@cLjxTt6egm!-WPzx}s7=GvL01xgz5Wxf>i+5K73`e>YUSMowwFtqD^H-RH6S-p?w zZH9V*Ma31z(;WrtiimPd$b^t6)PzG-PZ)}uE7uqtIaqy@Q>~aFb_>Hnb@#+NIH4)V zb1IuKxcT1eH9584;Kh_#GB`d-48`D3jF(3XdTd+B91VS!TyX)zXUD3C0%1l_urE5Y zvFKw!IVl0O>n6p-0{=qKh@J(A5XQ!q+g(ha;@GZ*%Jj@#wdc&--*`&(?1*$4z7m+` z8rf-_m>Y7rTjivxCP_}Lw7aNrIkycWaFk!#oG9)OPfXEa^o~5lhOTNVoL_OQ$-a25 zexG#yu6QZDE=PD^I5wZN(WbE z=05u9gBsA}Ns^i{JYE=WH{;6xVQ}_ug4jUTl(}-(x8lY1tJl$#EZP#ZfA{%Z zi6IyWR#ez<-{*-Pa`9VSE*e7LBNMlcY~O&>+g~RA+vbX3b`+b|u7_p!uqr*8m>y%a zt3fk1w8y4%>0pH!P6BfKxb0novuwx=zC1Emh|UC25DKI+h24+ z3YmfE0dN5!)@YeW{#CYxZbjPX4!81NZprm7Z(riNkP1JBF2t5TKhNpCw<>EPill!s zm^*5y!;9n(OHWf~@D(j&)##XjU$SL(%o|jd?ci@HPV<0@yR5Z!AFms!2||{)^9=~l zC+e3xv_N6|%&sx=hsQq~WX<(q8DjhOK(Z*hBOBcZ$ zZkMSL9VRrbsmXG>&HrqpGrQ?6O11NZnG-Hy;l;vfC{p-MrQc*tuvvHrfg|?kr(CYn zpP0;4LovEK2L8Sqd^s9F-?S_|9U$mJ~yAex2inaOc$>&Z4p1wWmqo9Qmugk0mqb8zO%&>=z!QACI$SvUL2 zg=~GKRtjdBog=z`@Ns&RQVh)pp-mX+nt zJ6~^&(8lWw(iQ-<0;1s1#c@ZaGWua6&dxJG-O6P*>_k;YRsvaCMT2|JD4U_LE}%C@ zEi0v%=};}qBJ!+xvv+$meh@K6=f|PV=1ZSW|2Z7q9k zRbj4PHllS1f9**2Y#?dZ(Cq#;4^L556_jg7UENkBNWfWkMkeM*Pj+s^5B9lRWZ;r2E})pXws_-I{4w$E z-lGoj;>R0_EQ@~k`xND*Q~*r`5k+C1Ir7Chl{#X}ZO&5S*=|$SI`tPZ=^kJ$#D5VL zh983;CCveK5?~+(0i_1ZJzLF&3NJ~j2do?{d0DK}(@p`7+N8G8X|xgv;4AjX=So;E zXhzhSN9#yH*hXuRf!E3kqIPpZ@%ISC={>+XsIZGs)^z7$4q&#nHI%kR@OiQFL#`-o zBp37QWX5+{AfgS?f3!hJm?vkprwd<(@UzJJ;$3U``o^74Ec7pm%oZehi8wAcQtp4X znsQVJ%-##1h(JQOp21SAUK+ZieZNf`B(Ej+RmuXqA^TTcd(*vL0X?B{=X3tg>&uY6 zeR!@{Hu9ndC~w_0SX4k8a_ zuZG!MGsOX7?(9g3Z&;7JT>fy>dbfw{g94bQM1H}R9L}(-V&S6hFvx7hWJ*gL!Cx#d zO^E>rhg2i1%l>^9jGnX3BFFTy=1?Htjtr+(rSft*dP>-f-JD9KNN%dpX}5ETpwj-Z z&FPCaoGysuPT01i!L_{V5+rT*6;qM@RJYdi)VR7@;ry8fVoK8qTUFsdQQ99`uEpv5_k)5nax$k{7 zDWh?(=kQd^sAUZ;Yq+K%iHA_V>IyiwdutY#a-Orx zc%uKZd>y90ez6I-t+&4le~C1~l^D+{XGOiPddt{OIA}6*YjQPSM?`D~1_VmOhg0T| z82!WpL>Nweu0j@gQ!i}lRq`H(y1Tr%@D>%lADLi9wYe?Nkc2U+6?|+oE}k9s%up-- zNru4s?^u%M!u~Ptn`Q5lw7k)X-v#GF@A13i6%ntA7qjWtBy2k2d?v-{Mk{2p>`nOH{dfy9 zr66G9*U@}@VqK6IrKV#2cNw9DR}yC^w<65A{Yac9ShwGhV+{G}tw`(8sI$xj5Q~0y z+zAdj8T=!xSXNg@R|NlXg?@_UB!oo;>u;fOT95htak7a79Zg?eb2KQ)6L-zT78^1h zc#uV4Thd%PHvTby@H(O`T&HH%sYBw6cBPa3d-JQA;EJ~$6Pec-* zgg&r59^j!&7I6M0^iA-5pM;pW;@lDwLPSXY{ocH6VY}K+fX69!nabX3;@H+Xf7=O)>Lkq z%vc{U*DFZSF;)s32f7&58cAL}M+_) zCw@L&G`^Rs_%LKnSm!B-5+-nYWxDWI5FxEL@6z#p{>r-ld!`qcpg6C39P}Kfrcq?j z<9@Ht7_~RwTx}W}L)YF8@<~NX(Cg|VUzNO*e+xaw+45Ir1D=k^?$dv}Qppj{Y}e-i zH=tp@)M`D;0k3mA_UY4*<^d)}pG437p|?kM6%{Alrv+RBdWGt$5U49(R}fiY`KV-W z@;=w%a<0DOOn+BKR-CGNBXK2byV~}sX0{$@Z^7qaKn4fcaZJDq&KEkq)4+b%@!s8V zF@9oW-sN#P`R=b@bcT)bMU43e)N-HgNBfe%yV3KJ*74Q++k~9Xr;FQOINXO%7r_MC z6>{jE@7|j5sV7p5H?=fDgOF~JP%cn^U3e|iMr$WW-r05xy+xh4$AB6I+#1hc2rb!c zT_=(EX)mahx~ne+@@UD?X_YhUVD^k1i<(3*Rp0l2-~c4F+Xlg+_-3gW(a5ZE<(7Mh z!7vE~nT>+jc9hlXZ$+|Nv~2|gsh2)~OiFcKdFj?}Ld~pEoCZ$fgSE7xTyLiaMwrsX znIxT#RhQBcYzwJq+Z+1^wo@j$yJmG``z~E}kUvqQLDAZ96+Gl8raG*Q1U5~s4CT2S z=jf_`qHvv%y`!}$qEqO;OSvj0#($6IzVH0a+Lx%fxupnKN`ceafi)JA>R10E+=?}+ z5f882d*hXl5IxSb6WaJAXF`{~`KfvKgO$MeUdPJrq0Tr&eA4LQ-|Z~4V-8z=_caEnZB~))Y*{{btj1ao+DdeaaA3JI~*RjV+KB2mMOt-c^FYm$GGgBR1 zOB>pMF<(4!7poYFaRjx9X($GE)g97_h_L0;MCbqJKnz%HZDWl<%_7Xg$)w5{h45Ne>}J=?%|nRt@~6_v6~|gY{Sc>7 zF7~IiWzj}#IgTALUN-JJijeg0vXVrV1h1onB*envVz<>RZpzq+Y7ILSP^D$YmNd}m zjRVcN-o42g3B(~`j0pm6&3Wnt2-G|x*wD16r_1T?4b49_O?OSVW?OyAl!WhSpWF{F z(%;e8tZ$yS`TFG^UhLMdCNK;V?ag{$+~gf)ltoDjLTF*`hm1Vh)VK&Oa4$FY`_i$M z{e4rQ()sP=v?m-Q`iWnhQf+VlTG7T?%!;Gj>Fl=R_wV+z2xCb)pXyu~GYy&;T>U9X z-CBN8$y3SudcMUJ)icp+uwuRN&D*lIT6Uz2(}tPZmV!?v23&*DJ${>T(6j2nx|p!h zH{esx6Pzz^;^RLWqh6r)>YOhpmniXsR-PrcRW6J%3KCFOW!B=?}1Sl=@R>{|s%s0ImDjuJ$XT82oYEGLd z<~gV0na>o4@TLET7Nt;a5ADTDR&y&(kr9Wv+6g|}2!iFsdG1~G|NdzEfzViiLU+cg z#XaIIN57eCVn~>fFP<%0$TyZ_b+&XgLkuN)e4=s{To%uSaq1I@>+gQEl;wSX-X2O2 z^8D!lWuv?WMjl(R(LB1@1@*3M?QNR+bXV_yTUlkn`17ae4!b%U+}liv5Ye%0-Ni-B z&!4)D9-noQ8ukxW)eG8+YARplzPHl7-F=?TG`?l4J z*N&^anjUYlOr#d&!a>vAXc&M5$Zyb)5lN%7GYc{qD#}ZD=Q7vB1gm$ft!-?q2a-h1 ztc>60jMQCU#_AxE;}McId;HLzh>ny z)J&1)xh^^RO{1W2aL6Q?vt>twRf3k*{r&`&-i(I^6GG9OT;PyAo}HcApa!HUD{)nB z-#iJ>O$XXh75CFwi^kE;H?E##1=7*jM>Zz&_$w!6PUFDe@mXQ%bcMvsGjsXzVT_4Q zSkK5trz0)JoN)TE+ws<)ry%H*r1^nt&}eOINl1Ygb;Y9wSHVQ~c3c6eSVVuF&=|0? z>2k6H0s=`%Nk5pGE!25|?0bpbfd1F7U!lQfMT4@uL^s(u@iy z_w_ZNAG{%=GWZZ5k%-`X*RPLtl$;1qcQ_O~)|%sVt{{R6d@hd1LgO>rdnrU2=ok*y_54`l zxWv~p_Z3Mr2 z08ak5^ZmD}0X-(e3iA|MDx0;T>!uv>O-;U1?wSQLwrhZSo_J0vjOInEpzkMy_!v5; z0=`_#9NgTd?C}XFaX*tHabuq->K{My=1F9U>WWlV5fT_MNJ3)tj>LJZebxhRT z)Mxz5_{(dTv1~+u@dy&a#`Ga4l;O#My%g|tyBH|Ud0OYauW%kNg7L-3->)S;aiWTf z|Mipi*6)#_w`;xKom~k+&VN5it3I^YtT?lZf}a{c*er~a=?R+IuM7Q`jFpuYv#uA5 z2lGDK0=4G#yr3hVSc?63u3epN>A`e={!Drd?Gg*Ya_!c7Mdj*@)QOO$}{Tt9wRZ+4t4)57?GRsoQOAaeE<^;ZF zjZ2wM{-D3XGP7c`qKrL1%stH<{H}d%nl7=sE`BfTlj_T~@)Y{EHPZZ+ECQfXl-Dky ztcvuE&wTF`3)->B#m0Yjn}+&n<+LtUI=ilwOq#tdzOA*iaYCgBH{GnBs++piYXU5v zRsO)fA5ygBJd!gXM;S_Ce+p}QgizjQ!^$?~w>iJU@&*kTy&VG*xMcO_fKJAYviZm8 zqLiw)xnHwS*8-GSI9|Ql*jaXBy)e>I90-h{!rGWI2s}45W<*IAaojin_l(PHmyxld z;IIg|N*=h8%$t3BjzLMLPO6YDIxCppj45!Ki?D{ythza z{Gq8LJ>9VOXXOsSNhW8e0!6(foubYtawoi~<7!*b^_jodQ#;-bkck4T40TK1 zBkkYDrSCYjMr8frx;*t6^#YG$-oec+(M#m=7TGJklQ_hr>XRPJCwxEzTYttw2F{|9 z|JeyY0L8#$c&rZW3NtcjL{jfxu9W5l=h3MWgtjRf2+4X!jkY$|7lns|+EX;Z&}waM z#QGw}@3qv>n5<_;Wl*b|5*uq~X(X1eB75O2iz(}v#6!<}zW4ch8BsC^o+JKF-1TJd zHIEKV*L$&ZsqFB(6^NYRG9I^U@_^)^7;&dzr_0O9ed`|ktL*6L*mZwFrwH7r+{`EL zoc!c-(UtOGe^j2X?)!Y^baGN%Fl!j-n)ZGlVa16`u@?v{2^v`N*}ABdJoigF4yz58 zW;gh*`hCFEsU4eG4nCC4W-#4VKKDm@Eh12oT z-fVNnsv`&<=_69Xr_RH38bd;WJf7{|79(M3w9MGbAzlC+uH$NL%n{!ouHfnE2`#QJ zZH{M{f;~sqn>gS47|!>>`K|ZGxK}LO2MmmW;PrgaL-Wi9e>5a^~(h7U}SxO zg@t9ttMZY*1Gpd0mWS&8lckw}bhNZlu&JbD;^GsQ@XcYyI@o)HjxB5+dj)!7f*C$PS^#sS49JMz`2G>rQ$2wRW@Ya#d&1EYaTLfqs z6`N$Xv19x#>Zkqr1WwzGD!~&icWc+Yhura2f(-m$8Iznpmewy_X$!q}RnaG3<(bzd z(V|BHO@bjJcH!?ley_9hO#;7#V2EXllfQD~pi=(>ulZ7J9kP-Y7D6R{kduG;y7U+P z7=61r>5sPPiHaMt+zl?(j|xH~X6QF;r|g;1l}psGlM z>npL_K%Wolg!*R}du;nkoTdlEHzh6g>lofkZOAb z|5O(&Q!hin@e%fEicJg+syZS2WBRIsLVRwCBOb5;#(_ilLtX2@*q`58Kys`>UhQS{ zboeS}H$$&tPrqy7`@}{^0iEfBk5WvmO8H|3e5^K%xUp-o7}JR}mV!@!nCw#?r>0Qp zTU zZ*rG#rT+@``|Wp+C@GW`-t0_W`L`O)#OVxtUKwlYpuXh0KWg&IO_4j5ctESUoN z`x#~G6Y-!I|ME?~0lGlpIgsh9#z2~WI2FYRh7=IJ{|(HgE}$j%19sq<#e|6cNv(I- z|KkE2dPetoKHi;1T{S5WdY3NI(<@CYc|F zy^bGIg}+@a(bAc?d8falbQapg2v)QwHI@>2tFeZfgojpEkhrJ4nryG?+f9PUC!8Sv%D7qK6pdM#+%E(o)|(x0v3P0;SG880itSJR=48FT+#mBY1XjINq13ZT5@JH#>zln~(2362x zSR9?FC8v@hQ&`4ceUb5T?6Jq0^;rGqhbZtw+9ejk*%qZvlhru7TK+vo%2ngg7Eu*5 zj*s!B$IvR9seI~JpJc}rfeRyNquB`Hk@vcJ4?zJNdpR(o!TGp7Jx$dl zdBImVb1Ju-@l8`u2ryn3*T1iG9Q!>&?{wrC>n&Uzz&6?BmkJ2Mpt<9Ko+LBS6(Xx( zZ?X0_jW>O{M>+Fna%z;$PlL8rZEkHozMORv+6H;RqbSf=KVQLLTPGsYs22QhYEl(s zM)0i{>GOjsy0wn7&js9PbBb07{^SUhyyr}1_HCcUd8tI)DK7_3)<7?Ji?kV*0ye}M zz)2a>hb>GHb)%{2!^y|m>fgpAc3^9@EwU0!tqQGXp!vD+nTz>_BgoESf5-)#VPB zt2@c56lK-Nb>1}cR>6e^b777+S^3BwCp+<(W&__9FI|pECd}J%#GuwfOn(b*i(i1p%@D|Gwi? zOYcR?8BdkMS>G_nuo`1@ZLo!r%#lGL4x)eg=T;3oI-m1nf#UH()RPU5v#nK9E?ZEk zufhQC+)b&1_eZ-rUg1>SgCh%vBUhspTpE%&qZMw@;{5FHNl_#8It54_3XrqDNtc4- zMvU)Sa-+$98N(VL?{-}O8fN$gx!_l}FEa4R z`qvuvv10JypV|UTNYPP_*KZ0dqT*BcO{_GSc!WF*YFoI^s32l4l-NF-4Jv%_f!q$3 zpQuN{A3#sjWLzra6JnK|c{4^1fC#WQ3ZMQAd56m$(E(R^wGURyD6tX)e%cV^uaJY} zuSrMH^P>F<1?z-t9)*Mpd^>C*cPxMBlXtvIc0uOnhv+T6J*3r$bK_gmAH;aw>|ISu z#D(;S;7$9x4(x9hC*Lm=A*RRR$?`D-lKWTfWsu?1*jaS{%i@Z}rorCjjA$~)fT{%0 znk~d+iJakFMCI0=kL>^PEJZ?9;9zIuI|JmoTL>89W84&!#hNdvNk<+0KuQC2C^vnK3s!QeacVFitM7$Bp z!5MtgOdsyUm&_0K2i%KjTReneK$s}+DXFowJP&9Xk*1^ z1v8L$r>y_|3+WHwH7Y(w`&0}=i^kxlYee%gM1J$qUnzGKH@YlNYzWSIviVpBN&53D z27heWaVqE+ZeJAwGw9IR6}n$8|0yKPDbfca z>`H{<^XFCMlVq_;S#!DIgVMhux_y+`pfZB1%sitG=#F|BEx_enjR=7%FK{vHV`8=j z4$X<>Oi)st>*e%kF9F?@#By12Md4s~0?JFv_ve(XedL{yGwBhs$T!NjD0k~jUnLtJ zN4SsW6c{kYu2qg|Ti{S9tbmK0D#dnzZ-07>v1jN<`(9qpy{b)D#SZ zK0ZT|s7z7gs=H@ro3Fh*m>Magr6~>SSXG1h$=$!95N?DPkLG58d%&E4^NVtWCMA1b zA!O+4+O2qHwSS?G()+wBIhr6IBElzPSvV@tWIVK-ny%FSfS{-^U-uTlA+(Bsz7LxU&+;ry%LkQxjCi zCorWUbONF*M~p^dcbPP`LoKz;Ybs72hE32dYQ_88V^x_su`-48E=Rbt)+O5~s zr3+?+J8e{#7W0}N>RC*oot0s&`?TDVcG33*zbj;@NYwqw(a|F<^DMg-A`C(s%^4uc z60ZyH5OBw-+@{-^dM~J@Jh!uhEj8Na;IPMRRi+(_@+-&K>#ckUDn{bW|4xn$hAk4RqI?U%c7h69!c~2#b22o)^bCdIFcz+B!%r z1-YG)ONQliic5|)&=VjudmN-;pqTvIh#g_k(7bbdGVZecgP#JGvTFN_pY7DY5}z$} zx4wGx=GjI!gPJFfr8mWfB6{Z6P1vqI_3v#FR_5&dw9dIWj26Di zvydls;R>f z7X=fto6m0YNX)-1jS3`+hoYuytCu*Ys8CZcSow=fHk|4rz$~_S3icSlX0((U{Ni-$ zbw2c>#T!9%;}5^8aa0+4iFV<9lUeLq2MHei@uM3()U#%v^YEUfucCf2QL&hi#8(Lu zMDqJJdGKaDq>k_C_AohT@b3|N1sc4?ppA+3Pi$bdS$@UNzxsX~nfsdf^DC;8d=c!~ zxC6dffGX)W_#7*2EQ2g$umA6;z%U`d<0}B)BT&<^KZW{r>t!;Bz#zhBRt%qqUf%3V z;=CgM);97Xa=GP0JDo$9U4o#%?b$7cd{6McO0!;bc-s}dgRsXXE@Z7!TNh;Dc-CGS zB1Sr#8B2#m-}uc}uV?Oo*}jGFfa9jrlCB4B&6 zp#2Hy$9bAn^7ITc2H8TsS3ntaDcF^dpNs^Q7-S*nP2PLGpvD2-X1(2MsLwlk|3pD# zy5u+IK^L=b;ulT_%Xw^{sQ5_Sn_c4z>=WSQU{^zJy!YG*@5R7=Lgl%#au*dK4tgiX z5|4Tx+XM1lltnz}+zpToUAid7ADG$j?53hD~p{Uo#D>=@U~@JYr&ceCJHa%rGy0p zen(e6jAScIL)`lntSBJ`ega&txYIZ&^ zQzX%JG9PtYs-f~mxjSmUkciYuTiCJ+mbOYElpaXjTMSdLNG-7VqM$4-+?`1atEW+= z__)t1lBJ07D`7Cb-W*z7ENd=G4D8PSmdKaasdLFqPj3bthktXE#T^q95h8xXZeF{O ze$NwHux~SWxS^5VVcPG>U8Q=iyFmk)+|4^`;rjrCo~jVWLP1=v!JIkx+EuSb)PBWBi=A!CjP@wTnFCC)=|~wP!D_(h}A=# zL}MppcCNSiPYY^o$jI8uCHs2m$VqpeI^b9DxP*JW`(A6KbJ4tJZH@W1G^v2SYkHH= zB+~&O#IfgROInk*`?Yg7!@FHxtIRL-EL<#G%dYx-Zk5*aLzI^={c8$@3hn0NgI>8!EZVqD0kD<<2)pt#nM^V)W3x2)ShynQ2`~?s({VK&`1-9v+02+0)Zs&o^DQ zipAgMDCF~zkjPM=)e66jJ>A`q+fVb8uY4bfhO;Czs=9920Ip;Ald5~0w`7ri6S7wO zC{{>-rdo-RlG@A%x4CCC=BraYRGcZTD+_!_1vM3GPE#t?=lpNUo;C-2r^OOynHVxf z|Ma|(D|I@0acvOzi#DKpt_^WgsnLmz4ZGPc_~ooV6L|{|&f6?4kv7t!1@;@pF|>k}Pb}fkmyZR& z*}bQjDX(9DU0LOEb7`LW9d0C`cHB)0gf1Ix7eKH@lQQXhGShKOaG*;l@ zr<8?#{o3Vw6=)YQOc?S##U%+_55RgZwZ^)Y+$H8KnXlO8cHQwKx2UIATA?f3>>2ZE zD5I4&-!qWuBP_O<;Q4uR>d$!Z;C%IB>gcTF3u!IBI^V?)+w%q$aqbiEaq;7))HP;i zr=oO0Ud+tR1)%rUP`N6pvX(ob-MPwUqOR7$VsoQNJDGQy3(QJ{Gdu+?_Jb4PKC(^H zDBADh5P|qM6rcNfL=;ENgfd5#X<-EkJE{Oo%>ChDX`cgsKX(t;cgbuvARkJ$%2^=I zifjL>cdQHERia5^wFl_!9IM>bIrsJt{)n^IUE_Mpx4a}CiDUd~HuHVV?@Xr~xB+?7 z3hq&p0nO{8dd&h-$UH{shnxrR^L?G~Xe6!GZ`9+&IMfj8bCpkIeeB0?ABqR*=1>)Q7YtRpNfdAr&ZGhWBAOnq!iCLw= zVwyLnb+O0(kKAx0BSZQEm?=B4pR}>VhY>|ZTr?4XIyQq9Lm&?ZLj-avVnU(of7Bhg z?oV74&3k}BNbu&Z-6lkw;R5$A9`&0vicn)fjiqY*0)?(1*ibp8Tk^@o*(ny5^9D$n zXHkQu3fUaE`N|(|oc*|oKaW{6p%M}3kq%QF{n*Y>?XrKRtBE(GWRMjm^8!5<+5^w;SAZ+u!u+Nj!pGV@ z0)*ccG0K%0N4=tgG^AT+$7*&2-`Z0pYX-?_}zmd9WFpy0xId6(U}2xl?CNp zzZUi%k~yl4dj!QWQX7fL-TPNhxUTkkuOlq1E$w%fy?7mhrv-3~!%3PiVjg^<&zW}T zyf>$#S4N_cOk@?h)|#hwTlc-1ItQPCN%}Pe6qw306DH-~{W>clB#QvBma|qL%*(uq zR(q$>vucOn(`Mv>Nm{1Ye%!M33qnfPOdK=`=n8s;k^dAj5W5N^wfL3WY`F((RxMUl zQwaVUYOGS8Fw$3XdI9``WnQ1QpYTJTs>H;aDQk3PJxyzzhdUAj+0f?j!0-$Ei-`CK z88XrzNdZ!s3W3*1dUEMTTQ<7Q5Jw{5&w*|TMIIO{wqFtt zGS~4qVmMA&quz?jYUgIyfZ4z{?DX&9E(C5b)c4^1R_YB0yMw7=EN{4N`hy&koniZIy%vOgLzbO@?rdT8lYb|gF7keRY(`~~jY1Qil?cNXStYmYJV`sdMoOc5e^&hc9T8m5aoR^+B0yD= zcYo#|xlIJUl|l8@or@ye-X}_r!9AmH6_>L){vDZodwwA3HPT<&>5m+Yptm(4Gr5n9 z1cXXDRqX68GzKWeTf-!SmP?0m;+V!JClr*F!9tJRpSCW;vQ$54wxq78*uY{@uvbbM@NhC;qww?z3wA;?=o{N^J~E%&92oQ_dNM#L!S!W5mOlK;Mw zhmf%95EIlx$GRT)X8~NFI>*OF)t!((0b*2Q!gm*F++ReY#`hxov^(5?X>`kSmG1C3 zlwV{qIN-%9j=ZNt<$wQn(D8C`o=+F`K8*|0g*dJ?Xak4z zYg*>Fy$I10#Ll}j395DyV~dAxT7V_*GsUrF-_u=7AR<08R7P^nW#mDB>iKu_>)M*) z#CkA#tx67^|K9&<-(Nt&HNL^+j7M9hD2#e9pvL3e$=OWF0P$yHDTvQYnB{|4=E#Oj zf@OArX0;+~Vm7q+DC0Ld8&|F|4+xxDs6YoWZ|Zote^9dUynaMKo1a7_{TL6oMiP#&zt9hkiPo0ayEH2pF%~yb;bh&c z)a0t(pRv1bc@r&%M4o>DDo`c!*#rK2uV;%vbrx*jEETb%{Z! zeGm)j`8VY!_F9StCU5RK5toj8f*Sq^qxog#!sOih>7v8@V|L~XK`FupdV9N>Qn_757v^JC zVuANgg>n%6<;q{Pi#lcB!uBidRzU_B*r@xUUfwjJ0P=s#hHo=hR_L-isT-uw(4XUw zX|Os}m1V9(p{Kk2Id$CQFg}zArH~`_Rmy#Z5rIE%DV)jp-}TtuO$EM*rbZQD^aCGH zm*A=C>zAS#;7wp%?^TEbS~?1eQTLE`vXe>6MNaoFtcx^ROAMDU&G#!Wz)*ts{>+2; zyeyw8*Em}cR6M=4J!p15I876PP7JqsA7C}2x?LOIMM0^cM$aT{5Pk)R7WpS>7#YPn zR9j=F^W&`7dI_$b-(fkaR9Z2phNp8$;eslWf(4WNJhwLP&T-kCdV2q@uQdCrCLwy= z{+Tu^zdt15maHvWiD?g(?2)t})fO-zO`lvtHUquSb_keLs~qiy+Mc3sO81KkdTuzH zSnPmve1m!qEJId0-z;j8y4*z>wL_sS&z`NM6o<{XWxoA8Y@@xAv$rXisLC*GvvZzg zbCLdm6dPxL?BDA1ZZtxHB+PaoCJM zn1@aaxZ+DvM_<=_)SSUW?sQ_l99nBYV+$eF%cTCWXI(3gV7$e4YD$fu}M#An{p98JviBYZ?@Q zPPJivV3Uxc)?A#I2Rp~io<@CfUiK3pVT6@yA6XZ*Mm9t7%5$Mw8Jp-;J!G>}e=4*$ zZj!IUsGT0kYF>;veSHmLnw!yNx#~_ITV*}G@^mmAYMlL0yH#@3CKdu0Jls7iNPSlX zj&bfgou_~?H8rToR#06mxOuOim!-xA-9WXK?6{GsckzoEi-dpd*G#; zh{gQq9^4RL7trXgHToX-2$lB~3p?lCV&>^>tx|Gz+zXHo91F7fuS65LT%HLov50qE z``>U`Apq(*ef<&jz{jkS8W~-rxfkbERgJGbif3z62RBP}ekb&<>!6}yksRAQ40a9B zGcxR$EuPKaC|9Qqcw5iNSNp2tP|tjE#BH{sV15b&R9VrO7ZQhs1kbzN!Y}ro{pT4o zsIL(aZ0$89_ptSdV|&*tgvXgF-mbh{bUkx+vD<|#i-N6*av^7DotR{`#y6^XBG9{g zv1f>NPTRMgYu(Im--67%F~$sILkk;=9m7RNHX7cNyuGtA`tDsU0) z=QRyw?|bMZlNK>CDW}ai8fU=jSY>j_MHjzV_#rZ)-I&G~#Xkh7vf52!ADt*)n*BCu zPCLhVK3V)$DK9yWad4oYgj-L~%&m4YKYDQl`&4SlzShNhQPTYcEH%$eO`qA?y@?bD ztv)q~U%rkx5&$bxGcFFhh6h7kI8@MTy>U<^+XWFxaBYK@wqk20E7uQd)P@WZ3_N=b8%HOH>b((U;5(8H zEWbc=)(NI5JhpS#fJw%8?Z%O>^3QC8$B)7g4)q3`YRQhJU%a@jvc!REJ;wmE8qnae z?Jh3L!uq=kL8z#T`RI8#ozkZ?KAj4%-U~N1zkWdiMv3K~qq^K~ZYwFW+VwJIT#%i6 z{@N=t9D>3keo;f?uRQKU5g{q>R5_%`anXF|aN?N@HEQ6JOZ~myxSF8^a5X!cLt_z< z_89f@AhhQtX}q~ZIiaydMLx_mt{WA_Y4_k8Cnthh&8`v|GMWZTqa|rmAKjm;l91fb zKwWI8@M3+ZYBVQH@+~TqR28fh#~Htq|6HpML<&H+xuwIy!#hw?;y35xZpgX4ZTRc^ zBMWK)2G?wrKUJ))JCBe4)uE>>7$I-I^6hs1r z7FC5Z3Nz*3!k(%`ayU8(bPK9GvbSDRe`RQUC>?_sZc9{eo6h8G^w)Qjt{M1S&8fw6IK6Q<=$%Qhd1da=Vs!s z|Jl#(0xA`O!i*fqbq{o>6|~dT0HmSv7x$HkvRNwS1>tG@pT_1ywr2}<8~R52LVDNd zy^bSPKvmo$&kZAo`=#I9t(at=Y5q>aA|*3SVHSmRW!wUErN-BDfzcjk@Ml1#sd_~$ zI{-JgkdTltgB7ILI#aQ5Co*Hb)2W_ln|5ohNDNOGd|vZvPH|pHFnKP;l0Gyi6GrV` zke@|DazzZ(Xki4Bx8`28mD!istgHaP8X9)TA}NskF;;CqoTbs`x8N6QNQngqXJ9>1 z=>O^$;73;gGv9%8rW77_lsp43lEe#EA z67vooO|b z5GE%8fNw-zUg7TQ%#He`6aWqe&=T<#@X2xKT~sgtmb$^lFV4>XX=K1&!1IIm-f@E& z+pA_}{q7l+WVK@KyMB}PjVDj$iCJvl3t`pYVvO~4ub!C5reqdC$G_fvhMU;4EM4!w z#np+3fXuQWqpzlUg?WY3#i^-KJRqgneR^hOWNe5Kc!G!!-??h%X2}Hd%N#yf;uj>T z^cR0sQ7NN0N?^5?WvWDz>lJT4IlPZ4UA4IL&Y#3+zPp>h!NteJ!zDPg+Y`weX%h3s z7LKY=1U%2TV>Re3F=jokV{GWynt$8QjI=wAf)NruB-Mw~l$tO^f znnUd;>2|&J?bF5nx{*=j@^WS~5w%hdxM-5Af({m_#yv8#5qIvzES<*zc?E?g?@kOr zURja&gCn7zq}i{QgVVtpkR*L&l^Hy{Y0JgWr~;zI-;_ocbDupy^!n6R7XYI#5dQwd zKjhH3e0t^YN~Z9)kMcUI5YvM+SdSzLKYw_WPT8^j$_p*hgWK-td5`lkF4mVc8ei1C zq?)nJVc*j3P~6Xve3D(h7fg?X*2Hz^;AD=sL8(w0h0oNMe=y-lzJt5L`<_LM*pM~5 z8t0kFGhEAvyL+tMs`G?m0I!)$#xtR;($r&OQd!!a7{;v^pE^L}UHz*b4Y3PSfiZjS z&+uF}&z2UKe7cjI!L^gCr{QF&A7*kh%Z}ID9Y{iC=;`UB6qQiUb})e_Lc8}Dq~h<$JuJG&Uhof&|{9TT&?E@pQOPR4y|V}eEAFzeLQWCeBfEKK)f!&zBgUgI3> zN%Br4cxhP0{|HNo zZE7nB|8D)TX+>iICOX-BT55qX>9>9& zzQJL~m$!ii9f&^p8IcF@QsB3-1;2~E$no>%cY~?wd>;EQTbRPl zURoY(aL`6QQv4)$5Ygv22*enyS)kAWcl4p*LVmUt$)(W4JaLeAwDkOmGN`>7mddZh z7G4BZ(Sbm$7XmakkCDIQY!3cBFmz&PyC7v>^Kis^qg?W!2ZRi{P*E{z_kRssEc@~f z;d)5eU&xLjB- zI`0mT-u50XC1KT)v^JL-K#PC=hKJHXed1HKiKurV*2VwzS*QYp2vtczCPlN?gP(V5A&^l3GrugLa^jsJW1yCnS zOiGXI3q)i@ixtND>?s|R+UR8<8xtc-9liNb+aLm?_7x_N{L7UrLHTRM44vRoMVYwL zq(n#NvK7JgbVp4?@#XogI()U$U(|m%a##R|hBHEtlSe~LOin06X8u!2+aG%Ro@$$0 zsgyFK`I#mplq7Y>?BT7~=bdJ+gfk+9b3i)7R9=^hME8P$R~IhGFrleC+s)6)?Oe4_ z=kxrcuFhf$|J_kIBb*0K`QXh-K@;2#V|vGghFZ6`u`8TA@{m&P)4P6*jF?k#8mUBs zK+bYyWo9-#(OB=MwePE7P`Fn&_ zDY6F!p}eBvYaAjL_~?hV`Pu5%uj`}f)`rBwLF6wslo2>|yETy`ops)SyY&|Z%`zV* zL5bRg2Va{B?lz>RrZmiMbg|zW&xUCp=9)~_O6d#fE3RnLp-`M@movG>OxM>B#KddAr`l#djl9z2{2ul&|YS>nD+ma#v4;RLLSlaY-3$83?{t zfdFJbL`khPNf&Mbx-V%rdlkSr3W%G3W-TUtBqvv*#1>E0=%l=T@?A8eSi9~u5T&GaJD7?9kfzIJD0Y1;gX`rK z<|!*E9L@9kV?_Z-dcH}84@+;V5fSg_o7Md3c2<_(EXZ~bbzQCvw;?tSwRG8L54tL7 zscCEDy&|D=j|k6xOpBDqHD+d#k~9e9(u<3Y^YijCU-4_GXgB7ocxQpgMaq1LQ?$_tRLndOFq`!AY+P6nP%a?*_k*Z2;X`opnG?4S?B{up(klex6iaQs4 z;^-5Eou{!eu~z9|ux(5wR>iHh_8@Apte}8{onxNwrl+f?!cz^~95FLH`|shXFz_8~ zVrGe+^NkMe60hU--(_1`!=U`gqb!pQglZe~-C0cF(z6M^Qxo`2zn`N8e~(wI$<6Ej zR6T~dc_Mfj_5HO~VD88C23G-YDrDe;*1($wgUsOeoRWF{Mi>2HcO zCgvg5X_J4g*#N=AKj9Hx?D|z79PAob8N)tW>vAxFfgwl6k5=n7oAp3YuP-7d3Pv-L zRGwZX-CchT&%cYTR4WsYmxB&M_eka&5@666z0m+{@zgQUWtQPM^S~tY3>W~p zwaDNM9dZGebZ|C*oROgs|MgixY}dLy4$caVbmEL6`q21jI-h~DRILAyOH|U)LcXTU z(QHZsCYt@ReOcMLvvblm*(Y`IoS%*s)FIYls$K|)ixkh!U!`W3SLml30zT#}-I1Rz zs`VG+qatIo3}5+yNG#NQ@6uyy*X>9m5Y**4U>oUWpkH4%6ya`vr4?ui(&~Pyc^kEd z*Gr|T1iNKN{;OjV^{0vey`kfc8{$%L;~XVf6Ht81*&TpG&Pk@W^G@?x^kQ z3(Mul(5ww01l`j!Mz@~F-CbpAev{u(FE>=T6!sL-7i!tlJiSMv4n4z$CQILZDEqs4 z#LZ{j|Md3wlCSAw%dcUCC99r#6%dL70(#A)oj7toQk*8&5ZY=B>AWc+*Uh)mMCQKo zE8jr%`x8ME?&Pw|MtJ1^vpb*8g-ifU78))|l@zz@2}*R(L8Y9vTrvEk z%Z3v*=Cj=mS_TTu^2{KZq2fF0L&8q9#>fecHQjFV!Py_R=}~6I@Vl z?q_5s0bXpZJ~lSux1}+^lXK@(%=H|vlLjWw<)@m`Sfnh20QYYo#WMbmr zogQY;y@$TAu(07ZA()m3Q7ci0lI-kG8Em%R?TvA~j9y4ebiC9T#Px+pU6x>g8Me7f zyv>u(9qp#(rg?M)acat!>4IQ`AB)Ed?jv@Q(NCsi{A2+gLP)HkrJ)4^1z#=sy2_hj zWl^+YXM!%&Y&5TcJofDtP>Q~#@9)^|sI#3#+&i4csfv^Is4_)*zm=hUr6Qmv?)hX1 z=m_N#F*H7`prmls#4iTVwWGMKN;JDEPUQ_=z&PCXpnyBWdkOdi;s*%^(mwe0FBi_; z5&(qT+m(@OfX}&T2l49IfKKB(8XB@_tlS*f1~@A4>z;vb0l4=IK%6qFI4%y99mU)? zF*GsHv-rU4JSnfDrly34NpKTJ>ao?~grKWuq`z=IF9vrJRdo1$J#6(6RdHXyGSa^6 zIogX#rz9_To`N!wq;FW}>i<_UMOf=1G@X#_dH0}FMD#<4FmX6JYLn04<_VFbDAHib z#>u52S}hA^4K=E83jy$ql0O2J)g=ULdRQ+%QY*YF^`a1dU@^j5PlA~&{G6#^cDC=OqBNfy%PFt7%0}T!nITW>6Ui*xj5v3R{SO`j zb{E(nfE&zz@ZM(R7ymj>f`7lmx1GimmZ{n+LGS75IU{8~Fr9{KR%--;hK_3+YacGQ z=P&8+=d0BuC1KX?>gwvv2uNq4AsQLzs2K+|JeAcDJqy?s&nK z)~g-$7sBut*IoK;_X+%(6`h6Iw?ITpO2gGbGeu_R6U5dizvo_}p|EOE2`aG2Rdlyg zLX(kkd~7d}B`TNrp>#Pepc&HWH91gDBMYfq>ljN*jXs%-V=Vd828BYYZ)9I{8B0^h zSxQ3}znslxXIH-B{M+a@Dw{PQlCOl~?#9v73^!4|u=z4_Q1`9C;Gh+WRhnqgZncR8 zx^T{Zb|R#BgDrga=w3%19UXg;%9+}xugmRiy*6c+&2v+@zgYT7LNP`8kN8pC*4Cm5;mv94>qB04i)(fZhTfV>U$_N?khAdHEs=Vn0S)*N?tN7<$u(L`e(&sXNF}IB zzBDG$QJj!}przq*=}6(`nVBKAwmypkJ>?xQr;egcWOqz0xN_D?HkR#cm5c{$;a|OZ z$(O7~X2B1&Ff*^?;pNIX>`=ZARY`AlG#mbo47wX}S*6rRgEtbSb(L6gN)ysgA{GL&n~~8R*a2|M1A`t28VBPmc<2|44^&%5zvN~ zoyk09a~h9;2^%C~xW`nb7w?Z&z=t#}tWjHASH$`G9G=wzQNaxN2Y;bI2gH3lAtDiVp3x!^s4=qendGBdVgI0V^vjv$!Dr zHd!1*#$|tf$#P>ICQ3~m1tSOi!%5L~!+_jeXrAiPZ_N4PaUDV_> zvoOd0$W8(M_J57bK`SbU7>FF(=`VLv1QgI0_zJgze-POM1Lm1z&91KZ0ind`!2JU$ zBES?bmOF~zGe{txPewyqSLXrdR~+)~v%bFYF4WKDR%4j8;lQw2ln1VwM|d9L~U*D zCR2)uiW-v7*V(Ez6wHZ{5yD07>z0^ZCDq-g-uiL44&KA9)(wmi3OMdn0~WXoG2o z1gKAnNxj%BD=3YMja3*J7!ZK;!7N3y%+I0Dd&I?=Km0_VJ`dIiT;XV896|9N!lcAS zyC6H}wY%=y-Y?U$;r>m#uYVI(}t z)l3ppI8Ru-yI*3)M zXJ_X+f|rQE3lxL>K6UhzsRYU9Qgc9FNhugYq^hN1&p>NB=6jSIPR4eiH*pCYX3kz% zbV5?=95ortkxA-<71v?AYU1K?F+&k#u08Xr?-q9g{Dw*}AJepaSlRY@=#GB}H3^T# z9A*t_`P0QDKwp}GS5IFeA8EKWwTrzY z?z$a(?y4n?KS~lpbWYFoW_j`Mh7LCNAtnoefQlBlrll z1>{mU*Sno<%iGwn`n^qpNMrpi{RE+EZ^v6-?}5R9memt@MR-;TnY}%3Yz#cay@|7Q z+EU>f1R3nh%0(=`*_W4ZGOEv%fzityZE*a9ToRp=?Vz1M*qt!s7;&t2-#`?R+>w=F*K+_~M zQ)(hd=5j%OCZgCK+E*Su*%SX?E&$|Y1Eg2YVUnp9YfI%s_+yg30A6#NY^L#FA^Szi z{u9zTNk~km_&rw|T>#luDUG(v?FH{k1kxV2V0y~C;^w<;)3h9jfVjD!u=pd#J+GTk zF~k7!bca9N#&pQL3+rgM@ARUq%)Vo9_F(#+D^|F&v=T?~w@cx{XNh$a6Qep$_ZJdf zsd~exhXHeQN@5tjm1d)|QU%Z%AFS&)_6`mRdZ#sZE4W}nsg{uedd#opJQV3{aohfi z%3LWE33mU$!%qY4v)WKdL+C-0|YeVJBG>eNnZco7Kgom{q6_S@Y!;)i`55GY_GZ4m^iIkNKrsm7U;#Bjq^%rt6JI0 z!oa}5jN7f_w5*I(2?wXS@rK9Iba4#aO@!1XO2G{!Sc{~8Xl(GQ#GV+cgs`GROFl2W zQ>ymnw@6Pn6Ycx4i7R)3XRNRS)bFN|aTP!7t8JX#R}YPtLBg@FG0CIFXGU221^E9T z-V^tg&AWfdqfW6ZF%~dbrMSZXWF>_G6sJUZ;(V8Zhr`uNtEB6wK9pQ9-glLRDV zU2_k0t3xY6F|k0@LB$EvR>!;C;B!%cM!R zmHzubKRo^-vcS)ZzlPWI*yH5oK`Am{VFWC~7Zj)b5fYSW5vGP^?6E<~rH^?t{O0jd z{lR}%M^lOWu7>t6DWjQB3+caHA$YaVKj!R@_mQ!P2*RfSNnIe%|C@XFu3Jx)78y%! z-&{;uFBZl!E}a*_FKd$Ma+$QJT-M}+EA)H!QxDi!HL__zib+O^&O!suJIDYmvc>Rvszx4#Da zQX&pHOMln=q@yCi#<8+6qZ+7cv+))ZLJ(izpY88%hkAf&s_}8eo`QxG*>sEL45)X+ zzQW(7Gsa{D9gkfV6j)*<*H5lsJ@nBX*I+64qSZ3AVV_tX{P=OOUIISr-TPs?QWsJI ztj4&wsD*WxkEeC<(dAZRz0SnMcQ>bA(J|R2S;=u}kQ3R%zbpn@%5{r@2H?$sZc;1u zIWh^^1<=@(>;3MNO`Oh4aTwDjc#;z;NlUyY~#jI?|~-Ah*rYJsLC?MCCBjSQVT6PYCY?Uk!%Ssg=W?4;=z z2hSd`f1ofh&4s%t#+`;*I@9v~um8AjR`W1LoF>)bcAyoppiqpsmpeIQBgt<@hB zo$PVmW0Vo`rQFGZqh2GZl{~Tw_?4T*roU$TC_w-gMf&=>n;zC!01&_VaW7`Ux$AvG z(B0irwLOTKLAJc#cJoG#6z2)prZ!RX2KA5lqF&J8r90bV1I{fy>vynRJ6%Tvz^2C^ zlB>mabYvY*3nsOrB|o87BL0)%W~g#x>v}VDg%{m87bP@*iOC$7Wn-(Wlliwi(WDaS){$(ljh{|wvFb_s;Cf5*7{CUJ#Q9LBRa$9QnWw&`SN+~ zF3iU!q6s~-b8rs*87A4=ML6T#GV5}X*6gm%c9JMX@HaZHagHA>K9LA|xOb-r z0($)uGPv8DcB}p+^*M3=Smwz8t^~opdxL-i*cSjR{gV2!)l1>)pV`maR;lXIIldwd zvV%SL&btUecm4t5ck8q5EpsDl$j*W`vfGuASED)pI@_G)sW2@rSfP6?0Ex9_WnI@_ zV2d@Q-dX2_U!a4~S9bPT@BFIz7s7Bb;LLx4f&?PVX%Sfa+@7Wrf4ej3@G7YpPu%!; z?p9YkNyFu`AourkhfXvjmm?rV1~7Ajt13?g51*h>O2$Z~^nRw+tLnfI8QIUA^9H_! zv)UjgmGmv;kdx&d>mQd2%vfoD`)$ft(Y^7}d}DtYOma9x5?FeE`J|<;xjHD^9g}!> zegEjr-FJvNJERJ0k}ZV9K4 zkv+F_BhJ7H@f2sYBOV+*64&m>Ev0B1tPT}!n}gP3M!T0d1OuhqU~sU)d5i{@s;N*j z^RmCFD|Gi&cnNa39MKu)?4h5YrZu@@W8>`2WSP)dB=@E4YF_M1ld{QH1c!%&>?Tq5 z0zRFaB-~zQ6%~EG^KE?A>vK~drTHYxqL_i>2Dr>Z8w%YsTyoeSk<}lV&)+o%*Lj^p)`FwsG$Xw8&YNJk!xt?;{uF=hd7!y5W;LpIF;s23VhSIx7?7 z0fl{x;Pv;)4*mT#|MZtHj|i;HVBc$QS6aZfhL1SZ*xc08+*FH!Eq;)ZjzLCB&c?

&nFv`g(Q%QX2X7ed5cb$_4*|Kg>LAPS+p1UvJA3q~qOo)WrNH0K=ODZ?pj|)G zK4UzvmJc$x)4gx*8@IQ&!CLEIUJ)c8pFv*F?I+RQuh+JqC7|C9*xuSsMFrAO`N?dZ zzzwHpk=Ykw9G)Jak(4YYC4m6mqtVb-rlYD8M?f2Tc!(<~lOn20?I-N^nm8#fk-Opn z0G5tiPvy8Xu>Z4DVEkvNXkR^{S69h2fdW2BL9qPNqtSR~`x8O19>Tc>9?(RjWZMnA= zP2=Meso#5jhP_GBJ24@ItdKRr9CnAz3?wi>HmC3TA-I>%v@ou|c64GIzt3OD$a9@8 z_$vLSNYnz=6nbuT|c_C!k@dF!ECX=#RfXZ!yFJt_W;3E*7g32?QTP*D&k zfiivpk5Y-lDxCk)JpX6t@BtY#w*m3$z(AXTaFS8gQY#U+_P%_jTYG%YAQQTv=A?6p8&sYP`Xx0=lqmhDMS zw*8!zcD41~R0sD@cc+T($F4@c2EIZ{|&UX9&V(6=U?^4`HgWAZyfKf(De0-xoNJ$_4Inq3o*xQ<8341(DvN_O5F_O*;SYYeEpN=<%6^8E zot@2T^QC#$o8b?|TPE#BSZ3k7p5JD(i-8$X31gpjz*@rq*Son`gq}8SLgF zEW+@oAcP7oaEd3bIQBu$5OP5$?U&?~mwZcVQM4~uKSh4Np6Bve{>}Z&<|SCVsH?A2 zRaP0H9V2aY4-Cg3ey=y&;0D+p!&xkP!!nrDZqoVOOcx;%(7l=Z+=3sUPBdORZpx}U z$GNtsib>ssG<$#4`xS4J9_!6i66@BU#34iPdHW@urKzd<`}gbfta~!&uM8*n#8Q4RF8|a z%*kBDVszU*#)tLj{R2VobNG0#A5QL=bo1-ixF_c_2IlD-{B@}sy}KOY5C&f#iY45N zkqDc%{=9*#_sZh99pP5p;drEY`XCEoBBL#}B^l&}3c9Uz4S3zSJ38!cs`JWwo>1Ez zm8}a4!i0T5i6N|dCvc*U9 zl#$})IdZc#M$f@+3L0!I!Wx$c1fYwdPq)G|5m#GMNN9N_akR3`>#VN8sP}v?zC^pA zu+Y)g9?=KHD#cn|l*g5uy#ug>Wgc^je!I&RZV-Ry&)eMba5JKc6~;zx(H~ZjsSk_GIg`+-aSsS^g5@5D+s@)rVxKvvFM)P+H;JIH5LjGPp&ODSV0tZJ2=A+P_+kA7@bMZ@$?z)J!U$E3Ismwp^n;$^!y-&TTE|19ICO0oQvm_rNs0*+`^{nZbAwBf z1-1wPQx4m%`gVbrbDNRaz;DQ6TG9{tAMpJKZg+C`w;3 zSySjfNk;)xMOfZYF0}h1`qYKdB??P~dJL>8H>2_#-CKQ@HBW&AFlltCG9RQc^+|BN zclqsjO5A9==+_ur9+j2Adc5hb%>cN>CNstHKudA7ER;?;(kINCHbeWWEFDUh*W|cjw^b-m8)&Eev(|g}k3hmO((aQYSI~Rp#b)pxy zAZIb1B9wzcOynX@266wC$m^f+OHan_Ug0Svj{pLSS9N=SVA5_G|9)sj;AH(Qho_1(&JH{nN30d!@veQXJ8gm_xh6V;eUINuyc=v92IR43}O_r`U zqFrvwDK5|Bcr`Qt&9Q3kH3VkC`%RJ%o)`~w@4z;whj~>jDohq53=w@Bxs+K+;gL~N z$43NPnJlBxNUV+T5Mx6_Q*-k>kdStounq+bk6zI=N z0)9zXc=aP@xxwaVPJ!LWVSTyO%oM|pZ<>%~OTD2vr;Nyyk-CR`<&T&?E+!2T_sp|T zsYGPFg5U1tJqmEOy}XQ5=Ecarn-zd!Xe=e`X9_kjI&sa!H%C#?pXgQ_sP795(lk7besP%wlvjj;E`P-c># zrxjA@`a3C~W6M0%BL;Mcv#T@s@(Z*aB+)T^-Woj~9n0|cWV_a2!t!H_s4FTEw)tF8vksAU!r*`aQj(vnkJAl| zh|Q4kv-OPZ++(^ePa(f?Y*`t1ykC>btDRfuKp^6;hz-~#a^3IAK{Pa!99P@QpR03A zlkuje=HfzF(B|sTp0?!HO+4j38C`#RzC-oq>G}^@`rqz)G%+8FcLZLb+`qi8%gvV+ z)#_}iM$|<2pDH`4th5%r>qEv(G3FqZ!k05zd^X}7a*Pzy+Zxsc^kz%d+ixX{U3XFu zo$%Lh8|!U7o40wr`6A`VTvb$M`da0J&t)Y+RJdbVsl2>A%Di{7wL6OZi0_%;^7?|! z{^kVO=&6=rRb+kX>qApzrlqzMYy+99$C|vxMuy~jLRW|l#cPX+{UGMziW1Nzn9{3+dPf1Lm-*$wz?v;gnfDW_@>lU zZ-Kg2zW{&LdV@}GE`k*6rd*?p4C82GlEB$fjR*Xue@@k68eC^0A|ezOi&?a5T-Q1l zve$@75*!at_p;Zb9rBcJy>S3^#^F{4iBw->(Qg#)=0YGMq`A4p8njgjfg6AD+$$=S z!KM?oOo(MzLdSMbicn-1+jr>h6mAPSywemxgE(GV zj~s@kMOn;&D8v2WMv0+@dO^utQ5CyBtJt`vvh!~Hg*$9oTE&ooOc!-EQ{g|K-is-jM? zHzs7HiY?=ky^xSk+|LYTuWyO^_>f`I0b8)E6%DcqPjo+Nx+4dXG=3R;em26ZsV-sO zd#zL^E+Hu;8IC_Chz(m`>nDI=1&mV-0+W5Nz+AFo5G_ibP1h%O2dF zzHh%dsmSlFZvOn!TV1)gZ$FnEwi7(juG>~BRB!*GS0*R>X?xbaHy|Q^BX=RKJzr~2 zNQpD>Zn`mRBIA24H4tF`t0_#k`Q7s~3SUhk50>5}er<4#i~PtA>cbNG*|@oK&cf4v z7^h%s3Hr(i*Mr1o+gooqu$U-r5#qKKGZLZfok*rU`zPyav|8IV>YUoe#aP$;JVCX0 zR*`o32i5^k%m?&$ha1p1qIx$5VarIdC}wgL(qXNqu<+vu$6c>dzSZ0^_O&g6kjEIa zwH}|Y2NQo@llxy#0|AL{Lk?JtRi z$-l9Fkfr6@hsmAa%7-$yL5_46C>MEn-!oiUUPG??x5e^0Z46h*(?ODlh?i)kEaneC zYiUvL?*p&PEJG&tRobdLU@oBXxc8iZ&F&n~fA~UgeKIog2@I2ue%6d ztrTFvn9Fj2za_(BJkTtwP4y}90rXQX9XUvj!`@q7@|qEe#1xc{Sw--q1WmE8v-@!I z0Ae=xQfImXbdpgvfs2eXYin0fYG?Fee#HD}wf57w0%KWwUI?Q3UdV+^0-4Zg`)HeJ zne+H$iGG1-S69b(N+i2SzD#cmmG?cD-&LXF&j5Di`cP@QqD7KT^E9eL9<^AN>6QY49485?_8QHdpF{`zTs(rEbiH5e}+N$ zu)`UDaA<};T@;R~zb+M#llfYVl$QGkEx9^5OkttV4V4yFv;GPgif`Yhe0~JbY!j`{ z`{lurK?)$yD0l@xDYBdN_TB<9Y~0!Bpx3xhdrP>YlJl{>7T<|AL2HHj_0g2g=31oi zJj(+R?#oRcP?|dY8_D!8 zYk){Hp5OXUOF7I*!1*k`cY)uXe0#E7UCogYBEDdUCN~sH|M3~d5>lNdOuViRL8-Q) z86B6KUpQ7AM+CuNPA4$Pny7lzP-gw!RJX#%%2!Z7GJ5>AVOCq4V2#6BBZ z4OXBT>Ksy^8J(<-hPT;B_|QT`_AY5tW81b86TW)UjONoXGhV5BPTqsKUzT4s52M86kb%5jq~MSt!AbhxBDdDG@VbgPH7 zyqm&wz(qE&@7h%UF?v|%2&08Q7_Zl2ABc>exm_3bEg{X!?Z(kA?>`R}FGnR~$VDvc(sze!(F_qdllSW$?`Xr_Y&3S~^bKw=fo(@(?`K z1teUVw;Or`G1wa+4I;;+aiz))&~z%rw8|k(rxG6hx@^(5-@e4a3&_ALd2&~2H1!<4nM-d|5IYt^xNV$r01Jk1)|snD_Vl|cIzBw6F*kNDO%w;qAJyhIN?iBe3- z@ar||e&6@vgp~swjQo9yEdGV$Tv8?z0rKWqB!#iDk}nvyn7}t5d=;n_mm)KqHh=QP z{Lfr~@MH)&1aj))#u9~}k#H9RdBY(0<4ciJq?TvUZJ@a45wBt-1*4)E2qPS+!A+hs z%Rj^2JvB7P$u9|Kgg_c8#Wfr0zP)=95&7@uVlTp8h^O=+q8zD3y#L-odEFd&UnJ(^ z6EhtMgr1e{>pNlcnZdr)4q3<@2;|}gZCFlG0W+bYVZbL=4)6~v>1?JSTyujnX}z21 zw=@E7rYSrdJB5luoh!nTaGA?V$utY%Nm@uUHvT3lukF2*OjuOURKzXtiW-^X;m<=A z*j|1_Jp8~Hl_VFbHF0-W?7`Xo%H~R7=``)CVA*v`aY&M|606Ej8W!9@nFK!6#gREz z;7Gk9QfsD~(US}Kq2GnY+C2npjwPY?W%a>UA<~*^oR(^zJ~Y5VR6b9+P$OO5k&IWi z&TNE&oYxS0)k);m$#$Y3BF~J=X>s{QW`zG*%LIF7#EWw45niWjCyMEi0RJbO{goX= zcYXv$R{QYE{D_atm8Bmi;|gnHQkU=sbG!UBiV^=A_`~L}@D}4%i1unCsuv6G<(trq z%na>@tsPJ94p|wYlYzDIA{njv{$W|T`&xRDjICMM;(F;K?xGX9V0KpCRH0$s?ZwvD z_OhRT>C4n$h>C_J3JGmGlmz6MiqND{V`>5pkk-J;A~8%Gh6{$yoE*RuWNW(?MUyy3 zV0fQBma}ASu3KwDQdl5F=FWVjUU9VR-o~M)1 z(`&feYz4a=@+Ri<&2Uf8dN$HCGho`gq)4`R(F_V`oSef`WhREnS=SrQ>QW94BX|`c z8w}U~nZ(bC_{dmeji59o4Pm^2lkjk~Jf+8>#h(|%v#2b%;`{EVpjsgF{22M{T=)Pp2j8WY?LayoYPx|09V%Sq0)-i}QS{E%GoT@|e4xN`RxO=6_tRb#RN{9o} zk-Q@Q=gb27?J4dL{Qd7qlf!2fGsTCCly|TSrU>`n-3&MR`@36@Wcdrx&OIeQkZ`u} zG@x&|z4h7k94cLZ^2CiIsd-_UD5@La*hCE8Ja7y)$!}_>;|W!A-Hna+@jY>W*UNyb>2Dfq&~jv9{C;g=eY# zzkY2f=Hfp#W{V+>DqxCCS+V8uZjznZ=mF7Y8elEbI}}{sEb=+Vn_f{d?5%D! z27(5R*_x=?B{B8`*RZe;yF=}qd1L)!BfakQ4UAoHX`}2$enaiAJJXbRW~E4Yd|Hhx zXG^;?<)hS$jP#06{~Vb!tees##CM;&`rHgymYCk_RzUlpsvW`M&Q^;xsOMjY8J)$S zG0{p;hicS2fEc5?u)yWy>gp^4&T~TkOG{idFMJ5WM&uM65be zW?MlvNRyVPRp%K;)st_eW~gI*Z{>3E?|e(Y{Lak$f$ts!qmDwB=@Lr!ELxFeQ>s>0 z@Amdw9cunEPg-Skd~k(YOBx*o3jM zB%HYld6rgMrLLIM2O1tgzDTmK!YC@@sLgs?)oXMWp@m>S=R zJD~HY@7}+;fIwDmW9a<7fY1~DwIjecZ>qd*433*m7aEW_e?PJ;Is_)bsME`orT

}RG z{LHF=dWsW0nuEIsjc$)7nC1KyuhgI2hM;Yv1($@p za9WuinAKCwQ;kH07eP`NnMDP?z&>>374f-EJa0^oA0Y2h|4w(cnp{1t-h;D1CDhMZ zV|H0i-%ng#*e(@GPpx(dUnO`Y{=l3Dyr@c0Z zun)9Ad*>@OonEDh#Vkq+kZV%gZccR9x*p9X+=1XLYJB`j64$&ES?7rXmJI(vTrc77 zS!d3A8@l0+IyTzNM)>`}?|{SeVWu>Z5eE0xgaGW%@}}4j+h8T-vf4z0X%V34k(PTu3J?q|r>V?u@I;v9*QH8gIwCT5I5vnkGC zQWk&4CN>$B%3j_E=6I7)@pC3qGtufu*C#bQ5B@$qB;b2ch<2%^gqmx$B&~X>Wgy#Z zRe~aWU|Z}4iB+?vzsZqMoWFQ{M8<`2G4#dKFV(Kd%S~5OQsUK#vtZ$S)cUEs73CX7 zGkcY*5J>C07h%Q*7&ZuYu%j5=K$)w6R05q&ao3=oBM^rkqP|>~d}XFUt8s75GDN&b zoovY0eTcXqF*dl*NKAqo3Z>S)zTPxf9O^nNrxdb)HeS|%o}{RYDmacVG(3i(3*XpB zOaxc%`BFgNPk1970{%EFl zKER$uI$SU{o!SW~lU>X-#MJp5K6_okP_J-W-6c#We^KE8*Bh(meyeeVR$Ta@h*zBMWq zDN-(8=Z&wDv^3N!TkT7}K{_vq_x$JT={%KLI^v&qF6QPi!2J9I@cp4^SgF4W*RD5a zrskr+iQz4N7TEkJK!^6 zgZu1U+p|rIOG=!tChV4fSwroE$kDaJ78gpyw0i1~_K2$I@$tIpRG~=TT!+QzNS8Obig%q`}i8O<`psVNZRBiTd8s|UR7yb|o^zUV|#$T`T=K7!H^lBK@ zons&3k8Gu*HNvjPJX@=RiA|`L-rQH^uTMyCitBGMQ$LflZpyQWs+E>LP;nf%R-!_= zP?BsE>*q0De>|R;;*Pp)mGO|h5l*(%F8 z9d97B86`~pr?jM`?&Gyp8mS8f%zlplTi8^m=CL&Oc(s3$+^ zoNTpYm$su$eg(;#6Q1rim2ww>b6sfp8Jlu>jhTf?H)-rWx_6TvTL#;NS7MzC(`bg* zA8A2lHa5{4hujeBMj?6q%%pm3q4DeYb^0Dmn%sIcS+~G!q@5*}h@5C@Cf8fS+E=$U zOG>rae(6iA=44s7hY}zdNklVq)B70g+$|a;Bqo~u1w4|YK>2#j$CLIq>mhbMcck5dYhLpkL5ED~Pxiv6oou>hgTeF^NUfKU*Ts@t|FX>9-v@Gjomt?{x9penH$N z<+RXRl^`{((dq^PuK!m*$3%WmhX4cIXw-Ukui2H0Of)KIU;275q0?NcFDB4k$4Giy z?s=P`)~C30ExE!JzXMbo@}~3eHkD1~qMRfmB$t9d0tKdvF?o@t(LJU#qL>v(f$pKD zjfBQ70>&-XbsncWL`vx_(H*OTctJkUEuF?gkPJ96ugUtV-D@7MdH(sKOWSsvdT?}j z@!$+$6WbLt6`%?-&&LXpg3?9o&Ww-0VNLDde&cVtd3+T;P6^*MO8u- zGE)769DJ9{$_(W*Juy&v+(uA0y;P9|SL7=5Ylpo*^%3SWTD!3QRmGw6BdH)pvb_VI zO_-10vhCRj-)FSL9Rp(-1y0!VYF#p*l*Su4cL}U6Gj&4kH4hvZ!zqPqqJ|MoV zrq)Yc#KQyd+?Kx91m6YmUaQ?$u#B$uDgW%Vs0FDF?x)nnuaU<~_jZJZ{lq!-Yv)kI ztzPO6-upwBVV4^RPSyk%BHNFW>R_nN8TFOpW+J%a9+{IE2myuj{1sCl6rR)Q=SXHw zau$75WWovA6zV9S^D?%cd;L2|TJmZ(+i~XTfDkuy|M`2>pZO`rShLEk?R2!ZRs8zG z!XxW+Eb;2amZb``NRtVp&h#7t%%JeS2ip%7k8<^$;v_@YY?H5n+w~_ct@If#HAYBq zu#Dt#Zq7=dtjoj0K~F9Up&f45cnBYJY{XNiw3S&L|yU}Cdtbkoyd%gJp zWP=Lyn|Af%JeUjPciM^G=8bJO0wld6%7aJZdx30q0qjO4rr$*>67IRbTT7zIrdO*=*@2aj90$R@y?_M&MSYJu))b zHRG>3V#Y(g9hQ}AGo0zd)LsAG4p;*jUg~ZX@Hfh=`{q4UKV*WCqw?f+Cx?4s+(mYW zcGnYO7i`uO*{^OUieCM%86F-B#HzP(EpdygsR)tyN$OP0_NmE;1oV0-#Q2j|+X zdY;lz$IkP|HyagAl!p0jM8^?j8goihoNzH>I&E@0oYFVMjTyrVdno2=%nJ5rH#O;k zw*=h(yivA3`18EnEE;DZE`*YnRsCmdXuVP2m*B{Ph^;fT>7+U2E9QBDNw}-|S=8w;QmLj^-Z( zrfE08==f=AX<4|$G#Z!i(f2~dg&tf$8UrXAlId|X|Rddz3t_f=kmN!e2v%~c^; zgRy`u67X*V%JSZRhCag$92t5r3L!vFwJs~AF5Nf?{ zx`c<~C^4%6s~#s*fmXj%1^TQD7Z1lf^yE#KNTMB?Vez-K0hqVVM@WuTI$3NY@h4YH|yKj*enILi|!xHsDw5|0-7bxFwvcF!?^8(XL zbR)%FmGWO?CR5#)NkM!vWMSPaOteFV!U&*IIr9|Z16t1ri>9xzad@Wqa6>g%tS8%n z+njTNrj57gpPgDS7c9@UIfqArbG6*dNIf{%uYhi@Sah|Z=4A_O-%F!x7Syial7XUE z^Fj|dmQZzBGHsp`e%~)+e}t!7D9x08D3aFvIrQ<)mmMLuy$gVsGdfum05!Cio+DKv zAOtk1EbV`GhvJJ^jd6F`vj7?pD0W@tggI;s4pouDp*Sy@sKn}?5lFKi9c)~Q)7a)TPqdtlOcZ791tpiM@C;tC~ zeWn>-9R4`othU+&jLjWqW zQGRJO`=f}eDdH)i@$;+<+|ZOntwc-=+0*!2Ap98hGt%s%WJnvo^AW#Tx?*#i!hEHR zoG$v`lTA?nlgaH!0t$AZkE;uuj?t#dtWCrFHVHmtgcYo|oCvBFX!)DZ-w@Wn%l`{c z`S1LL-}17(bz>*oeEvU7$eSPk=X{4_NdUfNYk%nB?!b}_9v$Jd3T+rqO|?f*P_KJO z^U%TmNZtgEym2qd@?yNe{^3OFy4@;$WkI!r;?WawJiLqDh0o2tV!`B^br*Cm6MO(c%}A946H~Y)3756U z;qrTGGd)vN#M<~|b#ql9QG_LK{qtke&1Vts4!g^U*ww;_#lUo|Hm+)M!L&YWj-jdRM5DXXGEckmW@K|Y3H zV5=Ty`LFR(&+Emr13NO?HA^A4O=3`{ZX^|lJ5b=|wcBwY*y(m47owtEku$8*fTlfI z9Z?nFha2{jRw`+>T2W%Bv_6tqoy($Mrz`z|gV_kn;5TP-q0Agm94wE>3?jXE4;^=) zb4V-coe*>EiM0)<)u*7ohDeceNTom&rJq&vfv_$?>T?N5;6=&Dn~&ci%7+ z^AyOpxE6Nn>xkU?a)T#%cnc3y6tkoU3W14p#r97@50#U0CklD)Ej0Tkz>c%O^u}^b zR5>73g&IIE&%y8M%`N!#H5mgA4gtPsK)FBFz=KBCVNk+Y$niECm*3v2~y8 z5@s-*PAHG{t&IV@CKe^%s{8R~q2=|OiRn#dezO_eMS^f*>d5xVV!D|qv|TzOp38*| zXG_R_P5I}}4#(Hd)231d1gmC1@Y!UZwKg@bp?@s5Wku7Fyh{h-qRIm+_z^nIiR!~B z7J}Wgfmg4V=%kEZJ^>e9zuRLu5v*E(fmF79)5tt)Qd&xebbFD_YM7oYuui`_Qo9O( zWT)y2PjtXR{dn+-qb0@3I&OO=PpOctwb!!m&o>aHMk})(s3>?TA1%P!9JGiB|g7)*}VxZW^^gb?(8w zUrYIr2xEO~*04?t=~?7yu>`{Hp-FOn=TxO7Y-{nGIT35VR{c8%aq5V~hED^9SwXhk z0-Wy2rGazb4!ULtBqC4a`E!c0oK`NXx;;ENbCu;2Uh7`GHnhGx=RHOuv#0A_7cMgF z>V*@0?w?-Z=(llL4~ZT*e*%jrxR zLH(t%V-1((2_7P=!jzEopK-rCeDmxcqAiM{Qrhz(|&vN;|*{IM_e<+TqY||A~&U@SPA& zbC4G`jCOm4rat$H4)sTR{5_jJ?LW*{LG0?P zP>+Vg!?N}g&!~{T;`^hUX9xGNNjUV6Eey%y7;rf)r&S!zL46C5P*9El?yFE++=6Afg5&p z!AU`Z_RQ^K{w>oNG>B{;2nPdoW5}Kx|TdhFiGWd+weVd)K*}eb{(o993kaZ7iJ-85z0CW%z+reG0s=ikdo*=DA8e z(lT(9k&tKJ?Bq#?2U!m zbDv&SOT}SrPJzr6m9(`Ivux{MG3Nwb6m6v6(u-* z2NEtOE-ptv>{pNI!;woPWNx9}1EeL2JYd6lK0uZ1^nV8EFA>{&urujif@a$g*)A^Y znQA~FOYM5Ku`)Q4S5N0omkQ1nS+JV3vxy4bsKgrWRlfpOg`ddc*B0x|cSR8qiHUuBSEz1OMG&c?4W-bW zDCS0>$l~GQp)@&fzGnFchmOI?^U2nSU0a|^h0A)f>|<-dB{?|}i>A`hwB!iW+EpF6 zm7Q^)!ggkQI*0k7!MB1fi<@M7k2Z{mCvf!NKwjQz@y{ECP|-E6ud)bzcU;E zgnd#)?Rb5L&x!7K{hRW`;ohtZ^TTD8uK+?%+L3^h41 zDd`y3-(Wp=<&G+x`MpwB_|(wzh#(TOgxx>~p+76ji_ zAX(+yUt0WSo<@dB^=+>P;lIIIim-SENzYfQOG{;(2kwsuZZZjOOnE&64JJ*2|IL>F ztGE9b(-~a;zu;E?c|*849P6-;&IT=k%B+`n?$iOhxWaBM)v#MMm~?Jr)UkQBcY@T{ z<7#lGP}$i4`ruLQE_3mm&W%8amYL7h7w|da4%9g9_=ZqOK|jBJ+gDf!YGJ#u;OA$( z+O^9>rCrA|sg@6|!{z^}B&Vy4l&)r7w`GYa1INrugQGe^3Zb zYNPp>M|-jl`uRgduX?drM9Sx;UsS@Geeq|9tqyFASNBVX24eUv%5aVv`{5sa{jaeUfhmq4Pq2N)lZ8A3mN*`8Hw8)9c0 zXBr*7(c>%W@7YYXb7(5SIVdzTWux$1b`ScJ+C$% z_*3XYt}VI<8&lPf?-5w!+|I678UR24p+4b?iEDHd;=h8Lb6Xwm9mvZsF{y17eus*P zk**;RoNGlSW(Y6jJz2@hOKWtV{+^eYw@X}n&DdI7o6x&c=cOnXW!s9a z|C-hAB?_B@Y@)$)C6@ES-X3{DL7<^MpSpUEq|sc%_4!ERsu5shtmn2qZ=fVfXIm$( ze1O*;1iRi_D)4$^xVw~vjT0&dED0!w)#CE3V?~{%rN2oA>Z5ubMV0UF{$ADf{M%v! zfO8t+{Ee^SuGHJMMwpM;-JNpShCYJK-!x&9=dLcM*?Ejk z_a50Ol?x#em9Xophk}Akgh*xdqr=_T_J?am)m$UYjjJitt=si{#HNB6F7&JRv(d_1ENZjbpFHD8Flnm3e4uQabq0ZtZgY$FBExCuH|b?*VjR27t}y0?R=pQ z72YIp@0bshtUv#K*pGg=5oa!A(yc3=kvv7%(W%WX%u$Q+d8dUxUu~8MS=C*^Nr_$M zG#|;YvO_9$aor&!$162B!x&)*jAGWTcU9ajENM|C&oA)cRRjtb`7hkYp_}UnHLw_7zb2BDzKC?*`hynsAtE?|-(l!FGAG9r#bv3)qFKL?)C)V_85Y(b= z_3V6P+Z~08`G}v}A{)SlXY9rvm+U$Ex^k^$w%g87g=G{GYxopW8HOwOr?N#XgmSF- z)QJFo5XHj4Jz0J>x2WDt$lAo-2u|?7dH&eAv}c8IrH}ICJvyzlAZ0U|pTBiUDd^z_ z#6)`3$=70it9xk7S``-C`Kqe8oh^GyK$1e2DT%Z5(uARD8k%%6NwXy)2XVKqelo3} zNkqBzofT-+fAPC9SHau^nl<~93Sg*3bfte&m8#YOCkLqfs->gSx|X$prFNhfn&UOq zIIKMk<^;PuZ{kf)WqK&NfoSoJ=? zd+2C}p!Li%gXl*JncX3RezzFFAhx; z{r>tFtTI6=guUJvcCtkmA^vc!f9K+iibfP)!peh)MIm3-rtAAUTh4IbK$GeCFK{$~ zONVLixW3*mM&F}SZEINk2%wdoi~#rrVVc{a;s(HR-F9BAgszB+G3F^T$KIQ*FV*cf z(j-s#X1DrlBA$7w^3_Cs#P+s6on!}YV2$II(-Xv)^{n&R=_5Nw79H~ZKaWUo&w2Q% zOQiCYpoeD?kZ&;}4`Ccx%KX;E8D((Ho7SG`A}6+&d!ubbM$^5u)6f zETdh!Hd-}=E%Z1>aPAAK`?P4P-1BGzpFJ0&|;1krbzD9cceD$$MPRD@GRn@jDYn@?BqCpjA zCp+Hd?ye_=nx&%~n8?)B)OQVEpOCC+^CR?qZqEy4hR8z5{LW*NC%Sqj(TEhivp^hj%B+H%qrilVAHWy+ zkU@rpaKb+1)2MZO4p+km(}2ZbnnMes*@GkA%5XcV8mEOMnnxTFK_V!Gf}9S4s5hJ1 zB`!{`Hu%o&|0H@TI~c2?20~wzpmBrK9yN~p>8Z_+z=Kdcx{n_}+HzxEUS!m076G-c zCqu)+V$~A;3fHu+^0c~0!)B{3NRJZOLCM4a8A4L>5(gzobLYKr5jExJBa=0DV?d9! z$;7ZZt$r89B*|5)_q^5xo@#Y@}u9KET;}~-tAZb);3P)Gsf<|QOET^ z-vBsi(X+HysL?Rn-6lH1#?Q8RoRB;*lm#M6ZR$LHj9S8 z2IiP2$KMctMyKiNE(j=4e>jh{KiGe+zvMZ0L&GcW;$l5lYJO0S30x%x?}bpDwDu|& zS7&^O@C6oO-O22Jvf7Z@%GQw%#sHF6$dBhJ>DApv2QmAkpCanz|7290Qb6j@L+DWC*B3P?}q(t zvx1z=QZh1d%dT*sL(fmoz*kO=4I#6GGM8UKFjxN=V$T_5MKj{tqIg$q63vjIyJj{k3I+Io66kIRuD#Fs1E6z%7@Jz;2NRDY1< zN&LvCr0H0oCODCwDym!1^Ff}48E?nR9N&){`@n-_xM&XEMAfhn<+q57YXLGLmljfL z(awR17I$^)-tnfighU*Vlh#3-RJcPqqALQZFLFWGp4B5{SvdzgJ3Dhhfj>Pcjt?wg z_6BWXC9d6XF!sise?VdQHxcM?wo-y0K89MgGfq^uVjFNnC+(4|K-{k|Mj^)v5dH15 zF8xneQn+_!+5A#AQZlPtKosb8;-PWwzhn)G_wVHd?vRm^<`rb*XjoLq z?99?hCnU1#qvMeCxol)!Gt0{l9a~Q3YgD^63&ovm&J`8qp_m!gNAi>vUnm!smY)s0 zz7C5_+;%_C2dDtpy_K)@xr@}rx=^VJ2~o^i&*mS7_gYQYMnpX4aXTCj)o&N82|mS) zy20yWcPVsk)Eg)kv3Ia{mx1vduM0!#5pZCCiMV7Zr8OVLaSM5zL!m%;PuJ*+!MA6u zr>o0BGx!n1Y~dm;V3y$Rp8eCuxr#Yzr*AHP9v(*t9wpNa7Kd7MgK=dZVnnsnjl&fp7Dfx_&152Mt zY;YNI`1Y=vm~Bti&*=BYc4X6!={EayG|kR7&DMLp1<~T)mIxM5vYII1I?Ta6R}ZUH zpeE;>l@e12A_WMQJm~`7O7AbDg=!hRpew<_*@baa(*&xCS_N#i%vax;_hMo6?*B`2 z*Z%?@-XzUtt6b>;!Y;sJe5pq#lrBr3{*l4AnV}HNkWKa0jwE%2Nv&O#FtHHM0)w9nxK%}}AVbNH zy93{lC8_2Oh~ya;0Wp{Sue>Py%P+rOmaT$^bM?8VhB;7NlH)2P%!4H2?XF%VT)QE% z)3B2vr^`Hrg`n^%wON*$J3gtGt%@=zvZYL9Vc1|VE;e{NRv` zSKY~(Xx~(P?pCGMy)uhQNuD93-QJ($OBhIwv7c5R!iX@7jd3X7{;i9sSY8g_L>Lt* zfJQI@3oq zm@62xF|~x@$Z5D;6gJ-jyu_D`G$66ThR19c;nwi{xoCUqeic6mgEKx+CSGCVU}Q8u z*iNu2Obchu3W@u1*)kzP#2UwUt?aXE<5Eg1-ACSjgT(w#Rln7Xa=LUqvYP$PfKxD2 zEg~TyK@}yDKDdQCu}Ah#)QSde1_35tGcxHWazT%)9-+0qN0t6(0#p_zIxp?#pXz3= z{Tboc81J*SC3Yy0)9a_{jlyk^w zCigsEJOd<^j0j(UdM?4)RF6AZ^_PkQ&^9RL5pP7Dj6O};mn3>67RhoTf+?a%lO9th zJ(hviV3R)u)joX&mvLUga4jqW7(*qn`ut0cXFZ&?8>AC%xsy#ynCV1#)i?pFw)63E z2B!m!yAN+1%3Z{NfryVogQzLKO~G0r7Qw5guy*D+j$RK1DJjcj;knIF)&<@2p6k;6 zQt@Yt2hKv==i-QzjoWXJ#eHOdAM{_5^+NRq9we~~@Hx4o7Tl+lB8~gbj*&CI5qap+ z@W*ENZ3XM%@7x5Q=HdUcZJ2Q<)bF_-Ew+te5{m;T2UK-TIBsReD;Aom@zBsLb*zV7x}FTkD#K@i37i_H zSkG!V>9Y35LW2wk9P|VfeOTw=cv(tr&iZ{iL{beQI0LDmS_jBEjPF5@8roV%+1R7r z8(Lt+5leEG$1`faPyZ=zTvsqzHX?fsXEIk4t#0#tIRE?f^n@xYf2!+#{j5S=#}iezm)Z*n+K(-*$9!(-c@D^){_N%CT6!UMG@Z04%gOJZ~u#A!9| zN4W|luk6o%l7K!&(s5_N+gFCNCW!2EbER9Vrn1s(vepO_kaP@SeEZU*1EwKH19V0W zhQR;^3(mPX6ckP6=Q9b0&_%r0u6LK8$~QU|q|r~M6m%b)EpfPo)M41-bA2sFTBT7q zS?_?57X2U0y>(QS;ny~b7$~KH5>g5xDBVbn!q5oPNH<7#4JlGmBGM&Y4&9B2G)N51 z(A}NGd^h@g*Ll}D=R4mYC)RlutcA`zb;pitUwd!y^RYQvzRe^AXp*HOQHR^)xZn<) zmr;Dm)J6}xwdIPro5}kgJnBwaCHL&+2o#>`iijDMbo;ykO!Gb1;0s-9Ctr6Jr6CZO zQZ6+6xjd^&3*JFwH~RWj(nWp>o8I-05|2<@u$5(0HJ>V;TUe1#J#V~B*%wlJ2Ev%o z;o+SdT-wH&I!@oRaKz8bfh9EcCnw_0+|%_nNbLN+~lY^E~Z7M?>W`1?)m$~G*G zRhkv>oQ`fBdjiZU@FYT4Fp9v3X4VX);r+=rvX{9!~w%VBfuU*T1be009ytM3-J~A`I^@f-*B`N|7Z1Q|{t;?Pfjz{|S!fng2O2X7?ZtH(M)>;XkRi zT7{=`tFtCY5+*!1!)H0nUug9X=RZq zBL2IecMqz~%{lUZl$U`!Gf*l9D~A=RPP~73<1aLq+P-3cFXGzQcFTHlTQ^MezkLFF z6Kd&Xt1C|ggEPOC%SK8zFBlRqf#_Te}zL2@U{3OiuxE^ zAz!YIrRXl_Gq9Sjk9U%PRSo#-|3H$z{`h~HUi81Ph5mQE`~RDl?D{$xL3QPDsHbS( zbzjq6yT)f@V6gLqJx7&E`-JbWOq3*mX!?d^m=?5)V?`_z45oKx7y=)elVk( zO5Nb@#=Ke?rV^NaM1G1jBjCBDNZ-waf*mr=I!3As+9aE*%K{=uOLL0z?efsebEo43 z6~a8DsqasLqp62Ne<#P^oZN64Jo$|n(sUkXgKKq^Uq>MD{|=*9XQDiH|8%`h$8R)~ zMt<#?`AObFEGFu0C?gkq=E*aT`KjIwarg7vB+UoBKkkJD)1;H1e8i->vtrE#JFH%R zo()y5F=!(quME}UGHnmesQS1wny-@#WalIxh!ows*TzEuYg0ro$?iD)+UO=|& z3fqlawRlq%%&^*-fyJ8Y9UkziEa}><2hUxc{g)*jihKEGKihF16?{Q{-yx;cTn&`j+ zlu5Rl^z{_v-X1~0lv^D21Ne1kg)QWQ7u7BQ>W+tgpMQ%37NXncm^f7Y{QRO`e#yGb z{G17K{M!$f#X&}(-AMTzJ3w37BX>aHLN+WOK7Qa(H7-mB({64SGX^l64;F~ zyUv7p8v;vU>B%)StG4V4O&Ot7q3@fSbz72~&3cWVW)w76<1Mh!k#Ulg5%mkoSI++? z1YGN-FDJK~7Kguq^xnp^UE%&aK;ee)7DZ6<_hcGm)kRPhB1`kss(&%lfRRFDWWlJ&Okk& zQL`3z1=+%L(6JMwuF5|5%gA;fZr6Ms1@f!D>~4{VvN4JA;_Q`B*||=fm7aWM z?FxsBQ?%hu<3c(g65<0Hom+j&&+z2QcN&ItMd&S@pYrQR^(`9Z-ieeU4O!o}Hnd7PG&wZC_>=dwlvKB8_p z+$7)8aWya}S7-rSq$_8F|UIWa3`Qwjn8RLOHt!-M0Z6+ zrJbX#>sD6q@zzANnsT8?*BD&=i6nu1UdXdmKts_#3gR^`3= zx|%?}S6!F&@fNG?Ni-Sh1n-iLxbfRw&4ZP77Ve6>BURL1=H`}`PYCIQCp6?T z-P>N;u3FnyO7zF6{BNMveSOexj=XOR5X28j5)l_%o&tE=C*b_(-qt9+a+49VDg>E&rE06E2YxKXj^v+Q!{25%46)j9vA4RZ za!gI%Ubzwz;Dv-H9CayA?`(h`Zb5efB@TC{+bv#aDrWr{m24F&ZanX2QZihK$Z0y; zJLGM;Txv%MRCXj+Uaec*oqdf<5WoyQRU3mX?k;_@s2$P>KAc>FtR0u%-+9E5t82vQfBfvr zH8N3-VOTOYj!X&K4+&|~IOZfEBl~=kD(EG&HWIs2&--lN`)cJi!viYyvq07ERp|tc zTit_G^*Rza8XJjCmZ9G~PUOUOtQ(Y23BfNq{j;*RD3dPv-PdCOnl!GCw0H2R*v;5l z**5DMH}4i_`JaUxtry|{ox_;40dro;u{xtA8^qU%xS$SdP<_gEX&>+6q<*h0Y4uBS zTN$LJta3!<_~3A)sp?Fu_%Lfqh6MW-RGBuCM-bt%+Vg_u@xBO(4G6XVG|;PhhPRNK zo9}mbs~>Z4o&Afsk=_!~K!I_Aa%;jpJl^$TcJ8Lb^nV-@WP^XYdK2juWShCBBMtJ8cQ zm?Xaks3dmUZ)Hz+@|V(DT6CzWq7ex03PP3$a;m91HN8Kj72cMB9b{C-m=t z`y_tI1Ey0@{j}ir(o+4w5lO8KrGR5ceX1I5<56=%Zy%QbZ zY4V0|4v?Ln6^uK*u2DhAt3z6v_0?r-YjbI6i!Z1^jnq8ZYII<2*a$hm`*;gz>F>9T z$5{!c8>8GW=u_zY-i!_KK-INt|i|^^HclgF$V|QGvwn#A;7Ea@dKhQUo4^NM0i6vnA zcn5~oYe|qNinGq?0$(PgsoASM0i4c}+3gh3y3iEnhULR&ef1eEe^*Yh# zdT6eXiCfQ_|NepT=lS1F4*uc8bK@TH4z7>#dy>~=4{&^c`x+D6==%77<&sSmVB=z( zR_T+9XTKZH`z9T&Sb*S=wZH-~m)*>23Kme36~~pvx8vQjd3)VWcICg%%`62UP(`Q` zMf%V`AP>?#L@QiBzFaq3s4DoamwT$z(MBUmTcU4)b+q_THpD#+R(=^vMiyK{vDg5v zZPUDD8`MrqBb+J^E#>$BA!luDa`o}*=Y`0fYtXHJz?|FPILm3BpUBYAsOkCyV+M`~ zySK%bjGek_N5Yq+X30S|)c4yD)s*j^VTumm2r`0!npN06^C(HvR|(6kxamgtcNnko z9tVHxUjZE~NASUG&Ay*KIMt%65=8%w!%9Qu{sI7p3&LP&WG4EKl6bH_~(w@D=h=k z_sQwt_PD1%f&6y0cY2xSLvOal0M6CGN@abQuMDSbGyFTTyNlmm(t(b%|M@Vs+pXkS zROH`X%Qcu|Ls*r-63PG?MD>CO?&rT_2}YX!M1&a>vBmhauk)iw#LEH;T=Kbk)`347i=NVy5P0eGjrtf>$tGo z>+y!Rh`K-}UoA&A9)*NK55Xx_)-xm8iZ7!@(%!i|p51BMj)06UjHh~WcpZ*?rLsD$f+KpRJSeQh@=|nGW&Wxxh~aP?ogaU5{8^=(~G^TufLQomK$ZH(;1usjmF zoZ@;6uZmq+Zo0}>gJ)(sE^oeXVnz2350}UDS(uxH^0i%EUDzQZ9Gsjx#wN>)%bVks z4c~KZJ317IV~9aPA)KZp@3pQaPCL8vr`IjOFAOWZWBVemKsl|~qJP&+3PIZIKWuh1 z=>!YEd7Qe7APY<&gT@Pn0cnR}AX`pba z)X&Zt$t}{UJMO(Ka-=gcF-f7?o^;;y0AW-2=!*b&U#pn;sDw8(p zX~gNLPn57@ruW6)k=laz5kbF0DPFCFxG6+N3R1Dsa(0h({QC3fOHj6K5})xrv=Vg3 zu0meyW~^SJ63=BHS6J)_L#ToMwlFvd(xA(o67%BoYVuwXAVx+S_qOZEM+%qrTmvI0 z*8U))d%biMF73s{9uXjhhjFPnV?-%vCdv#ivf-MsaP>FPP*rkDL{p-7m70!MJnD^a z&{xH;B%T+P1e8Kvmt}6c>YDG@0@+P|LZ|KCyPeJ7);(~mkAR@3Kr%i}w6#{9^Dn&&9ePeXb56aa>ZGanG2uvpu1j@jxA=?=;Sode%i{ zEc}QNE-f!MVts+g@5=8AR?>Nz9#8FMHrls58>yb=12H?brJ1NP4vAEkg|3}!H=ySv zK)rl6US97*iQIyM$$G2qR7P*KBeK3&*fS^>uzSlOsKeHi8T$0Mla;p}H-0bd4L?3g zXu8t48j^>w>Mn1sRXDZ&#?lWA+?lKqJ*jI3@Pu;6%}jkkEnHf;#+l4V9!uZ@ma3c_b-1ElW=q1B!%fgG{i&4yxzhJkU$@lWr|H`_eEsg=>d7FJ zgtd9!Yh)?jdz@%C9ZH8o!h~AO31)puN=n&ad*xBd#wc*n?T<53q?1t)lN`l+(GV}3 z%)cfrmm-Wp@Ztow=H=zN{h%8CaZ%t6h0NOyZX?}Lh|!>q*6HbimbBdJxS)9=LNE3D zxF8;@@j+g$;jyvR=Csx=%L%b|Tzwl}ZXPmr6AA)^^fS+oeoaXiXBX67uPOx9qB?h8)NK}1?7wQgF43Na6UAjlM z1V*lo)SRrs8j?Zxgf%dz2M0I+ot<$z2xCb`Deh!~`{w<~$KAdEB)x6M`{bb1m@rQ{ zOHm_E^V_#*;Sp0z42-aUQaY4DB|o^Rey~`Op0_AZ6ZA+25mkKy1CjePH>~$SL)s(% zkXSH@JO)!^4U;Yp2H=^KslAC+F716_L#KM7mLeW8z6}ivX5cpo5-*subAx8Sd+AYM zug0RubF~D#GjAyE`iG*%>>mZR=|JXC{Auzw zg*089?8rPDlm~2%QoT2FI@?9vUUkVy_3NWcG&lWf4w?Yxf2aPH0|g}o)e=FeL#fiB zBCjQKAC+$77-Ek;KIpf^^}akN*Zi9FHQ{Sa?T3w#2q5M!$4VkSX}wO@+F4injImOK z&E^@4pb|&C?Cf&~Zl-<7GN56PkcaCV1p=5#fpK*`dS+ibW59#oWg7@GaXjj$kP`dmJK|9k^vc^F!3LmW@%ml&~Y=CkY!wY8G&xBq5If;7!E`@*Vr z;$FdyLq8~?JUkrs?FB$<@g&R!*bK6~T);v2Y*7kb5A-wSuZbZ@tJa@v(fIR61frZ_h6P~n)34tD?~oO*z_7_4&-XqPsz0JQ=tF4_4~^$mt+*b_W?qU<|YAw z)#X9I6FJZ2-pa&TYQN_+7d( z>-G%MHDlL^SU!o7e73oE{x+`}Az|Jd=gBk}~2ggT?A z78si>;|^@YHOYAm=_(theHi@B96>Y%0G9tOcqYr~M#Hvs$mYa2kIGzP(K7nf7L`9b z<9@M4HgvPrsk^fq<$!Xp{4+TjqK$b@VCCgXTaYJK%wsuDnEHin4WV{`gB=k1cxfg} zMz6{mkoPwcWjWGW{El3e5>-B9hV5gScKgF01cf7l7P0+Z+QY++VP_MM3~3EPO(sI@ zmA+K(g^}L;{Pi7T=C9Ipb;nzH_whIhLqOx&e(h@8%|$6GtF2%4^}QP-YgM4ua}E!W zGV)=x^wHU6QDe%9n7%@!)>GPaZbr4-;dT8Ci3`X56!e)E53ERO7{oJ>Y7Q$g(J}15 zJkT@LrVYFffIhBSwZq26wYs@c1&of$mS!Ie@q&`l(!qw-9yVDqWB=%AW2yJ|H1{XI zy`al7o?+2m*E4m2K+u7y-dA%gslk9=@CH7>FYt;d^dLhX(hw8J5G@I+EXYVpW8qQj zC@OyamNW%=1w}yORBW&hM?-)zT~Mr0WR8}SOBRxWYF}Q)pibH)(CWbAefm!Wb}Zf_ z((&G^Sl+1TI$NTf@faFLTqkQP=Y!mc3QOfEdfD6``5sokah>tYWLZKUQ*dq})L3oi8Lh?}ky#~Pm`A%c^!h!eYb{%N$60h}~=b=T#1YoJS zRr8ic?LyK9%t{^XiENMz3`_}Z#{0kS5e4Eu<^n?uIX#W~`8ECMJ}j+tGS4yP@jkzRXm~0`zbq zl&oyVyT8Bvq=ZU;Dvq7#cZ9Ko#rTUqqlLQi4T(HnholwKM_|bTGw0m%%x0lIlw8<| zA+^5eK@29pI;Jk%Vu)j!igZMw`cFNVy^i0D8H;W1Eda~~R7PZNIwU0M zy;v{s^1Lvw&;TZ)Giw24w1}07WgEeGS`Y|P2W>xqL01+M=(Kkr;ISAa!m@JUiZ;S7 zF9?wVU4>fN0G)Hk;+pRD&s}2r_ATb>d?w3fXooKAnKuW_85AzPygg&7gCD3$5%8nsfFhZe*zBsq4PoLlaJiwuWZ@0O%h4fkoYuef?|yN9|4_fM9ZO3M8G+#S&$#yP6+x7zNY1$57M#C`gc1V)9P__WR?36Y$nR?XCa zismFZjXZ?p0Heg^murB#<1wn5C$g%+XC7jXp)FL zTuFVaQe5IyOjZQAs*)DLW;?z&Lzcar4vwv8_Sc3#bf4ov4;P9;Ko+z42Yu@gAC6jj z;%#IT#i30_+KKVeDmpq>=LJPaxa%#I2kjG(_E3uP7K9T5kkDgTBZQnmqm)VN-h>LL zc6^#zw~GD-BC>m0=zG{v&zdYf0yThb^}3&YQD%4 z*a3V$mvfJ@;Z0a(3p@YGa(q@)%6sErg@$NCnKZaxGm{b z?OXR?1_9oc(HSpJ9-jAnXqhmL0|akKA^o#@ZbNquk)MDme_}nu0{Wb9&Qw`0eJ0A0 zgX>&rdMSXTL^?}aS`MC@Pm}(MoHwRO{j6`&#;v-pV0gWBpTqYZpUGketwaQHs=UEw zlY)_`(M;5#o7c+huxku9a}^9F!VF-hYQ7`4qoQIHzs5W!rc}{XBA=yxm-Ft27AmkI z8HmK?au>U^xpry@YE?8#@x7L!J-4veOkXnX?{G1I4(#6gH-SzrLqk?uo1k5q)>Ha) zKun$g`jwqlLOm|g8@=GIt*vEEN9S^AyYr{TYEXuVl5(@ka>kjB$9ZWTp%^b)Fkn^@ z8Z%J(7LQUejuPhaAD?w>G(C{9jj(}wZU4FHr6xMGxjUj1^P*yDFx!Py|tK$m&l6- z-Wi}xW$3uSU=*l}ij6HO;3U9%%+@?QYTA(Bnn$i z7+z`vQq9wFE8EeL@EblH;i(@Yo%dyArjs{VjW98+-izxLW`w=Xh}Brs4ZZwoz)3XJ z1V0`sH3m{1T4y*OJ7xV8n_F~>YlT8}MLH2Xn=2>F8%5|=*Q;oJ z%HS|EuHuReGvkViip@<&fLXo;o{!-Wj6yJmvC3wcacz7&H37xrttII*S96U}rhHv_ z_Lp~GC@Ba=Wn(flsPz%iIWov70bWt7l&EqFKGlD_0Rda z3=ZMp;fc84IoTqb@K}8R>Q$gT#SmIO!MsMy9jHL0gBcq2Qv`?ez)OG5SG%@!iKI|x z+-31g;Y81x4c{w1Vd;nnLS_sML92hLP$aKT^78uPw-mRXsVo_g256l>0UlhSwhod- zDwiTe^awfH)_LajrsX%KX0L4TCF(NBtiJ^Xq81Uz`1gvc=c6ONKr;*7tm9Q`sxLKY ztF3q{>_7uY@Di1WEO(sph=TPtpg8AgC8gZ-O|?5@%%tTFfCb|>;PdcdV(IV;iDNe zuV6%L6wLfwDHG;m=kc1y(4pehX(o9P85H?ZzF?mBE!O977ju$90oA~&Ig!qIz zPB`^mw7zfqAH(IL5^^cKwhkfdOLjt^zro3CH%>%87 zii!rhGHc;*$Pa*$ZN*hMjnp1e%){jNMXaiA^L;$nu zj0$aJHQy^j1)VpIub&i`RTy^zfyzR!W0T#e0hg1K@wA%HY}zV}j}dUTZE{5=G$d;q zt2nJs3oJ;4n&(F$4C_hi9^86&WJ=A7r{^!abX+UIGCRk4; zR-=V}GO%OucoA!>4=P2p(_#DkVj2IL6x_e@0axee5tRK@W)&LovL=>Bnchd|z2u@9 zSnH)TIqTwzionzFh;gZ-AOOq+*JhRtdeY>-xB&4nf%n7D+z_8xo3v%24X|5Iju!SKRlXgwB^qAy$gp4Y z-+f-o;K%3Ss?F%wm#?0&d%YU zSjd0^U|mSy0$7@s#X8TO!c$FNC!DuJpO+22N|Coc-Z;*9SsHUH4T(84 ze(A{Kjk0FdtviS34JB<-2AORZM}nFgd5TCmDP)Ov(b%6q?cJI#hEYPoBG)_RKa(OJ z8XCIdeffeQZ#bVjkw;lY<$f^L?7~v-(iIw8kvA%;aub;+06)PmmVi}_(#wA+^(;|1 zDZGk7*C{FsNoU!kD&ZXdmyjXT)$IMxczDJf@rB{a&p98E?cTo3UN5^jsxXIQ>gf$; zcqwSmn~i547SKKCQL>nbmF8>L&>xVWla`mKE}`G*msMFmBvg;$0R zH+x8SvBbr>bxpfdv_;Zp5y4Sok5bgb@$sFcjrHwH8sN+X#!Jh!{I7VGW~PQ^86I{$ zvOiYtHgnUW0wE?_KEOg4+9}M7F}5cQY#n%eZ`qblu_hFR&aE4W69#2_3tikn!1n`qEp+QqxT6}2hAYgkaX{@5+Zt}b0*Xfs8 zo!;S zSEM;wc+Sg%_^@F8pDGNOlyM198G1cEsg6*&EiMk_!_W(OVlVJTk z?AOprzvtn0Pm|TPL@O-3a_Y^OGW=cT;`|D>cbR1|YGfbZ0M~YeLL%_3H^Z7xHRoP$ zZU9O~RYlnPWQ4YmjEf-_$!NB_$2YSZ7&=fy1$X$CWvV$zuLp>qK5O39x`w9ZI}f5T z(6#3$Kj+g;UfyzC)6iB*j*c4g5Gd>`97^=UyNR>ZoM4G3@k$p&WbmCl|1CXyGb*Fjsnh;HNZiIH&d_3ut>nM-y$nVI`y zpC5s1y0xwxRD8M)>P;{N=-;{|S!>Yvt3>4Go;@@lPWaDBxhm#qxsl0(sha=Peo~qw z)b;lDSuX=fMbmOCGF);0eL@l2&Ha$9W8)#55CYJ z#QMLuBDaQBwo=OK7xBPqYs~2F;8=I)+ zyz6=thXcZjW?X!8&pW2AsLlwTp`#zf!&9r}hl#yVbWsb~TZPq%r+zM6Gp@Cn#lM`jhcq8iMt zX3FLPq@a%k&Iz(e`0vm#2e&V1B*b^FKLnmp_SX*;8h0+9-N0zZ3F%(i=hM28YGY;w z7|{)@kWHGugcf}Y{PvFKKOM8T|25;#U2Bt@`4{iTpd$GHUEutZ*fOMbZub^uijTY& zOJMulgPhysfh#veaWnKK3lO=(kE1{9$Bl&F#h5)yS1jl*c$xK?zec1`u|Pur)C}+; zrsd&!7=nw7hZ~BEhbMLiPT5Cf9)ByYbqO06D(H*xYNv@jkdJ~Y5LB!6Vb#OsdKoR9 zrdKZMcLM`hu}+`o_c=sw(rPjim87XRlaxC{!E7*#KaZ7qWDjtu=}=!mbu+l+OQ?%hm-tcWVDeX+>)+Adr6jHl5=t;3EC^z!fbS zp5rjmykuaJm2TRYZb|N6sc_bcSV?UJBK@AfxPeiV6>%V+2(4(N2olzOf0-1kFX_N9E2>BDSdMngws@>Yb*`T?G(7W8<2=$2N2y>?OBk5jeuN z(#2-$HMnsKr74U)T7y|_qyn6@(n+L;AIr$bVcGI-*8e#h$E+VR&esQ>=}*%0}Eq${`%tVbUl1) zYg6Fj%#Kg8S>qA$M*vD*e+5A#r*1WVl=_OoI=0WND$3fTLYC+eA4up{=vW#hns@SF zUS76oI$N$i+IZyT#4|D?REssCK1mTCW?VG#B6@{2sS22sAY617LgG}VuBka)7d!B= z#ZQgoo4L(ZfgX65hVBcjl2NoA4zrw?Od8 zOY_BD0)H|8swkUL#EbEt`T6+()(Hi3pV8nr9DFTR)W)P3q&NCiJO`?ztW6h;maF9yYBXqMD3rzGQwc931~#Vr z4*UM^z4lEF5Vq+2^h@H#cT#-CNrau4Xe2fSg;Gw z!R)W(0>f?9t|ae6Nl8)byhal#$)elPwVZWM>{<6INN`H%+2BNax+#O#Q$Ehu-wDPZlt2N(YJnO z-4kcAH##29U+dzyGt2UDU%(B9uJJC)Fdj5Jodxp4*vT{sxG~k0Y9Q`H-#kriF?KdYXEZp4ORGdKj z)2!DFs{;)J1pWXXdp9hVRhkTQURqoZCFkVfWbE#5uaZlPI~=?Pm;=a`hC=#Zfrt1t z#NG|r*~@ueK!akOb3N`Y^n}q|hy&bQTPCQ<v9WAD?m_WLu52oKzAvt+tXC;pJ*;x>H8-QXjz*oc>jp^neDe}t5kX<}8m zJCO#A*OxOc1?0s7VMb!xX9k9Nq33w7yV z(7if7ElKk;tmk*<89GfHqt&4l+PFRSFiWxK@+7(pnVhGquB_$3zrFdXWFg3Gs1h!n z_4UN|c+Chb{eImqzJO?Si9HyHTe1Z-XJ(TJI_O`cYVf&s}fOBnV6ds zk`1uFqRYz79sBt+Jw$iq+psbKzDC>WUvZON6U_u=1gZL4dp$>yLPYIN!?aI|C0>8O zQUUa4>xDbVV*@Sv>)+HKSH4r#L7Ev%h330_cx5UTHDPc0os@L=@$T zb^maaV7R5i(_X_I{50&EGzdhsFSxn6gV3(+{-@wpg8-wI<;-a*oDCukZB2*$!xuL4 zMUDEPj>X(|VfP~t{rF%y-FN+LbXl1{p3(fU;T#wl9$`UyW_d}C_GycN?8D`lRtZBu z8G+q$zJLE7-u-)srgE!Md=mN<9U;HO+N$E})yp;<_M2GALL@7CJ9-9|Q)b*1;>nTG z<7{u}(!uisM$DQV9xiTn6Mr<7zJA9*t3+HvLTNiFK9QA`g}1@SH%2YslwO}c)is!p z%-RUPM@L8JhlOj|NCGt7i6fC7ks%RENofcT(Jr%QCU~2|H!wVGH20Mb+drvwuIIwC z57a~f90pk^uy8;=@kJ||6L8j$DLR;qK0)j24-c06P2;d+#1rG=k=1TdK}<|cT1m-K zU!xv==BHU75>RJ&0Lr=l&_2oW^UIKYwtsxg#9CAhV@X9f|hx()VkZM<*6#YLeIR&;bh?9}nyySVu4AB>GF z4Eqa9XeAC#FEypAxHYyuL%c>2pxsx|+Z2Nj`fF5rF9d`c z9Ze~{H9z`FfIcU){MSHBNkd3MrfR8vcQ${Py?W1=W0t~N&C0Ebr;(DkF}>i>uYFA< z-n4Jh-ht?9{l$sO%Ziecfzts)a^dfJ!JUR-7&B5$nkw2t4DPR6W#Y%*-??+A<&6-S zzs&N(**Q_LRQSdO%qk`*>s-PpxiuhIa`kQtn>7xYX+A-&f=Jy&o>i8-Z~41_{#a|H z;7stVgXPI14HMFUgQl~cNW&7a1?_7Lj&!{Pj<-djF#OFS6z)?s2El2epw;1V&d$6S zM;b%&#lg8?OYDC6^BQff>0&Kk2Wy`kD#!!0M<4eTYfO)gG=3lSHY0hoENpm$k&(T^Wfr4DuRdGXS4&}T=BrK&i$xVV}@kc)|qxuQBV zj_~~Q2XX1F0;XIDEvI69Z0kq9x zZEdF1a$l|jS+r{?hzYyqhN-O)W?a11$ex})bJyVL_-MEN&3GV1H!Zhl(FAMx^qOD@%5J>*guujius_N!}5=Px?^koj0KLfBF73jdycZ;$4>S( zB`UuhFSF5=lMBC6fyazjnD(d9mT+dj1?{H*bOZyTkA!t}YSgvvo$n>zEV0He_re(& z83~~A3rplJ$!G!72)HFiZ94^yM2X{hYIZCAz;hi*ibLFo*`m4^}uhILWO5S|Ld{Sh0aFttuO$J{F{O zsf>zMGf~Y3@zbASzc2t$=3>W}+-;LXA?*u* zt65T9Y^!(Z)0LmE^QHy*E$Qq0_VJSigK`ZP0MEkiZ})fhRsfi?-6rE)td_qnbGkuE zU73_%M6Cb;q7@14=dwU>peM?GQI8U{5;5V*FEcKVPLB3IEF(37q26QfR|XM`UX6|M zVV=_b`!)5>Tb9#P{AS9J)84tBY)=!>%O6K({c;|9@GND$Cwjl|xl-2qxl6HUg*hr}d+ zoA`~AY{ZO9iz*g`n8;MYyt&K?PWJ67(feb*(bi5@%<8K1Zqm`i!lx#@dkX#Lg7&%$ z!|GOo&(udIW5NqYhRaugam0gqPe}0SA@It^H_$=NU925N1qBX{wtCcy?>6UvQ~?I+ zCgOmk-=U@+yxkS@iQ0;N%}{o|`_*7uh#JdD#Hs}JMc#`O4vxppaODwy|4)PiEwq7U z_N54O?m)h4R?bgR5z0+UT zfyf+>b&q8kS`-Z^2eVqX=zXEZgCN0WoD_Ws+8otVB{2-tWu(54f zV?es>I5qzH^Jie$l_5Y6n(w(c1e|vU&C6?za{*!sJfGnP0a(8BOS-QUKQ=eP2G5{E zN#&@0^ddlQnYGDIdI4T~I%cO|U-UJ^C)xTlO(cAricYD7A8(ALwGPGQF-A+b zi66CpC@3iC*RE%C|HY718XhDY8YT)0+!V5X(mXTMB%?+%2>*%Loz{+F*?LBkD(B64 zJ0aP&(QYHASokSRU!SGEvvoL2t6H9lpzw~f{a0Y^OT&+M2Aw7gDM1!cgT{N6PL{g2 zAhx58s&kZ*dz-@Mob-<2+yPZ9jkYExCKhWGyM5aq*g)nx>$T`VE#Xv@VPRBUEIfo| z5F_BGWSCXl;^XGFI&P=tW{QxPl$4Y;%Hg8Vdd5412@*8SxS-{SIjIRd8>gLUH<^`@ zElt2IpSR_!HNHk{Q+NT}w=X3`z=O;AHJZUWFY^=mz2y3Ou%nWqqBz}uNz#1nGzyIP zZO@lP&>FB-v<^DjO5l?>0z+o7bTCEeW3|@yG;9r*z41Q%c($pLE6iO*RV_L?R#Ov& zp4A7gp}4Avk2i0Yq8sDdarXlK-CG}l6`k37)t|A(7%D%7;zwCKD2GQWfs(W!ntQpgli4{&k z^^lTz_F(*0ToB+*JP-3;d$$?cv$^Su%D@i!j87e6%*u|Nq5RTcM884JA4}rCQQg%f zf!?(^7&03M5INA0)SUJYQ`=dYn93_YwCkwk4SP^|@A~)xeJj>Rmw7UTL4dlPECt)3 zwB01zM3Bm6DwlopL#j?g1O! zQd{xWWf>Bo!^ZF2&dyFaI598lwB==2XD3oTAtMcbnwMd}wx=;26GzqycrlrxI(e)n zMWD2S`1IF|5x|TNCu8sG8;QB@k_76z{&WunWyIEb4a^OGHnLn)|1v1K!g;Hrq5>?t zh`aY~_~_K15r$FlT+T;#@9`3f!cGRlP$^A+b>(4DWLUV(5N#+>#z&t{0ihXqJe>n; zebaS~$sXIrCWm;Q#goP2873>f8=7@jMZpWd$w^5cw1UEP@yxjQ@rHE$CaR+3w^8*@ zt!)c=XXOcFEh5|uBE*=RI0O6IyyfpmV_WrIo~r7 z|CZB^wYdR!XVB!rjenb|Zj+7RQS8IX$#Dy=go4o`cHF4=WKa!f_;Hwc#@gai)}(gc z_hQK`#nBM00^=BTqas|@W$$36S8GlG7~@?To3=B(VZ^sE=)K4Rw|6G*Ca^>yRJcIUowca@aPurMGX z00Ej*ML8&0eEbKO9ofexgt6UlKzIjEx@4+wVc*-vIva`K^^YZ13?ZqWZGJ=v18!@!)5#erpg*xw5-fLx%)*%jaB9up*b5J$gq&Ag8?}{36ulq7*JJK(U6+zeK{-@DY>|? zHH~ajsWNbu(<#gg4z{*q1*v8KiIC)d?!pF!@8 zE-hXTDX12U%danKIejTLb{i%DERdF#0k|pvzz7K5p zXqA8#&cwv3(^zh`BA2Du$#zYGI;sG{4K^Sb+;82Y;(sgyRgEFWKgI`q8%}Qar!>LJ z?yL()f0w{J6OFHB90kJrh1`qYotSL2huia;BY$>9_bY3OmKGf-d$+cP_hOVfu# zNA(^@(n=YPZzH>xup%gcg?DkEl8u9dhldAHXW4l;fHFB(wI4)%^qA(`o!P!gF;N%c zRRf@}WO%Y)gXns4xoC+5;CBIIIxTIkumQG@gX4aLD<>`GT`V;$*mTdxUi>2fV|woJ@S>9iS+eu(~P z@IsbWR&@}qrt`Bjgn4joUR4M>4Pc~z4SMH3=_%J^EDTr2(I~>dtu1yH5_!LtB_f$CF4TDMNu@*?^o#c%2VKg@(lrCM)^41?cSk)u!9|}Etd;g(?PZ%yih9sMH4x> z%Pq}wIt6`wH6k13QQj)13nEe|JKZ+ZIk^hRz-Pr27wqIZLRQA zzS3iK<1~yS@04=kK%15|K9+*}$CCwuV50_&J*eNB1G^urY;J7bxYXRZ`e%2#BrrJF zThh$HUeV1stIp!$3)LGHZZsrfbZYqUvZ8?O)p#u-308YtM@Q*rZ06Pnkrn<+g|vZ| zaCqJMX+C$t{GcM1=A=fapY|HaAgSD(lz|dSg#O4aEId&d)12HCcF(NMHc=n;34lE_ zD^F-BDe3j-0HX+w-Jq21hpQjwzk0SC0Qw412%gPz`q8>|Jqr>_V%7JkCy33-0$$jY zNNIU(LF(BRwRc*U3>>out}5Kza?Zy&tVyPfhuFA>&Ih)3j`@Y~@Fq`A0oDlSljGG6 zovkrs@4!f5dj8-@tu|aaUpX)ED1tcn6X3?X`QN@LRW+?WX^QM05+fvhsI0E2c*UkB zUmKO3nu^6U=Ehp}1VRr%Usf=J>}Q(CypHNlR&aQQlZfKi$g$$u?2)di`Pt3|%O!=I z)SFh{6$=dIQ}aia7h4C`Q0)=Izv+REbA3dtRSSu{WopdtqyHcXzW+U8y2sQ{q*$RHdP5LhdGu%MTxtjQ@|`uCpD^E?Ofxi6Bad z5)s}IHCh-XqPIx&9-Yxg?-C_Mi*PT9Y6NB#Y5*@JE4 z@E>)PL(@6=I<4~%0{{2QdFI>_5@OTJ&k>C((3Fqd@}yySM=x4dDWcbOOTGN;(>H6J zq`Lm=+aip!CD3FRO1<#R%`LaJ)rmbXNhhg%8B0cH#KdGp>Z4@~pZ~qR72R%buTm&% zC_1C4M6!f_PHy33?aBRkVxUK&v}|wb#4VTbwp7qIgW<#rc6K&Te6cb&=t4!sSs1~g z@2ZO!Q-(3`V&!Ubz;;ezl^Zan` zd2Sc+6qBl`^s1@e4}bEMdldW=VK&dvLE$NOZ|}sqBi~A!g2NA~%-*@sFEw8PJkhQb zh2$Z=9uV!>a(8fIs$O%_%rK+b zMtfvyj(M_y2cJaGaNk8+E&L^A{DXyvP?=g8fv4c$sE`m<-huue%+}n>>bj$u)5^{U zSK`^2@?*ME(`N#LvE(FO{q?BwS41)L)YSK_%%846d?sprPTJ*U+vcT+e^1QLw{$H6 z%x2GhkH{(I!b8&-(*yQL6!;B>Z6f_al8L+1 zW}DxICx4`YCDJ|F;$05@r3YB!_Pdqi75|uw3icivipIo5`x3ZI2ksP=78J<$e4A0> z%&~B_A;A0fZxiKN97|;802(h@DlM+JyXM8==GU1{%MuLc0Hia@|kDDH664K z<3^*gQKa&nbfn07t9F45D8%yP0DSCu@&J9^|_l=*;s;7<)P%f3zjCI7roL?7geQIhR zu-wS<__zWjKuV|$7N$hQ8?xWr5`YqV*m8~kIUP|thMMbOudpZEm&vI!6 zUJK7?^3E>GkqN>V%Qp>rrkPj?<)gVrQ!ggIBkiiik*E+BHlwb_&Bf#D<;X`xa{qR2 zlm_6QNPu_8mEK(atF#R}EtZ00I0&EmQSM0e!LebDjNd_T*MKN3W4V%_ot(Z)%?nM7 z#19MR#>-WH>pLaen;S`faqY1W_}2zu)HC(&9$p@Of4T$&?*aR7)qGb&?=8sjyzTtT zez!j)7rp}uzN%XtvgPfwC1l6Nd-xuQgv4Ei{x0-7>*6q`&7VVh6 zzRpjtFBiSMx~=vHAYLH$^o&Slh!W|mR)wcdri6u{#=Wh;1M%z5T z^#G{QqX4I!ogq7+&3&YUe$8baH1i3!aoX|r`MGdyt@BPGpN)376c?A?F*3)3Q~8tj z5AJ6KAd`Wh#v=*z_%fuVuLsrSidk!3`P!J3niG>gR>F88c)dr1T|79CaKF+~r)M^S zu{K#8JVpmCV~z@+UW;e;1I#>q1HDz@MV~-xWl;cvKUrJ%zI)vrx0;7s8}5EYl-i;r zl1GEFUQ&~^grqe1^V{DS1 zIW>$b)%vIYtb}}{gI?`dSgu@gCQ}q0?>!r-`ta~0raJ5S<>-;*S5Bgo`rDp0ow>1E zk;^u`CeuF`5p!BLl)ozkVOr!BwZ(_=e!GPY?l9O-ZH{CE#}J}87C+l5RDkQ!-cf4| z9T&G6BD|f9PJ6^;XfwxL&F!@*{H}qvw(-pGsohk2!NY^YnGF<!}EgTeZuqT-= z!r8_L-n0$c44LuGs2j&u_ZiX}vwrwC8VoQfhKh?EN`C9=&#fdYIFMSa!ZBSvIs##|z5%?0#{iJ_){_ zFPzp^$JfES1^M97w8kLGHSAd-z#l--r=B{^Jl?S3VHCB0fh1xO!Zk5B!30>bdG5dWp#@tZ8%{4*4 zfF?8aGxADSUUehSj#9Y;<^m3Cl%&{|t$>-mS! z6EtXmVsdNY!OF1@rmjT2&|3e_9uh#uMU9m z9|Kp#NuEalp<`N{Z|pU>j9?3{HMqb<9>4~{->@!}K#MqDRHE0Zv4-TV%*oPIv!>egIqwyOn)nh~5 zpIXm_$yNvGA`F1jUR<0c$jWC%H0J5=KbCJ35gNv(ruwGPW^v5|#CNtwuc5{f8nSCu zlR&f%JFxv!(6I)@eBpGup}&OJ^=su5abLrE!q`P+ULz$4VbNG_JEt=WMJ&tLv|ll` z$&s_4_Ji*Z(;#@{3Y~5mRiK_JQ5g4$s?#9oWM8GBrIK7l_A)pqaJqrh>tb&i8FV!s zs}Q-CDak_k(K1BFl)ZX_i3ELWMn^um_3=}z{U`&QpqE#`=_vH|N7e7V;>OdXGnJTM zA0uq-=Q{>#KD<&04mn~0xjeLdZ(5JR4o;^%bY~$Xd(G!- zB#r6{vK}ZQW(kk|d=eK8JGqmqfKzm{G-miYqGNC$D>X|^>{7hF%_oI*i(S0j*1bBx z6l4i7kS|OiQ2~BRtqb)?XVx67^a;EPCcq~16(&s~+)=!FL`t35q& z&mFuF8se3A9m&lG+jr*h(IEh=43ULqkqz;d(4^KaBy5OF4-Mv_U0$XrhBX*Hf^U!uI z_MRRc4!B%sAL@pXa6imZxqS#_*ogeIiREbH^F8;An`w2vx%=@~stMt);L8I%L-KPr zmU#Yi;|L(om@!t1wdEskJIDe5IA7SWaaI&?o?P~n#*Pd>0v?Q$6;6#a^Td}a)u81) z)TcIlcy?{qJx8JYIUzRECy*|LCwM=i1kU36#lzJ9cAeVYHUh2K`t9ns3- zZuTDj%gNI^E{nol@kuC4WFQH>^?tEHJT!8=$#wWBCcVT@IRlUB+_m9R%kHIBoD6S} zIg%oes!NYezuIzL!cVG9;(-I(o-BWrcb&xc*9T~+m{8{*VVZDH-y~FE0xmC2K?vRcDOl59EUS}R`^r+>Qj=h}P zVY3uE>G%3Q75ebVq1dBK|4^B7bGwS#0>fM#U85hDU5nDBUr#Z9yR(%(n5Gb--3fne z$kgt`9O?p<>LPCToV3$A&DH+P-?^w5c-^1ME?fVdPHB?j`;S_#E61T$555q5i06#^ zTNr;K;1YJne0rnF&L5jg;pFZ)es7HxIrteanUG>*QuHG!ntt);Bw^%Qvh>A6y_{%` zS@+W1pvzypY~VV7eOPpceZzi9b8UTLW2J?OYKAP^{W5a)w$5GuJu^1os6$omVzMMp z+#O%NLaZ-1>Ov!T);9yt$r=3&c%><{fi(amesiu_{Xy>87NWgsWJR)?Pm% zZ~dVJXdt?WF_TGzAT8pQ=L_n5Ubt4ZIsik@D$=O^MGH*Jhss_&jeuP|E{&um;AqZ0Ji@3 zbpEfH!_gIxR4pzm_NV3KW1XbZcqDCPc%4LexU;KS;r3FMPn-JjT59C4vIPD&H$)+r zlM|Pg6wFUM;J`87U$G|vkcr#% zs#VuIq2XzOEddR%am>pXYfV1rzp3i$%(|A`KMKu+Jit?>#a-mftiRD`oL6wf53O4w zn_7UwnWpMp{HU3HZJ2yB`HfJOaK~RE`XPHE+Iq(yxj4Zvp|vtOyAg|8svD65p`%&< zEub9wPtg&3zM%f>Y#2Z(l^;I5yzdGocG zu;REB)K2dNrfZiXqAzIww!ItQ7b5_)-K^)|QP0C8O0xjnVEwjr$e})=IXPmnk@BWq zA%Xc>|EEB`;|V?A-Y|HmC=|>@J~qK^&0-~{J^R<<4-K_s{N>*^Ce^nCvaJtsb-0qf zoM*K@Lv=r=r&pMVIqZu>l6LoX4{f?Hpz~X0(0W|)PDagvN%iEu0jJ%`)PCkk>NSGG zR_0il&oUh8jKx@ANwsZ9o%+nx6BvMQ=3p7Xgn0U?*btGl7WXF0L;?2}er=9I(Po&7 zVsPZ2d6zF4&ov=OTP-awoIFK(_$_J+Sw+2~0f+%sfiX8yu@G^5E|rT=l=W>4Y%x!D z>0KCJ7CdQyi+!>Bm`pM00GR5jOCEgC3m^Tig;C89Mjs5hhNY=mY{#qZk+0E=NKdJ35yr|xTL-;AmA^EJ1yh>^E& zHbw1Q^;9tk_b7`?^f@wZ%O*8gMoMuhvu5X1aJiz*W8@Pvll9-|r^3Yq4wOSovXWBT zDn_OuwKb)25vQj_Z*`tt<-;Z{1%+#jO!$KWEi^T&UZSM=U&#JuzSq!LQ<@c_r<0JF zjF^T@tV8lj6zAbDP%oP0^X^DxT8$r63BhC`*;@`C>LnYXEEHv{Q{tb_78Esg!3k0IeX` z{G5fFLKY6Mvn6#u13)d%(UGw<)ecM^oxF*Xta9FhbNl0Hm*x7{-|G4rEegvj6nz#o&84+!IV)5K&Da3NE|(46ycwcHLXk04Ib0 zY>$D37S1hA?moEl5eRsyT(G&j%i?qKhda{NWsqYJ#OHrD5EwNI7EGnj!J#YDE9OXy zx1ujaN_203V5PrJ7$$?T6QPc;EmXzTWWXMAAw z1~I1!kzWP<)&9DqhZ^F6q??1o}V0DuU_TvKrGFo@+ zftHrGPvh+1H7vkx8JMQ)nesFf4E>JyPPV_Vc$d(z8k4t5@RC2h&o@BJ#IyRvh=1+q zDkinhI^<;*G?9teWmH(0xfBWhX>DVjtZNiqcclClCNE|F?%g|p7hc%IL)Nm~V1z*} zz~UBVjQ?QS6yNBmRgpn*nJp#V+)A$iaQmvR7Ga~x3amZcuUN9QaCdi^DJfj$v48>2 z3D>D3A~hW?FXu)QhoAdDwnF{?*a~||Z@f_e ziFZ2xu@zSSM}U|@bK~>}{M}M??OuG7tO@>~ik!c~CCNWI&Jc;Ry{=eEPF=P{=G}+? E0aTg=aR2}S literal 0 HcmV?d00001 diff --git a/app/artifacts/ui_acceptance/03_prescription_library_1280x800.png b/app/artifacts/ui_acceptance/03_prescription_library_1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..585e7157e0168406a6a7678e4e28313815646021 GIT binary patch literal 84080 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�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 z zBI9kw3i%k!2JVap!!|D5fu6>YIe}ul>%~p2Jo*{#&@>f;r|ZVEXJ@>$D`jqpu0jH? z`Ptil5sELT0#)tQKVwU-knn637;fQbg@KBuxRYY8)H?T92Sc|RZ9)ZKD_k=)_cciNjqka(VYFz?=2-A-rS~_6H?>0Mmm0jdd;wt;n5=U#{lv` zcJ;HEzct>r-d7UtfxM#f4`h_P<2v_C&Wa9GTG`r|94?Xx>5$i{tF7hd2PH8CA&8sa zk`F(`;ciC+2Ofa#E-)@9tFh5ImU->j3h3j(*`GfLkqT;F4RW9^+4Q#Vw1%9__2%dS z1OWWU6NLcDAP)T;cyqHqJu}Ja=$!v8J1>As>G~>4Qvt*`v1)qT36c(Cz zFaa_FRb;AN4Xg;fY|Kp6@y-73zexEajRh?1y7R@m!k|c~xUzv*Ym7Ji%5{6b&LiZ! zTl4q`qiSzKpwbZ8fkncuYl}Vye@4LXwfI)RDv>_;mR!5GHU_qaU!6N@8Km~(T?LEn zjDFMMv=GuGRnY`oM#XMfFQKA-)AZqITa8?gNheqQ?8MZRvniHb;;hm!m9*(@FS z3cY7yrnoi(QvA>5BVkQ6&m0U({v^I^dTCMn3OW<~E7ko*ry6u;<{l z9|&I(7&+>r^U4k{ep7^{2so{d_rLP? zo}-U`@leFa`D*yVLW(c|ofv7s))!mKw^M9D`arO?BY8$Jq58#WrzUM~Pk^BT*2(_( ze8E!8qmcF5TF%k2p;zhYMh>n%*r|htycYR-X+V1bxDHA$C!4NvHVb0piG}kYQ{=q^ zof8?jg*jI(K)zD@lH+xiTCBTS=yQ1= z*5qovAjW?UwH?5s@vgX7+D(L-z^n_EXhShE?~#ef4GvI4bQ!D$VSBMv`2$d zhk~Bwrm!l&cLtI=C*&AiD|VJiSI76y%cGOP3Cv6Gz4*6}5;g*H)a+ht9-ohKmUL_c?V&98ya zp9(IpXN5f+wr9q(&uf2n5|$A_6Z+!RVZX_jY!=yj#stkQDG;c1TOeO!X7rV5$q1MU zC+!*N6{xx^$-mWq`e(FS#;If(;dpC3A;?E{pzE$$TSMyaF@eyWj#$W}gA(x5GB`R8 zVAvtQGX7W;efp{W7%KjI_7PsA4uY8_TcyBvzUoqPv9YoF<{iws&$~b8n{3elpzh3# z@`TI<5As0L0VP^wEl2+s`53wD;qGx}Za#;Op4A8kHhhxQ*WzhX9OtQPEUr}*nt5ZZ z$z@2@%cw_xt_;Pc4?Puye74f`>8-JVcXxW5ug$IX zUg0~mhjjQo0OIOdeVkot7oKv)&8>UBZ>&-8>2hE_wRO(q+i3Q+nNhcF`(QyaRR})l zgvvzS^16MgZ}tUtfU%iHf93b4SMh2EV>{IfvW900d`y3@K`ENLg^Tmy#qu56!;>w2 zN&=1oNZQ-o{IS0BwD+y;z!Xm6yDfG(+nM#aXc6P9tp$)EfLFf+g@e*h+&r}w!X4q8 z^Uhmz1#;x&w2f}ukH&h}>+8|(qlvSP9nzZ%hiG&@mz|3*JB0w|YTT~%BOux$d46}z z2eUJm^-kT1rI#!D7iHlpS)*>{_xOE7)ZE*5)GDtFE4lcrO|~*3brCig^iHqIWBI6` zB%7L=r0Mz)CW=x~R#T})`!shfA;WBtRTnHMTHNpyy;rF`ro^#rO%5!J8&e$piJUH0 z8~nBx|AAe~U8K+uF2cFO^wD~xd^K|@mAw~6O?{j*phOEQh6CD-@ZZQjN#QpLa{7l1 z`)z4R=zljf*Ry$R7JGs;Yf-Cv;NH*EyIW+V%@`9VtwkTfPU0{A9tg|lr98=(>y{Sq zx*C0IxUecx@(QxBC#08@bRp>DBi6b{5fI1T%w&kzzZm)&NE7|vx6OOW@yT4i(_el- z4zEaOdQD9CJt3kxyP%%q&kHdXF!A8(;?k*eFqOfuXtGAfB1FUY4Y0KBFW=7DH6=I! zB<}hZ(%J6Jd_H}t0D3RYKYnVw5#Cc>TKmFZh1^-zb zF;U6&nE>Q*$d}nl_&Pj=^lxJ*YDFMA(R_0g5(5$gWGVYB+kYcKYHL~q4vE{I`=G=| z;3r5LZAs~`pIw20ddbNmr2N)n`^`;Ca`X(kHCHpMPV3}+PW0^5p96WVt5ov5dS9NC z3e@dSDzB;QH}GR_j9rVFca$8t!VGV$=Q4HNi-XE;8hlL z`MCHx+FJZmGd!*q07~R3xon^Ob?|Fb6%0NN0s`>-0T=qL%ZeRBM;_WwT)Vq)K!XFg zsRUZz6Nj#iwqq=Kaha{|H+TH(JgyP+7e71`<1R&P52s12SM91>;^QD}=Nnv(*PtMv zkg;quVLh#s*ZVJOgfdpJhP%ij8BWBtLIJy6?HH3)?26N9p)6xgz%@81eBGheF>8tG)*w(!z?1 zi_Kzxh?;>=kB{0<4=x>RZxs_)@&-JN<3#Y#@f_Tsk%cZhIx z+h3@dC_6S|P_8XYOOwswaF`(N88}i?t2>H1LDuq*~ z3}~6J9G0&eyoWy(RDhe z&&ywfy)X8#>+%6u$9V2om(RbawuMmzAie*YHjjYS^Y`Q5q?CVu{6C0+j;^kwpfzBX zLDP5tZjdNjIB2A#Hl)N%E&tB-zlTZxzaY#1<5vIg$m{>>DHkr5e1=HQZJx(elW>q&uIHang zoQ?I@gb@Hu_e&n*F7D0io5>}a7@OYSskfqwQ9hfVnFjB(t#KhC4&#wC8xXb}c2#ou zwR}+8msEJ99xdDc+une7q!^I{1R#uL%XNxeZ5O4XgGR>c#Oinx9d=HE-vgdNA@4%6 z_n?%qy%feN2G^Ou6l!OGZfa_sP@lY=+;Yio1jO^yP|!f{*QG zep6UeN{TJR`5H7TIZ;(hYc%&=8_$H2hDHZSq@VS@Wf<%mppTZ;dyzbUGhO-ROKBI4 zjjl&_b`BeQ(Q)xYBU5CrL3QlwohBjAc`QuEm}eZiaf6Kk?_NPyrqb21UTfciEYr(- zO|^MM75OR!#q$joR>sSF2C9&DqpD{F z_@=8c9#@B=spnz>^9-mUuEjwuPsHV{rT!X?`~?Za_I|Ur&&JO(`I#!Xyy;_%y|~Ud?)U7vNHu#@Ica1?%ZM+(q5c3~Ugbp{Ar# zw}#~v9EChqND`R&iC~LFF|2hdvY_Dc7atl$u!Rr8)9jt)zAWsLxCo$zeerOmVQu;K z%a2oyk{~fL4oJmcogEMXJY?YGHCT5{j|p%s0FW8cyTV@EAg4hc9V3%9j2o1xrUDRH z4f?3aP6hLs=?o);0QMdzdev&YAo)!KH_pn=N#=DMAMP_6{N1cuS07Ho9o$=xpzsbc z?$O)}Se|Kd2?z*qfC`gv;_aX)D|X08wUlD>%mkIGim^mSLxUFsLoXP*+>ez(}M5JWKl<$u8xx)PFqXR7D3?OkRdE>Wmw2OvVKnPTaB?((to3D%%)k|i) z!ph^a4An8VF`Y`!gBv*>?KM9Esu}CYY^e#)iSULtd)Ggb3+o+?3F?xN*mPo#?KR%b zyt;nSk(<^AVili@5)q`*$?T2?zrf>36Fs;#^mW~ytW|}Vbj58{o_qnMi>^gNm-kZQ z%krGiI;GyF$>h;-&?sPg;1*LnGc|#6+w8a=){(0QHHDGIb_zM{6$V9=sT4g62{}H- zkdylo-w0|6+2e1PT$%wyBO5)OqwCh3$OERu6hf6I8)QPBZcck&zi$MI5Yx4f$pb+X zPsGV)rly}NzY|MS$@0R*mw~DTaZ(8tSp^ITGV^cGH#p#ZAgaikBP%mP9Q;B4` z(En{;10(>jt6ZmrLbfQF=@evTh9*V|YLttHz_i&Fc5dlvvETZ{@=W%%y9xAiK1X?o zKDzFPB|gykHNQT;bAIjjf`!T76lmo0qP0WqCoSTWVy8IlsYShMSFJxy) zeC?F5zNh`9HI@aZW$5Qzm*aIJU42LQ$KHk1!R1t5H`mnd+_lV|&@B zPG!C7>FT3QFQ~TN+7wpomir>VrFF0GKVRZjuYR9r1o(`_eEJ7C4`!b%mGWhGP=glg;BI-xk4jaFX3O0)bzqiow6rH?G{vx-3 zV?o({MU^@Bnv;4P~5g> zFK@;ee5&o94kg1;BiM$ZYV;A5+0+Y9JVvwCx07yW=k?)H=V;B&x6@M$g!OJ`XHOo# zSRARAFBo5KtK3S-95u;~-|S_f#*6T^UrcH9MOIpydc0@gDK>0!k!NJKot`WLp_8wH zrG>LEkl(+vYsZV{Z7hvBj7pJ*Uu_se_}ASo`?4^a8IgN7VTs>T&UQ+;XJ>WpX32urS$8=W0am+TB^BjXdPFk;#CziTpTHNe_*oK!~!rNVC= zZue(nsf{icSwAMdzL#cJpwVotV`ghP-d?cWWE|iPzmV>s+^)9STpyXK&Uu0Zk|EiX zHGZ}mMa%Xxg6zY)WfVkT+riU8f+A`kerCa=%`2Nk`7fbCw0ul1r{v8(+?HQ}(HjlF z7A?veGM}!r-ZkI4`H3d&Q586f(eAHhnP| zpIEF?kUfyfQL1Qovu8-I#*Vr-TvmZtW$1{K@P-+i&LND~t*UL!1-|k_AoRegQO_8s zRSO1+09#ud_BAgMIxZqB5t@nXbj$&5Wr(s`66eAB@!}vWiua;#0WF}4PI^v(6jU}V zcyO76>LZ!35^WUpgp+=2vUWs|x!UEJphU2^CNpl6J|-$j1#exOhSO#?Zd2kl(iW9E zy^4%XHrlb&uDP}8HcHm?R|Yy^@fA)4DDpRBVS!yio}9<5_A9x3^JCc@hJ7>hAXN7)+#sd%7*#^JaY;jwBoaE<<&7+3sj|W2D5#k2GN^b@s*bR^im4 z#I?M<-n67F3kGNc=%JFww1QC{3slrJ6w@uB&IA%}Ba8(;7(UHakFo%$42vBohS#10|$z$#so6Dk@5Ce{+oev41-FeY(*h z*x(c)6o7f`a&>rQ==5w$8ma+{k)I0Hb%PXJ_%1oKRex-=DIj+J0nYhX66+1I_taxGj6qTC#f*WnkltS zx3^~?Oi@maZVVcg5|KtR{7w?iZ8r>DDVzC<NN)v%I|Y=K5#ZpfC~0 zrV~KyABd&-{yNZjM~&k&w@xTnMb+z++Y=@6%=w zJzeDZPml3OsI6i_dEFWWF(>;3Z~et1zDBJ8C#6yi*IooHL#1jEi???BnKOQYKPXZy zM-zTVnP6}n*CnIi4F$H6^G#0g-oTL!7KZ%O0)cOW*O?40txeSC?_yHoJ$NqWlUv|G z{S;V*Qy%unI-5jIW-y;O^Zf!^-#^&{`H{C{nRG5JsLXb#FzQr>XxUNA(^G+JK5J|o zgw-w|Y%-9oP4bgaC@=gn9k4L04`q8>4H~a2iiCuEzd{}8?x(_1Px{H+T-uVOdk!2Z zASY>id2Pj+aP#AykiI^u;jeTH4(!B8O(mravjUsT2M_vk?+=@oJ34~>^R88_kJ(9; zgBrDX@}3+NBv65P+nsvfAQ`cL*G`>)FzN9G2q)zXz2XD_ywNCa%?9GAk6!eNf|2Xw6n8`D-%>u z@n$2E27hKg`mrf+?8iS8i~WwkfrpdP8-|7jr6H>ac?I}!hmu?TCO=((6p=sd-Fh9% zPPKZr24e4v5H5HVk_y<^XWTAM-%3#%z2jv{<7@|g_onZ71+CxiH?5+jDC+YfSs5vL zL`otm-lUQ>0&~Z{t8FJ~b}rzFWQQ<`fEVS6aGpxRQY3C7x2>Sn@aR!b&OmBg(?A+ctg=76D$Vjx(NG6I6^_edex^aOaXV}QL^m^?EsoGIvx&XZ>@s0b6K#oNBuA5j?#U-`J6Rpo ziA8VR)91T<{Xni@zhY7gLT`sk4Iv0Q1t$hsWnd%%;}DXO8r>|LrEEbrPmF)Yxl}SI zKvK(TlClFfPiFn*t&Lxz85#h-b{y)PVkEHoxfpJQw*-P)WllM}Hajt1Ty`U2HbHbU zU^;aUB!wx;=yAi}>622(L+KG)*+|mxwIWD*#*U3O%RH3;k zK>s+!ju6$UCuI&2)VtB+PB*}I5K9{%q0Nr@;E2rfB z{IN(W0DzK`lKT1zy`}CntVV5%Lj$FYzfQbo{YMn6(;i?nUcF$0f-@LFoK)e)7UyGxoE1+EZh{ z?KD~H7D(S`^pYPp)|l#H?M9c*yL&6Y-p-9T1NXp32icifww%agkw0YaqkGvXnIR)9 zgB|J)At0=_*=76gwy;h*Df_0UUUUHqQ!PIlpTTRctf$B1)$iYy2%RjI=A*;IgK~x4 zhR;ukaS3qV*}@1?qs(oMt{jkJU~yZ^hOLt7^>SIxD zN@}R5ha35HeX4v6ppGJLHsrU5rGdG$zzHK2oXH!dCkTlKTM|fWeB%@{uqzNXF<9xc z(a2fm1alq7LJBphOW z?+AE^-{Ru2CJT>~)gN->_V(CfLm}T&_JDpiHg0UMi|?Rnq_1U&y|&PnvISJQDd|;i zO{99dyImUfO?F`EqwS&F%v1wz%5W04o|%H>vs*ZxDsnR(oDA$C9)=E*Ba*fV5mZ>2 z7I79e_p20OzsmFiVJ3si%33$i>lXB%9n(61A+|^ZSkL_Yyib)c|2qS4Oj5(Fj}Y97 zOY~Pl-Ld?=?_rNTPhQfnRI34MWDh{y1g^8u^*W|nGeB8Fq-oL3bUCaD?fOC|EAdf7MX!DG_3jYaz zY50DNa8sY7rKG1?Uxk&MZTrvmso%8+C9zQnsD|x>7WZY_->3I z0z6DO)y~#3#!!vb@5N-F#<@SBQi;KoV&v0^$z3iB>k zrcDyc2^yQ~C8Scxiw_DaE*>Zq`^d99OAz_Alaq%ox(8$8=Hb;z^3kRlSQeP+31X2l z6R7WS6s;MH^plcI%F6@NUXd~B&S5q2xbz$a}dUvnAzM#ljy*&W6QQ|%dXnO=F7K6H0 zRY6zCUpyndW~5>Y4Fn5c&$6RUk&W;c&!3@Cj}(4uX3PMP9VB#{RXBX1tsVnM$P-t` zq24VZY*U+v&A|Zxu3+?$@Ho3TI8HmfHB>IELBM+}G?`;!WS=>r(2)N#7a(CDKpa|odEPX%)Yr?%9 zVPiq3Nt;AU`e%$R@vIFPkn+P_+$Gdq)Z59>!Pw~xfBt{5_g+y=Ms3@milT@DN>i%X zkggydf+B)arT5;XOK*XwfQU4u7a>ZO5_+%FJCPDP3B5z;AwbB#_5J>twPp@x4(4Rm zdY{Dsi{wc*``P>6ce(ECnjY^7)nx{77;U*_Ws_&{ElH4H1ll5`NBffAvrGc>6rp{N z0~v{x+H##KRo0UPJMH_9XyZ1V&zDsrR!jA*RzLdnd^;G|*-S`! zTU#4EoT+8@T?AZGi91eZbgM#02za{6ippZ{JEv#q!C~Ry4v2iIlLhsqT0M~2=!||R zl$@EDCk~yVvU0PtH-iF?38YRPQ-B22e2)_LSG_=QK6Z=^h>CUBd+$9|vf~`HeQG*<>n?z5 z5G;qp;z^a~<^1Pn(NR5l0iIIq!lRiVhB`<{*FL*tDIZBZoqG-9KvR`_SII*yTyEb0 ziYt+Hh_k&-P%zN9vs)rZu7gs6)p3`;cts}-GTTFdpI=c~#S|pWl zzK(llx15vm(%L6LWv?}-`L`0cumajmc(G$aD%{^rJ%8$jB+e0IIX=i|4*n8!-z8Vt zY?Vlqom7S1GV(^eJHM()|MMyzdBM8}zfiWI7j^T|552cf8J5oG{8XK0)m7K8xuG4R zs{f~$C;GI3l?3_=z1`F|`)(xwrq>aCktl;fa~0C^-l<=^t1)ZYL|bstqS5^p=#hW7 z?Nnmal5OVqi4w5;{=I(D+ooNrD$1}pi*RUEO0xfzt{@}DENNzLCRSi=Dc0R^hg0w% z_+GG3m&bM)3SRAH% zYXfE4{mFglSeE6w;pY`AFC7=(5WWQBQm*!~v(V6B3!<5qSf0lIkt7a?Mg z_PdZ$ez?`DPlfOc^dV3FO~&ubKR>mfL$XL%pd%2CDH5rgI$r*ZwgMypu+8a;M5On! z^?K&=vJ$#zYwC+ru>0ESQk0{I2RVer7-LJXEkZ9rC)+l35*OkRA1|kCpb>CAM9x6Xw>0+ zPfg@1A2MbsTgR~%5Yy)hoEwS9+&pcSO0}d`bg!$&YnOYYxnk9Y9dC^lq$HKwDzZ;cDbBY7S9~0~pp8djUOY}|l zqa!L+6O9FAN2K!BWMgD-$Akbo;#znk%abpkV>nSx?2%7;WZWdV^Fw_@wY83<{X^+Y z{w;#{lppC*Nlx!`ICrjTf+hS4vN{p|dEsj8dtATyd#+h4ow1xB@2{(8?}<#U!W?O~ zy`xW#_-iT9b>n{~+7&S~gDsbpn3PE8A1qk9CQINXQ#zkcnaPUr64U2Aj^&1){2 zjc|1Af!tQ_%l;p523D4wtjL$7gI@nV?bY*@4{y#m^5~V>Eck3Mg_kxxkM_YaFQC}& zirQ@EM8o>x8+7G{_3oZBrF=~K0;ph+y<6{j5FWPz!!T8!P<5Kbw_F+n--tKqO zBu5LZ=xDeZgz8B9{{w&OG zSDPM-iUSO+*RM6O2+jE^|4(0X?(6V}zkLe~-5(23swmznvK1}0w2w5B(a_U+xIl)^ zUiuPkQmtkW96};b?f%T%hB+Shb}YNXAz0V{^v<0lnqwg( zX(9|FVMyjF)r`+y9zF7q0Wpv{R?s8;Nim~&SaB=bER>np1ssdDkzs7`S;zfn{ zgj+N>9IY)~j}N74S~Da@v~D}rK?ltEvN1nCe=hplcm8Z=r@@{#2 zh-11Y_~lC#f*qkE8X}HNr3j5M5`DX!;ck~^K0l#Rm@1+A57goE*^}ly>t)hIr*Sn= zOrF8H?+G!(XTcmhVkxmfZABiN;m`Ls{mS1qB~B6(>;xV1P`#Fpyn(m=npcC_@5|c)PftNx z0qdoUP=a&M)wVCmNeTJ4Auc^+*e7`~LX}G_?*XI5$l9H}OQe@AJ^yXrwqY zrd)4}8B53sg{6-+zk-@tlpdl#UxxWMWAqP&Zc9_Ef&nY}0MkxBfl-gpT$O-8$4Inm4Z+9y~B6Y&2V`1lu#pr5?muD}8VSFN-hq zoyhW4FQ1I9V(c_9Y7q$+xm+!`c)S5%Ht6NUihq3roh&)XxPLq?zb}6}_wSdl7ta5) zmUk{)_}6In?CR}nzl)un6DKL5x6J0vN^AeMSAVU!MmqCjW~O)ZGUVEa=clHBZA<4* zelNxh*wz&9#zIWBVbkRqcx@%P;n|uMPl9&Cci+-a;b9NzN%tA0pcXr6ZG%2t30>5+ zZW|f}isLkkd+~fc%X(R=^~c>qpB(g&%e_?Ee0k{jKQnY2@<@7f2o|5>0n{ zMY9;fsqQ|0R5beDUz|7Sciuwh;A>qsQy8l>i1hKcDNE9bmz8^o&@ayIWJI5bRR5ltVIdrEpo<=~ z@K~hB!QEeh%UxB`ej_c>l`{_KHd$n;p{$-DWp~2ns^d!H*k%@`p#jD@GeY;#q za4=0x@oYX_?%(_t{V@N;CbL|VQ&Pj?*l52uXzzrAl}Xq>Lq1bYeoL}S%6g|6KV+4d zXcI)`e}-J*);l636t^3_l$E=FTflaA%sJxH)hrZ9&RV>B`}Wn_U$AGt(>o$rk0ASg z$8LR5@KX{Jao9l+U}x9R7*1eoK^oP)o7?YNNR|}2?={;i+ATE)L~O!SpE?gYtq-me z=VE(=?I&}eC_R{2xk)W$hk1^_Oz7KY8+DpKb^4~9J#bnX%z@Q%9OxA-EH2+}=r%bA zS#oVYnx}j$wlyC;ZPv%WJoh9d>NMk(DexPyu*&|RtK$=61=B?hIZgYvT8 za{H~*jV-IgZ>T!RX7J@lllHwb+0OMG4{ktZFcqO@*$o^5C-JWcC?5&~kumxYryG z;ENyLzfZ%naXMdiyZMLklP6vKkVZz12+0Sd>6p-a&W%n}MGm7FBnipx~c?OqSF7ep^}^d6k2$m5J;sYWs__hROsVBu(!vX z*g)^jw_ahfxa+MzPq``eh9j}k{&mjH2eFM*Y=JNQgAJ-(t}{KcpUoE)8WEDdvTmSt zV2e6Ch;+wXXEwE8u0n=%m0FGI=*xAqa;NOgk8worE_Ef3@*-FFtWR+G8ogLf@W{A` za`N$ys$H7qssUjkAJeHjap8vf%Gf}A$MdEp{O*$9A}4gBV){MAxX}Ot!>i5DXSy!k zW(^Jw7ABSv&`SEHIIqj-OkkwuA!x8k21N%+$nbb6@um5c>H5x_jc3J&p}f=6Ju&s( z%W!A)Y>}}^F5l&G@@2rPMyy^N4Q^;iXAkF_nfbFcPq#V@JMP6M&%Tgy7zB)>iEIt91FswT`(wfq|dS8g>e=>kEsEiq$LkP)XBx zxEvF*HCx!jrW>qBgB0Sgii;Z7`DBKL+69QY`xE@8J3j=(+Inxe5bF*r;iG3+66Hv1 zr&BT(X6orW)##0t6Y&z8j*9ocf3H$ENNu^Aos~S0{tWn>xh3lSD*NSwUY0J2(7HVx zk#gJU>=xt`iU}`QDm>%!kJ(=vMA!s;;(Z|Re{vv#k zKYE=f(j<$iCV3 zg?P}zV5xfIm@@g4c%s z>zjNXy1HpY#0))fcNG*FgD|aZ8;39=O-YtLq3yq9Jg< z9xGPtL?iB{q7tHk%4|Fr&ZYfJiCV$-e`5j0YV9KTF}x{pPE$1pEma{E|1LqPTz>*w z-{#T``1dbfy6pLOXlr3ypm1pSvVH&DB_I$G8X76(b~;vKtmQvY-VqhsV?I9@6%}=S zojE@&k4ebn%>x|KU!~FpEiD>VZ@Rt|&=Dcq(Y}9NXXj z=0scjNuipjBzPhI+X>$=*BNc;@jPgJ}W1*%8ye>{8eEbBN((xcgT{t$uRU3h|e3q*p5 znvr~W@808oqgD*XmmTkA)#jHS!_zk;-QJ-lFo9Ih*`7yRo&G>2jqB(a>XkixSw4x| zQcl_lK%2ZBDK^y5(BLIkhz-%ZGCQl~xRk-cCtT~bxZ8-^0`)J)k>V7pyZrnvlQmMC zdy75CwB1bL5Fn!JoQucVo0$-~RkgK%f-1h1NY= zN6yQIX*CQ4F)_#Yo?#bs4D5jgUVD*W+6IKjqJi{u+3XpQI6AAzKuZf&phs}=K1@At zbg~RjnSi+*&Q+h?Q^Q-pkMQ1A)wkhRb4G3}RmIDEhHqGe@fqdLChvw+Ca$ne8T4?c z2sm}+(grc7WJM(32^6VtEmXr7B9fh^&#dQu6}M+aoP2)_LD#HfrGy+mhkbD=LekUR zoB~ISH4?sDT)K|RtWCB{1XJU&G0r1#cdDh&@X8YyJ_@cyyvag;ekOqYOJ&JZ(B|6TTb#=*;5t8CVIfX;35%Aqa0erA_gP|CYHe#XLyW=pbEmVs9 z%C@MV?bPQ18$o`TKU8@J)gD+({As+i7!U0CC(0v_qxVkY`x_HE4kr-~ljLj@V55#~ zP8wg^7_G3(^EZa(XpmDZDyQGPiTGF3y1dvi5$OJD1Cqw#eXujRAphX;(J;G$x;mL@)+r2v);tO9fh)rH+k{|BS6#h_QmM4JZbETQ)AsA0BRz@M?@tbo zrLUOUroHxm+}tS=BRqsl>q7n@y%b!wewg@VjscaY>kCfzpR=Ztko72kyAw)~-<_2< zFo4$5A+CywF-!PZ^nNwntaU$g81KerK{3EvD&XZ+IXyK{W4usrhe1yQVXoCtDenN_ zAYccYI2J5!Q~s9z{D2DvIIrQb!5x(5&U1aR+6Lj;7M^_Qpa8i@gIaI%qu))^pMQTf z5wD$UCx7cYIo966-rClYoSc}cN8F*t$fWSzc|0>@G%YRN!WqXWE3Peeee~nU0ODBL&Ri_lylhxmS<$KA(5Gf) zWnm&-u5dID#kbUg^E)mxM>;mKHT5w(H9G7;S}Me|9BE1|O9w^x`1Tn*=HukFZ3-Kg z?^AY|r03OG*+u2OXt@1DE$5I);vHcm96901bU--T(C^{KS>jkISs+aOF8i&j<_%24 zQcoomIe_zMGn5&#mCya%WI9NJD_iXU#& z_^)fltB8}a^&5yt!N%wKYTTT3D$!AzTui&;l&oLpDfY6D%Wq0wB)wFzx|>MVT>WOY z%e><@yZY+`ayv6K7wl{Rf2Mp#TgS;|32lnY7WwxPXSeE?c)1W~%QU1vwQ|6hSaByD z&WGY{fVGZI+oGIj=cEMZjr6^{y9@mU7hjG~&pO!e>m<}yJ(Xl*GqTI_!#@xm?@J&@T1}8VH8Mt9nXmrrL#6L;;sZ8eo*Eyl4erAC^ms zDHZO^c`9|nHe+vYUr71jIhtf+%%YL-_16jTe;d!fx!mLqXqwUMUOZSPtchFvL5Op( zJ2;HY5&`%?v#u3M9$)u5eh1>6ckX+}D4$;O=|o>Lp>d<-;J3@}9;^a555Ra@ddii2 zH!36^;M^H29Pp;6GK<;SMsSNijA67fRGBw(%hrHzeT7XqMY7hU-M-#P%Dq3Iqtu%B zyQp|MPQKo9(FehxDYXWq@_u~%3SQU{^_mIK%6r|2WG$M$dLr)W&8?Mg_{=US-6xVw;aJ1`FZabQ%DgH9qJ#Tc%^&Rp1OY)>) zr@tKV8j(XV6R0vgRl-_UQBhG4$%&H4yKn5axfBjudP0p?BGp_798;}8FWu5I=|OnD!AVIk3bW8;|Eumup~$-uCuWXZM0*G`<%{xz!Eua-q(wQSCmi zuV05`G4!>g?9>gDB+!AMf;jFa22s^qOnH1u4|<3ZDR*v>9m&-)JSE;XVUv-u2t*(d zYV6OmhiuWM=cY=Whctqp;TVN<@G(HI<~B36q}fa*85vpAPd3tk*=Q{XACIl1xohuo z!4|@#y)KQmR;jd~kRTtOJ-Ehtgm6Bxb5rbH7$2&KLT$ARMg5ODHL@4=D`%0*AI`UT zEvu(oCy5!j!kq?d@UxI<@F zxH$yPy5`>41^yV3BEccSZ-z?C3}P}?+%~r}r)Iffnomu~Vin63&ma3L_h8dyl8mik z16}&##d)??dc#^uW^qo{Z1u#1r#85``?3!rua>eCziRc+^BUKwUD53RDk&*fb2M@befD>K5ADZ}ilz7rTz03%Cs200 zx_EWMgu9x--EuojD%nt$>`OU7fng9A2O?{xjXiR<xZyi2v$qD!u^ z4qM<3dsSXf==a3psIt1%f9oEqZ&5LJBx1Q%Si_UNh_o)Gk(H74Ae5e!orTU2_4C>$-LQZ-nKwyr_SANT?4h%$FD-mn7o%mSc!1YpsOL_Kw zo#n%FH8;2HE+`XzB&#YzNT7R%QneHts9#E?;m3RjL2`l9z-o7}W@+ac2zoD8VnRLE z_q})dhNm8o*Q=!352aZmk?IugAk1p7xen`35E&P-I9{}S|FVSbPqZw|^KkCcJk^Sn zHbU9@%KrBG0N`MNQy^eGl&)?mg&t(z?DLJDFp<9Eb@kV|zvdPk!7LgxafNAy1cZdE zOG`_ojqs$?Tdu27nPz6@TaYU45*;$OR&b{GRL3c0`+qpagQ)**`rX*<*T(=MmoD@K zFh;i5c4lE*yetCc5&ZpH0ErX>FMY^Y{x#0+`1HJf`C;WqpT0qji|&;hHyOmB&0~eW z2mO{d9D$DopWr)7yRpe<@=tO!L$mtiuCpA@54L40#MqDga*jSkL>tr4GclzpvhU68 zq|2#5Q^;u{Ynz%~=^sNvUaOf6)*4oO=E6!kk9*QA=?e{SOOq7%4Z;HhUQgT8GKw`80Qb zeN|fDfu$bdmEgkG0KwR8IMox&!N@=-WVPFh{S@9yz$QZfI%2;5sY|+l&hC8zY1(I3 zOqm3~exGQ~Fs$qcDTzb@QQwDj{zpeU;6K;mGlG~mMTV~n|60;*GkMIk18J~W`~tWt zGha2{EybmQH0HjTw+pKI0f{Wd-u|y2-?4&XTdvK#<)P$iUde2Kf>N$Zf-K?VTQPY; zYEu=$)l1Lb|-6R=VY->PULrd@s}k)_GT{In><`w;%e*!#K|c8V?->MhF%eL zeC%fnh~WtJp2%V6c@XmeY&vwxY~afxhz{wb^9=}gL!ZKja|}(QwR*rUG^E8As4u+C zVwZw063dR`N!``q7sPmM%D*?m^@V^#TK=na?;fTD&91^pPwy~Z-GV5yixA`6Pm-9L zW*k9eUz`DARwMaZ^^Sdd?U~FIWt$U~ogUxY$i*|Y-g6kF^t3`DE zJXST5wgbSiIRIU4g_Ih#?!DkD66^UoPcj3}JbTVvbza03?(Q%VuH>mGBy z@$JTw;wQC-o4O~X$9cj9c26fj87_!e}+u^DyIt0S6Xrzd5?R? zfk*^~ohIPWl3-q5H^6=w)_*FGMS;{A1pBA>b-<@?G9q=h%BA2y4MfaR+l8(|*DjlW z%8I3-LZUKxlN;5}AiM1d%2?L#&Qy1(CXb;`T@^ZmAU>`NTeRHHd|%hJ`zPx)XU z?+VnLk|CyQXbJBue_{XDK<9vy1MP=o+Dy0|mSgPi-O*xDTj>+8AY=2{Ur+D7z!R7N zaXQR)klK0W&|RO7HUcgnjXST)LHj{TreQEtSPbvrYb@k69yKMzk(~+k^{Myo-nfm< zR`z&1t(+KljrH1v$J}L&woey;CiDc9ZfL)-8aVF z)^MBSzFSd2^~W#=Q&aR0Wy$%|7Cwb?OFORhAOWjBC$~~S?!(O1w#Jv(Ad|A?ckTD4{+VzT!h1eOcok(^{^EpE z!fXE(wqQEe4x}Ew4XA?Ch;Lc1LZ*1mrylZzgM(A-xPQ8~*tyt<-4Af!JP-a@O3#}h zZdt>B%N6wP`5?txJAtVgeH3-ze^!|73~}x)az}_Z;%AHwzv6< zZYR$MG=ztSs*|Cr$(Q#UY+LP>&FviKU60*B{j5hDj)(ZI`At~s5b5drc=d{Vo105= ztu0e{+3%!hw6VjLra*lj*@g4fFwH z_AFr&DJ9*~OxKrmvfCO?JJrMYUDOvOp8U`J>uV3kd{<^b%CR537iAYf8xj(NV}<
c92~?uIIm8fQ2zdb$NMp`H_#(Y==t747Jr}#UZwC zpgzOJi7tv^3+Y)Q{9yl0Q`JOQU*djHl!Kj?g_GW4t=>D@@)44+Hx(PAGVHeX>Jt&s zn~Qz42tPf2HX_GY(X?~FXxY_6`FJ=<1S8@XMm zI{5hiHV#eUwN)Vvb)oSa;uo~+_G{rEDHRIpUmQ7(VC46_n-o0=hfB%kcL3RQ9(9p# zfViWALJ*b+>F_c831~`)2{}h75xT+YmSp(%kTHG+=SV?MPxdxZUU6;sHx(0`%Rotb zlEr>^ZXs>mLxEAjBFNkMjijA0h{RH5d@x?xoo`2i?tPZOf2`jVYZ|(cY~z#Lo>DLX zua6U*ZOoZxSHQSd28wt&Dt!pkPvC-th%7UMCXpq&b0e`1|FfO}_m^hKPa!TgF)}PM zG3u(ZIz#_fX`*%cKv z=%TwmLr}at73PoKg1$gBw1uoJF28_xRJ3@56La(9m9S!ED5qcj* z2ezekc13zbZ@o9GjY4$OBvFHk78<$TZXeM~O16`?<8`gs(1kc`ca!08{O-(O|Je4t zUI>`L@ul|(sLI|M9p_go0> zF*c=5oGIh-h#d zuG60hPBfHCC|~m66wn>YB6g?A&vA_XnV~US;McfrX!wrJBD7l{8qBmcnn-GR;IL2g z8$f39?_n!yaJ-u?jJ6e3-OBBW4n#%WE#O2u;0=wDVJl8~y*jT6lvIAtCrv&?8!U`5 zAuFwxWospQ)lE&qd1m=sr)@C}AZZeEwxU2FmHY|PWF5n-^jv$M_pi4!#qMzAQJVzF zBOX+4%(z{&o}jxYU6uxwl!P_H#s6lvKKkZWI9IA_o1>5y95wD=gHp8cq>dO*RY|KO zH*Z_tfCUy4{WXd1nM`7}W0LWqM7nH)FM7V_<;`w^8%6MliJc;@ICZ3oI&5<^m7hEE z3Lu<61MTpGrh8h#Hb?W2m8G=mKk5x?z9KB7q1i!ods0R0Q+ENAO_Db{9n|@xlM3oP zwB4Qc&qhel9LG!o3aZM3j(`OkOU02^I^_A%EG{%Da!T6-J!zVndeS!ga?8|g!3o=a zbC-%v`lEsv9a63Wb)=|)T&_GD5*peWD>?aFZlsAKrbw~G4YoZSE1A|EpbhH${2d4a zVJ91}zU;X+bOQ3^4mzPO)^gSUlwhVD_f73Wh-(5MW0)Sw@VjwChfUU+lvq*(Y+;Ty z`s)S4(rLxs-cr}^JLOEAu0Ypd$V5RJ0|WZue12;BM-tzg@$}@==i7Ycd$!^cV+Gr? z%4z&K=>6mz0`x&qQMpK)fW`QSU>(dqu}l9r&@Td>pC9;6bcHzInuIiu1<(q>S zbR_t+pk@qo#dq0hLBLOB?Q%gqk`UIE4Ej^D;B579{@V)r^~G|&zZ?xB&8!EFheQeT z3mdz7>kZgpqB`^u9?R>~!OTdk00~tG1;xwFt+5d#72x#8Ye(*%cRoHXJV^Sd{l>x( zu5;iqPI`TXV4LTzReHL4Wh-vf_ar2^-kno| zIwDLY1JQkiunu;2RaNNSPVDkI7>^@?FIA)F*(|bAFh2R7l%uV3Dobe3ny#M!b>#ca z!0A0lxR2x!N0$H$mU%s>fA_YP7nWKN0XC+ma7nE0e5OJ|t0R-%BZh~Uw-M3w z@XhBeJ2bu1+<|^T9`Zc{D+t4{BE{63bjQ3lb9SnJ$58j0taOwC>L2e@?M1e^?pEE6 z7B9w7yzMQ5ErOSuI|N%h1lv0!CV_7^24+JXXJeG%+=%`+5lCO?7xyv0GzQUIaK~Z) z7bDw1cOQWJt`Fcpdzfd;1uDd!qB~_-yg! zSqNyOWCz7p-vdec3_1LueUD4Z=+0s{8b#a@qy1fnEu;H8_J3wx{w5ou;3Ck`>sZ>2 zUik^gDJr@}9PbMbH<>)#&NOlh5HHT&)+-Wt*gL@RmWLiT7ApU&9RtX|oXNaw<8lb! zQr3Whtw4kDiUxL7%L1P|I5%a`@!iiQgg8PZ)88$NPW5BpL&3*45yeEDSM;Vo{(H*p zrfHB0bwpyV>(=O+c#w)Ad)+t9_NnU?dLXTI&I;o-pGlh(NSC#*D39)obvZanSBxJ= z_y}IpT)ocR+`RjG^MGTKp?{1T{MGnOdxWc*8DCSLUz4u5f820wwWGmxX^nldUQ(SS zh{K?Fk^t;_SY3nj1ZA(hHy#0TbZo@PTv0%Foi7;t1?9@K5(XQmzWvT@*n!zL(_bO3 zzt=jt+L#47j<<<|j0q$Rb7MtXWyz3SSc_ZDxbr?{~j= z@*YJIN7Foi`W=AwTBHp{gx6SEwCaJ9DgSZ-_;SX~(wsb>VBA$^TYfU|y5||N6k_dJ&kp6r;p?(ym*gLKE4O$(Soa zZn=;D@2#HprG^4so>&R;5wLJ3s3T=0e!Uuisg{CdA?ocb`Ga_-c{KJc_D{Vf$mIX% ze|hxvpNAshs=Sh+Q3 z|K8(Z6#%5cS{q$eenp^vR>rPa)80P4y-kA?N$)sIuguKXCq;=BY5k!#PA#gowomiL zzn_zt6Cn+c@~MsTadslBt1p#P=U+h~LRxy*-dXfC{XQ9tb|g> zQVbp*i-X{QO!nbrqL`VHu0}`E&n|-?bw+?1;w&E{f-8)<`BxocGhc9cY#f+X?vpoW1szv9Yz|tPl+*xS45% zqszE$ZPQ7+|J-)Okb-jlGMnK$V?ZU%C&Bhp*hIy8;_~n>P2_a!ZA2F;b;C1Xua3WX z6<>*pWaQXv#m9etmjzvsMKMfdR3#JeYt(Q`R3y@e|L;Y0e9D#)#1hqu^Z~PXiWxTS z-rqdN{{3JD7B;mYwORR;XKs)p7{~sqK%N;+)u)L9t|~}^ChVuuPg_L3Mo;=EW;N;e z8G-Hkr7x)^aBviXi;^*!?_MOdgs0sOeye~%9ZM1^N>EtdK@CK7LC}imdZ0oGT&PBN z>%rgIc=8!?HJJ8=%3T#2FwvWIej7F3_&^ZFIZ z^tIWeD1ORFLuEw;WJE=hu<9d{A`gK`A^CKM@|P0kKK>kuLp1irCLr|(_FXUx5S-1o zw;h6;1QV3JNJkL@QyxtjChV%ZextQ+NYpqU<*uqU-ZN?kw3OJtQf^4l|eG-4)@Q#3F>M#>XwAOv`mI zyS~Y=fL}wtyGZuB6qWn!QJ;}JrAmr5Rp~VrUGO%~%P+M=fxM6UPnoga_|MLE&UuZv zo#3ihCEo1tx#dAVteLUPT8NJ$yHn)8wmkC0(i-zhIOXZs+x%&H(ISxkd+8gPaTn?9 zhkrc-+x*_7`i$?D9iq3RG=~H)-Y8^y zoZ4dYisGj&MJv#RVMj%&RP78ts^Cl38=Eivl_5Z5;-3`i*s1<4tA2%6IM$OQR78@c zJid;^enfs`F`#{o&)rrz;|u_)Zae>cVaVhAS8dYaK4yz#w1t!aTh^s(a2m>C&U#vw zkyigC*xR9=%($C#o)0;57#rq9(1(kEhb6&cFE?pGvQ>5VdAX3(^qAT}@XVkGYQ98tn9Y;8`mjC(! z&`xdo-}<}ngKYoL;=qOPhB3cdveGMxFJiPEzC?HHKV-h5jx^LY{%orM#n5zmsI|1v zZ>u#~S^IkDFc3%FO(^i^53(0t2!d(bbVB?$81I=F*j>+2kA@qn%JkT75`FLUWY@O^ z#Q{_YGI1>Wnb=Czo4M|({KlJu4Mu|k4DHv*)lMtgNwlVT-Q7K{`}2v+7WE3$eZBqu z(jve1Cy(0ml_Mx5ZfDg&KfS-9PMJnk=)R7K+y#S3h0#Oj?k1tmZYaGtKG#olPg2)! z^^c$4iBX>{&)~`BW$7{Fz&(QL0r4|JAk_W%d`J7?8BTB#2g9_PzM6Bb0JXi%F4(&V z_mMi%zg;&>1<3PV0kx0j;=E;>50PJ_3`|U7?K^|roH?IcHetP7+}}1#Db`lff-U!& zJoSc$7-M@=)vMesi2TzNcs!ys!GZ_1E`3IG+Cr-5ZUicd-_=U%Z|kqbqaP(SiKGuf zubW3I)?J`TR%c>-2KUJ$hj(5o~VE=&g@XkL#_j=HoO6Fsb`bdr?BNZsf=dS9l5MzI7nL&ZI5S9z4K_4oMBP;;$t6`s{li$XG1lnV(r*5k7oSd zo*@24;r^>3vS)<6{HC2+bU*8p;^zU1$?nZ70I`+xop`x#=DuQqRvUR9Jp-b=_m+R9Dq(bT5?cH#pDe^5VMo;~^|E zKMmFKUjwu!?#>X_Ta_F^r}%_~!|gRpY3Zl2$ID~+J8#%}-gSf3jZrizBAGHk9gHl( z<5*(#GFHBu-bmsoU52t`AgP0_txRR?ZKuCL+Q`NLRu31^K%-gJJh#i3c2FJ0zL|;1 znbjsb6dCyiKPU^CkpJMjYB}4(EWrY4Q;-urC$O2{(y^bi#WPEjxD)0xvof+WVU_!& z5nbm*TpvloVyMSTOUnprr*@3Z;wuZZVro9xDe0YY=TrOiq5G*Hs<29!EiSD_*)>Hw#bZd~C8x!#f;K;b zmzESa-0R)_#K7JQHT*cZPha&KgxPEwo?X|Y+~2D|TqdeSb*+A3RR?vf*v+c&`oO}& z`>xJxc2i%qsQR?Dvl|#~GLP*}svGxit+Cs+{8CqD2=7EdPxrMHQM489cL~!^&knpY zCR{8RY8B7eED2o07vK${hW*#SA-&9%$@1AcY?Y@ z-A*Vu*vFvOd^h1$XIHs3+R|+~>j;5s1htp*HA%~4vrJ@eTx7(E%7)FGP1DcD$dF@o zwcWvRA*>b8P1EALkN(Cg^7n82oxyfsVgcxFQb&Ty7_vIpA;(1i#>2%OyTvAXL`Q>thjoCA>veLf1olUWYw{=0xO&XP-muK;PK0_uKWVnx- zKflMO8W%$s7T#I$J-E4u<$m=lKd-t10z>=YJ59biv?+tP4|dVkBI44-40e;lhygzb%sTgZHJ#54-8l%h_goyxY)aW*Ne!Nv zG2^?9{&*%+EDoo<-3v`T(0y-w3PhW_-~Hi*9S#=G=$NsYLr|`QlA6-`=!Ey=Qg;o? z-b|(ZuE$=-882*)G^(PU87b(M6iu;8>6czgOHTC}Ni&ZI+XpTB>?CPjJ=QN%uKTN0 zElZP(Ov7aQ6WKC`ugMuT_c zl3EQmIDP_oMjnu3#4YS@T~c}_Nt`rX+e3@VZ2FWVt6|SUljg<4W%`3HS(Sc-tLu+NB|uufy~;j5_W$j2F}!t3?;udWqMiF~ zc^QwlNR7*2y1L~zrG9s>w)=;YGY84DT4GSGGeX9)L-f#TS;?M}o;Z!RD^{esmivtX zp9cYFi9+d@Kkw}$LwLVNp%K+?w@xLdvIS62O(++P%PT9>ZPeLjZ~Zj3sJ#t;_Sh~5K=6^b_MpPCXSK(wARTI3oiw=MAx4Ffd)I;O+}mG+J!2F=0W#6 z+P*%DkfSH)b@s={g1X5Mg)^_CM4;yR{$R08Egri^5Ey4F_PEuO?Ya-yu(9h*23P>K zc%;0dJ?sE(P13yw7l36CFf^G6d|vu@wvmp1lRVv-N<-feeXS zF3i?=NGmEvI==Azty7}XjrW-@dS}YRQ!=|BIy}7^nXt^`@0-T^tUJ{@+uB-xeMB(y zNKIaTMacLEwYdF{jn^b0tHh2hoNP!CjCfKwQ?4`cc>Ty}gHH2xBbQc_D7@$XIl7zX zHCI4LfPe7z#`^wXpO!3HjRw*E<(p)Bt8xbj!eDa%Ta56ti7~M!dvc8kdvidAnufi){jp8RUO?BS-Mcj$TNKrD~#LlHM$YUpNxZ1zB8 zz3$mXUS8e+Nt%s~?VaJkmxZFaAF02$X;MKi=~ihthR|CK5^K zxmaom5d^XER5DCI=oiR~~O<(CjE0GVcLfel_hHheVcC1cJUew_n`+yZwXm>P(s^CC-R~|<})!@ zfkd`D`+Jo@n`k;lvj#u(^4i|PmOWT#biRiL5>;)GL(k(#VVj+9S8NbQpdc3<8J}kHP^nlk@ zrewBdc-W;)1aeG{r3w?nw^1|$JCWZrGPj`vm;ktbPPbD>QIoCk$OS}=>eHHJo*6cC z)r*khjBa7PQKp#ezMKmJb^dIHozkpCp9G9Ze#a8Xw9n zMtr`tw#JTREhwA%$xC<9YK%t26mr61;$A*j?kKU=$-Txz7UWy7UU8qRcRH%S0_hIR z{?cKvhvuYWf*aTu%i~e$(DyhVT`Bt;{BRkghi0j3Sh02|Y`x4~mD{vA1y8Tz&U*Lr zrZ2fAAWZa-VTryde$$P2lxndLhQmftH&RI7oVYcQ#EAC0eUX@q0$HPDV zaJ4sBbdIsmDB9Zvt1P|N8~z!%th)e4VaHgY6tUN*_FGId=}iLEnQRWw?cAwqLmm69 ztE0!sv0@v(vUc*1ll!*gtUH$k!dGS&BNm8pr?qA|`8zw?S{#l7B|Z`)0U66(C>swK zt*R0@AT26S;}aG~feL77vI38$e%T5K&0X@fV8pW(sh4cqSPjPi#D-Ery8wGmSiDS} zB3{{Y9)i52CKQzEDQS%LzK~!ANNd*A>#y%p3?wH#sZRSd#k#8TV|4~I|ww78VvM93)7q(b-_6hN)!Wlq#8PdbZ?dK+tw$!WbS6 z>Y_TJ#O_YKxtP7KE>-E}h-X54goulcgQZ*zd-4du?an&AbG+tBYSh8a+PiT1`JmVj zIuFTpK0!pej*bGUa)cUroVOUe6AvM@GuW1REc4mr1=x_qTusB>Z#K2bIZmlL7mW)H zE{82$4cFN;rxUnEowk(vwo{t84S(fVfOVZmWWhn*FBL zdg~Rn))@0bSCHcekmp42`C{O2Z)wgsgkJVB!3IOU3C79mokr$5#>=F&Z~9>_0|_4- zmv+w;d8v@9go`z9cb01;#g$QQ4<=mgi?<}&^onF&Ufkb}oZ68{e+0{#4kpnB+UO!@ zudLA^37f6wNvGHA0ow@)ngnHU%hutVuX2!+M1X70{eFIhizG?K!Q;Lah1OjC3rz&B4;F1F+5S~_JEN-Xvb&?1JJoM~3!f8Dey_Nfj$?)_%uMl*nAbg! zcwycZjBF1&OW_{Mae&)c6B`TmsAu_ix9oWso0)3W<0@##>FR$@$xknHUJ8F6oj>C- z4cir9=FJ*14$(^nZHAP=P?nxX^(I?kF=vh-vF8EpUN>kWBCcDL6*G|pEt(t-Qm)Yj zFDKczG>;vciV_dl3bm6P1>CFOZ181|Ao8UGMOMJMjEC(#@+|o+Y@CyuTs``fccSr` z>eQ5UQU~&Pc(eTAaV0{(XL;1r)D}K-dE8I!fHH_UN`R5|Kssac>F(0%Y`%kz&eEOl zQc*u$_gva_os-?K0*mwX1UM;4aq%7ziYTyG5>%OPH*~RlSy1y$Z|_BHEc6;TATTJ< z5AL%Q7f~|(;P7a7f7j5+i0wn2&f`qE+^|#~B^Yjy5Fu|zc9M|xQy|^kPDY04?Tr(; zD@9mHVAYZrsr++eeJ$=K0pR3f;yj<5$&L2+7u%cr!QkRAF7~ZRJDy2T>35ItrkV9c z%Ux!^l7jVz3Ku-CkdTL~i3*(-Ht6-+6E^{UeG`*hJ>rd>dpPnAa-a|0$aE|9iX*Q$ zTiK|qYJawI)nje9B*G5geAtc`JfGus@%ZJRYDpkE3@ooynopxb-rnBM&b9tNv>Y59 z@Ly9p-mso8MH;VIKEQjlEXf=2&)Q|o7lXEV+P36>c9h9W?n}gjB(Q`}w z7QEo@MS1wiFyz~r@P|1>6UHX<*=qYc=QQm=0cw+lDRTBVNsdZAYt|dInymdU%sVJ{ z*lnEmij%d=E^E=IG-D$(ygXEc6GQXWUj+9Yym_3f?XRdGW>RUXA#x!bbf;$*HyOFp zdCB^3tNB`5pLcG%D(gy}$7ntvc#6SU>K*_O7bSxCV8z@<-!|3qi5;PSBU;;UP4eaf z6Xop<#;Ylhl$+5f7y}x4cjup&vWe#E6OYJlZrN(d(LDD!)H*5L8PymAy7HD!?lnzD zI)WyK#`}8)Uib-u3beaxAi7I`Zm(8?Xl10Q8k zSv>jYsU3bKb@&g!%szj`TY2S6JQEj(ZnNWX!Ji_IiHztEmr3AAM?+rb-wF03QR9jS z?@vB~>^Kr1Wxx@WJl{pQ9TRoF>1dthqmH!SHon`o*A-B}hH~;sp~cgyvNar>VDvdZ zStGy#f=NlOMi{5c49?_ce|(LMTuY7p6nNyfY3W}$XMj2|rop@iHWAKqNt%g%P|c12MHwy>s_&L%%Q8qW@-sb3!>}SYdI73f zgEfP$gZTzAXIk6`F1yZd^=LWsa@rUb6KBAtQjpBf^E1-x z!TGz9jsC};Z_?|*{$}j>HWF(CvYD35X#Oe-($_%7baZr-E|G`Rti@FdXT!}fE7z}U z({DvzPSp?wCXmj(kerL|j#df?__>g3PGLN-znXh^F(d|tGrE70Q;|+5QIZ5r-zY08!ZmyOE=BhzM098LC>3hdnzpZ% z*`M0pXmr`sxXy5R@xVyoK;CpQg-DPH^=t3MlhfGlrY{a&&ck~ zGnj_;|09_$7RCGX#^tRKMfrYidt7o9MD>yhmY3>ZrGRzku_p20=|ArX)_ec*3h`>fLZj+HZEi_}ByzqQ2RLUimz1M0U02>F z3x*uOCbnU90r=vr5Bl3M5%936pEdzZLe}~ylYViu#__eJ5_v0RX$rQBH zGl0qL%~VtvTWYnh%{RJapL4ylXZ`AaeH-i5;3j2t#%p5Xo>a0#F)-1NCHir2%#UXU z&a-nR(;#EwN7|ZAjR>h)qp>J|$1Gn?yV}JFz5kl}M3HbO*OtY>$MRlD`|d+KcfSkwwbH>gt?lv^wsT*6-{)9T}p z3TN=$cPpy^E^y?0(<{ljaPPaqdWmz-Gq6PD_o%4Lp}dNe-E`&$(%zBX7D0AVVP{j{ z7$)&e*tHMey{3-r?PWmm6HgnZ{q3}s=Y+vCIU~S=jAV(OzZK@z-F^Fx$UTh>4+Y>A z{207|g4IfA#mvYC9JF`H!;TCdfz2aIJOtP{V$42RspXoax5?Q^*NB5aCIZ8v- zf5W<3;vGd?!QHcMKJCH3q^wIi_cLiHLZAR|QT3_@6-AR)DUHjw0#LxY=D->?8wwZg zv+oWZJT*hOVI(mc)e4=M2O=3gM#Tx$rGV&m2_XuqSXtGdV`9hlepgL~^R_qpoEko! z7$1$2rAi@JSC2vWIF6uWL*h7FQhG}Gd#c}azB0xZB8hmb-*Fr&0QAgq+t1cqioD`r;JAA&4uD)}8Bp5jjFw~xc;f9BWE!M~OH44{@$+ZXOle}ZI9Ld+!oOt| z=GJWd%8`GLB1(&U>b!%Ba>#Y>H-U0# z&o?G+aOs)pQ2nmz@j4r&e~k@|jf_zle3LN|HdInkDa=aK9;_c89)L_^mD$o`W=*jO46=p-P} zP*=wy+L)S}=D!(g`=d9~;M;7{`a_wbLB|xYXRy1wztKg2aS~}MWAUi$GZaEXL|kPz zQ(W>U)sV+#7ObWq%0kGjFW9gzDs(-vdD4wXV>4N9F^Igo@3$*}<63JT|f32ht8}X<&ZH z_(v2{W@~FHhs|=%j-}QMw!K@asG`iVG&xzH=aI1^@M-6r8lTlCCb*wwn+J;vZ!C0A zZ`6PbVRL;}n8cH+UPV#Plv2nsFFR!K^#`Xx z1OL~r!Gda576-HG%a%|1VZy#(X4=sh$il!-y*C-rxhz9DY!R7bpP%o#Hz%JnBA}&Z zX>N|;fCVr`zs*xB(?)^FShtCzrf$7d1Wq`F3{NU;ga~`CE<&0z{jlQ00CK8+ z+mCi%1bZ=cTcD1F5~^I*($XT?o>Gy`Q8lGtw(UH=_9Lrys;HvA4F5i(`29@qdx2tK zUm$K*k^SF`AJ?Z7cnjCUsp}p!%fjcOos$<>#(p377OJbNY)7U)21y0Q-niE&(cZZK`WoV+2`H}V z2Ra(877SqNI)rBHJe8(-YCRX9E{u!_S`)hCI0UDzRTB zZ&U*PiHAM{g`Ac^SL+84R|yy~&ht?)5DWzo1#bedSlzyS9q*icW=_zOI&1 z)y^=1YHJr)XBFD$*xO=8ohs+0PlH#doAvH@$FW|*HsxW`W;+{f`ur}%nt3b~OhTc7 z53#Pz7PH-a*}-1f%iX8WvHhfU||UExlbCF?9&3T_6|fXBx6_>A_S|NJRgGv;>Vz#M{#N-Qn%d z1ALM4vm}19=%>D3x3CZ-Qpvy;NI~v}>S-bo${9mneDivp<#l{^x{}R??3kD5au2K9 zBr{i5<@d*~M-=9vKQU1>@<-doZ(pg>pM3gJ+jLub=g??$yB~4rfL}eSr4<$@l(7^u zE}szHZQ8wQ!RK+wA_%FOU0F5cv0SWlo{k-RZWV2$?TIM7%y8s;!5vVfVHMR=?a67r z%F0w-ve0W(!DmN=65I9)lC_2JEo`->x7EPgoT#p%sG|@T(%2@@xZ*H6!o62iu(ENg z0hX1J_NC(sJC2P-CYdZ1h)TYiWwflK;=avV-osqsCnNAyA?~XxeOXzy9(T_)SxTxa%^TIr*Ag)`(*~OrMLF@%pCpSC1eRKiwt72A; zJmB+mn7GxF$~T*WT#@gt*_}%HYA5+7<(7@FuBjjhoeYg;o1Uwl(eqUOF<)jBg!bj) zI=xzF3JU50KR&tQIe?NUU5WRK8bwYFY5S$8N4Ofg;Nz=q2OH|`|iTe3ULFy$VQ>3N9 zW0c%RP!uYCVfctuSZ2O`Mo$IBkNA5hp0s)}k~znQJxe?`oR1>^A@1AUeW>`WX&aP9 zEZHnv(%-&(sh$lXvzns95 z_DgFT!GC=C9|MXzTC{8)#i)l9k=M6|$m-fmbF~sG%febRw}zNpJ5tUs4?a9uVRI%n z789yt8GHPQb<_=#7C5+`ZDwjN@DwFCl--g2fmf6C0Xap z_W}lQMkm2#oLq{7(W|MFzAHLUX{ciKlkhF3y}H;vOi^wa0pDdU9Z}vi_I(t~*z~3J z!iE=C9LLpkUlhMpAD+cN3*AEeoZ+0%d^CHglisoCzB@EIsi#NX&4gnm@KuvRx$CFt zu%skx8as0jbiOEbWo<=;ngLEslBMK>g7*qV6btb0%SkKRjKin zFd$o_#{5QBaR?{a8OmP=Atj5=*{wnOE*ULLg`1bDMz5S7B`(}t`zFK9lTTR2;7mAn zw4-lHrjH|9$JEY7(;Mf`juR=QjsC4@q_84(|;@guiQE5?8cL5habemPh8&2!k%QE!KIKIfso zO0=%lOQuNKo}OQy(UcZ8f}xN!X(`%KoM7mO9ufO{sg$ep$KU9q^H=(u{Z%%%HdF?E zWpm#V@x^Oj@`b*5@qkNU=c${XZlz176-ljZw4RSKf~1KY;oMV;6CGEsBJ zr(1^y8yV|=rcnQaC3M(V9D}u``Je_ov@hi-e&?Wr^FK(QCY+=Qz03!_E1!?$)=>4^ zi5DwW4onF(7RnZ-9Q(-^S+eb`_LZdnp`fS{;TXO(dj~H6Yh-Ms+CIrxfujGKXU6#^ z>fxPzr0kN(z{SN>`$ z?g8=EGw#G96$`T#KvV)=YPI<`sFL?ET^^^lDd!(N6Z`W=KYsB%jl=xnk2GK+sa^;g zfKd7_?VoQ@zFS5`$=<)APsDrz20Pt7;bu8zke%^oeExaO$LbWtFsyiy;lA~o_=N{7 z#5aFt`kz+=i-Sy1v67lUJ_Pl1U5BV9Pf4!mjPl>_THr(GoR>=wH2pdHLOgI{v5u=N z@P8Yre=A3{rk0*bW{D=k1sux{o*UqskCvwVU#-$-WL8$nQBUCfS5Tz`dXR^Ry-hPcpmiR=J_O}J$=Tuo)e3u>?)Y)Uo zeBiDtE(D7snheA(6Kd{9ilhBG$*3!FD7B%U79$;ky(nfU_A83S9QEQMqkO1od3jCL z%Dplzu+9rW{x;|yp;N^CECg>@MJ6LJEM;)DW=xYy)TRYicIx5+-XQlsl70BTUQ=-~ zc53gkJ)a(TK!1mw=--36|bA0 zqTGu7ZwvC@7Ew;`;lBO%DVOjo%HR7%5pDDXa?yWZTMsB({(Vwnd5QXO==gc2t)-v| z+HF1RGA|j&Aj&{2N>- zqo0Un{q$cX>u|Z)t*i)UDjGs$d;2)Kxi#{}wwrFl=$>9|3>CNeHd`ToJaH(ko~dy{uekMBm&DVYpfFQx_C^^hWAhR&@rcZRg`+sn<^JzB zb7i<9P_{R>wV7s-mh!6&c7|>RD?C$}NE4+x0MY~)6hT+#+z4UyX{~A-PPLTF zR@KY2t!ri3U{|BEsTlur&#B;^0jgD=I`N!{`1uw|rOi~nO|J&1SHb44`uy;rIbD(suw5c zicFkYNQ~5Avc-HRpgR~^#S;+mCJ-`fFV9=QFk${kpFt{BoM_c(mUw%!9 zG+k^^NO<4IcAms=uyN`%J9TdPhX65HxZ9@B>B5wIe4+Jj6%&4S4Ugr`MRzmIXB=lU zN}6h)l=pwSAq2EX{^_&ue^^Y0yQ_0q@Xmp|^N*yvq@Pa?`@05&J@@2XUR3)kl6&jV zNth|H71$OROBo^qGvw>taEFGD&0yYa@og}n|FAqH`hk+2JV|}gTv^eQBoK{V`nHt+ z-;4YRIp$bUtl=-7HIzG=e$FEL&P8`%O?PtYOmRSjf;2%Bk ztmD7(yaLN&?^@}UwN2;W-AHMlR(+6eEdQH|Oo~<^11{0lmd3e*6)h?^7q_dUy}iZa zWPW^oP{fc6Qh+Ie6Hqbt_H-{fdZ2kU23fXeQKc~HK6>zjU3&_n-kOnV25~f5 zXUBu%vOVcATN)u^tyQ2#Z>WhM+qStdlH)dEi_wfMwhF+u()4k=9Pj@c7}#FWY+5m8 ziAVsED`3{7^7!_gG<^6Vk)wzkAx(?>_&%V5yC+;NkysT@@q@vEK&fcd(j~7_j*$)| ztT~r+nU-lyhXD%#Y|2f`j=Xx<0ovTZ#=vI$x}C~`j}Ppi{NnGp$f~dMnawP0??%3@ zI>Rdu%8gaHUGzC9=vS7Nt)|8e{AfK?cz1@H9`Wn#N#Kzgv92g7^=-0Vyn1dqLf{b1h z`3bZ=0>W6ztgKxD*H1*1J4=&`*RS8iwE@9Og9e`>Tr<=$DeBmDLc&C1;@Y?bO96tv zBgUPJAjH(ZBho9mMlg z8XXA}+cXNe?92^5BcH9iRrG8#0&9~!zA+jfN5}i$=8g%{HEhM+2fas4)jZur=sZW$ zTQ%52f`8(#?kcuV;bOX=whl^NQC&Xn`tt9U9AKX~J70JiNV%!xZpO*6YBFuz;jF+roc2x@m5~#5( zs%lecwtv4?r3HG%|H~v(!_pVhuhlb9N4x@N)$25+gBtal!oRiz$}a-p00vF^f_&~j zCTT7wF*dsI*x!@7+z;qg&MVllXpzSMuArQ!uE#C)KX#nx*kU;!Jt9BfQUaKi!8%3n zDh@TV{v4$w1tuRtN7WReuKxP(X;4rQME^f*4%A2gt`Ft^;a4hoNHM1@xUHE4WkzXZ zxt|>5F!>4v1&!OP{cY_)7I>lbGHGhXQ&;OthCZ@#^6#p41e_e(?&f$t0*V7+CWh_v zBO68G2mJ7p{x1Fb4*EOHkL*2S(Yj1qyLmCD9CHC*pvVsGx8 z-fP`_zBqMp_A#hgkvIE0k5QnX?mu7buGrw1xS4Nia7(Nr6%tgpJpJ5QA86jX9_c&T zVDa{x%#BQ#HnRKEz1DEuyF#s|_lVskx)CkL@nDu_Vh&`%SmHR3lS8Pyj8B^w`uPc+ zqF>2uV{$~~@n?5HUhvPj8_n$HDIp}l4}EciQ{j1WB72ZMujYGZlLCKIQB`P^+&Hzn@k4NM z=%RuP8ybMJ?IKOu#JzjjUx;@{%ABz7>rnw~*}MAf(u(3k%vrCEmP$q8C_e%RQMz-%|-MuM~T9B0S^ymSJn=QkF7KCmLf3r}pG&dpr%H{X4 zE0a!4iD&3dV4xR`Ja5w-3#`{)m#6B*U844#$-E|%vrusX#4D+@Gi$i4CkxZIhx0fR zcr5kgf2*T|nX|CDxj|NIf49+&5o^0Z&&)(Bu#q9tCPmt0zX!8_i33neoT1i=9ALNO zcyKzUa(b!xyc;SJs6KFSXjjd)o2(8AWb9{55e%_hTB@^X&p%3_ST-^%)M0-1UvG6E zF>>nkyI*Ugr@+*7Bl~j+?~jC4Np-HPXSa(J4-EC_hj1PlR1^NW=X@nEmEmcd#31P+ z4ZH{>vN@Bjz^p_Ml0Frg&Cg@5bf~_xgxfsBV|%f{#lz;U->=Lzh@HYapC?}*)prt< z(fRno3*z~L%=PHUr2~be#>}Iko7Co#$$N~<%pPf?&Bb%zx@M}a$EGT5#C5i+NhZRG zI9K*E0-C)WN9Rr@df>gUP#=CT$r*5uiE^i4ZTZ<{Kc?vvNXy7yZX~gHnK%*uAX=8o z;v#p!%?8k)0=ma5+mWlp*7piku8-)tp_P_vI~@wlt0nZfgm@96Ei4N^R_zsRr+b#0 z+OC;THb;2Qe*s4p+^P~s5(%eP^OclmC-bk)fn?@qgf82^=pg)C(GN@j!-*NUShKF z37pLI&qKADZKi>6e{O@}DTAlAZpgy-2X-US|PcVokKHU4X!{&jvVTgV~ZCTgUVqX?AKR!Qc|ZfMZBGB1I<{3#W!;vg!t-|UbwVY6YumoH~!gO{H8Y}!#@XqN{2roZ(v3x zIJi8{9smLqoAE@}+##Lo`yvj2X5(~knu&%dw#^7cCd#!6w?dS%R4x?~>`m93V%_?$ zeAHERh;gvu+57|VuC7})t$d&-t8NSzdIpxT?BwX^jO4j-JKw^lgM5NNz}lXW&(9NA z7;CSbrU{yUWA3LKuv|?e%%>V6bUosO+N44cNbL`H@(^%W1v0+661Rz_d3_Eir}{7= zWxzTSAAf$hCk{0&XNTZEx`3`A55(Sf8LzD#3#Uq(xNiIWTF$|-`){XZY9w}l-qWKV z$nP-GmR6O%Oiy3J1&nUCLwb-a$CDaYCf&yU)jvbqkDdxQcwTR@4w+1&to(v|X1H&5 zyko6GIirY)@#qKxP)4*-q#D#Y2sOWKc7m4(&v~kOSc7R#CV@VwJ7u!6f|(-BM<;Z8 zc1MAaQD|8AL3@Mm-HCrueSFiDss`h&)1{j{NgY@OHkPX9`jlFqJowWOcY2q}a>ee% zgusW@M1!AvV_1pZpLKO|ee~E{&*1ZGS=%W*P`gtNqGOL&kLYftAmH*ce4xW8Lz)@?S7}H5n8> zoHD+;)A2)Y|L`FuQElpbc0HN1f31i9rw4uolO;F6osWuZOs5jaVTuWBtDBpvo7&!; z(cLDHv{F;!>fM5g3-HLV28+lClg`BB@qA*>k_5$|+8!Phu)&u`Slc6-d1_l*TWW@H z{{fkD#&$3TZk$IK4J}`#vLz*L2L|NsF)}ewKq8d14ygul@z(Axl68s{273}}oN;ip z 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

{title}

" + f"{body}
药材单剂{dose_count} 剂总量
" + ) + + dietary = source.get("dietary_taboo") + if isinstance(dietary, (list, tuple)): + dietary = "、".join(str(item) for item in dietary) + aux_usage = source.get("aux_usage") + aux_usage = dict(aux_usage) if isinstance(aux_usage, Mapping) else {} + recipient = " ".join( + str(value).strip() + for value in ( + source.get("recipient_name"), + source.get("recipient_phone"), + source.get("shipping_address"), + ) + if str(value or "").strip() + ) + signature = str(source.get("doctor_signature") or "") + signature_html = ( + f'' + if signature.startswith("data:image") + else esc(source.get("doctor_name")) + ) + audit_lines = [] + if source.get("audit_by_name"): + audit_lines.append( + f"审核人:{esc(source.get('audit_by_name'))} {esc(source.get('audit_time'), '')}" + ) + if source.get("audit_remark"): + audit_lines.append(f"消费者审核意见:{esc(source.get('audit_remark'))}") + if source.get("business_prescription_audit_remark"): + audit_lines.append( + f"业务订单审核意见:{esc(source.get('business_prescription_audit_remark'))}" + ) + audit_html = "
".join(audit_lines) or "—" + return f""" + +
+{esc(_status_text(prescription))} +

中医处方笺

+
编号:{esc(source.get("sn") or source.get("id"))} + 日期:{esc(source.get("prescription_date"))}
+ + + + + + +
姓名:{esc(source.get("patient_name"))}性别:{esc("男" if source.get("gender") in (1, "1") else "女" if source.get("gender") in (0, "0") else "—")}年龄:{esc(source.get("age"))}电话:{esc(source.get("phone"))}
收件信息:{esc(recipient)}
临床诊断:{esc(source.get("clinical_diagnosis"))}
+{herb_table(main, "Rp. 主方")} +{herb_table(aux, "辅方")} +
+主方用法:每天 {esc(source.get("times_per_day"))} 次,服用 {esc(source.get("usage_days"))} 天, +{esc(source.get("usage_instruction") or source.get("usage_way"))}, +{esc(source.get("usage_time"), "")}
+辅方用法:每天 {esc(aux_usage.get("times_per_day"))} 次,服用 +{esc(aux_usage.get("usage_days"))} 天
+忌口:{esc(dietary)}
+备注:{esc(source.get("usage_notes"))}
+药房备注:{esc(source.get("remark_extra") or source.get("pharmacy_remark"))}
+出丸:{esc(source.get("out_pellet") or source.get("out_pellet_text"))} +
+ +
+""" + + +class PrescriptionDetailDialog(QDialog): + diagnosis_requested = Signal(int) + orders_requested = Signal(int) + + def __init__( + self, + prescription: Any, + *, + can_open_diagnosis: bool = True, + can_open_orders: bool = False, + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.prescription = prescription + self.document = QTextDocument(self) + self.document.setHtml(render_prescription_html(prescription)) + self.setWindowTitle("查看处方") + self.resize(920, 780) + root = QVBoxLayout(self) + actions = QHBoxLayout() + self.diagnosis_button = QPushButton("查看诊单详情") + diagnosis_id = _int(first_value(prescription, "diagnosis_id"), 0) + self.diagnosis_button.setVisible(can_open_diagnosis and diagnosis_id > 0) + self.diagnosis_button.clicked.connect(lambda: self.diagnosis_requested.emit(diagnosis_id)) + actions.addWidget(self.diagnosis_button) + self.orders_button = QPushButton("查看关联订单") + prescription_id = _int(first_value(prescription, "id", "prescription_id"), 0) + self.orders_button.setVisible(can_open_orders and prescription_id > 0) + self.orders_button.clicked.connect(lambda: self.orders_requested.emit(prescription_id)) + actions.addWidget(self.orders_button) + actions.addStretch(1) + print_button = QPushButton("打印") + print_button.clicked.connect(self.print_slip) + actions.addWidget(print_button) + pdf_button = QPushButton("导出 PDF") + pdf_button.setProperty("variant", "primary") + pdf_button.clicked.connect(self.choose_pdf_path) + actions.addWidget(pdf_button) + root.addLayout(actions) + self.preview = QTextBrowser() + self.preview.setDocument(self.document) + root.addWidget(self.preview, 1) + close = QDialogButtonBox(QDialogButtonBox.StandardButton.Close) + close.rejected.connect(self.reject) + root.addWidget(close) + + def print_slip(self) -> None: + printer = QPrinter(QPrinter.PrinterMode.HighResolution) + printer.setPageSize(QPageSize(QPageSize.PageSizeId.A4)) + dialog = QPrintDialog(printer, self) + if dialog.exec() == QDialog.DialogCode.Accepted: + self.document.print_(printer) + + def choose_pdf_path(self) -> None: + patient = str(first_value(self.prescription, "patient_name", default="处方")) + prescription_id = first_value(self.prescription, "id", default="") + suggested = f"处方-{patient}-{prescription_id}.pdf" + path, _selected = QFileDialog.getSaveFileName( + self, + "导出处方 PDF", + suggested, + "PDF 文件 (*.pdf)", + ) + if path: + self.export_pdf(path) + + def export_pdf(self, path: str | Path) -> None: + output = str(path) + if not output.lower().endswith(".pdf"): + output += ".pdf" + printer = QPrinter(QPrinter.PrinterMode.HighResolution) + printer.setOutputFormat(QPrinter.OutputFormat.PdfFormat) + printer.setOutputFileName(output) + printer.setPageSize(QPageSize(QPageSize.PageSizeId.A4)) + self.document.print_(printer) + + +class DiagnosisDetailDialog(QDialog): + """Read-only diagnosis view preserving the important admin tab boundaries.""" + + def __init__(self, diagnosis: Any, parent: QWidget | None = None) -> None: + super().__init__(parent) + source = _mapping(diagnosis) + self.setWindowTitle("诊单详情(只读)") + self.resize(880, 700) + root = QVBoxLayout(self) + tabs = QTabWidget() + groups = ( + ( + "病历", + ( + "id", + "patient_id", + "patient_name", + "gender", + "age", + "phone", + "chief_complaint", + "present_illness", + "past_history", + "diagnosis", + "syndrome", + "treatment", + ), + ), + ("医生备注", ("doctor_notes", "doctor_note", "notes")), + ("日常记录", ("daily_records", "blood_records")), + ("处方", ("prescriptions", "case_records")), + ("业务订单", ("prescription_orders", "latest_prescription_order")), + ("沟通与指派", ("call_records", "chat_records", "assign_logs", "appointments")), + ) + for title, keys in groups: + browser = QTextBrowser() + rows = [] + for key in keys: + value = source.get(key) + if value in (None, "", [], {}): + continue + rendered = ( + json.dumps(value, ensure_ascii=False, indent=2, default=str) + if isinstance(value, (Mapping, list, tuple)) + else str(value) + ) + rows.append(f"

{html.escape(key)}

{html.escape(rendered)}
") + browser.setHtml("".join(rows) or "

暂无数据

") + tabs.addTab(browser, title) + root.addWidget(tabs, 1) + buttons = QDialogButtonBox(QDialogButtonBox.StandardButton.Close) + buttons.rejected.connect(self.reject) + root.addWidget(buttons) + + +class PrescriptionOrderDialog(QDialog): + """Create a fulfilment order from one issued prescription.""" + + def __init__( + self, + repository: Any, + prescription: Any, + *, + can_select_ship_mode: bool = False, + can_view_internal_cost: bool = False, + can_edit_pharmacy_remark: bool = False, + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.repository = repository + self.prescription = prescription + self.can_select_ship_mode = can_select_ship_mode + self.can_view_internal_cost = can_view_internal_cost + self.can_edit_pharmacy_remark = can_edit_pharmacy_remark + self._paid_order_rows: list[Any] = [] + self._deposit_min_amount = 0.0 + self._paid_orders_generation = 0 + self._paid_orders_diagnosis_id = 0 + self._paid_orders_loading = False + self._paid_orders_ready = False + self.setWindowTitle("创建业务订单") + self.resize(860, 720) + root = QVBoxLayout(self) + tabs = QTabWidget() + tabs.addTab(self._build_recipient_tab(), "患者与收货") + tabs.addTab(self._build_service_tab(), "服务与支付单") + tabs.addTab(self._build_amount_tab(), "金额与确认") + self.tabs = tabs + root.addWidget(tabs, 1) + self.banner = MessageBanner() + root.addWidget(self.banner) + buttons = QDialogButtonBox( + QDialogButtonBox.StandardButton.Cancel | QDialogButtonBox.StandardButton.Save + ) + self.save_button = buttons.button(QDialogButtonBox.StandardButton.Save) + self.save_button.setText("创建订单") + self.save_button.setProperty("variant", "primary") + self.save_button.setEnabled(False) + buttons.rejected.connect(self.reject) + buttons.accepted.connect(self.accept) + root.addWidget(buttons) + self._load_prescription_values() + QTimer.singleShot(0, self._load_paid_orders) + + def _form_tab(self) -> tuple[QWidget, QFormLayout]: + tab = QWidget() + form = QFormLayout(tab) + form.setContentsMargins(18, 18, 18, 18) + form.setHorizontalSpacing(18) + form.setVerticalSpacing(11) + return tab, form + + def _build_recipient_tab(self) -> QWidget: + tab, form = self._form_tab() + self.diagnosis_id = QSpinBox() + self.diagnosis_id.setRange(0, 2_000_000_000) + self.diagnosis_id.valueChanged.connect(self._diagnosis_changed) + form.addRow("诊单 ID *", self.diagnosis_id) + self.recipient_name = QLineEdit() + self.recipient_name.setMaxLength(50) + form.addRow("收货人 *", self.recipient_name) + self.recipient_phone = QLineEdit() + self.recipient_phone.setMaxLength(20) + form.addRow("收货手机 *", self.recipient_phone) + self.shipping_province = QLineEdit() + form.addRow("省 *", self.shipping_province) + self.shipping_city = QLineEdit() + form.addRow("市 *", self.shipping_city) + self.shipping_district = QLineEdit() + form.addRow("区/县 *", self.shipping_district) + self.shipping_address = QLineEdit() + form.addRow("详细地址 *", self.shipping_address) + return tab + + def _build_service_tab(self) -> QWidget: + tab, form = self._form_tab() + self.ship_mode = QComboBox() + self.ship_mode.addItem("甘草药房", "gancao") + self.ship_mode.addItem("洛阳药房", "direct") + self.ship_mode.setEnabled(self.can_select_ship_mode) + form.addRow("发货类型", self.ship_mode) + self.is_follow_up = QCheckBox("复诊订单") + form.addRow("是否复诊", self.is_follow_up) + self.medication_days = QSpinBox() + self.medication_days.setRange(0, 365) + self.medication_days.setSpecialValueText("未填写") + form.addRow("服用天数", self.medication_days) + self.prev_staff = QLineEdit() + form.addRow("前序人员", self.prev_staff) + self.service_channel = QLineEdit() + form.addRow("服务渠道", self.service_channel) + self.service_package = QLineEdit() + self.service_package.setPlaceholderText("多个套餐以逗号分隔") + form.addRow("服务套餐", self.service_package) + self.express_company = QLineEdit("auto") + form.addRow("快递公司", self.express_company) + self.tracking_number = QLineEdit() + form.addRow("物流单号", self.tracking_number) + self.paid_orders = QListWidget() + self.paid_orders.setMinimumHeight(170) + form.addRow("关联支付单", self.paid_orders) + self.deposit_hint = QLabel("正在加载可关联支付单…") + self.deposit_hint.setProperty("role", "muted") + form.addRow("", self.deposit_hint) + return tab + + def _build_amount_tab(self) -> QWidget: + tab, form = self._form_tab() + self.fee_type = QComboBox() + self.fee_type.addItem("药品费用", 3) + self.fee_type.addItem("挂号费", 1) + self.fee_type.addItem("问诊费", 2) + self.fee_type.addItem("首付", 4) + self.fee_type.addItem("尾款", 5) + self.fee_type.addItem("其他", 6) + form.addRow("费用类别 *", self.fee_type) + self.amount = QDoubleSpinBox() + self.amount.setRange(0, 10_000_000) + self.amount.setDecimals(2) + self.amount.setPrefix("¥ ") + form.addRow("订单金额 *", self.amount) + self.internal_cost = QDoubleSpinBox() + self.internal_cost.setRange(0, 10_000_000) + self.internal_cost.setDecimals(2) + self.internal_cost.setPrefix("¥ ") + self.internal_cost.setVisible(self.can_view_internal_cost) + self.internal_cost_label = QLabel("内部成本") + self.internal_cost_label.setVisible(self.can_view_internal_cost) + form.addRow(self.internal_cost_label, self.internal_cost) + self.remark_extra = QTextEdit() + self.remark_extra.setMaximumHeight(80) + self.remark_extra.setVisible(self.can_edit_pharmacy_remark) + self.remark_extra_label = QLabel("药房备注") + self.remark_extra_label.setVisible(self.can_edit_pharmacy_remark) + form.addRow(self.remark_extra_label, self.remark_extra) + self.remark_assistant = QTextEdit() + self.remark_assistant.setMaximumHeight(100) + form.addRow("医助备注", self.remark_assistant) + return tab + + def _load_prescription_values(self) -> None: + diagnosis_id = _int(first_value(self.prescription, "diagnosis_id"), 0) + self.diagnosis_id.blockSignals(True) + self.diagnosis_id.setValue(diagnosis_id) + self.diagnosis_id.blockSignals(False) + self.diagnosis_id.setReadOnly(diagnosis_id > 0) + self.recipient_name.setText(str(first_value(self.prescription, "patient_name", default=""))) + self.recipient_phone.setText(str(first_value(self.prescription, "phone", default=""))) + self.shipping_province.setText( + str(first_value(self.prescription, "shipping_province", default="")) + ) + self.shipping_city.setText(str(first_value(self.prescription, "shipping_city", default=""))) + self.shipping_district.setText( + str(first_value(self.prescription, "shipping_district", default="")) + ) + self.shipping_address.setText( + str(first_value(self.prescription, "shipping_address", default="")) + ) + self.medication_days.setValue(max(0, _int(first_value(self.prescription, "usage_days"), 0))) + + def _diagnosis_changed(self, _value: int) -> None: + self._load_paid_orders() + + def _reset_paid_orders(self, message: str) -> None: + self._paid_order_rows = [] + self._deposit_min_amount = 0.0 + self.paid_orders.clear() + self.amount.setMinimum(0) + self.deposit_hint.setText(message) + self._paid_orders_ready = False + self.save_button.setEnabled(False) + + def _load_paid_orders(self) -> None: + diagnosis_id = self.diagnosis_id.value() + self._paid_orders_generation += 1 + generation = self._paid_orders_generation + self._paid_orders_diagnosis_id = diagnosis_id + self._paid_orders_loading = diagnosis_id > 0 + self._reset_paid_orders("正在加载可关联支付单…") + if not diagnosis_id: + self.deposit_hint.setText("处方未关联诊单,无法加载支付单。") + self._paid_orders_loading = False + return + run_async( + lambda: _repository_action( + self.repository, + "list_paid_prescription_orders", + diagnosis_id=diagnosis_id, + ), + on_success=lambda result: self._apply_paid_orders(result, diagnosis_id, generation), + on_error=lambda error: self._paid_orders_error(error, diagnosis_id, generation), + ) + + def _apply_paid_orders(self, result: Any, diagnosis_id: int, generation: int) -> None: + if ( + generation != self._paid_orders_generation + or diagnosis_id != self._paid_orders_diagnosis_id + or diagnosis_id != self.diagnosis_id.value() + ): + return + rows = page_items(result) + if not rows and isinstance(result, Mapping): + raw = result.get("lists") or get_value(result, "data.lists", None) or [] + rows = list(raw) if isinstance(raw, (list, tuple)) else [] + self._paid_order_rows = rows + self.paid_orders.clear() + for row in rows: + order_id = _int(first_value(row, "id", "order_id"), 0) + label = ( + f"{first_value(row, 'order_no', default=order_id)} " + f"¥{first_value(row, 'amount', default=0)} " + f"{first_value(row, 'remark', default='')}" + ) + item = QListWidgetItem(label) + item.setData(Qt.ItemDataRole.UserRole, order_id) + item.setFlags(item.flags() | Qt.ItemFlag.ItemIsUserCheckable) + item.setCheckState(Qt.CheckState.Unchecked) + self.paid_orders.addItem(item) + self._deposit_min_amount = _float( + first_value( + result, + "deposit_min_amount", + "extend.deposit_min_amount", + "data.deposit_min_amount", + default=0, + ) + ) + if self._deposit_min_amount > 0: + self.amount.setMinimum(self._deposit_min_amount) + self.amount.setValue(max(self.amount.value(), self._deposit_min_amount)) + self.deposit_hint.setText( + f"已启用关联支付门槛:至少选择一笔支付单,订单金额不低于 " + f"¥{self._deposit_min_amount:.2f}" + ) + else: + self.deposit_hint.setText(f"可关联支付单 {len(rows)} 笔;当前未启用定金门槛。") + self._paid_orders_loading = False + self._paid_orders_ready = True + self.save_button.setEnabled(True) + + def _paid_orders_error( + self, + error: Exception, + diagnosis_id: int, + generation: int, + ) -> None: + if ( + generation != self._paid_orders_generation + or diagnosis_id != self._paid_orders_diagnosis_id + or diagnosis_id != self.diagnosis_id.value() + ): + return + self._paid_orders_loading = False + self._paid_orders_ready = False + self.deposit_hint.setText(f"支付单加载失败:{friendly_error(error)}") + self.save_button.setEnabled(False) + + def _selected_paid_order_ids(self) -> list[int]: + result = [] + for index in range(self.paid_orders.count()): + item = self.paid_orders.item(index) + if item.checkState() == Qt.CheckState.Checked: + result.append(_int(item.data(Qt.ItemDataRole.UserRole), 0)) + return [value for value in result if value] + + def payload(self) -> dict[str, Any]: + service_packages = [ + value.strip() + for value in re.split(r"[,,]", self.service_package.text()) + if value.strip() + ] + result: dict[str, Any] = { + "prescription_id": _int(first_value(self.prescription, "id", "prescription_id")), + "diagnosis_id": self.diagnosis_id.value(), + "recipient_name": self.recipient_name.text().strip(), + "recipient_phone": self.recipient_phone.text().strip(), + "shipping_address": self.shipping_address.text().strip(), + "shipping_province": self.shipping_province.text().strip(), + "shipping_city": self.shipping_city.text().strip(), + "shipping_district": self.shipping_district.text().strip(), + "is_follow_up": int(self.is_follow_up.isChecked()), + "prev_staff": self.prev_staff.text().strip(), + "service_channel": self.service_channel.text().strip(), + "service_package": ",".join(service_packages), + "express_company": self.express_company.text().strip() or "auto", + "tracking_number": self.tracking_number.text().strip(), + "ship_mode": self.ship_mode.currentData(), + "fee_type": self.fee_type.currentData(), + "amount": self.amount.value(), + "remark_extra": self.remark_extra.toPlainText().strip() + if self.can_edit_pharmacy_remark + else "", + "remark_assistant": self.remark_assistant.toPlainText().strip(), + } + if self.medication_days.value() > 0: + result["medication_days"] = self.medication_days.value() + if self.can_view_internal_cost and self.internal_cost.value() > 0: + result["internal_cost"] = self.internal_cost.value() + paid_ids = self._selected_paid_order_ids() + if paid_ids: + result["pay_order_ids"] = paid_ids + return result + + def accept(self) -> None: + if self._paid_orders_loading or not self._paid_orders_ready: + self.tabs.setCurrentIndex(1) + self.banner.show_message("支付单与定金门槛尚未加载完成,暂不能创建订单。", "warning") + return + payload = self.payload() + required = ( + (payload["diagnosis_id"], "请选择有效诊单。", 0), + (payload["recipient_name"], "请输入收货人。", 0), + (payload["recipient_phone"], "请输入收货手机号。", 0), + (payload["shipping_province"], "请输入省份。", 0), + (payload["shipping_city"], "请输入城市。", 0), + (payload["shipping_district"], "请输入区县。", 0), + (payload["shipping_address"], "请输入详细收货地址。", 0), + ) + for value, message, tab in required: + if not value: + self.tabs.setCurrentIndex(tab) + self.banner.show_message(message, "warning") + return + if self._deposit_min_amount > 0 and not payload.get("pay_order_ids"): + self.tabs.setCurrentIndex(1) + self.banner.show_message("定金门槛开启时至少选择一笔支付单。", "warning") + return + if self.amount.value() < self._deposit_min_amount: + self.tabs.setCurrentIndex(2) + self.banner.show_message( + f"订单金额不得低于 ¥{self._deposit_min_amount:.2f}。", + "warning", + ) + return + super().accept() + + +class PrescriptionOrderListDialog(QDialog): + """Paginated order list with an optional prescription filter.""" + + def __init__( + self, + repository: Any, + *, + prescription_id: int | None = None, + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.repository = repository + self.prescription_id = prescription_id + self._page = 1 + self._page_size = 15 + self._generation = 0 + self._detail_generation = 0 + self._detail_order_id = 0 + self.setWindowTitle("处方业务订单") + self.resize(900, 590) + root = QVBoxLayout(self) + self.banner = MessageBanner() + root.addWidget(self.banner) + self.table = QTableWidget(0, 8) + self.table.setHorizontalHeaderLabels( + ["订单号", "处方 ID", "患者/收货人", "手机", "金额", "发货", "状态", "创建时间"] + ) + self.table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers) + self.table.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) + self.table.verticalHeader().hide() + self.table.horizontalHeader().setStretchLastSection(True) + self.table.itemDoubleClicked.connect(self._view_current) + root.addWidget(self.table, 1) + footer = QHBoxLayout() + view_button = QPushButton("查看订单详情") + view_button.clicked.connect(self._view_current) + footer.addWidget(view_button) + footer.addStretch(1) + self.summary = QLabel() + footer.addWidget(self.summary) + previous = QPushButton("上一页") + previous.clicked.connect(lambda: self._change_page(self._page - 1)) + footer.addWidget(previous) + self.previous = previous + self.page_label = QLabel() + footer.addWidget(self.page_label) + next_button = QPushButton("下一页") + next_button.clicked.connect(lambda: self._change_page(self._page + 1)) + footer.addWidget(next_button) + self.next = next_button + root.addLayout(footer) + buttons = QDialogButtonBox(QDialogButtonBox.StandardButton.Close) + buttons.rejected.connect(self.reject) + root.addWidget(buttons) + QTimer.singleShot(0, self.load) + + def load(self) -> None: + self._generation += 1 + generation = self._generation + page = self._page + page_size = self._page_size + filters: dict[str, Any] = {} + if self.prescription_id: + filters["prescription_id"] = self.prescription_id + self.banner.show_message("正在加载业务订单…", "info") + run_async( + lambda: _repository_action( + self.repository, + "list_prescription_orders", + page_no=page, + page_size=page_size, + **filters, + ), + on_success=lambda result: self._apply(result, generation), + on_error=lambda error: self._error(error, generation), + ) + + def _apply(self, result: Any, generation: int) -> None: + if generation != self._generation: + return + rows = page_items(result) + self.table.setRowCount(len(rows)) + for row_index, row in enumerate(rows): + values = ( + first_value(row, "order_no", "sn", "id"), + first_value(row, "prescription_id"), + first_value(row, "recipient_name", "patient_name"), + first_value(row, "recipient_phone", "phone"), + first_value(row, "amount"), + first_value(row, "ship_mode", "express_company"), + first_value(row, "status_text", "status"), + first_value(row, "create_time", "created_at"), + ) + for column, value in enumerate(values): + item = QTableWidgetItem(display_text(value)) + item.setData(Qt.ItemDataRole.UserRole, row) + self.table.setItem(row_index, column, item) + total = page_total(result, len(rows)) + pages = max(1, (total + self._page_size - 1) // self._page_size) + self.summary.setText(f"共 {total} 条") + self.page_label.setText(f"{self._page} / {pages}") + self.previous.setEnabled(self._page > 1) + self.next.setEnabled(self._page < pages) + self.banner.clear() + + def _error(self, error: Exception, generation: int) -> None: + if generation == self._generation: + self.banner.show_message(friendly_error(error), "danger") + + def _change_page(self, page: int) -> None: + if page >= 1: + self._page = page + self.load() + + def _view_current(self, _item: Any = None) -> None: + row = self.table.currentRow() + item = self.table.item(row, 0) if row >= 0 else None + order = item.data(Qt.ItemDataRole.UserRole) if item is not None else None + if order is None: + self.banner.show_message("请选择一条订单。", "warning") + return + order_id = _int(first_value(order, "id", "order_id"), 0) + if not order_id: + self._show_order(order) + return + self._detail_generation += 1 + generation = self._detail_generation + self._detail_order_id = order_id + self.banner.show_message("正在加载订单详情…", "info") + run_async( + lambda: self.repository.get_prescription_order(order_id), + on_success=lambda result: self._detail_success(result, order_id, generation), + on_error=lambda error: self._detail_error(error, order_id, generation), + ) + + def _detail_success(self, order: Any, order_id: int, generation: int) -> None: + if generation != self._detail_generation or order_id != self._detail_order_id: + return + self._show_order(order) + + def _detail_error(self, error: Exception, order_id: int, generation: int) -> None: + if generation == self._detail_generation and order_id == self._detail_order_id: + self.banner.show_message(friendly_error(error), "danger") + + def _show_order(self, order: Any) -> None: + self.banner.clear() + dialog = QDialog(self) + dialog.setWindowTitle("业务订单详情") + dialog.resize(700, 560) + layout = QVBoxLayout(dialog) + browser = QTextBrowser() + browser.setPlainText(json.dumps(_mapping(order), ensure_ascii=False, indent=2, default=str)) + layout.addWidget(browser) + buttons = QDialogButtonBox(QDialogButtonBox.StandardButton.Close) + buttons.rejected.connect(dialog.reject) + layout.addWidget(buttons) + dialog.exec() + + +__all__ = [ + "AuditPrescriptionDialog", + "DiagnosisDetailDialog", + "HerbEditor", + "HerbRowWidget", + "PasteHerbsDialog", + "PatchPatientDialog", + "PrescriptionDetailDialog", + "PrescriptionEditorDialog", + "PrescriptionOrderDialog", + "PrescriptionOrderListDialog", + "PrescriptionTemplateDialog", + "RemoteMedicineComboBox", + "SignaturePad", + "TemplateImportDialog", + "parse_pasted_herbs", + "render_prescription_html", +] diff --git a/app/src/doctor_workstation/ui/login.py b/app/src/doctor_workstation/ui/login.py new file mode 100644 index 000000000..612d04491 --- /dev/null +++ b/app/src/doctor_workstation/ui/login.py @@ -0,0 +1,440 @@ +"""Account login window for the doctor workstation.""" + +from __future__ import annotations + +from typing import Any + +from PySide6.QtCore import QSettings, Qt, Signal +from PySide6.QtWidgets import ( + QCheckBox, + QFrame, + QHBoxLayout, + QLabel, + QLineEdit, + QMainWindow, + QPushButton, + QSpinBox, + QToolButton, + QVBoxLayout, + QWidget, +) + +from .widgets import BusyOverlay, MessageBanner, friendly_error, invoke, run_async + + +class LoginWindow(QMainWindow): + """A responsive login surface with optional demo-repository switching. + + ``login_succeeded`` emits a dictionary containing ``user``, ``session``, + ``repository`` and ``demo_mode``. Keeping the selected repository in the + payload lets the composition root construct the shell without guessing. + ``remember_account`` is captured before the worker starts and is forwarded + to the repository so every account metadata store follows the same choice. + """ + + login_succeeded = Signal(object) + authenticated = Signal(object) + login_failed = Signal(str) + server_settings_changed = Signal(dict) + config_changed = Signal(object) + demo_mode_changed = Signal(bool) + + def __init__( + self, + repository: Any, + config: Any | None = None, + demo_repository: Any | None = None, + settings: QSettings | None = None, + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.repository = repository + self.config = config + if demo_repository is None: + demo_repository = getattr(config, "demo_repository", None) + self.demo_repository = demo_repository + self.settings = settings or QSettings("ZhenYangTang", "DoctorWorkstation") + self.active_repository = repository + self.authenticated_user: Any = None + self._loading = False + + self.setWindowTitle("臻阳堂 · 医生工作站") + self.setMinimumSize(860, 590) + self.resize(1120, 720) + + canvas = QWidget() + canvas.setObjectName("LoginCanvas") + self.setCentralWidget(canvas) + root = QHBoxLayout(canvas) + root.setContentsMargins(26, 26, 26, 26) + root.setSpacing(26) + + root.addWidget(self._build_brand_panel(), 5) + root.addWidget(self._build_login_area(), 6) + self._restore_settings() + + def _build_brand_panel(self) -> QWidget: + panel = QWidget() + panel.setObjectName("LoginBrandPanel") + panel.setMinimumWidth(310) + panel.setMaximumWidth(470) + layout = QVBoxLayout(panel) + layout.setContentsMargins(38, 38, 38, 38) + layout.setSpacing(18) + + brand_row = QHBoxLayout() + mark = QLabel("诊") + mark.setAlignment(Qt.AlignmentFlag.AlignCenter) + mark.setFixedSize(42, 42) + mark.setStyleSheet( + "color:#0F6D64; background:#DDF1EC; border-radius:12px; font-size:20px; font-weight:700;" + ) + brand_row.addWidget(mark) + brand_name = QLabel("臻阳堂医疗") + brand_name.setStyleSheet("color:#FCFBF8; font-size:16px; font-weight:700;") + brand_row.addWidget(brand_name) + brand_row.addStretch(1) + layout.addLayout(brand_row) + layout.addStretch(2) + + eyebrow = QLabel("DOCTOR WORKSTATION") + eyebrow.setStyleSheet("color:#82B7A9; font-size:11px; font-weight:700; letter-spacing:1px;") + layout.addWidget(eyebrow) + headline = QLabel("把诊间工作,\n留在一个安静的界面里。") + headline.setProperty("role", "display") + headline.setWordWrap(True) + layout.addWidget(headline) + description = QLabel("接诊、问诊、患者与处方信息统一呈现,帮助医生专注于每一次沟通。") + description.setWordWrap(True) + description.setStyleSheet("color:#B8CCC5; font-size:14px; line-height:1.6;") + layout.addWidget(description) + layout.addStretch(3) + + privacy = QLabel("本工作站仅供获授权的医疗人员使用\n请勿在公共设备保存账号") + privacy.setWordWrap(True) + privacy.setStyleSheet("color:#82A198; font-size:11px;") + layout.addWidget(privacy) + return panel + + def _build_login_area(self) -> QWidget: + area = QWidget() + outer = QVBoxLayout(area) + outer.setContentsMargins(20, 10, 20, 10) + outer.addStretch(1) + + self.card = QFrame() + self.card.setObjectName("LoginCard") + self.card.setMaximumWidth(470) + card_layout = QVBoxLayout(self.card) + card_layout.setContentsMargins(40, 36, 40, 36) + card_layout.setSpacing(14) + + title = QLabel("欢迎回来") + title.setProperty("role", "pageTitle") + card_layout.addWidget(title) + subtitle = QLabel("使用医生账号登录工作站") + subtitle.setProperty("role", "muted") + card_layout.addWidget(subtitle) + card_layout.addSpacing(6) + + self.error_banner = MessageBanner() + card_layout.addWidget(self.error_banner) + + account_label = QLabel("账号") + account_label.setStyleSheet("font-weight:600;") + card_layout.addWidget(account_label) + self.account_edit = QLineEdit() + self.account_edit.setPlaceholderText("手机号或工作账号") + self.account_edit.setClearButtonEnabled(True) + self.account_edit.setAccessibleName("登录账号") + card_layout.addWidget(self.account_edit) + + password_label = QLabel("密码") + password_label.setStyleSheet("font-weight:600;") + card_layout.addWidget(password_label) + password_row = QHBoxLayout() + password_row.setSpacing(6) + self.password_edit = QLineEdit() + self.password_edit.setEchoMode(QLineEdit.EchoMode.Password) + self.password_edit.setPlaceholderText("请输入密码") + self.password_edit.setAccessibleName("登录密码") + self.password_edit.returnPressed.connect(self.submit) + password_row.addWidget(self.password_edit, 1) + self.reveal_button = QToolButton() + self.reveal_button.setText("显示") + self.reveal_button.setCheckable(True) + self.reveal_button.setToolTip("显示或隐藏密码") + self.reveal_button.toggled.connect(self._toggle_password) + password_row.addWidget(self.reveal_button) + card_layout.addLayout(password_row) + + choices = QHBoxLayout() + self.remember_check = QCheckBox("记住账号") + self.remember_check.setToolTip("仅保存账号,不保存密码") + choices.addWidget(self.remember_check) + choices.addStretch(1) + self.demo_check = QCheckBox("演示模式") + self.demo_check.setEnabled(self.demo_repository is not None) + if self.demo_repository is None: + self.demo_check.setToolTip("当前未配置演示数据") + self.demo_check.toggled.connect(self._on_demo_toggled) + choices.addWidget(self.demo_check) + card_layout.addLayout(choices) + + self.login_button = QPushButton("登录工作站") + self.login_button.setProperty("variant", "primary") + self.login_button.setMinimumHeight(42) + self.login_button.clicked.connect(self.submit) + card_layout.addWidget(self.login_button) + + self.server_toggle = QPushButton("服务器设置 +") + self.server_toggle.setProperty("variant", "ghost") + self.server_toggle.setCheckable(True) + self.server_toggle.clicked.connect(self._toggle_server_panel) + card_layout.addWidget(self.server_toggle) + + self.server_panel = QFrame() + self.server_panel.setObjectName("SubtleCard") + server_layout = QVBoxLayout(self.server_panel) + server_layout.setContentsMargins(14, 12, 14, 12) + server_layout.setSpacing(8) + server_layout.addWidget(QLabel("服务地址")) + self.server_url_edit = QLineEdit() + self.server_url_edit.setPlaceholderText("由管理员提供,例如 https://api.example.com") + server_layout.addWidget(self.server_url_edit) + timeout_row = QHBoxLayout() + timeout_row.addWidget(QLabel("读取超时")) + self.timeout_spin = QSpinBox() + self.timeout_spin.setRange(10, 180) + self.timeout_spin.setSuffix(" 秒") + self.timeout_spin.setValue(60) + timeout_row.addWidget(self.timeout_spin) + timeout_row.addStretch(1) + self.save_server_button = QPushButton("保存设置") + self.save_server_button.setProperty("variant", "secondary") + self.save_server_button.clicked.connect(self._save_server_settings) + timeout_row.addWidget(self.save_server_button) + server_layout.addLayout(timeout_row) + server_hint = QLabel("生产环境应使用管理员下发的 HTTPS 地址。") + server_hint.setProperty("role", "muted") + server_hint.setWordWrap(True) + server_layout.addWidget(server_hint) + self.server_panel.setVisible(False) + card_layout.addWidget(self.server_panel) + + footnote = QLabel("登录即表示你同意遵守机构的数据安全与隐私规范。") + footnote.setProperty("role", "muted") + footnote.setWordWrap(True) + card_layout.addWidget(footnote) + + outer.addWidget(self.card, 0, Qt.AlignmentFlag.AlignHCenter) + outer.addStretch(1) + self.busy_overlay = BusyOverlay(self.card, "正在验证账号…") + return area + + def _restore_settings(self) -> None: + configured_account = getattr(self.config, "remembered_account", "") + remembered = str(self.settings.value("auth/remembered_account", configured_account) or "") + self.account_edit.setText(remembered) + self.remember_check.setChecked(bool(remembered)) + configured_url = getattr(self.config, "base_url", "") or getattr( + self.config, "api_base_url", "" + ) + self.server_url_edit.setText( + str(self.settings.value("server/base_url", configured_url) or "") + ) + try: + configured_timeout = getattr(self.config, "request_timeout", 60) + timeout = int( + self.settings.value("server/read_timeout", configured_timeout) or configured_timeout + ) + except (TypeError, ValueError): + timeout = 60 + self.timeout_spin.setValue(max(10, min(180, timeout))) + if self.demo_repository is not None and bool(getattr(self.config, "demo_mode", False)): + self.demo_check.setChecked(True) + if remembered: + self.password_edit.setFocus() + else: + self.account_edit.setFocus() + + def _toggle_password(self, visible: bool) -> None: + self.password_edit.setEchoMode( + QLineEdit.EchoMode.Normal if visible else QLineEdit.EchoMode.Password + ) + self.reveal_button.setText("隐藏" if visible else "显示") + + def _on_demo_toggled(self, enabled: bool) -> None: + self.active_repository = self.demo_repository if enabled else self.repository + self.server_toggle.setEnabled(not enabled and not self._loading) + self.demo_mode_changed.emit(enabled) + self._emit_config_update(demo_mode=enabled) + self.error_banner.clear() + if enabled: + self.account_edit.setPlaceholderText("可留空,使用演示医生") + self.password_edit.setPlaceholderText("可留空") + else: + self.account_edit.setPlaceholderText("手机号或工作账号") + self.password_edit.setPlaceholderText("请输入密码") + + def _toggle_server_panel(self, expanded: bool) -> None: + self.server_panel.setVisible(expanded) + self.server_toggle.setText("服务器设置 -" if expanded else "服务器设置 +") + + def _save_server_settings(self) -> None: + base_url = self.server_url_edit.text().strip().rstrip("/") + if base_url and not base_url.startswith( + ("https://", "http://localhost", "http://127.0.0.1") + ): + self.error_banner.show_message( + "服务地址需使用 HTTPS;本机调试可使用 localhost。", "warning" + ) + return + values = { + "base_url": base_url, + "read_timeout": self.timeout_spin.value(), + "api_base_url": base_url, + "request_timeout": self.timeout_spin.value(), + } + self.settings.setValue("server/base_url", base_url) + self.settings.setValue("server/read_timeout", self.timeout_spin.value()) + self.settings.sync() + self.server_settings_changed.emit(values) + self._emit_config_update( + api_base_url=base_url, + request_timeout=self.timeout_spin.value(), + ) + self.error_banner.show_message("服务器设置已保存,将在连接时生效。", "success") + + def _emit_config_update(self, **changes: Any) -> None: + updater = getattr(self.config, "with_updates", None) + if callable(updater): + try: + self.config = updater(**changes) + except (TypeError, ValueError): + self.config_changed.emit(changes) + else: + self.config_changed.emit(self.config) + return + self.config_changed.emit(changes) + + def submit(self) -> None: + if self._loading: + return + demo_mode = self.demo_check.isChecked() + remember_account = self.remember_check.isChecked() + account = self.account_edit.text().strip() + password = self.password_edit.text() + if demo_mode: + account = account or str(getattr(self.active_repository, "DEMO_ACCOUNT", "doctor")) + password = password or str( + getattr(self.active_repository, "DEMO_PASSWORD", "doctor123") + ) + if not account: + self.error_banner.show_message("请输入登录账号。", "warning") + self.account_edit.setFocus() + return + if not password: + self.error_banner.show_message("请输入密码。", "warning") + self.password_edit.setFocus() + return + repository = self.active_repository + if repository is None: + self.error_banner.show_message("演示服务尚未配置。", "warning") + return + + self.error_banner.clear() + self._set_loading(True) + + def authenticate() -> dict[str, Any]: + session = invoke( + repository, + "login", + account=account, + password=password, + remember_account=remember_account, + ) + user = invoke(repository, "get_current_user") + return { + "session": session, + "user": user, + "repository": repository, + "demo_mode": demo_mode, + "remember_account": remember_account, + } + + run_async( + authenticate, + on_success=lambda payload: self._on_login_success( + payload, + account, + remember_account, + ), + on_error=self._on_login_error, + on_finished=lambda: self._set_loading(False), + ) + + def _set_loading( + self, + loading: bool, + *, + button_text: str = "正在登录…", + overlay_text: str = "正在验证账号…", + ) -> None: + self._loading = loading + self.login_button.setEnabled(not loading) + self.account_edit.setEnabled(not loading) + self.password_edit.setEnabled(not loading) + self.remember_check.setEnabled(not loading) + self.reveal_button.setEnabled(not loading) + self.demo_check.setEnabled(not loading and self.demo_repository is not None) + self.server_toggle.setEnabled(not loading and not self.demo_check.isChecked()) + self.server_panel.setEnabled(not loading) + self.server_url_edit.setEnabled(not loading) + self.timeout_spin.setEnabled(not loading) + self.save_server_button.setEnabled(not loading) + self.login_button.setText(button_text if loading else "登录工作站") + self.busy_overlay.set_message(overlay_text) + self.busy_overlay.setVisible(loading) + if loading: + self.busy_overlay.raise_() + + def set_session_restore_pending(self, pending: bool) -> None: + """Block manual login controls while persisted-token validation runs.""" + + if pending: + self.error_banner.clear() + self._set_loading( + pending, + button_text="正在恢复登录…", + overlay_text="正在验证已保存的登录状态…", + ) + + def _on_login_success( + self, + payload: dict[str, Any], + account: str, + remember_account: bool | None = None, + ) -> None: + if remember_account is None: + remember_account = self.remember_check.isChecked() + if remember_account: + self.settings.setValue("auth/remembered_account", account) + else: + self.settings.remove("auth/remembered_account") + self.settings.sync() + self._emit_config_update(remembered_account=account if remember_account else "") + self.password_edit.clear() + self.authenticated_user = payload.get("user") + self.login_succeeded.emit(payload) + self.authenticated.emit(payload.get("session")) + + def _on_login_error(self, error: Exception) -> None: + message = friendly_error(error) + self.error_banner.show_message(message, "danger") + self.login_failed.emit(message) + self.password_edit.selectAll() + self.password_edit.setFocus() + + +__all__ = ["LoginWindow"] diff --git a/app/src/doctor_workstation/ui/pages/__init__.py b/app/src/doctor_workstation/ui/pages/__init__.py new file mode 100644 index 000000000..0d1ea3de2 --- /dev/null +++ b/app/src/doctor_workstation/ui/pages/__init__.py @@ -0,0 +1,15 @@ +"""Business pages shown inside :class:`doctor_workstation.ui.shell.ShellWindow`.""" + +from .consultations import ConsultationsPage +from .patients import PatientsPage +from .prescription_library import PrescriptionLibraryPage +from .prescriptions import PrescriptionsPage +from .reception import ReceptionPage + +__all__ = [ + "ConsultationsPage", + "PatientsPage", + "PrescriptionLibraryPage", + "PrescriptionsPage", + "ReceptionPage", +] diff --git a/app/src/doctor_workstation/ui/pages/consultations.py b/app/src/doctor_workstation/ui/pages/consultations.py new file mode 100644 index 000000000..8d7b6ae02 --- /dev/null +++ b/app/src/doctor_workstation/ui/pages/consultations.py @@ -0,0 +1,1475 @@ +"""Doctor-scoped diagnosis list matching the canonical admin workflow.""" + +from __future__ import annotations + +import re +from collections.abc import Mapping, Sequence +from contextlib import suppress +from copy import deepcopy +from types import MappingProxyType +from typing import Any + +from PySide6.QtCore import QDate, QTimer, Signal +from PySide6.QtWidgets import ( + QComboBox, + QDateEdit, + QDialog, + QDialogButtonBox, + QDoubleSpinBox, + QFormLayout, + QFrame, + QGridLayout, + QHBoxLayout, + QLabel, + QLineEdit, + QMessageBox, + QPushButton, + QSpinBox, + QStackedWidget, + QVBoxLayout, + QWidget, +) + +from ..dialogs import DiagnosisDialog +from ..dialogs.prescription import PrescriptionDetailDialog, PrescriptionEditorDialog +from ..widgets import ( + EmptyState, + MessageBanner, + PageHeader, + Pager, + SortableTable, + TableColumn, + display_text, + first_value, + friendly_error, + gender_text, + get_value, + invoke, + page_items, + page_total, + run_async, + show_toast, +) + +APPOINTMENT_STATUS = { + 1: ("已预约", "warning"), + 3: ("已完成", "success"), + 4: ("已过号", "danger"), +} +# Kept as a compatibility name for callers that imported the old module constant. +CONSULTATION_STATUS = APPOINTMENT_STATUS +_OPTIONAL_DATE_MINIMUM = QDate(2000, 1, 1) + + +def _as_int(value: Any, default: int = 0) -> int: + try: + return int(value) + except (TypeError, ValueError): + return default + + +def _as_bool(value: Any) -> bool: + if isinstance(value, str): + return value.strip().lower() in {"1", "true", "yes", "on"} + return bool(value) + + +def _canonical_allowed(permissions: Any, code: str, *, default: bool = True) -> bool: + """Check the exact admin permission code, without dot/slash aliases.""" + + if permissions is None: + return default + for method_name in ("allows", "has", "can", "contains", "has_permission"): + method = getattr(permissions, method_name, None) + if callable(method): + try: + return bool(method(code)) + except (TypeError, ValueError): + continue + raw = permissions + for attr in ("codes", "permissions", "values"): + candidate = getattr(permissions, attr, None) + if candidate is not None and not callable(candidate): + raw = candidate + break + if isinstance(raw, Mapping): + nested = first_value(raw, "codes", "permissions", "values", default=None) + if nested is not None: + raw = nested + if isinstance(raw, Mapping): + available = {str(key) for key, enabled in raw.items() if enabled} + elif isinstance(raw, str): + available = {raw} + else: + try: + available = {str(item) for item in raw} + except TypeError: + return False + if "*" in available or code in available: + return True + return any(grant.endswith("/*") and code.startswith(grant[:-1]) for grant in available) + + +def appointment_rows(record: Any) -> list[Any]: + """Return canonical ``appointments[]`` with the list-row fallback.""" + + rows = get_value(record, "appointments", None) + if isinstance(rows, Sequence) and not isinstance(rows, (str, bytes)) and rows: + return list(rows) + if not _as_bool(first_value(record, "has_appointment", default=False)): + return [] + latest = get_value(record, "latest_appointment", None) + if latest: + return [latest] + return [ + { + "id": first_value(record, "appointment_id"), + "status": first_value(record, "appointment_status"), + "doctor_id": first_value(record, "appointment_doctor_id", "doctor_id"), + "doctor_name": first_value( + record, "appointment_doctor_name", "doctor_name", default="" + ), + "appointment_date": first_value(record, "appointment_date", default=""), + "time_text": first_value( + record, + "appointment_time_text", + "appointment_time", + "period", + default="", + ), + } + ] + + +def _appointment_status(record: Any) -> Any: + status = first_value(record, "appointment_status", default=None) + if status is not None: + return status + latest = get_value(record, "latest_appointment", None) + status = first_value(latest, "status", "appointment_status", default=None) + if status is not None: + return status + rows = appointment_rows(record) + return first_value(rows[0], "status", "appointment_status", default=None) if rows else None + + +def _appointment_id(record: Any) -> int: + value = first_value(record, "appointment_id", default=None) + if value is None: + value = first_value(get_value(record, "latest_appointment", None), "id", default=None) + if value is None: + rows = appointment_rows(record) + value = first_value(rows[0], "id", "appointment_id", default=0) if rows else 0 + return _as_int(value) + + +def is_video_available(record: Any) -> bool: + """Only an existing, currently booked appointment may enter video.""" + + return bool( + record is not None + and _as_bool(first_value(record, "has_appointment", default=False)) + and _as_int(_appointment_status(record), -1) == 1 + ) + + +def _video_payload(record: Any) -> dict[str, Any]: + """Build call identifiers without confusing patient, diagnosis and appointment IDs.""" + + return { + "source": "consultations", + "appointment_id": _appointment_id(record), + "patient_id": first_value(record, "patient_id", "source_patient_id"), + "diagnosis_id": first_value(record, "diagnosis_id", "id"), + "patient_name": first_value(record, "patient_name", default="患者"), + "record": record, + } + + +def is_diagnosis_confirmed(record: Any) -> bool: + """Use view records first, as the admin table does.""" + + records = get_value(record, "DiagnosisViewRecord", None) + if records is None: + records = get_value(record, "diagnosis_view_records", None) + if isinstance(records, Sequence) and not isinstance(records, (str, bytes)) and records: + return any(_as_int(first_value(item, "is_confirmed", default=0)) == 1 for item in records) + return _as_bool(first_value(record, "diagnosis_confirmed", "confirmed", default=False)) + + +def prescription_action_label(record: Any) -> str: + audit = _as_int(first_value(record, "prescription_audit_status", "audit_status"), -1) + voided = _as_int(first_value(record, "prescription_void_status", "void_status"), 0) + return "查看处方" if audit == 1 and voided != 1 else "开方" + + +def can_void_prescription(record: Any) -> bool: + if record is None: + return False + if _as_int(first_value(record, "prescription_void_status", "void_status"), 0) == 1: + return False + if _as_int(first_value(record, "prescription_audit_status", "audit_status"), -1) == 1: + return False + return not _as_bool(first_value(record, "has_prescription_order", default=False)) + + +def _status_value(row: Any) -> tuple[str, str]: + status = _as_int(_appointment_status(row), -1) + fallback = APPOINTMENT_STATUS.get(status) + if fallback is not None: + return fallback + return ( + display_text( + first_value(row, "appointment_status_text", "appointment_status_desc", default="—") + ), + "neutral", + ) + + +def _appointment_status_label(status: Any) -> str: + return APPOINTMENT_STATUS.get(_as_int(status), (display_text(status), "neutral"))[0] + + +def _appointment_cell(_value: Any, row: Any) -> str: + rows = appointment_rows(row) + if not rows: + return "未挂号" + lines: list[str] = [] + for appointment in rows: + status = _appointment_status_label(first_value(appointment, "status", default=1)) + doctor = display_text(first_value(appointment, "doctor_name"), "—") + date_text = display_text(first_value(appointment, "appointment_date", "date"), "") + time_text = display_text( + first_value(appointment, "time_text", "appointment_time", "period"), "" + ) + when = " ".join(value for value in (date_text, time_text) if value) or "—" + lines.append(f"{status} · {doctor} · {when}") + channel = first_value( + row, + "latest_appointment_channel_source_desc", + "latest_appointment_channel_source", + default="", + ) + detail = first_value(row, "latest_appointment_channel_source_detail", default="") + if channel: + lines.append(f"渠道:{channel}{f'({detail})' if detail else ''}") + return "\n".join(lines) + + +def _id_cell(_value: Any, row: Any) -> str: + diagnosis_id = display_text(first_value(row, "id", "diagnosis_id")) + unread = get_value(row, "assign_read_at", "missing") is None + assigned = _as_int(first_value(row, "assistant_id", "assistant", default=0)) > 0 + return f"{diagnosis_id} NEW" if unread and assigned else diagnosis_id + + +def _gender_age_cell(_value: Any, row: Any) -> str: + gender = first_value(row, "gender_desc", default=None) + if gender is None: + gender = gender_text(first_value(row, "gender")) + age = display_text(first_value(row, "age")) + return f"{gender} · {age}岁" + + +def _confirmation_cell(_value: Any, row: Any) -> str: + return "已确认" if is_diagnosis_confirmed(row) else "未确认" + + +def _revisit_cell(_value: Any, row: Any) -> str: + if not _as_bool(first_value(row, "has_prescription", default=False)): + return "无" + when = display_text(first_value(row, "followup_time_text", "followup_time")) + doctor = display_text(first_value(row, "followup_doctor_name")) + return f"{when}\n{doctor}" + + +def _void_cell(_value: Any, row: Any) -> str: + voided = _as_int( + first_value(row, "followup_rx_voided", "prescription_void_status", "void_status"), + 0, + ) + return "已作废" if voided == 1 else "—" + + +def _prescription_cell(_value: Any, row: Any) -> str: + return "已开方" if _as_bool(first_value(row, "has_prescription", default=False)) else "未开方" + + +def _unserved_cell(_value: Any, row: Any) -> str: + days = first_value(row, "unserved_days", "unserved_day_count", default=None) + latest = first_value( + row, + "last_face_to_face_at", + "last_face_to_face_time", + "last_interview_at", + "last_appointment_at", + "last_blood_record_at", + default="", + ) + if days is None and not latest: + return "—" + first_line = f"{display_text(days)} 天" if days is not None else "—" + return f"{first_line}\n上次面诊:{display_text(latest)}" if latest else first_line + + +def _watch_cell(_value: Any, row: Any) -> str: + state = first_value(row, "video_call_hint.state", "video_hint", default="none") + label = first_value(row, "video_call_hint.label", default="") + return { + "live": "通话中", + "pending_room": "等待接通", + "none": display_text(label, "暂无通话"), + }.get(str(state), display_text(label or state)) + + +def _option_rows(value: Any, dictionary_type: str = "") -> list[Any]: + if isinstance(value, Sequence) and not isinstance(value, (str, bytes)): + return list(value) + if isinstance(value, Mapping): + candidates = ( + value.get(dictionary_type), + value.get("items"), + value.get("lists"), + value.get("data"), + ) + for candidate in candidates: + if isinstance(candidate, Sequence) and not isinstance(candidate, (str, bytes)): + return list(candidate) + if isinstance(candidate, Mapping): + nested = candidate.get(dictionary_type) + if isinstance(nested, Sequence) and not isinstance(nested, (str, bytes)): + return list(nested) + return [] + + +class _DiagnosisCreateDialog(QDialog): + """Narrow add form containing the admin page's required identity fields.""" + + def __init__(self, parent: QWidget | None = None) -> None: + super().__init__(parent) + self.setWindowTitle("新增诊单") + self.resize(520, 490) + root = QVBoxLayout(self) + root.setContentsMargins(20, 18, 20, 18) + form = QFormLayout() + self.patient_name = QLineEdit() + self.patient_name.setMaxLength(50) + form.addRow("患者姓名 *", self.patient_name) + self.phone = QLineEdit() + self.phone.setMaxLength(20) + form.addRow("手机号 *", self.phone) + self.gender = QComboBox() + self.gender.addItem("男", 1) + self.gender.addItem("女", 2) + form.addRow("性别 *", self.gender) + self.age = QSpinBox() + self.age.setRange(0, 150) + self.age.setValue(30) + form.addRow("年龄 *", self.age) + self.fasting_blood_sugar = QDoubleSpinBox() + self.fasting_blood_sugar.setRange(0, 50) + self.fasting_blood_sugar.setDecimals(1) + self.fasting_blood_sugar.setValue(5.0) + self.fasting_blood_sugar.setSuffix(" mmol/L") + form.addRow("空腹血糖 *", self.fasting_blood_sugar) + self.diagnosis_type = QLineEdit() + self.diagnosis_type.setPlaceholderText("填写后台诊断类型值") + form.addRow("诊断类型 *", self.diagnosis_type) + self.syndrome_type = QLineEdit() + form.addRow("证型", self.syndrome_type) + self.local_hospital_diagnosis = QLineEdit() + form.addRow("当地医院诊断 *", self.local_hospital_diagnosis) + root.addLayout(form) + self.banner = MessageBanner() + root.addWidget(self.banner) + buttons = QDialogButtonBox( + QDialogButtonBox.StandardButton.Cancel | QDialogButtonBox.StandardButton.Save + ) + buttons.button(QDialogButtonBox.StandardButton.Save).setText("创建诊单") + buttons.button(QDialogButtonBox.StandardButton.Save).setProperty("variant", "primary") + buttons.rejected.connect(self.reject) + buttons.accepted.connect(self.accept) + root.addWidget(buttons) + + def payload(self) -> dict[str, Any]: + local_diagnosis = self.local_hospital_diagnosis.text().strip() + return { + "patient_name": self.patient_name.text().strip(), + "name": self.patient_name.text().strip(), + "phone": self.phone.text().strip(), + "patient_phone": self.phone.text().strip(), + "gender": self.gender.currentData(), + "age": self.age.value(), + "fasting_blood_sugar": self.fasting_blood_sugar.value(), + "diagnosis_type": self.diagnosis_type.text().strip(), + "syndrome_type": self.syndrome_type.text().strip(), + "local_hospital_diagnosis": [local_diagnosis] if local_diagnosis else [], + "diagnosis_date": QDate.currentDate().toString("yyyy-MM-dd"), + "status": 1, + } + + def accept(self) -> None: + payload = self.payload() + if not payload["patient_name"]: + self.banner.show_message("请输入患者姓名。", "warning") + return + if not re.fullmatch(r"1[3-9]\d{9}", str(payload["phone"])): + self.banner.show_message("请输入有效的 11 位手机号。", "warning") + return + if not payload["diagnosis_type"]: + self.banner.show_message("请输入诊断类型。", "warning") + return + if not payload["local_hospital_diagnosis"]: + self.banner.show_message("请输入当地医院诊断。", "warning") + return + self.banner.clear() + super().accept() + + +class ConsultationsPage(QWidget): + """Diagnosis workspace with canonical filters and guarded row actions.""" + + video_requested = Signal(dict) + + def __init__( + self, + repository: Any, + permissions: Any = None, + current_user: Any = None, + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.repository = repository + self.permissions = permissions + self.current_user = current_user + self._page = 1 + self._page_size = 15 + self._generation = 0 + self._count_generation = 0 + self._options_generation = 0 + self._prescription_generation = 0 + self._mutation_generation = 0 + self._loading = False + self._mutation_pending = False + self._prescription_busy = False + self._options_loaded = False + self._appointment_date = QDate.currentDate().toString("yyyy-MM-dd") + self._pending_booking = "" + self._completed_appointment = "" + self._pending_assign = "" + self._date_counts: dict[str, int] = {} + self._assistant_names: dict[int, str] = {} + self._last_prescription: Any = None + + root = QVBoxLayout(self) + root.setContentsMargins(24, 20, 24, 24) + root.setSpacing(14) + header = PageHeader( + "问诊列表", + "默认显示今天的诊单;双击进入只读病例,视频仅对当前已预约记录开放。", + ) + self.add_button = QPushButton("新增诊单") + self.add_button.setProperty("variant", "primary") + self.add_button.setVisible(_canonical_allowed(permissions, "tcm.diagnosis/add")) + self.add_button.clicked.connect(self._add_diagnosis) + header.add_action(self.add_button) + root.addWidget(header) + + filters = QFrame() + filters.setObjectName("FilterBar") + filter_layout = QVBoxLayout(filters) + filter_layout.setContentsMargins(16, 14, 16, 14) + filter_layout.setSpacing(10) + quick = QHBoxLayout() + quick.setSpacing(6) + self.date_buttons: dict[str, QPushButton] = {} + self._date_button_labels: dict[str, str] = {} + for label, offset in ( + ("前天", -2), + ("昨天", -1), + ("今天", 0), + ("明天", 1), + ("后天", 2), + ): + value = QDate.currentDate().addDays(offset).toString("yyyy-MM-dd") + button = QPushButton(label) + button.setCheckable(True) + button.setProperty("variant", "ghost") + button.clicked.connect( + lambda _checked=False, date_value=value: self._choose_date(date_value) + ) + self.date_buttons[value] = button + self._date_button_labels[value] = label + quick.addWidget(button) + all_button = QPushButton("全部") + all_button.setCheckable(True) + all_button.setProperty("variant", "ghost") + all_button.clicked.connect(lambda _checked=False: self._choose_date("")) + self.date_buttons[""] = all_button + self._date_button_labels[""] = "全部" + quick.addWidget(all_button) + self.pending_booking_button = QPushButton("待预约") + self.pending_booking_button.setCheckable(True) + self.pending_booking_button.setProperty("variant", "ghost") + self.pending_booking_button.clicked.connect(self._choose_pending_booking) + quick.addWidget(self.pending_booking_button) + self.completed_button = QPushButton("已完成") + self.completed_button.setCheckable(True) + self.completed_button.setProperty("variant", "ghost") + self.completed_button.clicked.connect(self._choose_completed) + quick.addWidget(self.completed_button) + self.pending_assign_button = QPushButton("待分配医助") + self.pending_assign_button.setCheckable(True) + self.pending_assign_button.setProperty("variant", "ghost") + self.pending_assign_button.setVisible( + _canonical_allowed(permissions, "tcm.diagnosis/assign") + ) + self.pending_assign_button.clicked.connect(self._choose_pending_assign) + quick.addWidget(self.pending_assign_button) + quick.addStretch(1) + filter_layout.addLayout(quick) + + grid = QGridLayout() + grid.setHorizontalSpacing(10) + grid.setVerticalSpacing(8) + self.keyword_edit = QLineEdit() + self.keyword_edit.setPlaceholderText("患者姓名 / 手机号") + self.keyword_edit.setClearButtonEnabled(True) + self.keyword_edit.returnPressed.connect(self._search) + grid.addWidget(self.keyword_edit, 0, 0, 1, 2) + self.has_appointment_combo = self._fixed_combo( + (("全部挂号", ""), ("已挂号", "1"), ("未挂号", "0")) + ) + grid.addWidget(self.has_appointment_combo, 0, 2) + self.diagnosis_confirmed_combo = self._fixed_combo( + (("全部确认", ""), ("已确认", "1"), ("未确认", "0")) + ) + self.confirmed_combo = self.diagnosis_confirmed_combo + grid.addWidget(self.diagnosis_confirmed_combo, 0, 3) + + self.diagnosis_type_combo = self._editable_combo("全部诊断类型") + grid.addWidget(self.diagnosis_type_combo, 1, 0) + self.syndrome_combo = self._editable_combo("全部证型") + grid.addWidget(self.syndrome_combo, 1, 1) + self.assistant_combo = self._editable_combo("全部医助") + grid.addWidget(self.assistant_combo, 1, 2, 1, 2) + + self.latest_appointment_start_date = self._optional_date("最近挂号开始") + self.latest_appointment_end_date = self._optional_date("最近挂号结束") + self.channel_combo = self._editable_combo("全部最近挂号渠道") + self.unserved_sort_combo = self._fixed_combo( + ( + ("未服务天数默认排序", ""), + ("未服务天数从多到少", "desc"), + ("未服务天数从少到多", "asc"), + ) + ) + grid.addWidget(self.latest_appointment_start_date, 2, 0) + grid.addWidget(self.latest_appointment_end_date, 2, 1) + grid.addWidget(self.channel_combo, 2, 2) + grid.addWidget(self.unserved_sort_combo, 2, 3) + + self.latest_assign_start_date = self._optional_date("最近指派开始") + self.latest_assign_end_date = self._optional_date("最近指派结束") + grid.addWidget(self.latest_assign_start_date, 3, 0) + grid.addWidget(self.latest_assign_end_date, 3, 1) + self.search_button = QPushButton("查询") + self.search_button.setProperty("variant", "secondary") + self.search_button.clicked.connect(self._search) + grid.addWidget(self.search_button, 3, 2) + self.reset_button = QPushButton("重置") + self.reset_button.setProperty("variant", "ghost") + self.reset_button.clicked.connect(self._reset) + grid.addWidget(self.reset_button, 3, 3) + for column in range(4): + grid.setColumnStretch(column, 1) + filter_layout.addLayout(grid) + root.addWidget(filters) + self._update_quick_buttons() + + self.banner = MessageBanner() + root.addWidget(self.banner) + card = QFrame() + card.setObjectName("Card") + card_layout = QVBoxLayout(card) + card_layout.setContentsMargins(16, 14, 16, 14) + card_layout.setSpacing(10) + title_row = QHBoxLayout() + title = QLabel("诊单记录") + title.setProperty("role", "sectionTitle") + title_row.addWidget(title) + self.summary_label = QLabel("等待加载") + self.summary_label.setProperty("role", "muted") + title_row.addWidget(self.summary_label) + title_row.addStretch(1) + self.view_button = QPushButton("查看") + self.view_button.setProperty("variant", "ghost") + self.view_button.setVisible(_canonical_allowed(permissions, "tcm.diagnosis/readonlyDetail")) + self.view_button.clicked.connect(self._open_readonly) + title_row.addWidget(self.view_button) + self.edit_button = QPushButton("诊单") + self.edit_button.setProperty("variant", "ghost") + self.edit_button.setVisible(_canonical_allowed(permissions, "tcm.diagnosis/edit")) + self.edit_button.clicked.connect(self._open_edit) + title_row.addWidget(self.edit_button) + self.prescription_button = QPushButton("开方") + self.prescription_button.setProperty("variant", "secondary") + self.prescription_button.setVisible( + _canonical_allowed(permissions, "tcm.diagnosis/kaifang") + ) + self.prescription_button.clicked.connect(self._open_prescription) + title_row.addWidget(self.prescription_button) + self.void_button = QPushButton("作废处方") + self.void_button.setProperty("variant", "danger") + self.void_button.setVisible(_canonical_allowed(permissions, "tcm.diagnosis/kaifang")) + self.void_button.clicked.connect(self._void_selected_prescription) + title_row.addWidget(self.void_button) + self.video_button = QPushButton("发起视频") + self.video_button.setProperty("variant", "primary") + self.video_button.clicked.connect(self._request_video) + title_row.addWidget(self.video_button) + self.delete_button = QPushButton("删除") + self.delete_button.setProperty("variant", "danger") + self.delete_button.setVisible(_canonical_allowed(permissions, "tcm.diagnosis/delete")) + self.delete_button.clicked.connect(self._delete_selected) + title_row.addWidget(self.delete_button) + self.refresh_button = QPushButton("刷新") + self.refresh_button.setProperty("variant", "ghost") + self.refresh_button.clicked.connect(lambda: self.refresh()) + title_row.addWidget(self.refresh_button) + card_layout.addLayout(title_row) + + self.content_stack = QStackedWidget() + host = QWidget() + host_layout = QVBoxLayout(host) + host_layout.setContentsMargins(0, 0, 0, 0) + self.table = SortableTable( + [ + TableColumn("id", "ID / NEW", 92, _id_cell), + TableColumn("patient_name", "患者", 90), + TableColumn("gender", "性别 / 年龄", 105, _gender_age_cell), + TableColumn( + "appointments", "挂号状态 / 时间 / 医生 / 渠道", 300, _appointment_cell + ), + TableColumn("diagnosis_confirmed", "确认", 80, _confirmation_cell), + TableColumn("followup_time_text", "复诊", 125, _revisit_cell), + TableColumn("doctor_name", "医生", 90), + TableColumn("prescription_void_status", "作废", 74, _void_cell), + TableColumn("assistant_name", "医助", 90, self._assistant_cell), + TableColumn("has_prescription", "处方", 76, _prescription_cell), + TableColumn("unserved_days", "未服务 / 上次面诊", 180, _unserved_cell), + TableColumn("video_call_hint", "通话", 90, _watch_cell), + ] + ) + self.table.setWordWrap(True) + self.table.itemSelectionChanged.connect(self._selection_changed) + self.table.itemDoubleClicked.connect(lambda _item: self._open_readonly()) + host_layout.addWidget(self.table, 1) + self.pager = Pager(self._page_size) + self.pager.page_changed.connect(self._change_page) + host_layout.addWidget(self.pager) + self.content_stack.addWidget(host) + self.content_stack.addWidget(EmptyState("没有问诊记录", "当前日期和筛选条件下没有诊单。")) + card_layout.addWidget(self.content_stack, 1) + root.addWidget(card, 1) + + self._diagnosis_dialog = DiagnosisDialog(repository, self) + self._diagnosis_dialog.saved.connect(lambda: self.refresh(silent=True)) + self.poll_timer = QTimer(self) + self.poll_timer.setInterval(20_000) + self.poll_timer.timeout.connect(lambda: self.refresh(silent=True)) + self._selection_changed() + + @staticmethod + def _fixed_combo(options: Sequence[tuple[str, Any]]) -> QComboBox: + combo = QComboBox() + for label, value in options: + combo.addItem(label, value) + return combo + + @staticmethod + def _editable_combo(placeholder: str) -> QComboBox: + combo = QComboBox() + combo.setEditable(True) + combo.addItem(placeholder, "") + if combo.lineEdit() is not None: + combo.lineEdit().setPlaceholderText(placeholder) + return combo + + @staticmethod + def _optional_date(tooltip: str) -> QDateEdit: + editor = QDateEdit() + editor.setCalendarPopup(True) + editor.setDisplayFormat("yyyy-MM-dd") + editor.setMinimumDate(_OPTIONAL_DATE_MINIMUM) + editor.setSpecialValueText("不限") + editor.setDate(_OPTIONAL_DATE_MINIMUM) + editor.setToolTip(tooltip) + return editor + + @staticmethod + def _date_value(editor: QDateEdit) -> str: + if editor.date() == _OPTIONAL_DATE_MINIMUM: + return "" + return editor.date().toString("yyyy-MM-dd") + + @staticmethod + def _combo_value(combo: QComboBox) -> Any: + data = combo.currentData() + if combo.isEditable() and combo.currentIndex() < 0: + return combo.currentText().strip() + return "" if data is None else data + + def _assistant_cell(self, _value: Any, row: Any) -> str: + name = first_value(row, "assistant_name", default="") + if name: + return display_text(name) + assistant_id = _as_int(first_value(row, "assistant_id", "assistant", default=0)) + return self._assistant_names.get(assistant_id, "—") + + def _choose_date(self, value: str) -> None: + self._appointment_date = value + self._pending_booking = "" + self._completed_appointment = "" + self._pending_assign = "" + self.has_appointment_combo.setCurrentIndex(0) + self._clear_latest_appointment_filters() + self._update_quick_buttons() + self._page = 1 + self.refresh() + + def _choose_pending_booking(self) -> None: + self._appointment_date = "" + self._pending_booking = "1" + self._completed_appointment = "" + self._pending_assign = "" + self.has_appointment_combo.setCurrentIndex(2) + self._clear_latest_appointment_filters() + self._update_quick_buttons() + self._page = 1 + self.refresh() + + def _choose_completed(self) -> None: + self._appointment_date = "" + self._pending_booking = "" + self._completed_appointment = "1" + self._pending_assign = "" + self.has_appointment_combo.setCurrentIndex(0) + self._clear_latest_appointment_filters() + self._update_quick_buttons() + self._page = 1 + self.refresh() + + def _choose_pending_assign(self) -> None: + if not _canonical_allowed(self.permissions, "tcm.diagnosis/assign"): + return + self._appointment_date = "" + self._pending_booking = "" + self._completed_appointment = "" + self._pending_assign = "1" + self.has_appointment_combo.setCurrentIndex(0) + self._clear_latest_appointment_filters() + self._update_quick_buttons() + self._page = 1 + self.refresh() + + def _update_quick_buttons(self) -> None: + normal_date_mode = not any( + (self._pending_booking, self._completed_appointment, self._pending_assign) + ) + for value, button in self.date_buttons.items(): + button.setChecked(normal_date_mode and self._appointment_date == value) + count = self._date_counts.get(value) + base = self._date_button_labels[value] + button.setText(f"{base} {count}" if count is not None else base) + self.pending_booking_button.setChecked(bool(self._pending_booking)) + self.completed_button.setChecked(bool(self._completed_appointment)) + self.pending_assign_button.setChecked(bool(self._pending_assign)) + pending_count = self._date_counts.get("pending_booking") + completed_count = self._date_counts.get("completed") + assign_count = self._date_counts.get("pending_assign") + self.pending_booking_button.setText( + f"待预约 {pending_count}" if pending_count is not None else "待预约" + ) + self.completed_button.setText( + f"已完成 {completed_count}" if completed_count is not None else "已完成" + ) + self.pending_assign_button.setText( + f"待分配医助 {assign_count}" if assign_count is not None else "待分配医助" + ) + + def _clear_latest_appointment_filters(self) -> None: + self.latest_appointment_start_date.setDate(_OPTIONAL_DATE_MINIMUM) + self.latest_appointment_end_date.setDate(_OPTIONAL_DATE_MINIMUM) + self.channel_combo.setCurrentIndex(0) + + def _reset(self) -> None: + self.keyword_edit.clear() + for combo in ( + self.has_appointment_combo, + self.diagnosis_confirmed_combo, + self.diagnosis_type_combo, + self.syndrome_combo, + self.assistant_combo, + self.channel_combo, + self.unserved_sort_combo, + ): + combo.setCurrentIndex(0) + for editor in ( + self.latest_appointment_start_date, + self.latest_appointment_end_date, + self.latest_assign_start_date, + self.latest_assign_end_date, + ): + editor.setDate(_OPTIONAL_DATE_MINIMUM) + self._appointment_date = "" + self._pending_booking = "" + self._completed_appointment = "" + self._pending_assign = "" + self._update_quick_buttons() + self._page = 1 + self.refresh() + + def _validate_ranges(self) -> bool: + pairs = ( + ( + self._date_value(self.latest_appointment_start_date), + self._date_value(self.latest_appointment_end_date), + "最近挂号", + ), + ( + self._date_value(self.latest_assign_start_date), + self._date_value(self.latest_assign_end_date), + "最近指派", + ), + ) + for start, end, label in pairs: + if start and end and start > end: + self.banner.show_message(f"{label}开始日期不能晚于结束日期。", "warning") + return False + return True + + def _search(self) -> None: + if not self._validate_ranges(): + return + if ( + self._date_value(self.latest_appointment_start_date) + or self._date_value(self.latest_appointment_end_date) + or self._combo_value(self.channel_combo) + ): + self._appointment_date = "" + self._pending_booking = "" + self._completed_appointment = "" + if self._combo_value(self.has_appointment_combo) == "0": + self.has_appointment_combo.setCurrentIndex(0) + self._update_quick_buttons() + self._page = 1 + self.refresh() + + def _change_page(self, page: int) -> None: + self._page = page + self.refresh(silent=True) + + def _shared_filters(self) -> dict[str, Any]: + return { + "keyword": self.keyword_edit.text().strip(), + "has_appointment": self._combo_value(self.has_appointment_combo), + "diagnosis_confirmed": self._combo_value(self.diagnosis_confirmed_combo), + "diagnosis_type": self._combo_value(self.diagnosis_type_combo), + "syndrome_type": self._combo_value(self.syndrome_combo), + "assistant_id": self._combo_value(self.assistant_combo), + "latest_appointment_start_date": self._date_value(self.latest_appointment_start_date), + "latest_appointment_end_date": self._date_value(self.latest_appointment_end_date), + "latest_appointment_channel_source": self._combo_value(self.channel_combo), + "latest_assign_start_date": self._date_value(self.latest_assign_start_date), + "latest_assign_end_date": self._date_value(self.latest_assign_end_date), + } + + def _filters(self) -> dict[str, Any]: + filters = self._shared_filters() + filters.update( + { + "appointment_date": self._appointment_date, + "pending_booking": self._pending_booking, + "completed_appointment": self._completed_appointment, + "pending_assign": self._pending_assign, + "sort_unserved_days": self._combo_value(self.unserved_sort_combo), + } + ) + return filters + + def refresh(self, silent: bool = False) -> None: + """Refresh without allowing an older async request to overwrite newer filters.""" + + if not self._validate_ranges(): + return + self._generation += 1 + generation = self._generation + self._loading = True + self.refresh_button.setEnabled(False) + filters = MappingProxyType(self._filters()) + page = self._page + if not silent: + self.banner.show_message("正在加载问诊诊单…", "info") + self._refresh_counts() + run_async( + lambda: invoke( + self.repository, + "consultations", + **filters, + page=page, + page_size=self._page_size, + ), + on_success=lambda result: self._apply_result(result, generation), + on_error=lambda error: self._load_error(error, generation), + on_finished=lambda: self._load_finished(generation), + ) + + def _apply_result(self, result: Any, generation: int) -> None: + if generation != self._generation: + return + rows = page_items(result) + total = page_total(result, len(rows)) + last_page = max(1, (total + self._page_size - 1) // self._page_size) + if self._page > last_page: + self._page = last_page + self.refresh(silent=True) + return + self.table.set_rows(rows) + self.table.resizeRowsToContents() + self.pager.update_state(self._page, total) + self.summary_label.setText(f"共 {total} 条 · 第 {self._page} 页 · 每页 15 条") + self.content_stack.setCurrentIndex(0 if rows else 1) + self.banner.clear() + if rows and self.table.currentRow() < 0: + self.table.selectRow(0) + self._selection_changed() + + def _load_error(self, error: Exception, generation: int) -> None: + if generation == self._generation: + self.banner.show_message(friendly_error(error), "danger") + + def _load_finished(self, generation: int) -> None: + if generation == self._generation: + self._loading = False + self.refresh_button.setEnabled(True) + + def _refresh_counts(self) -> None: + self._count_generation += 1 + generation = self._count_generation + shared = self._shared_filters() + dates = list(self.date_buttons) + requests: list[tuple[str, Mapping[str, Any]]] = [] + for value in dates: + payload = dict(shared) + payload.update( + { + "appointment_date": value, + "pending_booking": "", + "completed_appointment": "", + "pending_assign": "", + "sort_unserved_days": "", + } + ) + requests.append((value, MappingProxyType(payload))) + pending = dict(shared) + pending.update({"appointment_date": "", "has_appointment": "0"}) + requests.append(("pending_booking", MappingProxyType(pending))) + completed = dict(shared) + completed.update( + {"appointment_date": "", "has_appointment": "", "completed_appointment": "1"} + ) + requests.append(("completed", MappingProxyType(completed))) + if _canonical_allowed(self.permissions, "tcm.diagnosis/assign"): + assign = dict(shared) + assign.update({"appointment_date": "", "has_appointment": "", "pending_assign": "1"}) + requests.append(("pending_assign", MappingProxyType(assign))) + + def load_counts() -> dict[str, int]: + counts: dict[str, int] = {} + for key, payload in requests: + try: + result = invoke( + self.repository, + "consultations", + **payload, + page=1, + page_size=1, + ) + except Exception: + continue + counts[key] = page_total(result, len(page_items(result))) + return counts + + run_async( + load_counts, + on_success=lambda counts: self._apply_counts(counts, generation), + on_error=lambda _error: None, + ) + + def _apply_counts(self, counts: Any, generation: int) -> None: + if generation != self._count_generation or not isinstance(counts, Mapping): + return + self._date_counts = { + str(key): _as_int(value) for key, value in counts.items() if value is not None + } + self._update_quick_buttons() + + def _load_filter_options(self) -> None: + if self._options_loaded: + return + self._options_loaded = True + self._options_generation += 1 + generation = self._options_generation + + def load() -> dict[str, list[Any]]: + result: dict[str, list[Any]] = {} + dictionary = getattr(self.repository, "get_dictionary", None) + if callable(dictionary): + for key in ( + "diagnosis_type", + "syndrome_type", + "appointment_channel_source", + ): + try: + value = invoke(self.repository, "get_dictionary", dictionary_type=key) + except Exception: + continue + result[key] = _option_rows(value, key) + assistants = getattr(self.repository, "list_diagnosis_assistants", None) + if callable(assistants): + with suppress(Exception): + result["assistants"] = _option_rows( + invoke(self.repository, "list_diagnosis_assistants") + ) + return result + + run_async( + load, + on_success=lambda options: self._apply_filter_options(options, generation), + on_error=lambda _error: None, + ) + + def _apply_filter_options(self, options: Any, generation: int) -> None: + if generation != self._options_generation or not isinstance(options, Mapping): + return + mappings = ( + (self.diagnosis_type_combo, options.get("diagnosis_type", [])), + (self.syndrome_combo, options.get("syndrome_type", [])), + (self.channel_combo, options.get("appointment_channel_source", [])), + (self.assistant_combo, options.get("assistants", [])), + ) + for combo, rows in mappings: + current = self._combo_value(combo) + placeholder = combo.itemText(0) + combo.clear() + combo.addItem(placeholder, "") + for row in rows if isinstance(rows, Sequence) else []: + label = display_text(first_value(row, "name", "label", "text", default=""), "") + value = first_value(row, "value", "id", "code", default=label) + if label: + combo.addItem(label, value) + index = combo.findData(current) + if index >= 0: + combo.setCurrentIndex(index) + elif current: + combo.setEditText(str(current)) + self._assistant_names = { + _as_int(first_value(row, "id", "value")): display_text( + first_value(row, "name", "label") + ) + for row in options.get("assistants", []) + if _as_int(first_value(row, "id", "value")) > 0 + } + + def _selection_changed(self) -> None: + self._prescription_generation += 1 + # A row change invalidates the old worker and must also release its UI lock. + self._prescription_busy = False + record = self.table.current_data() + diagnosis_id = _as_int(first_value(record, "diagnosis_id", "id", default=0)) + has_record = record is not None and diagnosis_id > 0 and not self._mutation_pending + self.view_button.setEnabled(has_record) + self.edit_button.setEnabled(has_record) + self.delete_button.setEnabled(has_record) + self.prescription_button.setText( + prescription_action_label(record) if record is not None else "开方" + ) + self.prescription_button.setEnabled(has_record and not self._prescription_busy) + row_has_prescription = _as_bool(first_value(record, "has_prescription", default=False)) + self.void_button.setEnabled( + has_record + and row_has_prescription + and can_void_prescription(record) + and not self._prescription_busy + ) + payload = _video_payload(record) if record is not None else {} + valid_ids = all( + _as_int(payload.get(key), 0) > 0 + for key in ("appointment_id", "patient_id", "diagnosis_id") + ) + self.video_button.setEnabled(has_record and is_video_available(record) and valid_ids) + + def _open_readonly(self) -> None: + if not _canonical_allowed(self.permissions, "tcm.diagnosis/readonlyDetail"): + return + record = self.table.current_data() + diagnosis_id = _as_int(first_value(record, "diagnosis_id", "id", default=0)) + if diagnosis_id <= 0: + return + self._diagnosis_dialog.open_for(diagnosis_id, editable=False, seed=record) + + def _open_edit(self) -> None: + if not _canonical_allowed(self.permissions, "tcm.diagnosis/edit"): + return + record = self.table.current_data() + diagnosis_id = _as_int(first_value(record, "diagnosis_id", "id", default=0)) + if diagnosis_id <= 0: + return + self._diagnosis_dialog.open_for(diagnosis_id, editable=True, seed=record) + + def _add_diagnosis(self) -> None: + if not _canonical_allowed(self.permissions, "tcm.diagnosis/add"): + return + dialog = _DiagnosisCreateDialog(self) + if dialog.exec() != QDialog.DialogCode.Accepted: + return + payload = dialog.payload() + payload.setdefault("doctor_id", first_value(self.current_user, "id", "user_id")) + payload.setdefault("doctor_name", first_value(self.current_user, "name", "real_name")) + self._run_mutation( + lambda: invoke(self.repository, "create_diagnosis", diagnosis=payload), + "诊单已创建。", + ) + + def _delete_selected(self) -> None: + if not _canonical_allowed(self.permissions, "tcm.diagnosis/delete"): + return + record = self.table.current_data() + diagnosis_id = _as_int(first_value(record, "diagnosis_id", "id", default=0)) + if diagnosis_id <= 0: + return + answer = QMessageBox.warning( + self, + "删除诊单", + f"确定删除诊单 #{diagnosis_id} 吗?此操作无法撤销。", + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.Cancel, + QMessageBox.StandardButton.Cancel, + ) + if answer != QMessageBox.StandardButton.Yes: + return + self._run_mutation( + lambda: invoke( + self.repository, "delete_diagnosis", diagnosis_id=diagnosis_id, id=diagnosis_id + ), + "诊单已删除。", + ) + + def _load_context_prescription(self, record: Any) -> Any: + appointment_id = _appointment_id(record) + if appointment_id <= 0: + return None + # This endpoint is the sole authority for the selected appointment. A + # transport/auth error must propagate; diagnosis history is never a fallback. + existing = invoke( + self.repository, + "get_prescription_by_appointment", + appointment_id=appointment_id, + ) + if ( + isinstance(existing, Mapping) + and first_value(existing, "id", "prescription_id") is None + and "data" in existing + ): + existing = existing.get("data") + if existing is None or ( + isinstance(existing, (Mapping, Sequence)) + and not isinstance(existing, (str, bytes)) + and not existing + ): + return None + return existing + + def _load_case_record(self, record: Any) -> Any: + diagnosis_id = _as_int(first_value(record, "diagnosis_id", "id", default=0)) + if diagnosis_id <= 0: + raise ValueError("诊单编号不完整,无法建立处方病例快照") + detail = invoke( + self.repository, + "get_diagnosis_detail", + diagnosis_id=diagnosis_id, + id=diagnosis_id, + readonly=False, + ) + actual_id = _as_int( + first_value(detail, "diagnosis.id", "diagnosis_id", "id", default=diagnosis_id) + ) + if actual_id != diagnosis_id: + raise ValueError("服务端诊单与当前行不一致,已停止开方") + return deepcopy(detail) + + def _open_prescription(self) -> None: + if not _canonical_allowed(self.permissions, "tcm.diagnosis/kaifang"): + return + record = self.table.current_data() + if _as_int(first_value(record, "diagnosis_id", "id", default=0)) <= 0: + return + self._begin_prescription_load(record, mode="open") + + def _void_selected_prescription(self) -> None: + if not _canonical_allowed(self.permissions, "tcm.diagnosis/kaifang"): + return + record = self.table.current_data() + if record is None or not can_void_prescription(record): + return + self._begin_prescription_load(record, mode="void") + + def _begin_prescription_load(self, record: Any, *, mode: str) -> None: + record_snapshot = deepcopy(record) + self._prescription_generation += 1 + generation = self._prescription_generation + self._prescription_busy = True + self.prescription_button.setEnabled(False) + self.void_button.setEnabled(False) + self.banner.show_message("正在核对诊单处方上下文…", "info") + run_async( + lambda: self._load_context_prescription(record_snapshot), + on_success=lambda existing: self._prescription_loaded( + existing, record_snapshot, mode, generation + ), + on_error=lambda error: self._prescription_error(error, generation), + on_finished=lambda: self._prescription_finished(generation), + ) + + def _prescription_loaded(self, existing: Any, record: Any, mode: str, generation: int) -> None: + if generation != self._prescription_generation: + return + self.banner.clear() + self._last_prescription = existing + if mode == "void": + self._confirm_void(existing) + return + if existing is not None: + detail = PrescriptionDetailDialog( + existing, + can_open_diagnosis=_canonical_allowed( + self.permissions, "tcm.diagnosis/readonlyDetail" + ), + parent=self, + ) + detail.diagnosis_requested.connect(self._open_diagnosis_id) + detail.exec() + approved = _as_int(first_value(existing, "audit_status", "status"), -1) == 1 + voided = _as_int(first_value(existing, "void_status", "is_void"), 0) == 1 + if not approved or voided: + answer = QMessageBox.question( + self, + "新建处方", + "已展示当前挂号的处方。是否继续新建一张处方?", + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, + QMessageBox.StandardButton.No, + ) + if answer == QMessageBox.StandardButton.Yes: + self._begin_case_record_load(record) + return + self._begin_case_record_load(record) + + def _begin_case_record_load(self, record: Any) -> None: + record_snapshot = deepcopy(record) + self._prescription_generation += 1 + generation = self._prescription_generation + self._prescription_busy = True + self.prescription_button.setEnabled(False) + self.void_button.setEnabled(False) + self.banner.show_message("正在生成不可变病例快照…", "info") + run_async( + lambda: self._load_case_record(record_snapshot), + on_success=lambda case_record: self._case_record_loaded( + case_record, record_snapshot, generation + ), + on_error=lambda error: self._prescription_error(error, generation), + on_finished=lambda: self._prescription_finished(generation), + ) + + def _case_record_loaded(self, case_record: Any, record: Any, generation: int) -> None: + if generation != self._prescription_generation: + return + self.banner.clear() + self._open_prescription_editor(record, deepcopy(case_record)) + + def _prescription_error(self, error: Exception, generation: int) -> None: + if generation == self._prescription_generation: + self.banner.show_message(friendly_error(error), "danger") + + def _prescription_finished(self, generation: int) -> None: + if generation == self._prescription_generation: + self._prescription_busy = False + self._selection_changed() + + def _open_diagnosis_id(self, diagnosis_id: int) -> None: + if not _canonical_allowed(self.permissions, "tcm.diagnosis/readonlyDetail"): + return + if diagnosis_id > 0: + self._diagnosis_dialog.open_for(diagnosis_id, editable=False) + + def _prescription_seed(self, record: Any, case_record: Any) -> dict[str, Any]: + diagnosis = get_value(case_record, "diagnosis", None) or case_record or {} + patient = get_value(case_record, "patient", None) or {} + + def authoritative(*keys: str, default: Any = None) -> Any: + return first_value( + diagnosis, + *keys, + default=first_value( + patient, *keys, default=first_value(record, *keys, default=default) + ), + ) + + gender = authoritative("gender", default=1) + if _as_int(gender, 1) == 2: + gender = 0 + clinical = authoritative("clinical_diagnosis", "symptoms", default="") + if not clinical: + clinical = " ".join( + str(value) + for value in ( + authoritative("diagnosis_type_desc", "diagnosis_type", default=""), + authoritative("syndrome_type_desc", "syndrome_type", default=""), + ) + if value + ) + return { + "diagnosis_id": _as_int(first_value(record, "diagnosis_id", "id")), + "appointment_id": _appointment_id(record), + "case_record": deepcopy(case_record), + "patient_name": authoritative("patient_name", "name", default=""), + "gender": gender, + "age": _as_int(authoritative("age", default=0)), + "visit_no": (f"1K{_appointment_id(record):08d}" if _appointment_id(record) > 0 else ""), + "tongue": authoritative("tongue", "tongue_coating", default=""), + "pulse": authoritative("pulse", default=""), + "clinical_diagnosis": clinical, + "doctor_name": first_value( + self.current_user, "name", "real_name", default=first_value(record, "doctor_name") + ), + } + + def _open_prescription_editor(self, record: Any, case_record: Any) -> None: + seed = self._prescription_seed(record, case_record) + dialog = PrescriptionEditorDialog( + self.repository, + seed, + mode="add", + current_user=self.current_user, + parent=self, + ) + if dialog.exec() != QDialog.DialogCode.Accepted: + return + payload = dialog.payload() + payload["diagnosis_id"] = seed["diagnosis_id"] + payload["appointment_id"] = seed["appointment_id"] + payload["case_record"] = deepcopy(case_record) + frozen_payload = MappingProxyType(payload) + self._run_mutation( + lambda: invoke(self.repository, "create_prescription", prescription=frozen_payload), + "处方已开具并提交审核。", + ) + + def _confirm_void(self, prescription: Any) -> None: + if prescription is None: + self.banner.show_message("当前诊单没有可作废的处方。", "warning") + return + if _as_bool(first_value(prescription, "has_prescription_order", default=False)): + self.banner.show_message("该处方已有业务订单,不能作废。", "warning") + return + if _as_int(first_value(prescription, "void_status", "is_void"), 0) == 1: + self.banner.show_message("该处方已经作废。", "warning") + return + if _as_int(first_value(prescription, "audit_status", "status"), -1) == 1: + self.banner.show_message("审核通过且有效的处方仅供查看,不能在此作废。", "warning") + return + prescription_id = _as_int(first_value(prescription, "id", "prescription_id")) + if prescription_id <= 0: + self.banner.show_message("处方信息不完整,无法作废。", "warning") + return + answer = QMessageBox.warning( + self, + "作废处方", + "确定作废该处方吗?作废后不可恢复。", + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.Cancel, + QMessageBox.StandardButton.Cancel, + ) + if answer != QMessageBox.StandardButton.Yes: + return + self._run_mutation( + lambda: invoke( + self.repository, + "void_prescription", + prescription_id=prescription_id, + id=prescription_id, + ), + "处方已作废。", + ) + + def _run_mutation(self, operation: Any, success_message: str) -> None: + self._mutation_generation += 1 + generation = self._mutation_generation + self._mutation_pending = True + self._selection_changed() + run_async( + operation, + on_success=lambda _result: self._mutation_success(success_message, generation), + on_error=lambda error: self._mutation_error(error, generation), + on_finished=lambda: self._mutation_finished(generation), + ) + + def _mutation_success(self, message: str, generation: int) -> None: + if generation != self._mutation_generation: + return + show_toast(self, message, "success") + self.refresh(silent=True) + + def _mutation_error(self, error: Exception, generation: int) -> None: + if generation == self._mutation_generation: + self.banner.show_message(friendly_error(error), "danger") + + def _mutation_finished(self, generation: int) -> None: + if generation == self._mutation_generation: + self._mutation_pending = False + self._selection_changed() + + def _request_video(self) -> None: + record = self.table.current_data() + if record is None or not is_video_available(record): + self.banner.show_message("仅当前“已预约”的挂号可发起视频。", "warning") + return + payload = _video_payload(record) + if not all( + _as_int(payload.get(key), 0) > 0 + for key in ("appointment_id", "patient_id", "diagnosis_id") + ): + self.banner.show_message("患者、诊单或挂号标识不完整,无法发起视频。", "warning") + return + self.video_requested.emit(payload) + + def showEvent(self, event: Any) -> None: + super().showEvent(event) + self._load_filter_options() + if not self.poll_timer.isActive(): + self.poll_timer.start() + if self.table.rowCount() == 0 and not self._loading: + self.refresh() + + def hideEvent(self, event: Any) -> None: + self.poll_timer.stop() + super().hideEvent(event) + + +__all__ = [ + "ConsultationsPage", + "appointment_rows", + "can_void_prescription", + "is_diagnosis_confirmed", + "is_video_available", + "prescription_action_label", +] diff --git a/app/src/doctor_workstation/ui/pages/patients.py b/app/src/doctor_workstation/ui/pages/patients.py new file mode 100644 index 000000000..625d8815c --- /dev/null +++ b/app/src/doctor_workstation/ui/pages/patients.py @@ -0,0 +1,2610 @@ +"""Server-scoped patient, order, and consultation-progress workspaces.""" + +from __future__ import annotations + +import re +from collections.abc import Mapping, Sequence +from types import MappingProxyType +from typing import Any + +from PySide6.QtCore import QDate, Qt, QTime, QTimer, Signal +from PySide6.QtGui import QAction +from PySide6.QtWidgets import ( + QButtonGroup, + QCheckBox, + QComboBox, + QDateEdit, + QDialog, + QDialogButtonBox, + QDoubleSpinBox, + QFormLayout, + QFrame, + QGridLayout, + QHBoxLayout, + QInputDialog, + QLabel, + QLineEdit, + QMenu, + QMessageBox, + QPlainTextEdit, + QPushButton, + QSplitter, + QStackedWidget, + QTabWidget, + QToolButton, + QVBoxLayout, + QWidget, +) + +from ..dialogs import DiagnosisDialog +from ..widgets import ( + EmptyState, + MessageBanner, + PageHeader, + Pager, + SortableTable, + StatusBadge, + TableColumn, + display_text, + first_value, + friendly_error, + gender_text, + get_value, + invoke, + page_items, + page_total, + run_async, + section_title, + show_toast, +) + +PATIENT_STATUS = { + "unbooked": ("未预约", "neutral"), + "pending_interview": ("待面诊", "warning"), + "completed": ("已完成", "success"), + "missed": ("已过号", "danger"), + "1": ("待面诊", "warning"), + "2": ("已取消", "neutral"), + "3": ("已完成", "success"), + "4": ("已过号", "danger"), +} + +AUDIT_TEXT = {0: "待审核", 1: "已通过", 2: "已驳回"} +FULFILLMENT_TEXT = { + 1: "待双审通过", + 2: "待发货", + 3: "已完成", + 4: "已取消", + 5: "已发货", + 6: "已签收", + 7: "进行中", + 8: "暂不制药", + 9: "拒收", + 10: "退款", + 11: "保留药方", + 12: "制药缓发", +} + + +def _as_int(value: Any, default: int = 0) -> int: + try: + return int(value) + except (TypeError, ValueError): + return default + + +def _as_float(value: Any, default: float = 0.0) -> float: + try: + return float(value) + except (TypeError, ValueError): + return default + + +def _as_bool(value: Any) -> bool: + if isinstance(value, str): + return value.strip().lower() in {"1", "true", "yes", "on"} + return bool(value) + + +def _canonical_allowed(permissions: Any, code: str, *, default: bool = True) -> bool: + """Check only the canonical permission string plus explicit wildcards.""" + + if permissions is None: + return default + for method_name in ("allows", "has", "can", "contains", "has_permission"): + method = getattr(permissions, method_name, None) + if callable(method): + try: + return bool(method(code)) + except (TypeError, ValueError): + continue + raw = permissions + for attr in ("codes", "permissions", "values"): + candidate = getattr(permissions, attr, None) + if candidate is not None and not callable(candidate): + raw = candidate + break + if isinstance(raw, Mapping): + nested = first_value(raw, "codes", "permissions", "values", default=None) + if nested is not None: + raw = nested + if isinstance(raw, Mapping): + available = {str(key) for key, enabled in raw.items() if enabled} + elif isinstance(raw, str): + available = {raw} + else: + try: + available = {str(item) for item in raw} + except TypeError: + return False + if "*" in available or code in available: + return True + return any(grant.endswith("/*") and code.startswith(grant[:-1]) for grant in available) + + +def _invoke_first(repository: Any, names: Sequence[str], **kwargs: Any) -> Any: + for name in names: + if callable(getattr(repository, name, None)): + return invoke(repository, name, **kwargs) + return invoke(repository, names[0], **kwargs) + + +def _page_extend(result: Any) -> Mapping[str, Any]: + extend = get_value(result, "extend", None) + if isinstance(extend, Mapping): + return extend + meta = get_value(result, "meta", None) + return meta if isinstance(meta, Mapping) else {} + + +def _patient_status(row: Any) -> tuple[str, str]: + status = first_value(row, "appointment_status", "status", "status_filter", default="") + key = str(status).lower() + default_text = first_value(row, "appointment_status_text", "status_text", default="暂无预约") + return PATIENT_STATUS.get(key, (display_text(default_text), "neutral")) + + +def _status_cell(_value: Any, row: Any) -> str: + return _patient_status(row)[0] + + +def _audit_cell(value: Any, _row: Any) -> str: + return AUDIT_TEXT.get(_as_int(value, -1), display_text(value)) + + +def _fulfillment_cell(value: Any, _row: Any) -> str: + return FULFILLMENT_TEXT.get(_as_int(value, -1), display_text(value)) + + +def _money(value: Any) -> str: + return f"¥{_as_float(value):,.2f}" + + +def _waiting_cell(value: Any, row: Any) -> str: + status = str(first_value(row, "queue_status", default="") or "") + if status == "consulting": + return "0(进行中)" + if status == "next": + return "0(待接诊)" + ahead = max(0, _as_int(value)) + if ahead == 0: + return "0 位" + minutes = max(0, _as_int(first_value(row, "estimated_wait_minutes"), ahead * 15)) + return f"{ahead} 位 · 约 {minutes} 分钟" + + +def _remote_order_locked(row: Any) -> bool: + if _as_bool( + first_value( + row, + "remote_snapshot_locked", + "is_remote_snapshot_locked", + "remote_locked", + default=False, + ) + ): + return True + if str(first_value(row, "gancao_reciperl_order_no", default="") or "").strip(): + return True + if str(first_value(row, "ej_pharmacy_order_no", default="") or "").strip(): + return True + if _as_int(first_value(row, "gancao_submit_time")) > 0: + return True + if _as_int(first_value(row, "ej_pharmacy_submit_time")) > 0: + return True + claim_status = str(first_value(row, "pharmacy_claim_status", default="") or "").upper() + return claim_status in {"PENDING", "UNKNOWN", "PENDING_RECONCILE", "SUCCESS"} + + +class _AppointmentDialog(QDialog): + """Server-driven appointment form; arbitrary dates and slots are never accepted.""" + + CHANNEL_DETAIL_NAMES = {"自媒体4H", "自媒体3Q", "自媒体3H", "自媒体2H", "自媒体2Q"} + + def __init__( + self, + row: Any, + repository: Any = None, + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.row = row + self.repository = repository + self.diagnosis_id = _as_int(first_value(row, "diagnosis_id", "id")) + self._load_generation = 0 + self._roster_generation = 0 + self._slot_generation = 0 + self._setting = False + self._initial_loaded = False + self._today_blocking = False + self._channel_names: dict[str, str] = {} + self.setWindowTitle("预约问诊") + self.setModal(True) + self.resize(540, 560) + root = QVBoxLayout(self) + root.setContentsMargins(20, 18, 20, 18) + root.setSpacing(12) + patient = QLabel(display_text(first_value(row, "patient_name", "name", default="患者"))) + patient.setProperty("role", "pageTitle") + root.addWidget(patient) + identity = QLabel( + f"诊单 #{display_text(self.diagnosis_id)} · 患者号仅用于视频,不参与本次预约" + ) + identity.setProperty("role", "muted") + root.addWidget(identity) + form = QFormLayout() + form.setVerticalSpacing(10) + self.appointment_type = QComboBox() + self.appointment_type.addItem("视频问诊", "video") + form.addRow("预约类型 *", self.appointment_type) + self.channel_source = QComboBox() + self.channel_source.addItem("正在加载渠道…", "") + self.channel_source.currentIndexChanged.connect(self._channel_changed) + form.addRow("渠道来源 *", self.channel_source) + self.channel_source_detail = QLineEdit() + self.channel_source_detail.setMaxLength(128) + self.channel_source_detail.setPlaceholderText("指定自媒体渠道时必填") + self.channel_source_detail.textChanged.connect(self._update_submit_state) + form.addRow("渠道补充", self.channel_source_detail) + self.doctor_combo = QComboBox() + self.doctor_combo.addItem("正在加载医生…", 0) + self.doctor_combo.currentIndexChanged.connect(self._doctor_changed) + form.addRow("预约医生 *", self.doctor_combo) + self.date_combo = QComboBox() + self.date_combo.addItem("请先选择医生", "") + self.date_combo.currentIndexChanged.connect(self._date_changed) + form.addRow("排班日期 *", self.date_combo) + self.slot_combo = QComboBox() + self.slot_combo.addItem("请先选择排班日期", "") + self.slot_combo.currentIndexChanged.connect(self._update_submit_state) + form.addRow("可用号源 *", self.slot_combo) + self.remark = QPlainTextEdit() + self.remark.setMaximumHeight(82) + self.remark.setPlaceholderText("预约备注(可选)") + form.addRow("备注", self.remark) + root.addLayout(form) + self.banner = MessageBanner() + self.banner.show_message("正在加载医生、渠道与今日挂号状态…", "info") + root.addWidget(self.banner) + buttons = QDialogButtonBox( + QDialogButtonBox.StandardButton.Cancel | QDialogButtonBox.StandardButton.Ok + ) + self.ok_button = buttons.button(QDialogButtonBox.StandardButton.Ok) + self.ok_button.setText("确认预约") + self.ok_button.setProperty("variant", "primary") + self.ok_button.setEnabled(False) + buttons.accepted.connect(self.accept) + buttons.rejected.connect(self.reject) + root.addWidget(buttons) + self._load_initial_options() + + @staticmethod + def _rows(value: Any, key: str = "") -> list[Any]: + rows = page_items(value) + if rows: + return rows + if isinstance(value, Sequence) and not isinstance(value, (str, bytes)): + return list(value) + if isinstance(value, Mapping): + candidate = value.get(key) if key else None + if isinstance(candidate, Sequence) and not isinstance(candidate, (str, bytes)): + return list(candidate) + data = value.get("data") + if isinstance(data, Mapping): + candidate = data.get(key) + if isinstance(candidate, Sequence) and not isinstance(candidate, (str, bytes)): + return list(candidate) + return [] + + def _load_initial_options(self) -> None: + self._load_generation += 1 + generation = self._load_generation + diagnosis_id = self.diagnosis_id + today = QDate.currentDate().toString("yyyy-MM-dd") + + def query() -> dict[str, Any]: + doctors = _invoke_first(self.repository, ("list_diagnosis_doctors",)) + channels = invoke(self.repository, "get_dictionary", dictionary_type="channels") + appointments = _invoke_first( + self.repository, + ("list_appointments",), + patient_id=diagnosis_id, + start_date=today, + end_date=today, + page_no=1, + page_size=50, + ) + return {"doctors": doctors, "channels": channels, "appointments": appointments} + + run_async( + query, + on_success=lambda result: self._apply_initial_options(result, generation), + on_error=lambda error: self._load_error(error, generation), + ) + + def _apply_initial_options(self, result: Any, generation: int) -> None: + if generation != self._load_generation: + return + doctors = self._rows(get_value(result, "doctors", [])) + channels = self._rows(get_value(result, "channels", []), "channels") + appointments = self._rows(get_value(result, "appointments", [])) + self._today_blocking = any( + _as_int(first_value(row, "status", "appointment_status"), -1) in {1, 4} + for row in appointments + ) + self._setting = True + try: + self.doctor_combo.clear() + self.doctor_combo.addItem("请选择医生", 0) + preferred = _as_int( + first_value(self.row, "appointment_doctor_id", "doctor_id", default=0) + ) + selected = 0 + for doctor in doctors: + doctor_id = _as_int(first_value(doctor, "id", "doctor_id")) + if doctor_id <= 0: + continue + name = display_text(first_value(doctor, "name", "doctor_name")) + department = display_text(first_value(doctor, "department_name", "dept_names"), "") + self.doctor_combo.addItem( + f"{name} · {department}" if department else name, doctor_id + ) + if doctor_id == preferred: + selected = self.doctor_combo.count() - 1 + self.doctor_combo.setCurrentIndex(selected) + self.channel_source.clear() + self.channel_source.addItem("请选择渠道来源", "") + self._channel_names.clear() + for channel in sorted( + (row for row in channels if _as_int(first_value(row, "status", default=1), 1) != 0), + key=lambda row: ( + -_as_int(first_value(row, "sort", default=0)), + -_as_int(first_value(row, "id", default=0)), + ), + ): + value = str(first_value(channel, "value", "id", default="") or "") + name = display_text(first_value(channel, "name", "label"), "") + if not value or not name: + continue + self.channel_source.addItem(name, value) + self._channel_names[value] = name + finally: + self._setting = False + self._initial_loaded = bool(doctors and channels) + if not doctors: + self.banner.show_message("没有可预约医生,已停止提交。", "warning") + elif not channels: + self.banner.show_message("没有可用渠道字典,已停止提交。", "warning") + else: + self.banner.show_message("请选择医生以加载未来 7 天排班。", "info") + if self.doctor_combo.currentData(): + self._doctor_changed() + self._update_submit_state() + + def _load_error(self, error: Exception, generation: int) -> None: + if generation == self._load_generation: + self._initial_loaded = False + self.banner.show_message(f"预约基础数据加载失败:{friendly_error(error)}", "danger") + self._update_submit_state() + + def _doctor_changed(self) -> None: + if self._setting: + return + doctor_id = _as_int(self.doctor_combo.currentData()) + self._setting = True + try: + self.date_combo.clear() + self.date_combo.addItem("正在加载排班…" if doctor_id else "请先选择医生", "") + self.slot_combo.clear() + self.slot_combo.addItem("请先选择排班日期", "") + finally: + self._setting = False + if doctor_id <= 0: + self._update_submit_state() + return + self._roster_generation += 1 + generation = self._roster_generation + start = QDate.currentDate().toString("yyyy-MM-dd") + end = QDate.currentDate().addDays(6).toString("yyyy-MM-dd") + query = MappingProxyType( + { + "doctor_id": doctor_id, + "start_date": start, + "end_date": end, + "status": 1, + "page_no": 1, + "page_size": 100, + } + ) + self.banner.show_message("正在加载医生排班…", "info") + run_async( + lambda: _invoke_first( + self.repository, + ("list_appointment_rosters", "appointment_rosters", "roster_lists"), + **query, + ), + on_success=lambda result: self._apply_rosters(result, doctor_id, generation), + on_error=lambda error: self._roster_error(error, doctor_id, generation), + ) + + def _apply_rosters(self, result: Any, doctor_id: int, generation: int) -> None: + if generation != self._roster_generation or doctor_id != _as_int( + self.doctor_combo.currentData() + ): + return + today = QDate.currentDate() + end = today.addDays(6) + dates: set[str] = set() + for row in self._rows(result): + raw = str(first_value(row, "date", "appointment_date", "roster_date", default="")) + parsed = QDate.fromString(raw[:10], "yyyy-MM-dd") + if parsed.isValid() and today <= parsed <= end: + dates.add(parsed.toString("yyyy-MM-dd")) + ordered = sorted(dates) + self._setting = True + try: + self.date_combo.clear() + self.date_combo.addItem("请选择排班日期", "") + for value in ordered: + self.date_combo.addItem(value, value) + if ordered: + preferred = next( + ( + value + for value in ordered + if not (self._today_blocking and value == today.toString("yyyy-MM-dd")) + ), + ordered[0], + ) + self.date_combo.setCurrentIndex(self.date_combo.findData(preferred)) + finally: + self._setting = False + if not ordered: + self.banner.show_message("该医生未来 7 天暂无可预约排班。", "warning") + self._update_submit_state() + return + self._date_changed() + + def _roster_error(self, error: Exception, doctor_id: int, generation: int) -> None: + if generation == self._roster_generation and doctor_id == _as_int( + self.doctor_combo.currentData() + ): + self.banner.show_message(f"排班加载失败:{friendly_error(error)}", "danger") + self._update_submit_state() + + def _date_changed(self) -> None: + if self._setting: + return + doctor_id = _as_int(self.doctor_combo.currentData()) + appointment_date = str(self.date_combo.currentData() or "") + self._setting = True + try: + self.slot_combo.clear() + self.slot_combo.addItem( + "正在加载可用号源…" if doctor_id and appointment_date else "请先选择排班日期", + "", + ) + finally: + self._setting = False + if doctor_id <= 0 or not appointment_date: + self._update_submit_state() + return + self._slot_generation += 1 + generation = self._slot_generation + query = MappingProxyType( + { + "doctor_id": doctor_id, + "appointment_date": appointment_date, + "period": "all", + } + ) + self.banner.show_message("正在加载可用号源…", "info") + run_async( + lambda: _invoke_first( + self.repository, + ("get_available_appointment_slots", "available_appointment_slots"), + **query, + ), + on_success=lambda result: self._apply_slots( + result, doctor_id, appointment_date, generation + ), + on_error=lambda error: self._slot_error(error, doctor_id, appointment_date, generation), + ) + + def _apply_slots( + self, result: Any, doctor_id: int, appointment_date: str, generation: int + ) -> None: + if ( + generation != self._slot_generation + or doctor_id != _as_int(self.doctor_combo.currentData()) + or appointment_date != str(self.date_combo.currentData() or "") + ): + return + rows = self._rows(result, "slots") + today = QDate.currentDate().toString("yyyy-MM-dd") + now = QTime.currentTime() + slots: list[tuple[str, str]] = [] + for row in rows: + if isinstance(row, str): + raw_time = row + available = True + quota = 1 + else: + raw_time = str(first_value(row, "time", "appointment_time", default="")) + available = _as_bool(first_value(row, "available", default=False)) + quota = _as_int(first_value(row, "quota", default=1), 1) + if not raw_time or not available or quota <= 0: + continue + parsed = QTime.fromString(raw_time[:5], "HH:mm") + if appointment_date == today and parsed.isValid() and parsed <= now: + continue + slots.append((raw_time, f"{raw_time[:5]} · 剩余 {quota}")) + self._setting = True + try: + self.slot_combo.clear() + self.slot_combo.addItem("请选择可用号源", "") + for value, label in slots: + self.slot_combo.addItem(label, value) + finally: + self._setting = False + if slots: + self.banner.clear() + else: + self.banner.show_message("该排班暂无可用号源。", "warning") + self._update_submit_state() + + def _slot_error( + self, error: Exception, doctor_id: int, appointment_date: str, generation: int + ) -> None: + if ( + generation == self._slot_generation + and doctor_id == _as_int(self.doctor_combo.currentData()) + and appointment_date == str(self.date_combo.currentData() or "") + ): + self.banner.show_message(f"号源加载失败:{friendly_error(error)}", "danger") + self._update_submit_state() + + def _channel_changed(self) -> None: + if self._setting: + return + requires_detail = self._channel_requires_detail() + self.channel_source_detail.setVisible(requires_detail) + if not requires_detail: + self.channel_source_detail.clear() + self._update_submit_state() + + def _channel_requires_detail(self) -> bool: + value = str(self.channel_source.currentData() or "") + return self._channel_names.get(value, "") in self.CHANNEL_DETAIL_NAMES + + def _update_submit_state(self) -> None: + if not hasattr(self, "ok_button"): + return + date_value = str(self.date_combo.currentData() or "") + today_blocked = self._today_blocking and date_value == QDate.currentDate().toString( + "yyyy-MM-dd" + ) + complete = bool( + self._initial_loaded + and _as_int(self.doctor_combo.currentData()) > 0 + and date_value + and self.slot_combo.currentData() + and self.channel_source.currentData() + and not today_blocked + and (not self._channel_requires_detail() or self.channel_source_detail.text().strip()) + ) + self.ok_button.setEnabled(complete) + + def payload(self) -> dict[str, Any]: + # firstvisit.myPatient/createAppointment deliberately names the + # diagnosis identifier ``patient_id``. source_patient_id is only for video. + return { + "diagnosis_id": self.diagnosis_id, + "patient_id": self.diagnosis_id, + "doctor_id": _as_int(self.doctor_combo.currentData()), + "appointment_date": str(self.date_combo.currentData() or ""), + "appointment_time": str(self.slot_combo.currentData() or ""), + "period": "all", + "appointment_type": str(self.appointment_type.currentData() or "video"), + "remark": self.remark.toPlainText().strip(), + "channel_source": str(self.channel_source.currentData() or ""), + "channel_source_detail": self.channel_source_detail.text().strip(), + } + + def accept(self) -> None: + self._update_submit_state() + if not self.ok_button.isEnabled(): + if self._today_blocking and str( + self.date_combo.currentData() or "" + ) == QDate.currentDate().toString("yyyy-MM-dd"): + self.banner.show_message("该患者今天已有预约或过号,请选择其他日期。", "warning") + else: + self.banner.show_message("请完整选择医生、排班、可用号源和渠道。", "warning") + return + super().accept() + + +class _PaymentDialog(QDialog): + def __init__(self, row: Any, parent: QWidget | None = None) -> None: + super().__init__(parent) + self.setWindowTitle("补齐支付单") + self.resize(500, 430) + root = QVBoxLayout(self) + root.setContentsMargins(20, 18, 20, 18) + remaining = max( + 0.0, + _as_float(first_value(row, "amount")) + - _as_float(first_value(row, "linked_pay_paid_total")), + ) + root.addWidget(QLabel(f"待补齐参考金额:{_money(remaining)}")) + form = QFormLayout() + self.order_type = QComboBox() + self.order_type.addItem("药品", 3) + self.order_type.addItem("尾款", 5) + self.order_type.addItem("其他", 6) + form.addRow("支付单类型 *", self.order_type) + self.pay_create_type = QComboBox() + self.pay_create_type.addItem("付呗支付", "fubei") + self.pay_create_type.addItem("快递代收", "express_cod") + form.addRow("创建方式 *", self.pay_create_type) + self.pay_amount = QDoubleSpinBox() + self.pay_amount.setRange(0.01, 10_000_000) + self.pay_amount.setDecimals(2) + self.pay_amount.setValue(max(0.01, remaining)) + form.addRow("补齐金额 *", self.pay_amount) + self.pay_remark = QPlainTextEdit() + self.pay_remark.setMaximumHeight(90) + self.pay_remark.setPlaceholderText("支付备注(可选)") + form.addRow("支付备注", self.pay_remark) + self.completion_request = QCheckBox("同时提交完单申请") + form.addRow("完单申请", self.completion_request) + root.addLayout(form) + buttons = QDialogButtonBox( + QDialogButtonBox.StandardButton.Cancel | QDialogButtonBox.StandardButton.Ok + ) + buttons.button(QDialogButtonBox.StandardButton.Ok).setText("确认新增") + buttons.accepted.connect(self.accept) + buttons.rejected.connect(self.reject) + root.addWidget(buttons) + + def payload(self) -> dict[str, Any]: + return { + "order_type": _as_int(self.order_type.currentData()), + "pay_amount": self.pay_amount.value(), + "pay_remark": self.pay_remark.toPlainText().strip(), + "completion_request": 1 if self.completion_request.isChecked() else 0, + "pay_create_type": str(self.pay_create_type.currentData()), + } + + +class _RefundDialog(QDialog): + def __init__(self, row: Any, parent: QWidget | None = None) -> None: + super().__init__(parent) + self.setWindowTitle("订单退款") + self.resize(500, 340) + root = QVBoxLayout(self) + root.setContentsMargins(20, 18, 20, 18) + form = QFormLayout() + self.reason = QPlainTextEdit() + self.reason.setMaximumHeight(100) + self.reason.setPlaceholderText("退款原因(必填)") + form.addRow("退款原因 *", self.reason) + self.specify_amount = QCheckBox("指定退款金额") + self.specify_amount.toggled.connect(self._toggle_amount) + form.addRow("金额方式", self.specify_amount) + self.refund_amount = QDoubleSpinBox() + self.refund_amount.setRange(0, 10_000_000) + self.refund_amount.setDecimals(2) + self.refund_amount.setValue(max(0, _as_float(first_value(row, "amount")))) + self.refund_amount.setEnabled(False) + form.addRow("退款金额", self.refund_amount) + root.addLayout(form) + self.banner = MessageBanner() + root.addWidget(self.banner) + buttons = QDialogButtonBox( + QDialogButtonBox.StandardButton.Cancel | QDialogButtonBox.StandardButton.Ok + ) + buttons.button(QDialogButtonBox.StandardButton.Ok).setText("确认退款") + buttons.accepted.connect(self.accept) + buttons.rejected.connect(self.reject) + root.addWidget(buttons) + + def _toggle_amount(self, checked: bool) -> None: + self.refund_amount.setEnabled(checked) + + def payload(self) -> dict[str, Any]: + return { + "reason": self.reason.toPlainText().strip(), + "refund_amount": self.refund_amount.value() + if self.specify_amount.isChecked() + else None, + } + + def accept(self) -> None: + if not self.reason.toPlainText().strip(): + self.banner.show_message("请填写退款原因。", "warning") + return + super().accept() + + +class _AssignDialog(QDialog): + def __init__(self, row: Any, assistants: Sequence[Any], parent: QWidget | None = None) -> None: + super().__init__(parent) + self.setWindowTitle("指派医助") + self.setModal(True) + self.resize(430, 230) + root = QVBoxLayout(self) + root.setContentsMargins(20, 18, 20, 18) + root.setSpacing(12) + title = QLabel(display_text(first_value(row, "patient_name", default="患者"))) + title.setProperty("role", "sectionTitle") + root.addWidget(title) + form = QFormLayout() + self.assistant_combo = QComboBox() + current_id = _as_int(first_value(row, "assistant_id")) + selected_index = 0 + for index, assistant in enumerate(assistants): + assistant_id = _as_int(first_value(assistant, "id", "assistant_id")) + name = display_text( + first_value(assistant, "name", "account", default=f"医助{assistant_id}") + ) + departments = display_text(first_value(assistant, "dept_names", "department_name"), "") + self.assistant_combo.addItem( + f"{name} · {departments}" if departments else name, assistant_id + ) + if assistant_id == current_id: + selected_index = index + self.assistant_combo.setCurrentIndex(selected_index) + form.addRow("选择医助", self.assistant_combo) + self.inherit_check = QCheckBox("继承既有患者归属关系") + form.addRow("", self.inherit_check) + root.addLayout(form) + buttons = QDialogButtonBox( + QDialogButtonBox.StandardButton.Cancel | QDialogButtonBox.StandardButton.Ok + ) + buttons.button(QDialogButtonBox.StandardButton.Ok).setText("确认指派") + buttons.accepted.connect(self.accept) + buttons.rejected.connect(self.reject) + root.addWidget(buttons) + + @property + def assistant_id(self) -> int: + return _as_int(self.assistant_combo.currentData()) + + +class _OrderDetailDialog(QDialog): + def __init__(self, detail: Any, parent: QWidget | None = None) -> None: + super().__init__(parent) + self.setWindowTitle("业务订单详情") + self.setModal(True) + self.resize(620, 520) + root = QVBoxLayout(self) + root.setContentsMargins(20, 18, 20, 18) + root.setSpacing(12) + title = QLabel(f"订单 {display_text(first_value(detail, 'order_no', 'id'))}") + title.setProperty("role", "pageTitle") + root.addWidget(title) + card = QFrame() + card.setObjectName("SubtleCard") + form = QFormLayout(card) + form.setContentsMargins(14, 12, 14, 12) + for caption, keys in ( + ("患者", ("patient_name", "recipient_name")), + ("处方 / 诊单", ("prescription_id", "diagnosis_id")), + ("金额", ("amount", "effective_amount")), + ("处方审核", ("prescription_audit_text", "prescription_audit_status")), + ("支付审核", ("payment_slip_audit_text", "payment_slip_audit_status")), + ("履约状态", ("fulfillment_text", "fulfillment_status")), + ("开方医生", ("doctor_name",)), + ("归属医助", ("assistant_name",)), + ("创建人", ("creator_name",)), + ("创建时间", ("create_time_text", "create_time")), + ("收件信息", ("recipient_address", "address")), + ("物流", ("tracking_number", "express_no")), + ("备注", ("remark",)), + ): + value = first_value(detail, *keys) + if caption == "金额" and value not in (None, ""): + value = _money(value) + label = QLabel(display_text(value)) + label.setWordWrap(True) + label.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse) + form.addRow(caption, label) + root.addWidget(card, 1) + buttons = QDialogButtonBox(QDialogButtonBox.StandardButton.Close) + buttons.rejected.connect(self.reject) + root.addWidget(buttons) + + +class _OrderEditDialog(QDialog): + """Edit the backend-required order DTO without discarding hidden source fields.""" + + def __init__(self, detail: Any, parent: QWidget | None = None) -> None: + super().__init__(parent) + self.detail = detail + self.setWindowTitle("编辑订单") + self.setModal(True) + self.resize(580, 560) + root = QVBoxLayout(self) + root.setContentsMargins(20, 18, 20, 18) + root.setSpacing(12) + title = QLabel(f"订单 {display_text(first_value(detail, 'order_no', 'id'))}") + title.setProperty("role", "pageTitle") + root.addWidget(title) + self.error_label = QLabel() + self.error_label.setProperty("role", "danger") + self.error_label.setWordWrap(True) + self.error_label.hide() + root.addWidget(self.error_label) + + form = QFormLayout() + form.setHorizontalSpacing(14) + form.setVerticalSpacing(9) + self.recipient_name = QLineEdit(display_text(first_value(detail, "recipient_name"), "")) + self.recipient_phone = QLineEdit(display_text(first_value(detail, "recipient_phone"), "")) + self.shipping_address = QLineEdit( + display_text(first_value(detail, "shipping_address", "recipient_address"), "") + ) + form.addRow("收货人 *", self.recipient_name) + form.addRow("收货手机 *", self.recipient_phone) + form.addRow("收货地址 *", self.shipping_address) + self.fee_type = QComboBox() + for value, label in ( + (1, "挂号"), + (2, "问诊"), + (3, "药品"), + (4, "首付"), + (5, "尾款"), + (6, "其他"), + (7, "全部"), + (8, "代收"), + ): + self.fee_type.addItem(label, value) + current_fee = _as_int(first_value(detail, "fee_type"), 3) + fee_index = self.fee_type.findData(current_fee) + self.fee_type.setCurrentIndex(max(0, fee_index)) + form.addRow("费用类别", self.fee_type) + self.amount = QDoubleSpinBox() + self.amount.setRange(0, 10_000_000) + self.amount.setDecimals(2) + self.amount.setValue(_as_float(first_value(detail, "amount"))) + form.addRow("订单金额", self.amount) + self.express_company = QComboBox() + self.express_company.setEditable(True) + for value, label in (("auto", "自动识别"), ("sf", "顺丰"), ("jd", "京东"), ("jt", "极兔")): + self.express_company.addItem(label, value) + company = display_text(first_value(detail, "express_company"), "auto") + company_index = self.express_company.findData(company) + if company_index >= 0: + self.express_company.setCurrentIndex(company_index) + else: + self.express_company.setEditText(company) + self.tracking_number = QLineEdit( + display_text(first_value(detail, "tracking_number", "express_no"), "") + ) + form.addRow("承运商", self.express_company) + form.addRow("快递单号", self.tracking_number) + self.remark_assistant = QPlainTextEdit() + self.remark_assistant.setMaximumHeight(70) + self.remark_assistant.setPlainText( + display_text(first_value(detail, "remark_assistant", "remark"), "") + ) + self.remark_extra = QPlainTextEdit() + self.remark_extra.setMaximumHeight(70) + self.remark_extra.setPlainText(display_text(first_value(detail, "remark_extra"), "")) + form.addRow("医助备注", self.remark_assistant) + form.addRow("药房备注", self.remark_extra) + root.addLayout(form) + buttons = QDialogButtonBox( + QDialogButtonBox.StandardButton.Cancel | QDialogButtonBox.StandardButton.Ok + ) + buttons.button(QDialogButtonBox.StandardButton.Ok).setText("保存订单") + buttons.accepted.connect(self.accept) + buttons.rejected.connect(self.reject) + root.addWidget(buttons) + + def accept(self) -> None: + if not all( + ( + self.recipient_name.text().strip(), + self.recipient_phone.text().strip(), + self.shipping_address.text().strip(), + ) + ): + self.error_label.setText("请完整填写收货人、收货手机和收货地址。") + self.error_label.show() + return + super().accept() + + def changes(self) -> dict[str, Any]: + pay_order_ids = first_value(self.detail, "pay_order_ids", default=[]) + if not isinstance(pay_order_ids, (list, tuple)): + pay_order_ids = [] + if not pay_order_ids: + pay_orders = first_value(self.detail, "pay_orders", default=[]) + if isinstance(pay_orders, (list, tuple)): + pay_order_ids = [ + _as_int(first_value(row, "id", "pay_order_id")) + for row in pay_orders + if _as_int(first_value(row, "id", "pay_order_id")) > 0 + ] + company_index = self.express_company.currentIndex() + company = self.express_company.currentData() + if company_index < 0 or self.express_company.currentText() != self.express_company.itemText( + company_index + ): + company = self.express_company.currentText().strip() + return { + "recipient_name": self.recipient_name.text().strip(), + "recipient_phone": self.recipient_phone.text().strip(), + "shipping_province": first_value(self.detail, "shipping_province", default=""), + "shipping_city": first_value(self.detail, "shipping_city", default=""), + "shipping_district": first_value(self.detail, "shipping_district", default=""), + "shipping_address": self.shipping_address.text().strip(), + "is_follow_up": _as_int(first_value(self.detail, "is_follow_up")), + "medication_days": first_value(self.detail, "medication_days"), + "dose_unit": first_value(self.detail, "dose_unit", default="剂"), + "dose_count": _as_int(first_value(self.detail, "dose_count"), 1), + "prev_staff": first_value(self.detail, "prev_staff", default=""), + "service_channel": first_value(self.detail, "service_channel", default=""), + "service_package": first_value(self.detail, "service_package", default=""), + "tracking_number": self.tracking_number.text().strip(), + "express_company": company or "auto", + "fee_type": _as_int(self.fee_type.currentData(), 3), + "amount": self.amount.value(), + "remark_extra": self.remark_extra.toPlainText().strip(), + "remark_assistant": self.remark_assistant.toPlainText().strip(), + "pay_order_ids": list(pay_order_ids), + } + + +class PatientListWorkspace(QWidget): + diagnosis_requested = Signal(object, bool) + appointment_requested = Signal(object) + assign_requested = Signal(object) + fill_id_requested = Signal(object) + cancel_requested = Signal(object) + scope_changed = Signal(str) + + def __init__(self, repository: Any, permissions: Any, parent: QWidget | None = None) -> None: + super().__init__(parent) + self.repository = repository + self.permissions = permissions + self._page = 1 + self._page_size = 15 + self._generation = 0 + self._date_mode = "all" + self._scope = "按权限加载" + self._setting_dates = False + + root = QVBoxLayout(self) + root.setContentsMargins(0, 10, 0, 0) + root.setSpacing(12) + root.addWidget(self._build_filters()) + root.addLayout(self._build_summary()) + self.banner = MessageBanner() + root.addWidget(self.banner) + root.addWidget(self._build_table(), 1) + + @property + def scope(self) -> str: + return self._scope + + def _build_filters(self) -> QWidget: + card = QFrame() + card.setObjectName("FilterBar") + grid = QGridLayout(card) + grid.setContentsMargins(14, 12, 14, 12) + grid.setHorizontalSpacing(8) + grid.setVerticalSpacing(8) + self.keyword_edit = QLineEdit() + self.keyword_edit.setPlaceholderText("患者姓名 / 手机号 / 助理 / 医生") + self.keyword_edit.setClearButtonEnabled(True) + self.keyword_edit.returnPressed.connect(self.search) + grid.addWidget(self.keyword_edit, 0, 0, 1, 3) + self.status_combo = QComboBox() + self.status_combo.addItem("全部状态", "") + self.status_combo.addItem("未预约", "unbooked") + self.status_combo.addItem("待面诊", "pending_interview") + self.status_combo.addItem("已完成", "completed") + self.status_combo.addItem("已过号", "missed") + grid.addWidget(self.status_combo, 0, 3) + search = QPushButton("查询") + search.setProperty("variant", "secondary") + search.clicked.connect(self.search) + grid.addWidget(search, 0, 4) + reset = QPushButton("重置") + reset.setProperty("variant", "ghost") + reset.clicked.connect(self.reset_filters) + grid.addWidget(reset, 0, 5) + + quick_host = QWidget() + quick = QHBoxLayout(quick_host) + quick.setContentsMargins(0, 0, 0, 0) + quick.setSpacing(4) + self.quick_group = QButtonGroup(self) + self.quick_group.setExclusive(True) + self.quick_buttons: dict[str, QPushButton] = {} + for mode, label in ( + ("all", "全部"), + ("today", "今日"), + ("tomorrow", "明日"), + ("day_after", "后天"), + ("last7", "近7天"), + ("last30", "近30天"), + ): + button = QPushButton(label) + button.setCheckable(True) + button.setProperty("variant", "ghost") + button.clicked.connect(lambda _checked=False, value=mode: self.set_date_mode(value)) + self.quick_group.addButton(button) + self.quick_buttons[mode] = button + quick.addWidget(button) + self.quick_buttons["all"].setChecked(True) + grid.addWidget(quick_host, 1, 0, 1, 3) + + self.start_date = QDateEdit(QDate.currentDate()) + self.start_date.setCalendarPopup(True) + self.start_date.setDisplayFormat("yyyy-MM-dd") + self.start_date.setEnabled(False) + self.start_date.editingFinished.connect(self._custom_date_changed) + grid.addWidget(self.start_date, 1, 3) + self.end_date = QDateEdit(QDate.currentDate()) + self.end_date.setCalendarPopup(True) + self.end_date.setDisplayFormat("yyyy-MM-dd") + self.end_date.setEnabled(False) + self.end_date.editingFinished.connect(self._custom_date_changed) + grid.addWidget(self.end_date, 1, 4) + custom = QPushButton("自定义") + custom.setProperty("variant", "ghost") + custom.clicked.connect(lambda: self.set_date_mode("custom")) + grid.addWidget(custom, 1, 5) + grid.setColumnStretch(0, 1) + return card + + def _build_summary(self) -> QHBoxLayout: + layout = QHBoxLayout() + layout.setSpacing(8) + self.summary_buttons: dict[str, QPushButton] = {} + for key, label, mode in ( + ("today", "今日预约", "today"), + ("tomorrow", "明日预约", "tomorrow"), + ("day_after", "后天预约", "day_after"), + ): + button = QPushButton(f"{label}\n0 人") + button.setProperty("variant", "secondary") + button.setMinimumHeight(58) + button.clicked.connect(lambda _checked=False, value=mode: self.set_date_mode(value)) + self.summary_buttons[key] = button + layout.addWidget(button, 1) + return layout + + def _build_table(self) -> QWidget: + card = QFrame() + card.setObjectName("Card") + layout = QVBoxLayout(card) + layout.setContentsMargins(14, 12, 14, 12) + layout.setSpacing(8) + heading = QHBoxLayout() + title = QLabel("患者列表") + title.setProperty("role", "sectionTitle") + heading.addWidget(title) + heading.addStretch(1) + self.scope_label = QLabel(self._scope) + self.scope_label.setProperty("role", "muted") + heading.addWidget(self.scope_label) + layout.addLayout(heading) + self.content_stack = QStackedWidget() + host = QWidget() + host_layout = QVBoxLayout(host) + host_layout.setContentsMargins(0, 0, 0, 0) + host_layout.setSpacing(8) + self.table = SortableTable( + [ + TableColumn( + "patient_name", + "患者", + 160, + lambda _value, row: ( + f"{display_text(first_value(row, 'patient_name', 'name'))} · " + f"{gender_text(first_value(row, 'gender_desc', 'gender'))} · " + f"{display_text(first_value(row, 'age'))}岁" + ), + ), + TableColumn("assistant_name", "归属助理", 105), + TableColumn( + "appointment_doctor_name", + "预约医生", + 125, + lambda _value, row: ( + f"{display_text(first_value(row, 'appointment_doctor_name'), '未预约')} / " + f"{_patient_status(row)[0]}" + ), + ), + TableColumn("appointment_time_text", "预约时间", 145), + TableColumn( + "revisit_count", + "复诊", + 65, + lambda value, _row: f"{display_text(value, '0')} 次", + Qt.AlignmentFlag.AlignCenter, + ), + TableColumn("confirmation_text", "确认信息", 95), + TableColumn("diagnosis_date_text", "诊单日期", 105), + TableColumn("phone_masked", "手机", 118), + ] + ) + self.table.itemSelectionChanged.connect(self._update_actions) + self.table.itemDoubleClicked.connect(lambda _item: self._open_selected_diagnosis()) + host_layout.addWidget(self.table, 1) + host_layout.addLayout(self._build_actions()) + self.pager = Pager(self._page_size) + self.pager.page_changed.connect(self._change_page) + host_layout.addWidget(self.pager) + self.content_stack.addWidget(host) + self.content_stack.addWidget(EmptyState("当前范围内暂无患者", "可调整状态、日期或关键词。")) + layout.addWidget(self.content_stack, 1) + return card + + def _build_actions(self) -> QHBoxLayout: + layout = QHBoxLayout() + layout.setSpacing(6) + self.diagnosis_button = QPushButton("诊单") + self.diagnosis_button.setProperty("variant", "primary") + self.diagnosis_button.clicked.connect(self._open_selected_diagnosis) + layout.addWidget(self.diagnosis_button) + self.appointment_button = QPushButton("预约") + self.appointment_button.clicked.connect( + lambda: self._emit_selected(self.appointment_requested) + ) + layout.addWidget(self.appointment_button) + self.assign_button = QPushButton("指派医助") + self.assign_button.clicked.connect(lambda: self._emit_selected(self.assign_requested)) + layout.addWidget(self.assign_button) + self.fill_id_button = QPushButton("补全身份证") + self.fill_id_button.clicked.connect(lambda: self._emit_selected(self.fill_id_requested)) + layout.addWidget(self.fill_id_button) + self.cancel_button = QPushButton("取消挂号") + self.cancel_button.setProperty("variant", "danger") + self.cancel_button.clicked.connect(lambda: self._emit_selected(self.cancel_requested)) + layout.addWidget(self.cancel_button) + layout.addStretch(1) + self._update_actions() + return layout + + def _emit_selected(self, signal: Any) -> None: + row = self.table.current_data() + if row is not None: + signal.emit(row) + + def _open_selected_diagnosis(self) -> None: + row = self.table.current_data() + if row is None: + return + editable = _canonical_allowed(self.permissions, "tcm.diagnosis/edit") + readable = _canonical_allowed(self.permissions, "tcm.diagnosis/readonlyDetail") + if editable or readable: + self.diagnosis_requested.emit(row, editable) + + def _update_actions(self) -> None: + row = self.table.current_data() + selected = row is not None + editable = _canonical_allowed(self.permissions, "tcm.diagnosis/edit") + readable = _canonical_allowed(self.permissions, "tcm.diagnosis/readonlyDetail") + can_book = _canonical_allowed(self.permissions, "tcm.diagnosis/guahao") + can_assign = _canonical_allowed(self.permissions, "tcm.diagnosis/assign") + self.diagnosis_button.setVisible(editable or readable) + self.diagnosis_button.setText("诊单" if editable else "查看") + self.diagnosis_button.setEnabled(selected) + self.appointment_button.setVisible(can_book) + self.appointment_button.setEnabled(selected) + self.assign_button.setVisible(can_assign) + self.assign_button.setEnabled(selected) + self.assign_button.setText( + "重新指派" if selected and _as_int(first_value(row, "assistant_id")) > 0 else "指派医助" + ) + self.fill_id_button.setVisible( + editable and selected and not _as_bool(first_value(row, "has_id_card", default=False)) + ) + status = _as_int(first_value(row, "appointment_status"), -1) + appointment_id = _as_int(first_value(row, "appointment_id")) + self.cancel_button.setVisible( + can_book and selected and appointment_id > 0 and status in {1, 4} + ) + self.cancel_button.setEnabled(selected) + + def set_date_mode(self, mode: str, *, refresh: bool = True) -> None: + self._date_mode = mode + today = QDate.currentDate() + self._setting_dates = True + try: + if mode == "all": + self.start_date.setEnabled(False) + self.end_date.setEnabled(False) + else: + self.start_date.setEnabled(True) + self.end_date.setEnabled(True) + if mode == "today": + start = end = today + elif mode == "tomorrow": + start = end = today.addDays(1) + elif mode == "day_after": + start = end = today.addDays(2) + elif mode == "last7": + start, end = today.addDays(-6), today + elif mode == "last30": + start, end = today.addDays(-29), today + else: + start, end = self.start_date.date(), self.end_date.date() + self.start_date.setDate(start) + self.end_date.setDate(end) + if mode in self.quick_buttons: + self.quick_buttons[mode].setChecked(True) + finally: + self._setting_dates = False + if refresh: + self.search() + + def _custom_date_changed(self) -> None: + if self._setting_dates: + return + self._date_mode = "custom" + for button in self.quick_buttons.values(): + button.setChecked(False) + self.search() + + def reset_filters(self) -> None: + self.keyword_edit.clear() + self.status_combo.setCurrentIndex(0) + self.set_date_mode("all", refresh=False) + self.search() + + def search(self) -> None: + if self._date_mode != "all" and self.start_date.date() > self.end_date.date(): + self.banner.show_message("开始日期不能晚于结束日期。", "warning") + return + self._page = 1 + self.refresh() + + def _change_page(self, page: int) -> None: + self._page = page + self.refresh() + + def refresh(self, *, silent: bool = False) -> None: + self._generation += 1 + generation = self._generation + if not silent: + self.banner.show_message("正在加载患者列表…", "info") + start_date = "" + end_date = "" + if self._date_mode != "all": + start_date = self.start_date.date().toString("yyyy-MM-dd") + end_date = self.end_date.date().toString("yyyy-MM-dd") + query = MappingProxyType( + { + "keyword": self.keyword_edit.text().strip(), + "status": self.status_combo.currentData(), + "start_date": start_date, + "end_date": end_date, + "page": self._page, + "page_size": self._page_size, + } + ) + run_async( + lambda: invoke(self.repository, "patients", **query), + on_success=lambda result: self._apply_result(result, generation), + on_error=lambda error: self._load_error(error, generation), + on_finished=lambda: None, + ) + + def _apply_result(self, result: Any, generation: int) -> None: + if generation != self._generation: + return + rows = page_items(result) + self.table.set_rows(rows) + self.pager.update_state(self._page, page_total(result, len(rows))) + self.content_stack.setCurrentIndex(0 if rows else 1) + extend = _page_extend(result) + scope = get_value(extend, "scope.label", None) + if scope: + self._scope = str(scope) + self.scope_label.setText(self._scope) + self.scope_changed.emit(self._scope) + summary = get_value(extend, "summary", {}) or {} + dates = get_value(extend, "dates", {}) or {} + for key, label in ( + ("today", "今日预约"), + ("tomorrow", "明日预约"), + ("day_after", "后天预约"), + ): + count = _as_int(get_value(summary, key, 0)) + date_text = display_text(get_value(dates, key, ""), "") + suffix = f" · {date_text}" if date_text else "" + self.summary_buttons[key].setText(f"{label}{suffix}\n{count} 人") + self.banner.clear() + if rows and self.table.currentRow() < 0: + self.table.selectRow(0) + self._update_actions() + + def _load_error(self, error: Exception, generation: int) -> None: + if generation == self._generation: + self.banner.show_message(friendly_error(error), "danger") + + +class PatientOrdersWorkspace(QWidget): + diagnosis_requested = Signal(object) + detail_requested = Signal(object) + action_requested = Signal(str, object) + scope_changed = Signal(str) + + def __init__(self, repository: Any, permissions: Any, parent: QWidget | None = None) -> None: + super().__init__(parent) + self.repository = repository + self.permissions = permissions + self._page = 1 + self._page_size = 15 + self._generation = 0 + self._scope = "按权限加载" + + root = QVBoxLayout(self) + root.setContentsMargins(0, 10, 0, 0) + root.setSpacing(12) + root.addWidget(self._build_filters()) + root.addLayout(self._build_metrics()) + self.banner = MessageBanner() + root.addWidget(self.banner) + root.addWidget(self._build_table(), 1) + + @property + def scope(self) -> str: + return self._scope + + def _build_filters(self) -> QWidget: + card = QFrame() + card.setObjectName("FilterBar") + grid = QGridLayout(card) + grid.setContentsMargins(14, 12, 14, 12) + grid.setHorizontalSpacing(8) + grid.setVerticalSpacing(8) + self.keyword_edit = QLineEdit() + self.keyword_edit.setPlaceholderText("订单号 / 患者 / 手机号 / 处方ID / 诊单ID") + self.keyword_edit.setClearButtonEnabled(True) + self.keyword_edit.returnPressed.connect(self.search) + grid.addWidget(self.keyword_edit, 0, 0, 1, 2) + self.rx_audit = QComboBox() + self.pay_audit = QComboBox() + for combo, title in ((self.rx_audit, "处方审核"), (self.pay_audit, "支付审核")): + combo.addItem(title + ":全部", None) + combo.addItem(title + ":待审核", 0) + combo.addItem(title + ":已通过", 1) + combo.addItem(title + ":已驳回", 2) + grid.addWidget(self.rx_audit, 0, 2) + grid.addWidget(self.pay_audit, 0, 3) + self.fulfillment = QComboBox() + self.fulfillment.addItem("履约:全部", None) + for value, label in FULFILLMENT_TEXT.items(): + self.fulfillment.addItem(label, value) + grid.addWidget(self.fulfillment, 0, 4) + search = QPushButton("查询") + search.setProperty("variant", "secondary") + search.clicked.connect(self.search) + grid.addWidget(search, 0, 5) + + self.use_dates = QCheckBox("限定创建日期") + self.use_dates.toggled.connect(self._toggle_dates) + grid.addWidget(self.use_dates, 1, 0) + self.start_date = QDateEdit(QDate.currentDate().addDays(-30)) + self.start_date.setCalendarPopup(True) + self.start_date.setDisplayFormat("yyyy-MM-dd") + self.start_date.setEnabled(False) + grid.addWidget(self.start_date, 1, 1) + self.end_date = QDateEdit(QDate.currentDate()) + self.end_date.setCalendarPopup(True) + self.end_date.setDisplayFormat("yyyy-MM-dd") + self.end_date.setEnabled(False) + grid.addWidget(self.end_date, 1, 2) + reset = QPushButton("重置") + reset.setProperty("variant", "ghost") + reset.clicked.connect(self.reset_filters) + grid.addWidget(reset, 1, 5) + grid.setColumnStretch(0, 1) + return card + + def _build_metrics(self) -> QHBoxLayout: + layout = QHBoxLayout() + layout.setSpacing(8) + self.metrics: dict[str, QLabel] = {} + for key, label in ( + ("orders", "订单数量"), + ("amount", "有效金额"), + ("pending", "待审核"), + ("completed", "完成 / 签收"), + ("rejected", "拒收订单"), + ("rejection_rate", "拒收率"), + ): + frame = QFrame() + frame.setObjectName("SubtleCard") + box = QVBoxLayout(frame) + box.setContentsMargins(12, 9, 12, 9) + box.setSpacing(2) + caption = QLabel(label) + caption.setProperty("role", "muted") + value = QLabel("0") + value.setStyleSheet("font-size:16px; font-weight:700; color:#17382F;") + box.addWidget(caption) + box.addWidget(value) + layout.addWidget(frame, 1) + self.metrics[key] = value + return layout + + def _build_table(self) -> QWidget: + card = QFrame() + card.setObjectName("Card") + layout = QVBoxLayout(card) + layout.setContentsMargins(14, 12, 14, 12) + layout.setSpacing(8) + heading = QHBoxLayout() + title = QLabel("订单管理") + title.setProperty("role", "sectionTitle") + heading.addWidget(title) + heading.addStretch(1) + self.scope_label = QLabel(self._scope) + self.scope_label.setProperty("role", "muted") + heading.addWidget(self.scope_label) + layout.addLayout(heading) + self.content_stack = QStackedWidget() + host = QWidget() + host_layout = QVBoxLayout(host) + host_layout.setContentsMargins(0, 0, 0, 0) + host_layout.setSpacing(8) + self.table = SortableTable( + [ + TableColumn( + "order_no", + "订单", + 160, + lambda value, row: ( + f"{display_text(value)} · #{display_text(first_value(row, 'id'))}" + ), + ), + TableColumn( + "patient_name", + "患者", + 145, + lambda value, row: ( + f"{display_text(value or first_value(row, 'recipient_name'))} · " + f"{display_text(first_value(row, 'patient_phone_masked', 'recipient_phone_masked', 'phone'))}" + ), + ), + TableColumn( + "prescription_id", + "处方 / 诊单", + 110, + lambda value, row: ( + f"#{display_text(value)} / #{display_text(first_value(row, 'diagnosis_id'))}" + ), + ), + TableColumn( + "effective_amount", + "有效金额", + 95, + lambda value, row: ( + _money(value if value not in (None, "") else first_value(row, "amount")) + if _as_bool(first_value(row, "amount_included", default=True)) + else display_text(first_value(row, "amount_exclusion_text"), "不计入") + ), + ), + TableColumn("prescription_audit_status", "处方审核", 90, _audit_cell), + TableColumn("payment_slip_audit_status", "支付审核", 90, _audit_cell), + TableColumn("fulfillment_status", "履约", 95, _fulfillment_cell), + TableColumn( + "linked_pay_order_count", + "支付单", + 75, + lambda value, _row: f"{_as_int(value)} 笔" if _as_int(value) > 0 else "—", + Qt.AlignmentFlag.AlignCenter, + ), + TableColumn("assistant_name", "归属助理", 90), + TableColumn("doctor_name", "开方人", 90), + TableColumn("creator_name", "创建人", 90), + TableColumn("create_time_text", "创建时间", 140), + ] + ) + self.table.itemSelectionChanged.connect(self._selection_changed) + self.table.itemDoubleClicked.connect(lambda _item: self._request_detail()) + host_layout.addWidget(self.table, 1) + actions = QHBoxLayout() + self.diagnosis_button = QPushButton("诊单") + self.diagnosis_button.clicked.connect(self._request_diagnosis) + actions.addWidget(self.diagnosis_button) + self.detail_button = QPushButton("详情") + self.detail_button.setProperty("variant", "secondary") + self.detail_button.clicked.connect(self._request_detail) + actions.addWidget(self.detail_button) + self.action_button = QToolButton() + self.action_button.setText("订单操作") + self.action_button.setPopupMode(QToolButton.ToolButtonPopupMode.InstantPopup) + self.action_menu = QMenu(self.action_button) + self.action_button.setMenu(self.action_menu) + actions.addWidget(self.action_button) + actions.addStretch(1) + host_layout.addLayout(actions) + self.pager = Pager(self._page_size) + self.pager.page_changed.connect(self._change_page) + host_layout.addWidget(self.pager) + self.content_stack.addWidget(host) + self.content_stack.addWidget( + EmptyState("当前范围内暂无订单", "可调整审核、履约或日期条件。") + ) + layout.addWidget(self.content_stack, 1) + self._selection_changed() + return card + + def _toggle_dates(self, enabled: bool) -> None: + self.start_date.setEnabled(enabled) + self.end_date.setEnabled(enabled) + + def reset_filters(self) -> None: + self.keyword_edit.clear() + self.rx_audit.setCurrentIndex(0) + self.pay_audit.setCurrentIndex(0) + self.fulfillment.setCurrentIndex(0) + self.use_dates.setChecked(False) + self._page = 1 + self.refresh() + + def search(self) -> None: + if self.use_dates.isChecked() and self.start_date.date() > self.end_date.date(): + self.banner.show_message("开始日期不能晚于结束日期。", "warning") + return + self._page = 1 + self.refresh() + + def _change_page(self, page: int) -> None: + self._page = page + self.refresh() + + def refresh(self, *, silent: bool = False) -> None: + self._generation += 1 + generation = self._generation + if not silent: + self.banner.show_message("正在加载患者范围内的业务订单…", "info") + start = self.start_date.date().toString("yyyy-MM-dd") if self.use_dates.isChecked() else "" + end = self.end_date.date().toString("yyyy-MM-dd") if self.use_dates.isChecked() else "" + query = MappingProxyType( + { + "keyword": self.keyword_edit.text().strip(), + "prescription_audit_status": self.rx_audit.currentData(), + "payment_slip_audit_status": self.pay_audit.currentData(), + "fulfillment_status": self.fulfillment.currentData(), + "start_date": start, + "end_date": end, + "page_no": self._page, + "page_size": self._page_size, + } + ) + run_async( + lambda: _invoke_first( + self.repository, + ("patient_orders",), + **query, + ), + on_success=lambda result: self._apply_result(result, generation), + on_error=lambda error: self._load_error(error, generation), + on_finished=lambda: None, + ) + + def _apply_result(self, result: Any, generation: int) -> None: + if generation != self._generation: + return + rows = page_items(result) + self.table.set_rows(rows) + self.pager.update_state(self._page, page_total(result, len(rows))) + self.content_stack.setCurrentIndex(0 if rows else 1) + extend = _page_extend(result) + scope = get_value(extend, "scope.label", None) + if scope: + self._scope = str(scope) + self.scope_label.setText(self._scope) + self.scope_changed.emit(self._scope) + summary = get_value(extend, "summary", {}) or {} + self.metrics["orders"].setText( + str(_as_int(first_value(summary, "orders", "order_count", default=len(rows)))) + ) + self.metrics["amount"].setText( + _money(first_value(summary, "amount", "effective_amount", default=0)) + ) + self.metrics["pending"].setText( + str(_as_int(first_value(summary, "pending", "pending_audit", default=0))) + ) + self.metrics["completed"].setText(str(_as_int(get_value(summary, "completed", 0)))) + rejected = _as_int(get_value(summary, "rejected", 0)) + rate = _as_float(get_value(summary, "rejection_rate", 0)) + if 0 < rate <= 1: + rate *= 100 + self.metrics["rejected"].setText(str(rejected)) + self.metrics["rejection_rate"].setText(f"{rate:.1f}%") + self.banner.clear() + if rows and self.table.currentRow() < 0: + self.table.selectRow(0) + self._selection_changed() + + def _load_error(self, error: Exception, generation: int) -> None: + if generation == self._generation: + self.banner.show_message(friendly_error(error), "danger") + + def _request_diagnosis(self) -> None: + row = self.table.current_data() + if row is not None: + self.diagnosis_requested.emit(row) + + def _request_detail(self) -> None: + row = self.table.current_data() + if row is not None and _canonical_allowed(self.permissions, "tcm.prescriptionOrder/detail"): + self.detail_requested.emit(row) + + def _selection_changed(self) -> None: + row = self.table.current_data() + selected = row is not None + self.diagnosis_button.setEnabled(selected) + can_detail = _canonical_allowed(self.permissions, "tcm.prescriptionOrder/detail") + self.detail_button.setVisible(can_detail) + self.detail_button.setEnabled(selected) + self.action_menu.clear() + for key, label, danger in self._available_actions(row): + action = QAction(label, self.action_menu) + if danger: + action.setProperty("danger", True) + action.triggered.connect( + lambda _checked=False, action_key=key, source=row: self.action_requested.emit( + action_key, source + ) + ) + self.action_menu.addAction(action) + self.action_button.setVisible(bool(self.action_menu.actions())) + self.action_button.setEnabled(selected) + + def _available_actions(self, row: Any) -> list[tuple[str, str, bool]]: + if row is None: + return [] + allowed = lambda code: _canonical_allowed(self.permissions, code) # noqa: E731 + fulfillment = _as_int(first_value(row, "fulfillment_status"), -1) + rx_audit = _as_int(first_value(row, "prescription_audit_status"), -1) + pay_audit = _as_int(first_value(row, "payment_slip_audit_status"), -1) + locked = _remote_order_locked(row) + actions: list[tuple[str, str, bool]] = [] + if ( + allowed("tcm.prescriptionOrder/detail") + and allowed("tcm.prescriptionOrder/edit") + and fulfillment == 1 + and not locked + ): + actions.append(("edit", "编辑订单", False)) + if ( + allowed("tcm.prescriptionOrder/auditPrescription") + and rx_audit == 0 + and fulfillment not in {3, 4, 6} + ): + actions.append(("audit_prescription", "处方审核", False)) + if ( + allowed("tcm.prescriptionOrder/auditPrescription") + and rx_audit in {1, 2} + and pay_audit == 0 + and fulfillment not in {3, 4, 6} + and not locked + ): + actions.append(("revoke_rx_audit", "撤回处方审核", False)) + if ( + allowed("tcm.prescriptionOrder/auditPayment") + and rx_audit == 1 + and pay_audit == 0 + and fulfillment not in {3, 4} + ): + actions.append(("audit_payment", "支付单审核", False)) + if ( + allowed("tcm.prescriptionOrder/auditPayment") + and rx_audit == 1 + and pay_audit in {1, 2} + and fulfillment not in {3, 4, 6} + ): + actions.append(("revoke_pay_audit", "撤回支付审核", False)) + if allowed("tcm.prescriptionOrder/ddcode"): + actions.append(("ddcode", "修改快递单号", False)) + if allowed("tcm.prescriptionOrder/ship") and fulfillment == 2: + actions.append(("ship", "确认发货", False)) + amount = round(_as_float(first_value(row, "amount")), 2) + paid = round(_as_float(first_value(row, "linked_pay_paid_total")), 2) + if allowed("tcm.prescriptionOrder/addPayOrder") and fulfillment in {5, 6} and paid < amount: + actions.append(("add_pay_order", "补齐支付单", False)) + if allowed("tcm.prescriptionOrder/complete") and fulfillment in {5, 6} and pay_audit == 1: + actions.append(("complete", "完成订单", False)) + if ( + allowed("tcm.prescriptionOrder/refund") + and fulfillment in {3, 5, 6, 9} + and pay_audit == 1 + ): + actions.append(("refund", "退款", True)) + if allowed("tcm.prescriptionOrder/withdraw") and fulfillment == 1 and not locked: + actions.append(("withdraw", "撤回订单", True)) + can_upload = first_value(row, "can_upload_pharmacy", default=True) is not False + if ( + allowed("tcm.prescriptionOrder/uploadToPharmacy") + and can_upload + and rx_audit == 1 + and fulfillment not in {3, 4, 8, 10, 11, 12} + ): + actions.append(("upload_pharmacy", "上传药房", False)) + return actions + + +class PatientProgressWorkspace(QWidget): + diagnosis_requested = Signal(object) + scope_changed = Signal(str) + + def __init__(self, repository: Any, parent: QWidget | None = None) -> None: + super().__init__(parent) + self.repository = repository + self._page = 1 + self._page_size = 15 + self._generation = 0 + self._scope = "按权限加载" + self._active = False + + root = QVBoxLayout(self) + root.setContentsMargins(0, 10, 0, 0) + root.setSpacing(12) + heading = QHBoxLayout() + title_box = QVBoxLayout() + title_box.setSpacing(2) + title = QLabel("今日面诊概览") + title.setProperty("role", "sectionTitle") + title_box.addWidget(title) + self.mode_label = QLabel("与排班合并") + self.mode_label.setProperty("role", "muted") + title_box.addWidget(self.mode_label) + heading.addLayout(title_box) + heading.addStretch(1) + self.scope_label = QLabel(self._scope) + self.scope_label.setProperty("role", "muted") + heading.addWidget(self.scope_label) + root.addLayout(heading) + root.addLayout(self._build_overview()) + self.banner = MessageBanner() + root.addWidget(self.banner) + + splitter = QSplitter(Qt.Orientation.Vertical) + splitter.setChildrenCollapsible(False) + splitter.addWidget(self._build_schedule()) + splitter.addWidget(self._build_queue()) + splitter.setStretchFactor(0, 0) + splitter.setStretchFactor(1, 1) + splitter.setSizes([190, 330]) + root.addWidget(splitter, 1) + + self.timer = QTimer(self) + self.timer.setInterval(15_000) + self.timer.timeout.connect(lambda: self.refresh(silent=True)) + + @property + def scope(self) -> str: + return self._scope + + def _build_overview(self) -> QHBoxLayout: + layout = QHBoxLayout() + layout.setSpacing(8) + self.overview: dict[str, tuple[QLabel, QLabel]] = {} + for key, caption in ( + ("total", "今日面诊总数"), + ("waiting", "待面诊"), + ("completed", "已完成"), + ): + frame = QFrame() + frame.setObjectName("SubtleCard") + box = QVBoxLayout(frame) + box.setContentsMargins(12, 9, 12, 9) + label = QLabel(caption) + label.setProperty("role", "muted") + value = QLabel("0") + value.setStyleSheet("font-size:17px; font-weight:700; color:#17382F;") + hint = QLabel("—") + hint.setProperty("role", "muted") + box.addWidget(label) + box.addWidget(value) + box.addWidget(hint) + layout.addWidget(frame, 1) + self.overview[key] = (value, hint) + return layout + + def _build_schedule(self) -> QWidget: + card = QFrame() + card.setObjectName("Card") + layout = QVBoxLayout(card) + layout.setContentsMargins(12, 10, 12, 10) + layout.setSpacing(6) + layout.addWidget(section_title("近一周面诊安排")) + self.schedule_table = SortableTable( + [ + TableColumn( + "date_text", + "日期", + 105, + lambda value, row: ( + f"{display_text(value)} {display_text(first_value(row, 'weekday'), '')}" + ).strip(), + ), + TableColumn("doctor_count", "医生", 65), + TableColumn( + "total_appointments", + "面诊 / 号源", + 90, + lambda value, row: display_text( + value + if value not in (None, "") + else first_value(row, "total_slots", default=0) + ), + ), + TableColumn( + "waiting_appointments", + "待诊 / 已约", + 90, + lambda value, row: display_text( + value + if value not in (None, "") + else first_value(row, "booked_slots", default=0) + ), + ), + TableColumn( + "completed_appointments", + "完成 / 空号", + 90, + lambda value, row: display_text( + value + if value not in (None, "") + else first_value(row, "empty_slots", default=0) + ), + ), + TableColumn("missed_appointments", "已过号", 70), + TableColumn( + "doctors", + "预约医生", + 210, + lambda value, _row: ( + "、".join( + display_text(first_value(item, "doctor_name", "name")) for item in value + ) + if isinstance(value, (list, tuple)) + else "—" + ), + ), + ] + ) + self.schedule_table.setMaximumHeight(170) + layout.addWidget(self.schedule_table) + return card + + def _build_queue(self) -> QWidget: + card = QFrame() + card.setObjectName("Card") + layout = QVBoxLayout(card) + layout.setContentsMargins(12, 10, 12, 10) + layout.setSpacing(6) + heading = QHBoxLayout() + title = QLabel("候诊列表") + title.setProperty("role", "sectionTitle") + heading.addWidget(title) + heading.addStretch(1) + self.queue_count = QLabel("共 0 人 · 每 15 秒刷新") + self.queue_count.setProperty("role", "muted") + heading.addWidget(self.queue_count) + layout.addLayout(heading) + self.queue_stack = QStackedWidget() + host = QWidget() + host_layout = QVBoxLayout(host) + host_layout.setContentsMargins(0, 0, 0, 0) + self.queue_table = SortableTable( + [ + TableColumn("queue_no", "排队", 70), + TableColumn("patient_name", "患者", 125), + TableColumn("doctor_name", "医生", 100), + TableColumn( + "appointment_time", + "预约时间", + 95, + lambda value, _row: display_text(value)[:5], + ), + TableColumn( + "ahead_count", + "前方等待", + 145, + _waiting_cell, + ), + TableColumn("queue_status_text", "状态", 95), + ] + ) + self.queue_table.itemDoubleClicked.connect(lambda _item: self._open_selected()) + host_layout.addWidget(self.queue_table) + self.pager = Pager(self._page_size) + self.pager.page_changed.connect(self._change_page) + host_layout.addWidget(self.pager) + self.queue_stack.addWidget(host) + self.queue_stack.addWidget(EmptyState("今日暂无候诊患者", "当前权限范围内没有有效挂号。")) + layout.addWidget(self.queue_stack, 1) + return card + + def set_active(self, active: bool) -> None: + self._active = active + if active: + if not self.timer.isActive(): + self.timer.start() + else: + self.timer.stop() + + def _change_page(self, page: int) -> None: + self._page = page + self.refresh() + + def refresh(self, *, silent: bool = False) -> None: + self._generation += 1 + generation = self._generation + if not silent: + self.banner.show_message("正在更新面诊进度…", "info") + today = QDate.currentDate().toString("yyyy-MM-dd") + query = MappingProxyType( + { + "status": 1, + "start_date": today, + "end_date": today, + "page_no": self._page, + "page_size": self._page_size, + } + ) + run_async( + lambda: _invoke_first( + self.repository, + ("patient_progress",), + **query, + ), + on_success=lambda result: self._apply_result(result, generation), + on_error=lambda error: self._load_error(error, generation), + on_finished=lambda: None, + ) + + def _apply_result(self, result: Any, generation: int) -> None: + if generation != self._generation: + return + rows = page_items(result) + total = page_total(result, len(rows)) + self.queue_table.set_rows(rows) + self.pager.update_state(self._page, total) + self.queue_count.setText(f"共 {total} 人 · 每 15 秒刷新") + self.queue_stack.setCurrentIndex(0 if rows else 1) + extend = _page_extend(result) + scope = get_value(extend, "scope.label", None) + if scope: + self._scope = str(scope) + self.scope_label.setText(self._scope) + self.scope_changed.emit(self._scope) + schedule_mode = str(get_value(extend, "schedule_mode", "")).lower() + ownership = schedule_mode in {"ownership", "self"} + self.mode_label.setText("按本人归属" if ownership else "与排班合并") + overview = get_value(extend, "today_overview", {}) or {} + summary = get_value(extend, "summary", {}) or {} + completed = _as_int(get_value(overview, "completed", get_value(summary, "completed", 0))) + missed = _as_int(get_value(overview, "missed", get_value(summary, "missed", 0))) + booked = _as_int(get_value(overview, "booked", get_value(summary, "waiting", total))) + total_visits = _as_int(get_value(overview, "total_visits", booked + completed + missed)) + doctors = _as_int(get_value(overview, "doctor_count", 0)) + empty = _as_int(get_value(overview, "empty_slots", 0)) + self.overview["total"][0].setText(str(total_visits)) + self.overview["total"][1].setText(f"{doctors} 位接诊医生") + self.overview["waiting"][0].setText(str(booked)) + self.overview["waiting"][1].setText("本人归属患者" if ownership else "有效挂号") + self.overview["completed"][0].setText(str(completed if ownership else empty)) + self.overview["completed"][1].setText(f"已过号 {missed} 人" if ownership else "当前空号") + schedule = get_value(extend, "week_schedule", []) or [] + if not isinstance(schedule, (list, tuple)): + schedule = [] + if not schedule: + today = QDate.currentDate() + weekdays = "一二三四五六日" + schedule = [ + { + "date": today.addDays(offset).toString("yyyy-MM-dd"), + "date_text": today.addDays(offset).toString("MM-dd"), + "weekday": f"周{weekdays[today.addDays(offset).dayOfWeek() - 1]}", + "doctor_count": 0, + "total_slots": 0, + "booked_slots": 0, + "empty_slots": 0, + "total_appointments": 0, + "waiting_appointments": 0, + "completed_appointments": 0, + "missed_appointments": 0, + "doctors": [], + } + for offset in range(7) + ] + self.schedule_table.set_rows(schedule) + self.banner.clear() + + def _load_error(self, error: Exception, generation: int) -> None: + if generation == self._generation: + self.banner.show_message(friendly_error(error), "danger") + + def _open_selected(self) -> None: + row = self.queue_table.current_data() + if row is not None: + self.diagnosis_requested.emit(row) + + +class PatientsPage(QWidget): + """My-patients route with patient, order, and progress workspaces.""" + + def __init__( + self, + repository: Any, + permissions: Any = None, + current_user: Any = None, + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.repository = repository + self.permissions = permissions + self.current_user = current_user + self._action_generation = 0 + self._pending_action_tokens: set[int] = set() + self._detail_generation = 0 + self._edit_generation = 0 + self._assistant_generation = 0 + + root = QVBoxLayout(self) + root.setContentsMargins(24, 18, 24, 20) + root.setSpacing(10) + header = PageHeader("我的患者", "患者、挂号与诊单按当前角色和部门数据范围展示。") + self.scope_badge = StatusBadge("按权限加载", "neutral") + header.add_action(self.scope_badge) + refresh = QPushButton("刷新") + refresh.setProperty("variant", "secondary") + refresh.clicked.connect(self.refresh) + header.add_action(refresh) + root.addWidget(header) + + self.tabs = QTabWidget() + self.tabs.setObjectName("PatientWorkspaceTabs") + self.patient_workspace = PatientListWorkspace(repository, permissions) + self.order_workspace = PatientOrdersWorkspace(repository, permissions) + self.progress_workspace = PatientProgressWorkspace(repository) + self.tabs.addTab(self.patient_workspace, "患者列表") + self.tabs.addTab(self.order_workspace, "订单管理") + self.tabs.addTab(self.progress_workspace, "面诊进度") + root.addWidget(self.tabs, 1) + + self.diagnosis_dialog = DiagnosisDialog(repository, self) + self.diagnosis_dialog.saved.connect(self._after_mutation) + self.patient_workspace.diagnosis_requested.connect(self._open_diagnosis) + self.patient_workspace.appointment_requested.connect(self._book_appointment) + self.patient_workspace.assign_requested.connect(self._load_assistants) + self.patient_workspace.fill_id_requested.connect(self._fill_id_card) + self.patient_workspace.cancel_requested.connect(self._cancel_appointment) + self.patient_workspace.scope_changed.connect(self._set_scope) + self.order_workspace.diagnosis_requested.connect(self._open_order_diagnosis) + self.order_workspace.detail_requested.connect(self._load_order_detail) + self.order_workspace.action_requested.connect(self._handle_order_action) + self.order_workspace.scope_changed.connect(self._set_scope) + self.progress_workspace.diagnosis_requested.connect(self._open_order_diagnosis) + self.progress_workspace.scope_changed.connect(self._set_scope) + self.tabs.currentChanged.connect(self._workspace_changed) + self._workspace_changed(0) + + def _set_scope(self, text: str) -> None: + current = self.tabs.currentWidget() + if current is self.sender() or getattr(current, "scope", None) == text: + self.scope_badge.set_status(text, "neutral") + + def _workspace_changed(self, index: int) -> None: + self.progress_workspace.set_active(index == 2 and self.isVisible()) + workspace = self.tabs.widget(index) + scope = getattr(workspace, "scope", "按权限加载") + self.scope_badge.set_status(str(scope), "neutral") + refresh = getattr(workspace, "refresh", None) + if callable(refresh) and self.isVisible(): + refresh() + + def refresh(self) -> None: + workspace = self.tabs.currentWidget() + refresh = getattr(workspace, "refresh", None) + if callable(refresh): + refresh() + + def _diagnosis_id(self, row: Any) -> int: + return _as_int(first_value(row, "diagnosis_id", "patient_id", "id")) + + def _open_diagnosis(self, row: Any, editable: bool) -> None: + diagnosis_id = self._diagnosis_id(row) + if diagnosis_id <= 0: + show_toast(self, "患者诊单信息不完整。", "danger") + return + canonical = "tcm.diagnosis/edit" if editable else "tcm.diagnosis/readonlyDetail" + if not _canonical_allowed(self.permissions, canonical): + show_toast(self, "当前账号没有该诊单权限。", "danger") + return + self.diagnosis_dialog.open_for(diagnosis_id, editable=editable, seed=row) + + def _open_order_diagnosis(self, row: Any) -> None: + editable = _canonical_allowed(self.permissions, "tcm.diagnosis/edit") + readable = _canonical_allowed(self.permissions, "tcm.diagnosis/readonlyDetail") + if not editable and not readable: + show_toast(self, "当前账号没有诊单查看权限。", "danger") + return + self._open_diagnosis(row, editable) + + def _run_action( + self, + message: str, + function: Any, + *, + success: str, + refresh_all: bool = True, + ) -> None: + self._action_generation += 1 + token = self._action_generation + self._pending_action_tokens.add(token) + workspace = self.tabs.currentWidget() + banner = getattr(workspace, "banner", None) + if isinstance(banner, MessageBanner): + banner.show_message(message, "info") + run_async( + function, + on_success=lambda _result: self._action_success(token, success, refresh_all), + on_error=lambda error: self._action_error(token, error), + on_finished=lambda: self._action_finished(token), + ) + + def _action_success(self, token: int, message: str, refresh_all: bool) -> None: + if token not in self._pending_action_tokens: + return + show_toast(self, message, "success") + # Every server-side success reconciles, even if another mutation finished later. + if refresh_all: + self._after_mutation() + + def _action_error(self, token: int, error: Exception) -> None: + if token not in self._pending_action_tokens: + return + workspace = self.tabs.currentWidget() + banner = getattr(workspace, "banner", None) + if isinstance(banner, MessageBanner): + banner.show_message(friendly_error(error), "danger") + show_toast(self, friendly_error(error), "danger", 4200) + + def _action_finished(self, token: int) -> None: + self._pending_action_tokens.discard(token) + + def _after_mutation(self) -> None: + self.patient_workspace.refresh(silent=True) + self.order_workspace.refresh(silent=True) + self.progress_workspace.refresh(silent=True) + + def _book_appointment(self, row: Any) -> None: + if not _canonical_allowed(self.permissions, "tcm.diagnosis/guahao"): + return + dialog = _AppointmentDialog(row, repository=self.repository, parent=self) + if dialog.exec() != QDialog.DialogCode.Accepted: + return + payload = MappingProxyType(dialog.payload()) + self._run_action( + "正在保存预约…", + lambda: _invoke_first( + self.repository, + ("book_patient_appointment",), + payload=payload, + **payload, + ), + success="预约已保存。", + ) + + def _cancel_appointment(self, row: Any) -> None: + if not _canonical_allowed(self.permissions, "tcm.diagnosis/guahao"): + return + appointment_id = _as_int(first_value(row, "appointment_id")) + status = _as_int(first_value(row, "appointment_status"), -1) + if appointment_id <= 0 or status not in {1, 4}: + return + answer = QMessageBox.question( + self, + "取消挂号", + f"确定取消“{display_text(first_value(row, 'patient_name'), '该患者')}”的挂号吗?", + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.Cancel, + QMessageBox.StandardButton.Cancel, + ) + if answer != QMessageBox.StandardButton.Yes: + return + self._run_action( + "正在取消挂号…", + lambda: _invoke_first( + self.repository, + ("cancel_patient_appointment",), + appointment_id=appointment_id, + id=appointment_id, + ), + success="挂号已取消。", + ) + + def _load_assistants(self, row: Any) -> None: + if not _canonical_allowed(self.permissions, "tcm.diagnosis/assign"): + return + self._assistant_generation += 1 + generation = self._assistant_generation + self.patient_workspace.banner.show_message("正在加载可指派医助…", "info") + run_async( + lambda: _invoke_first(self.repository, ("list_patient_assistants",)), + on_success=lambda result: self._show_assign_dialog(row, result, generation), + on_error=lambda error: self._assistant_error(error, generation), + on_finished=lambda: None, + ) + + def _assistant_error(self, error: Exception, generation: int) -> None: + if generation == self._assistant_generation: + self.patient_workspace.banner.show_message(friendly_error(error), "danger") + + def _show_assign_dialog(self, row: Any, result: Any, generation: int) -> None: + if generation != self._assistant_generation: + return + assistants = page_items(result) + if not assistants and isinstance(result, (list, tuple)): + assistants = list(result) + if not assistants: + self.patient_workspace.banner.show_message("当前范围内没有可指派医助。", "warning") + return + self.patient_workspace.banner.clear() + dialog = _AssignDialog(row, assistants, self) + if dialog.exec() != QDialog.DialogCode.Accepted or dialog.assistant_id <= 0: + return + diagnosis_id = self._diagnosis_id(row) + assistant_id = dialog.assistant_id + inherit = 1 if dialog.inherit_check.isChecked() else 0 + self._run_action( + "正在指派医助…", + lambda: _invoke_first( + self.repository, + ("assign_patient",), + diagnosis_id=diagnosis_id, + id=diagnosis_id, + assistant_id=assistant_id, + is_inherit=inherit, + ), + success="医助已指派。", + ) + + def _fill_id_card(self, row: Any) -> None: + if not _canonical_allowed(self.permissions, "tcm.diagnosis/edit"): + return + if _as_bool(first_value(row, "has_id_card", default=False)): + return + value, accepted = QInputDialog.getText( + self, + "补全身份证", + f"请输入 {display_text(first_value(row, 'patient_name'), '患者')} 的身份证号:", + ) + id_card = value.strip() + if not accepted: + return + valid = bool( + re.fullmatch( + r"(?:[1-9]\d{5}\d{2}(?:0[1-9]|1[0-2])" + r"(?:0[1-9]|[12]\d|3[01])\d{3}|" + r"[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|1[0-2])" + r"(?:0[1-9]|[12]\d|3[01])\d{3}[\dXx])", + id_card, + ) + ) + if not valid: + show_toast(self, "请输入 15 或 18 位有效身份证号。", "danger") + return + diagnosis_id = self._diagnosis_id(row) + self._run_action( + "正在补全身份信息…", + lambda: _invoke_first( + self.repository, + ("fill_patient_id_card",), + diagnosis_id=diagnosis_id, + id=diagnosis_id, + id_card=id_card, + ), + success="身份信息已补全。", + ) + + def _load_order_detail(self, row: Any) -> None: + if not _canonical_allowed(self.permissions, "tcm.prescriptionOrder/detail"): + return + order_id = _as_int(first_value(row, "id", "order_id")) + if order_id <= 0: + return + self._detail_generation += 1 + generation = self._detail_generation + self.order_workspace.banner.show_message("正在加载订单详情…", "info") + run_async( + lambda: _invoke_first( + self.repository, + ("get_patient_order",), + id=order_id, + order_id=order_id, + ), + on_success=lambda result: self._show_order_detail(result, generation), + on_error=lambda error: self._order_detail_error(error, generation), + on_finished=lambda: None, + ) + + def _show_order_detail(self, detail: Any, generation: int) -> None: + if generation != self._detail_generation: + return + self.order_workspace.banner.clear() + _OrderDetailDialog(detail, self).exec() + + def _order_detail_error(self, error: Exception, generation: int) -> None: + if generation == self._detail_generation: + self.order_workspace.banner.show_message(friendly_error(error), "danger") + + def _load_order_editor(self, row: Any) -> None: + order_id = _as_int(first_value(row, "id", "order_id")) + if order_id <= 0: + return + self._edit_generation += 1 + generation = self._edit_generation + self.order_workspace.banner.show_message("正在加载完整订单…", "info") + run_async( + lambda: _invoke_first( + self.repository, + ("get_patient_order",), + order_id=order_id, + ), + on_success=lambda detail: self._show_order_editor(detail, generation), + on_error=lambda error: self._order_edit_error(error, generation), + on_finished=lambda: None, + ) + + def _show_order_editor(self, detail: Any, generation: int) -> None: + if generation != self._edit_generation: + return + self.order_workspace.banner.clear() + allowed_keys = {item[0] for item in self.order_workspace._available_actions(detail)} + if "edit" not in allowed_keys: + show_toast(self, "订单状态或权限已变化,请刷新后重试。", "danger") + self.order_workspace.refresh(silent=True) + return + dialog = _OrderEditDialog(detail, self) + if dialog.exec() != QDialog.DialogCode.Accepted: + return + order_id = _as_int(first_value(detail, "id", "order_id")) + changes = dialog.changes() + self._run_action( + "正在保存订单…", + lambda: _invoke_first( + self.repository, + ("edit_patient_order",), + order=order_id, + changes=changes, + ), + success="订单已保存。", + ) + + def _order_edit_error(self, error: Exception, generation: int) -> None: + if generation == self._edit_generation: + self.order_workspace.banner.show_message(friendly_error(error), "danger") + + def _handle_order_action(self, key: str, row: Any) -> None: + allowed_keys = {item[0] for item in self.order_workspace._available_actions(row)} + if key not in allowed_keys: + show_toast(self, "订单状态或权限已变化,请刷新后重试。", "danger") + self.order_workspace.refresh(silent=True) + return + order_id = _as_int(first_value(row, "id", "order_id")) + if order_id <= 0: + return + if key == "edit": + self._load_order_editor(row) + return + call: Any + success = "订单已更新。" + if key in {"audit_prescription", "audit_payment"}: + label = "处方审核" if key == "audit_prescription" else "支付单审核" + action_label, accepted = QInputDialog.getItem( + self, label, "审核结果:", ["通过", "驳回"], 0, False + ) + if not accepted: + return + remark, accepted = QInputDialog.getText(self, label, "审核备注:") + if not accepted: + return + method = ( + "audit_patient_order_prescription" + if key == "audit_prescription" + else "audit_patient_order_payment" + ) + action = "approve" if action_label == "通过" else "reject" + if action == "reject" and not remark.strip(): + show_toast(self, "驳回时必须填写审核意见。", "danger") + return + + def call() -> Any: + return _invoke_first( + self.repository, + (method,), + order_id=order_id, + action=action, + remark=remark.strip(), + ) + + success = f"{label}已提交。" + elif key in {"revoke_rx_audit", "revoke_pay_audit", "withdraw", "upload_pharmacy"}: + labels = { + "revoke_rx_audit": "撤回处方审核", + "revoke_pay_audit": "撤回支付审核", + "withdraw": "撤回订单", + "upload_pharmacy": "上传药房", + } + if not self._confirm(labels[key], f"确定执行“{labels[key]}”吗?"): + return + methods = { + "revoke_rx_audit": "revoke_patient_order_prescription_audit", + "revoke_pay_audit": "revoke_patient_order_payment_audit", + "withdraw": "withdraw_patient_order", + "upload_pharmacy": "upload_patient_order_to_pharmacy", + } + method = methods[key] + + def call() -> Any: + return _invoke_first( + self.repository, + (method,), + order_id=order_id, + ) + + success = labels[key] + "已完成。" + elif key in {"ddcode", "ship"}: + title = "确认发货" if key == "ship" else "修改快递单号" + company, accepted = QInputDialog.getText( + self, + title, + "快递公司:", + text=display_text(first_value(row, "express_company"), ""), + ) + if not accepted or not company.strip(): + return + tracking, accepted = QInputDialog.getText( + self, + title, + "快递单号:", + text=display_text(first_value(row, "tracking_number", "express_no"), ""), + ) + if not accepted or not tracking.strip(): + return + method = "ship_patient_order" if key == "ship" else "update_patient_order_shipping" + ship_mode = ( + "direct" + if str(first_value(row, "ship_mode", default="")).lower() == "direct" + else "gancao" + ) + + def call() -> Any: + return _invoke_first( + self.repository, + (method,), + order_id=order_id, + express_company=company.strip(), + tracking_number=tracking.strip(), + ship_mode=ship_mode, + ) + + success = "发货已确认。" if key == "ship" else "快递信息已更新。" + elif key == "add_pay_order": + dialog = _PaymentDialog(row, self) + if dialog.exec() != QDialog.DialogCode.Accepted: + return + payment = MappingProxyType(dialog.payload()) + + def call() -> Any: + return _invoke_first( + self.repository, + ("add_patient_order_payment",), + order_id=order_id, + **payment, + ) + + success = "支付单已补齐。" + elif key == "complete": + status_label, accepted = QInputDialog.getItem( + self, + "完成订单", + "结案状态:", + ["已完成", "进行中", "暂不制药", "拒收", "保留药方", "制药缓发"], + 0, + False, + ) + if not accepted: + return + fulfillment_status = { + "已完成": 3, + "进行中": 7, + "暂不制药": 8, + "拒收": 9, + "保留药方": 11, + "制药缓发": 12, + }[status_label] + + def call() -> Any: + return _invoke_first( + self.repository, + ("complete_patient_order",), + order_id=order_id, + fulfillment_status=fulfillment_status, + ) + + success = "订单已完成。" + elif key == "refund": + dialog = _RefundDialog(row, self) + if dialog.exec() != QDialog.DialogCode.Accepted: + return + refund = MappingProxyType(dialog.payload()) + + def call() -> Any: + return _invoke_first( + self.repository, + ("refund_patient_order",), + order_id=order_id, + **refund, + ) + + success = "退款已提交。" + else: + return + self._run_action("正在处理订单…", call, success=success) + + def _confirm(self, title: str, text: str) -> bool: + return ( + QMessageBox.question( + self, + title, + text, + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.Cancel, + QMessageBox.StandardButton.Cancel, + ) + == QMessageBox.StandardButton.Yes + ) + + def showEvent(self, event: Any) -> None: + super().showEvent(event) + self.progress_workspace.set_active(self.tabs.currentIndex() == 2) + self.refresh() + + def hideEvent(self, event: Any) -> None: + self.progress_workspace.set_active(False) + super().hideEvent(event) + + +__all__ = [ + "PatientListWorkspace", + "PatientOrdersWorkspace", + "PatientProgressWorkspace", + "PatientsPage", +] diff --git a/app/src/doctor_workstation/ui/pages/prescription_library.py b/app/src/doctor_workstation/ui/pages/prescription_library.py new file mode 100644 index 000000000..efe2c57c5 --- /dev/null +++ b/app/src/doctor_workstation/ui/pages/prescription_library.py @@ -0,0 +1,420 @@ +"""Reusable prescription-template library matching the admin workflow.""" + +from __future__ import annotations + +from typing import Any + +from PySide6.QtWidgets import ( + QComboBox, + QDialog, + QFrame, + QGridLayout, + QHBoxLayout, + QLabel, + QLineEdit, + QMessageBox, + QPushButton, + QStackedWidget, + QVBoxLayout, + QWidget, +) + +from ..dialogs.prescription import PrescriptionTemplateDialog +from ..widgets import ( + EmptyState, + MessageBanner, + PageHeader, + Pager, + SortableTable, + TableColumn, + display_text, + first_value, + friendly_error, + get_value, + has_permission, + invoke, + page_items, + page_total, + run_async, + show_toast, +) + + +def _formula_text(value: Any, _row: Any = None) -> str: + text = str(value or "").strip().lower() + return "辅方" if text in {"2", "aux", "auxiliary", "secondary", "辅方"} else "主方" + + +def _visibility_text(value: Any, _row: Any = None) -> str: + return "所有人可见" if value in (True, 1, "1", "public", "all") else "仅自己可见" + + +def _disable_edit_text(value: Any, _row: Any = None) -> str: + return "已禁用" if value in (True, 1, "1") else "可修改" + + +def _herb_count(_value: Any, row: Any) -> str: + herbs = get_value(row, "herbs", None) or [] + return f"{len(herbs)}味" if isinstance(herbs, (list, tuple)) else "0味" + + +def _herbs_detail(_value: Any, row: Any) -> str: + herbs = get_value(row, "herbs", None) or [] + if not isinstance(herbs, (list, tuple)): + return display_text(herbs) + pieces = [] + for herb in herbs: + name = first_value(herb, "name", "medicine_name", default="药材") + dosage = first_value(herb, "dosage", "amount", default="") + pieces.append(f"{name} {dosage}g".strip()) + return "、".join(pieces) if pieces else "暂无药材" + + +class PrescriptionLibraryPage(QWidget): + """Filter, inspect, and manage reusable prescriptions.""" + + def __init__( + self, + repository: Any, + permissions: Any = None, + current_user: Any = None, + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.repository = repository + self.permissions = permissions + self.current_user = current_user + self._generation = 0 + self._loading = False + self._refresh_pending = False + self._page = 1 + self._page_size = 15 + + root = QVBoxLayout(self) + root.setContentsMargins(24, 20, 24, 24) + root.setSpacing(15) + header = PageHeader( + "我的处方库", + "管理可复用药材组合;公开模板可被其他医生导入,禁用修改仅作用于导入后的处方。", + ) + self.new_button = QPushButton("+ 新增处方") + self.new_button.setProperty("variant", "primary") + self.new_button.setVisible(has_permission(permissions, "wcf.prescription/add")) + self.new_button.clicked.connect(self._new_template) + header.add_action(self.new_button) + root.addWidget(header) + + filters = QFrame() + filters.setObjectName("FilterBar") + grid = QGridLayout(filters) + grid.setContentsMargins(16, 13, 16, 13) + grid.setHorizontalSpacing(10) + self.name_filter = QLineEdit() + self.name_filter.setPlaceholderText("处方名称") + self.name_filter.setClearButtonEnabled(True) + self.name_filter.returnPressed.connect(self._search) + grid.addWidget(self.name_filter, 0, 0, 1, 2) + self.formula_filter = QComboBox() + self.formula_filter.addItem("全部类型", "") + self.formula_filter.addItem("主方", "主方") + self.formula_filter.addItem("辅方", "辅方") + grid.addWidget(self.formula_filter, 0, 2) + self.visibility_filter = QComboBox() + self.visibility_filter.addItem("全部公开范围", "") + self.visibility_filter.addItem("仅自己可见", 0) + self.visibility_filter.addItem("所有人可见", 1) + grid.addWidget(self.visibility_filter, 0, 3) + query = QPushButton("查询") + query.setProperty("variant", "secondary") + query.clicked.connect(self._search) + grid.addWidget(query, 0, 4) + reset = QPushButton("重置") + reset.setProperty("variant", "ghost") + reset.clicked.connect(self._reset_filters) + grid.addWidget(reset, 0, 5) + grid.setColumnStretch(0, 1) + root.addWidget(filters) + + self.banner = MessageBanner() + root.addWidget(self.banner) + card = QFrame() + card.setObjectName("Card") + card_layout = QVBoxLayout(card) + card_layout.setContentsMargins(16, 14, 16, 14) + card_layout.setSpacing(10) + toolbar = QHBoxLayout() + title = QLabel("处方模板") + title.setProperty("role", "sectionTitle") + toolbar.addWidget(title) + toolbar.addStretch(1) + self.view_button = QPushButton("查看") + self.view_button.setVisible(has_permission(permissions, "wcf.prescription/read")) + self.view_button.setEnabled(False) + self.view_button.clicked.connect(self._view_selected) + toolbar.addWidget(self.view_button) + self.edit_button = QPushButton("编辑") + self.edit_button.setVisible(has_permission(permissions, "wcf.prescription/edit")) + self.edit_button.setEnabled(False) + self.edit_button.clicked.connect(self._edit_selected) + toolbar.addWidget(self.edit_button) + self.delete_button = QPushButton("删除") + self.delete_button.setProperty("variant", "danger") + self.delete_button.setVisible(has_permission(permissions, "wcf.prescription/delete")) + self.delete_button.setEnabled(False) + self.delete_button.clicked.connect(self._delete_selected) + toolbar.addWidget(self.delete_button) + refresh = QPushButton("刷新") + refresh.setProperty("variant", "ghost") + refresh.clicked.connect(self.refresh) + toolbar.addWidget(refresh) + card_layout.addLayout(toolbar) + + self.stack = QStackedWidget() + table_host = QWidget() + table_layout = QVBoxLayout(table_host) + table_layout.setContentsMargins(0, 0, 0, 0) + self.table = SortableTable( + [ + TableColumn("id", "ID", 60), + TableColumn("prescription_name", "处方名称", 180), + TableColumn("formula_type", "处方类型", 90, _formula_text), + TableColumn("herbs", "药材数量", 90, _herb_count), + TableColumn("herbs", "药材明细", 300, _herbs_detail), + TableColumn("is_public", "是否公开", 110, _visibility_text), + TableColumn("disable_edit", "禁用修改", 95, _disable_edit_text), + TableColumn("creator_name", "创建人", 100), + TableColumn("create_time", "创建时间", 150), + ] + ) + self.table.itemSelectionChanged.connect(self._selection_changed) + self.table.itemDoubleClicked.connect(lambda _item: self._view_selected()) + table_layout.addWidget(self.table, 1) + self.pager = Pager(self._page_size) + self.pager.page_changed.connect(self._change_page) + table_layout.addWidget(self.pager) + self.stack.addWidget(table_host) + empty = EmptyState( + "还没有处方模板", + "可以新增常用药材组合,之后开方时快速导入。", + "新增处方", + ) + empty.action_button.setVisible(self.new_button.isVisible()) + empty.action_requested.connect(self._new_template) + self.stack.addWidget(empty) + card_layout.addWidget(self.stack, 1) + root.addWidget(card, 1) + + def _search(self) -> None: + self._page = 1 + self.refresh() + + def _reset_filters(self) -> None: + self.name_filter.clear() + self.formula_filter.setCurrentIndex(0) + self.visibility_filter.setCurrentIndex(0) + self._search() + + def _change_page(self, page: int) -> None: + self._page = page + self.refresh() + + def refresh(self) -> None: + if self._loading: + self._refresh_pending = True + return + self._loading = True + self._refresh_pending = False + self._generation += 1 + generation = self._generation + query = { + "prescription_name": self.name_filter.text().strip(), + "formula_type": self.formula_filter.currentData(), + "is_public": self.visibility_filter.currentData(), + "page": self._page, + "page_size": self._page_size, + } + requested_page = self._page + self.banner.show_message("正在加载处方库…", "info") + run_async( + lambda: invoke( + self.repository, + "prescription_library", + **query, + ), + on_success=lambda result: self._apply_result(result, generation, requested_page), + on_error=lambda error: self._load_error(error, generation), + on_finished=lambda: self._load_finished(generation), + ) + + def _apply_result(self, result: Any, generation: int, requested_page: int) -> None: + if generation != self._generation: + return + rows = page_items(result) + self.table.set_rows(rows) + self.pager.update_state(requested_page, page_total(result, len(rows))) + self.stack.setCurrentIndex(0 if rows else 1) + self.banner.clear() + self._selection_changed() + + def _load_error(self, error: Exception, generation: int) -> None: + if generation == self._generation: + self.banner.show_message(friendly_error(error), "danger") + + def _load_finished(self, generation: int) -> None: + if generation == self._generation: + self._loading = False + if self._refresh_pending: + self._refresh_pending = False + self.refresh() + + def _selection_changed(self) -> None: + row = self.table.current_data() + self.view_button.setEnabled(row is not None) + manageable = self._can_manage_row(row) + self.edit_button.setEnabled(row is not None and manageable) + self.delete_button.setEnabled(row is not None and manageable) + + def _can_manage_row(self, row: Any) -> bool: + if row is None: + return False + user_id = first_value(self.current_user, "id", "user_id", default=None) + creator_id = first_value(row, "creator_id", "doctor_id", default=None) + if user_id is not None and creator_id is not None and str(user_id) == str(creator_id): + return True + if _truthy(first_value(self.current_user, "root", "is_root", default=False)): + return True + role_ids = first_value(self.current_user, "role_ids", "role_id", default=[]) or [] + if not isinstance(role_ids, (list, tuple, set)): + role_ids = [role_ids] + return any(str(role) in {"0", "3"} for role in role_ids) + + def _new_template(self) -> None: + if not has_permission(self.permissions, "wcf.prescription/add"): + return + dialog = PrescriptionTemplateDialog( + self.repository, + mode="add", + parent=self, + ) + if dialog.exec() == QDialog.DialogCode.Accepted: + self._save_template(dialog.payload(), None) + + def _view_selected(self) -> None: + row = self.table.current_data() + if row is None or not has_permission(self.permissions, "wcf.prescription/read"): + return + PrescriptionTemplateDialog( + self.repository, + row, + mode="view", + parent=self, + ).exec() + + def _edit_selected(self) -> None: + row = self.table.current_data() + if ( + row is None + or not has_permission(self.permissions, "wcf.prescription/edit") + or not self._can_manage_row(row) + ): + return + dialog = PrescriptionTemplateDialog( + self.repository, + row, + mode="edit", + parent=self, + ) + if dialog.exec() == QDialog.DialogCode.Accepted: + self._save_template( + dialog.payload(), + first_value(row, "id", "template_id", default=None), + ) + + def _save_template(self, payload: dict[str, Any], template_id: Any) -> None: + permission = "wcf.prescription/add" if template_id is None else "wcf.prescription/edit" + if not has_permission(self.permissions, permission): + return + self._set_actions_enabled(False) + if template_id is None: + + def operation() -> Any: + return invoke( + self.repository, + "create_prescription_template", + template=payload, + ) + else: + + def operation() -> Any: + return invoke( + self.repository, + "update_prescription_template", + template=template_id, + changes=payload, + ) + + run_async( + operation, + on_success=lambda _result: self._mutation_success("处方模板已保存。"), + on_error=lambda error: show_toast(self, friendly_error(error), "danger", 4300), + on_finished=lambda: self._set_actions_enabled(True), + ) + + def _delete_selected(self) -> None: + row = self.table.current_data() + template_id = first_value(row, "id", "template_id", default=None) + if ( + row is None + or template_id is None + or not has_permission(self.permissions, "wcf.prescription/delete") + or not self._can_manage_row(row) + ): + return + name = display_text(first_value(row, "prescription_name", "name", default="该模板")) + answer = QMessageBox.warning( + self, + "删除处方模板", + f"确定删除“{name}”吗?此操作无法撤销。", + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.Cancel, + QMessageBox.StandardButton.Cancel, + ) + if answer != QMessageBox.StandardButton.Yes: + return + self._set_actions_enabled(False) + run_async( + lambda: invoke( + self.repository, + "delete_prescription_template", + template_id=template_id, + ), + on_success=lambda _result: self._mutation_success("处方模板已删除。"), + on_error=lambda error: show_toast(self, friendly_error(error), "danger", 4300), + on_finished=lambda: self._set_actions_enabled(True), + ) + + def _mutation_success(self, message: str) -> None: + show_toast(self, message, "success") + self.refresh() + + def _set_actions_enabled(self, enabled: bool) -> None: + self.new_button.setEnabled(enabled) + if not enabled: + self.view_button.setEnabled(False) + self.edit_button.setEnabled(False) + self.delete_button.setEnabled(False) + else: + self._selection_changed() + + def showEvent(self, event: Any) -> None: + super().showEvent(event) + if self.table.rowCount() == 0 and not self._loading: + self.refresh() + + +def _truthy(value: Any) -> bool: + if isinstance(value, str): + return value.strip().lower() not in {"", "0", "false", "no", "off"} + return bool(value) + + +__all__ = ["PrescriptionLibraryPage", "PrescriptionTemplateDialog"] diff --git a/app/src/doctor_workstation/ui/pages/prescriptions.py b/app/src/doctor_workstation/ui/pages/prescriptions.py new file mode 100644 index 000000000..e78513e26 --- /dev/null +++ b/app/src/doctor_workstation/ui/pages/prescriptions.py @@ -0,0 +1,933 @@ +"""Issued-prescription management matching the admin route contract.""" + +from __future__ import annotations + +from collections.abc import Callable, Mapping +from datetime import datetime, timedelta +from typing import Any + +from PySide6.QtCore import QDateTime, Qt +from PySide6.QtWidgets import ( + QComboBox, + QDateTimeEdit, + QDialog, + QDialogButtonBox, + QFrame, + QGridLayout, + QHBoxLayout, + QLabel, + QLineEdit, + QListWidget, + QListWidgetItem, + QMessageBox, + QPushButton, + QStackedWidget, + QVBoxLayout, + QWidget, +) + +from ..dialogs.prescription import ( + AuditPrescriptionDialog, + DiagnosisDetailDialog, + PatchPatientDialog, + PrescriptionDetailDialog, + PrescriptionEditorDialog, + PrescriptionOrderDialog, + PrescriptionOrderListDialog, +) +from ..widgets import ( + EmptyState, + MessageBanner, + PageHeader, + Pager, + SortableTable, + TableColumn, + display_text, + first_value, + friendly_error, + get_value, + has_permission, + invoke, + page_items, + page_total, + run_async, + show_toast, +) + + +def _int(value: Any, default: int = 0) -> int: + try: + return int(value) + except (TypeError, ValueError): + return default + + +def _truthy(value: Any) -> bool: + if isinstance(value, str): + return value.strip().lower() not in {"", "0", "false", "no", "off"} + return bool(value) + + +def prescription_status(row: Any) -> tuple[str, str]: + """Return the admin-equivalent combined status label and visual kind.""" + + if _int(first_value(row, "void_status", "is_void"), 0) == 1: + return "已作废", "danger" + if _truthy(first_value(row, "business_prescription_audit_rejected", default=False)): + return "已驳回", "danger" + status = _int(first_value(row, "audit_status", "status", default=0), 0) + if status == 2: + return "已驳回", "danger" + if status == 1: + return "已通过", "success" + return "待审核", "warning" + + +def is_approved_active(row: Any) -> bool: + return ( + _int(first_value(row, "audit_status", "status"), 0) == 1 + and _int(first_value(row, "void_status", "is_void"), 0) != 1 + ) + + +def can_patch_patient(row: Any) -> bool: + return row is not None and _int(first_value(row, "void_status", "is_void"), 0) != 1 + + +def can_create_order(row: Any) -> bool: + return can_patch_patient(row) and not _truthy( + first_value(row, "has_prescription_order", default=False) + ) + + +def can_audit(row: Any) -> bool: + return ( + row is not None + and _int(first_value(row, "audit_status", "status"), 0) == 0 + and _int(first_value(row, "void_status", "is_void"), 0) != 1 + ) + + +def can_edit_or_delete(row: Any) -> bool: + return row is not None and not is_approved_active(row) + + +def _formula(value: Any) -> str: + text = str(value or "").strip().lower() + return "辅方" if text in {"2", "aux", "auxiliary", "辅方"} else "主方" + + +def _order_warnings(row: Any) -> list[str]: + if not _truthy(first_value(row, "has_prescription_order", default=False)): + return [] + herbs = get_value(row, "herbs", None) or [] + if not isinstance(herbs, (list, tuple)) or not herbs: + return ["请开方,当前处方药材为空白"] + seen: set[str] = set() + duplicate: list[str] = [] + for herb in herbs: + name = str(first_value(herb, "name", "medicine_name", default="")).strip() + key = "".join(name.split()).lower() + if key and key in seen and name not in duplicate: + duplicate.append(name) + seen.add(key) + return [f"已有关联业务订单,存在重复药材:{'、'.join(duplicate)}"] if duplicate else [] + + +def _sn_cell(_value: Any, row: Any) -> str: + sn = first_value(row, "sn", "prescription_no", "id", default="—") + prescription_id = first_value(row, "id", "prescription_id", default="—") + warnings = _order_warnings(row) + suffix = "\n" + "\n".join(warnings) if warnings else "" + return f"{sn}\nID: {prescription_id}{suffix}" + + +def _patient_cell(_value: Any, row: Any) -> str: + gender = first_value(row, "gender", default=None) + gender_text = "男" if gender in (1, "1") else "女" if gender in (0, "0") else "未知" + age = first_value(row, "age", default="—") + return f"{first_value(row, 'patient_name', default='—')}\n{gender_text} · {age}岁" + + +def _source_cell(_value: Any, row: Any) -> str: + return ( + "空白处方" + if _truthy(first_value(row, "is_system_auto", "source", default=False)) + else "手工" + ) + + +def _audit_cell(_value: Any, row: Any) -> str: + label = prescription_status(row)[0] + reasons = [] + if _truthy(first_value(row, "business_prescription_audit_rejected", default=False)): + reasons.append( + "业务订单审核:" + + display_text(first_value(row, "business_prescription_audit_remark", default="—")) + ) + if _int(first_value(row, "audit_status"), 0) == 2: + reasons.append( + "消费者处方审核:" + display_text(first_value(row, "audit_remark", default="—")) + ) + return label + ("\n" + "\n".join(reasons) if reasons else "") + + +def _void_cell(_value: Any, row: Any) -> str: + return "作废" if _int(first_value(row, "void_status", "is_void"), 0) == 1 else "—" + + +def _doctor_cell(_value: Any, row: Any) -> str: + return ( + f"{first_value(row, 'doctor_name', 'creator_name', default='—')}\n" + f"{first_value(row, 'prescription_date', default='—')}" + ) + + +class DoctorMultiSelect(QWidget): + """Compact checkable doctor selector fed by list rows/extend data.""" + + def __init__(self, parent: QWidget | None = None) -> None: + super().__init__(parent) + self._options: dict[int, str] = {} + self._selected: set[int] = set() + layout = QHBoxLayout(self) + layout.setContentsMargins(0, 0, 0, 0) + self.button = QPushButton("全部医生") + self.button.clicked.connect(self._choose) + layout.addWidget(self.button) + + def values(self) -> list[int]: + return sorted(self._selected) + + def clear(self) -> None: + self._selected.clear() + self._update_text() + + def update_options(self, rows: list[Any]) -> None: + for row in rows: + doctor_id = _int(first_value(row, "id", "creator_id", "doctor_id"), 0) + name = str(first_value(row, "name", "doctor_name", "creator_name", default="")).strip() + if doctor_id and name: + self._options[doctor_id] = name + self._update_text() + + def _choose(self) -> None: + dialog = QDialog(self) + dialog.setWindowTitle("选择医生") + dialog.resize(360, 430) + layout = QVBoxLayout(dialog) + listing = QListWidget() + for doctor_id, name in sorted(self._options.items(), key=lambda item: item[1]): + item = QListWidgetItem(name) + item.setData(Qt.ItemDataRole.UserRole, doctor_id) + item.setFlags(item.flags() | Qt.ItemFlag.ItemIsUserCheckable) + item.setCheckState( + Qt.CheckState.Checked if doctor_id in self._selected else Qt.CheckState.Unchecked + ) + listing.addItem(item) + layout.addWidget(listing) + buttons = QDialogButtonBox( + QDialogButtonBox.StandardButton.Cancel | QDialogButtonBox.StandardButton.Ok + ) + buttons.accepted.connect(dialog.accept) + buttons.rejected.connect(dialog.reject) + layout.addWidget(buttons) + if dialog.exec() != QDialog.DialogCode.Accepted: + return + self._selected = { + _int(listing.item(index).data(Qt.ItemDataRole.UserRole)) + for index in range(listing.count()) + if listing.item(index).checkState() == Qt.CheckState.Checked + } + self._selected.discard(0) + self._update_text() + + def _update_text(self) -> None: + if not self._selected: + self.button.setText("全部医生") + return + names = [self._options.get(value, str(value)) for value in sorted(self._selected)] + self.button.setText("、".join(names[:2]) + (f" 等{len(names)}人" if len(names) > 2 else "")) + + +class PrescriptionsPage(QWidget): + """Complete issued-prescription route: list, workflow actions, print, and orders.""" + + def __init__( + self, + repository: Any, + permissions: Any = None, + current_user: Any = None, + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.repository = repository + self.permissions = permissions + self.current_user = current_user + self._page = 1 + self._page_size = 15 + self._generation = 0 + self._loading = False + self._refresh_pending = False + self._detail_generation = 0 + self._detail_target = 0 + self._diagnosis_detail_generation = 0 + self._diagnosis_detail_target = 0 + self._mutation_pending = False + + root = QVBoxLayout(self) + root.setContentsMargins(24, 20, 24, 24) + root.setSpacing(14) + header = PageHeader( + "已开处方", + "管理处方审核、患者修正与履约订单;已通过且未作废的处方只允许查看。", + ) + self.orders_button = QPushButton("业务订单") + self.orders_button.setVisible(has_permission(permissions, "tcm.prescriptionOrder/lists")) + self.orders_button.clicked.connect(lambda: self._open_orders()) + header.add_action(self.orders_button) + self.add_button = QPushButton("+ 新增处方") + self.add_button.setProperty("variant", "primary") + self.add_button.setVisible(has_permission(permissions, "cf.prescription/add")) + self.add_button.clicked.connect(self._add_prescription) + header.add_action(self.add_button) + root.addWidget(header) + root.addWidget(self._build_filters()) + self.banner = MessageBanner() + root.addWidget(self.banner) + root.addWidget(self._build_table_card(), 1) + self._load_doctor_options() + + def _build_filters(self) -> QWidget: + frame = QFrame() + frame.setObjectName("FilterBar") + grid = QGridLayout(frame) + grid.setContentsMargins(14, 12, 14, 12) + grid.setHorizontalSpacing(9) + grid.setVerticalSpacing(8) + self.quick_date = QComboBox() + self.quick_date.addItem("全部时间", "all") + self.quick_date.addItem("今日", "today") + self.quick_date.addItem("昨日", "yesterday") + self.quick_date.addItem("前天", "before_yesterday") + self.quick_date.addItem("自定义", "custom") + self.quick_date.currentIndexChanged.connect(self._quick_date_changed) + grid.addWidget(self.quick_date, 0, 0) + self.start_time = QDateTimeEdit(QDateTime.currentDateTime().addDays(-7)) + self.start_time.setDisplayFormat("yyyy-MM-dd HH:mm:ss") + self.start_time.setCalendarPopup(True) + self.start_time.setEnabled(False) + grid.addWidget(self.start_time, 0, 1) + self.end_time = QDateTimeEdit(QDateTime.currentDateTime()) + self.end_time.setDisplayFormat("yyyy-MM-dd HH:mm:ss") + self.end_time.setCalendarPopup(True) + self.end_time.setEnabled(False) + grid.addWidget(self.end_time, 0, 2) + self.audit_filter = QComboBox() + self.audit_filter.addItem("待审核", "pending") + self.audit_filter.addItem("全部审核状态", "all") + self.audit_filter.addItem("已通过", "passed") + self.audit_filter.addItem("未通过", "not_passed") + self.audit_filter.addItem("已驳回", "rejected") + self.audit_filter.setCurrentIndex(1) + grid.addWidget(self.audit_filter, 0, 3) + self.source_filter = QComboBox() + self.source_filter.addItem("全部来源", "all") + self.source_filter.addItem("手工", "manual") + self.source_filter.addItem("空白处方", "system") + grid.addWidget(self.source_filter, 0, 4) + self.sn_filter = QLineEdit() + self.sn_filter.setPlaceholderText("处方编号") + self.sn_filter.setClearButtonEnabled(True) + self.sn_filter.returnPressed.connect(self._search) + grid.addWidget(self.sn_filter, 1, 0) + self.patient_filter = QLineEdit() + self.patient_filter.setPlaceholderText("患者姓名") + self.patient_filter.setClearButtonEnabled(True) + self.patient_filter.returnPressed.connect(self._search) + grid.addWidget(self.patient_filter, 1, 1) + self.doctor_filter = DoctorMultiSelect() + current_id = _int(first_value(self.current_user, "id", "user_id"), 0) + current_name = str(first_value(self.current_user, "name", "real_name", default="")).strip() + if current_id and current_name: + self.doctor_filter.update_options([{"id": current_id, "name": current_name}]) + grid.addWidget(self.doctor_filter, 1, 2) + query = QPushButton("查询") + query.setProperty("variant", "secondary") + query.clicked.connect(self._search) + grid.addWidget(query, 1, 3) + reset = QPushButton("重置") + reset.setProperty("variant", "ghost") + reset.clicked.connect(self._reset_filters) + grid.addWidget(reset, 1, 4) + grid.setColumnStretch(1, 1) + grid.setColumnStretch(2, 1) + return frame + + def _build_table_card(self) -> QWidget: + card = QFrame() + card.setObjectName("Card") + layout = QVBoxLayout(card) + layout.setContentsMargins(14, 13, 14, 13) + layout.setSpacing(9) + toolbar = QHBoxLayout() + title = QLabel("处方列表") + title.setProperty("role", "sectionTitle") + toolbar.addWidget(title) + toolbar.addStretch(1) + self.view_button = self._action_button("查看", "cf.prescription/read", self._view_selected) + toolbar.addWidget(self.view_button) + self.patch_button = self._action_button( + "修正患者", "tcm.prescription/patchPatient", self._patch_selected + ) + toolbar.addWidget(self.patch_button) + self.create_order_button = self._action_button( + "创建订单", "tcm.prescriptionOrder/create", self._create_order + ) + toolbar.addWidget(self.create_order_button) + self.edit_button = self._action_button("编辑", "cf.prescription/edit", self._edit_selected) + toolbar.addWidget(self.edit_button) + self.audit_button = self._action_button( + "审核", "cf.prescription/audit", self._audit_selected + ) + toolbar.addWidget(self.audit_button) + self.delete_button = self._action_button( + "删除", "cf.prescription/del", self._delete_selected, danger=True + ) + toolbar.addWidget(self.delete_button) + refresh = QPushButton("刷新") + refresh.setProperty("variant", "ghost") + refresh.clicked.connect(self.refresh) + toolbar.addWidget(refresh) + layout.addLayout(toolbar) + self.stack = QStackedWidget() + table_host = QWidget() + table_layout = QVBoxLayout(table_host) + table_layout.setContentsMargins(0, 0, 0, 0) + self.table = SortableTable( + [ + TableColumn("sn", "处方编号", 190, _sn_cell), + TableColumn("prescription_type", "处方类型", 95), + TableColumn("is_system_auto", "来源", 90, _source_cell), + TableColumn("patient_name", "患者信息", 120, _patient_cell), + TableColumn("audit_status", "审核状态", 220, _audit_cell), + TableColumn("void_status", "作废", 70, _void_cell), + TableColumn("doctor_name", "医生信息", 130, _doctor_cell), + TableColumn("assistant_name", "医助", 90), + TableColumn("create_time", "创建时间", 145), + ] + ) + self.table.itemSelectionChanged.connect(self._selection_changed) + self.table.itemDoubleClicked.connect(lambda _item: self._view_selected()) + table_layout.addWidget(self.table, 1) + self.pager = Pager(self._page_size) + self.pager.page_changed.connect(self._change_page) + table_layout.addWidget(self.pager) + self.stack.addWidget(table_host) + self.stack.addWidget( + EmptyState("没有找到处方", "请调整创建时间、审核状态或患者筛选后重试。") + ) + layout.addWidget(self.stack, 1) + return card + + def _action_button( + self, + text: str, + permission: str, + handler: Callable[[], None], + *, + danger: bool = False, + ) -> QPushButton: + button = QPushButton(text) + if danger: + button.setProperty("variant", "danger") + button.setVisible(has_permission(self.permissions, permission)) + button.setEnabled(False) + button.clicked.connect(handler) + return button + + def _load_doctor_options(self) -> None: + """Populate the creator multi-select from the repository's doctor catalog.""" + + method = getattr(self.repository, "list_diagnosis_doctors", None) + if not callable(method): + return + run_async( + method, + on_success=lambda result: self.doctor_filter.update_options(page_items(result)), + ) + + def _quick_date_changed(self) -> None: + custom = self.quick_date.currentData() == "custom" + self.start_time.setEnabled(custom) + self.end_time.setEnabled(custom) + self._search() + + def _date_filters(self) -> tuple[str, str]: + value = self.quick_date.currentData() + if value == "all": + return "", "" + if value == "custom": + return ( + self.start_time.dateTime().toString("yyyy-MM-dd HH:mm:ss"), + self.end_time.dateTime().toString("yyyy-MM-dd HH:mm:ss"), + ) + offset = {"today": 0, "yesterday": 1, "before_yesterday": 2}.get(value, 0) + target = datetime.now().date() - timedelta(days=offset) + return ( + f"{target.isoformat()} 00:00:00", + f"{target.isoformat()} 23:59:59", + ) + + def _search(self) -> None: + self._page = 1 + self.refresh() + + def _reset_filters(self) -> None: + self.quick_date.blockSignals(True) + self.quick_date.setCurrentIndex(0) + self.quick_date.blockSignals(False) + self.start_time.setEnabled(False) + self.end_time.setEnabled(False) + self.audit_filter.setCurrentIndex(1) + self.source_filter.setCurrentIndex(0) + self.sn_filter.clear() + self.patient_filter.clear() + self.doctor_filter.clear() + self._search() + + def _change_page(self, page: int) -> None: + self._page = page + self.refresh() + + def refresh(self) -> None: + if self._loading: + self._refresh_pending = True + return + self._loading = True + self._refresh_pending = False + self._generation += 1 + generation = self._generation + requested_page = self._page + page_size = self._page_size + start_time, end_time = self._date_filters() + filters: dict[str, Any] = { + "sn": self.sn_filter.text().strip(), + "patient_name": self.patient_filter.text().strip(), + "audit_filter": "" + if self.audit_filter.currentData() == "all" + else self.audit_filter.currentData(), + "source_filter": "" + if self.source_filter.currentData() == "all" + else self.source_filter.currentData(), + "start_time": start_time, + "end_time": end_time, + } + creator_ids = self.doctor_filter.values() + if creator_ids: + filters["creator_ids"] = creator_ids + self.banner.show_message("正在加载处方列表…", "info") + run_async( + lambda: invoke( + self.repository, + "prescriptions", + page=requested_page, + page_size=page_size, + **filters, + ), + on_success=lambda result: self._apply_result(result, generation, requested_page), + on_error=lambda error: self._load_error(error, generation), + on_finished=lambda: self._load_finished(generation), + ) + + def _apply_result(self, result: Any, generation: int, requested_page: int) -> None: + if generation != self._generation: + return + rows = page_items(result) + self.table.set_rows(rows) + self.pager.update_state(requested_page, page_total(result, len(rows))) + self.stack.setCurrentIndex(0 if rows else 1) + doctor_rows = [] + for row in rows: + doctor_rows.append( + { + "id": first_value(row, "creator_id", "doctor_id"), + "name": first_value(row, "doctor_name", "creator_name"), + } + ) + extend_doctors = get_value(result, "extend.doctors", None) or get_value( + result, "doctors", None + ) + if isinstance(extend_doctors, (list, tuple)): + doctor_rows.extend(extend_doctors) + self.doctor_filter.update_options(doctor_rows) + self.banner.clear() + if rows and self.table.currentRow() < 0: + self.table.selectRow(0) + self._selection_changed() + + def _load_error(self, error: Exception, generation: int) -> None: + if generation == self._generation: + self.banner.show_message(friendly_error(error), "danger") + + def _load_finished(self, generation: int) -> None: + if generation == self._generation: + self._loading = False + if self._refresh_pending: + self._refresh_pending = False + self.refresh() + + def _selection_changed(self) -> None: + row = self.table.current_data() + active = not self._mutation_pending + self.view_button.setEnabled(active and row is not None) + self.patch_button.setEnabled(active and can_patch_patient(row)) + self.create_order_button.setEnabled(active and can_create_order(row)) + self.edit_button.setEnabled(active and can_edit_or_delete(row)) + self.audit_button.setEnabled(active and can_audit(row)) + self.delete_button.setEnabled(active and can_edit_or_delete(row)) + + def _set_mutation_pending(self, pending: bool) -> None: + self._mutation_pending = pending + self.add_button.setEnabled(not pending) + self.orders_button.setEnabled(not pending) + self._selection_changed() + + def _selected(self) -> Any: + return self.table.current_data() + + def _get_prescription(self, prescription_id: int) -> Any: + method = self.repository.get_prescription + return method(prescription_id) + + def _load_detail( + self, + row: Any, + callback: Callable[[Any], None], + *, + message: str = "正在加载处方详情…", + ) -> None: + prescription_id = _int(first_value(row, "id", "prescription_id"), 0) + if not prescription_id: + self.banner.show_message("处方 ID 无效。", "warning") + return + self._detail_generation += 1 + generation = self._detail_generation + self._detail_target = prescription_id + self.banner.show_message(message, "info") + run_async( + lambda: self._get_prescription(prescription_id), + on_success=lambda detail: self._detail_success( + detail, prescription_id, generation, callback + ), + on_error=lambda error: self._detail_error(error, prescription_id, generation), + ) + + def _detail_success( + self, + detail: Any, + prescription_id: int, + generation: int, + callback: Callable[[Any], None], + ) -> None: + if generation != self._detail_generation or prescription_id != self._detail_target: + return + self.banner.clear() + callback(detail) + + def _detail_error(self, error: Exception, prescription_id: int, generation: int) -> None: + if generation == self._detail_generation and prescription_id == self._detail_target: + self.banner.show_message(friendly_error(error), "danger") + + def _view_selected(self) -> None: + row = self._selected() + if row is None or not has_permission(self.permissions, "cf.prescription/read"): + return + self._load_detail(row, self._show_detail) + + def _show_detail(self, detail: Any) -> None: + if not has_permission(self.permissions, "cf.prescription/read"): + return + dialog = PrescriptionDetailDialog( + detail, + can_open_diagnosis=has_permission(self.permissions, "tcm.diagnosis/readonlyDetail"), + can_open_orders=has_permission(self.permissions, "tcm.prescriptionOrder/lists"), + parent=self, + ) + dialog.diagnosis_requested.connect(self._open_diagnosis) + dialog.orders_requested.connect(lambda prescription_id: self._open_orders(prescription_id)) + dialog.exec() + + def _open_diagnosis(self, diagnosis_id: int) -> None: + if not has_permission(self.permissions, "tcm.diagnosis/readonlyDetail"): + self.banner.show_message("无权查看诊单详情。", "danger") + return + diagnosis_id = _int(diagnosis_id, 0) + if diagnosis_id <= 0: + self.banner.show_message("诊单 ID 无效。", "warning") + return + method = getattr(self.repository, "get_diagnosis_detail", None) + readonly_keyword = True + if not callable(method): + method = getattr(self.repository, "diagnosis_readonly_detail", None) + readonly_keyword = False + if not callable(method): + self.banner.show_message("当前 repository 不支持诊单详情。", "danger") + return + self._diagnosis_detail_generation += 1 + generation = self._diagnosis_detail_generation + self._diagnosis_detail_target = diagnosis_id + self.banner.show_message("正在加载诊单详情…", "info") + run_async( + lambda: ( + method(diagnosis_id, readonly=True) if readonly_keyword else method(diagnosis_id) + ), + on_success=lambda detail: self._diagnosis_detail_success( + detail, diagnosis_id, generation + ), + on_error=lambda error: self._diagnosis_detail_error(error, diagnosis_id, generation), + ) + + def _diagnosis_detail_success(self, detail: Any, diagnosis_id: int, generation: int) -> None: + if ( + generation != self._diagnosis_detail_generation + or diagnosis_id != self._diagnosis_detail_target + ): + return + self.banner.clear() + DiagnosisDetailDialog(detail, self).exec() + + def _diagnosis_detail_error(self, error: Exception, diagnosis_id: int, generation: int) -> None: + if ( + generation == self._diagnosis_detail_generation + and diagnosis_id == self._diagnosis_detail_target + ): + self.banner.show_message(friendly_error(error), "danger") + + def _add_prescription(self) -> None: + if not has_permission(self.permissions, "cf.prescription/add"): + return + dialog = PrescriptionEditorDialog( + self.repository, + mode="add", + current_user=self.current_user, + parent=self, + ) + if dialog.exec() == QDialog.DialogCode.Accepted: + self._save_prescription(dialog.payload(), None) + + def _edit_selected(self) -> None: + row = self._selected() + if ( + row is None + or not has_permission(self.permissions, "cf.prescription/edit") + or not can_edit_or_delete(row) + ): + return + self._load_detail(row, self._open_editor, message="正在准备编辑处方…") + + def _open_editor(self, detail: Any) -> None: + dialog = PrescriptionEditorDialog( + self.repository, + detail, + mode="edit", + current_user=self.current_user, + parent=self, + ) + if dialog.exec() == QDialog.DialogCode.Accepted: + self._save_prescription( + dialog.payload(), + _int(first_value(detail, "id", "prescription_id"), 0), + ) + + def _save_prescription( + self, + payload: dict[str, Any], + prescription_id: int | None, + ) -> None: + permission = "cf.prescription/edit" if prescription_id else "cf.prescription/add" + if not has_permission(self.permissions, permission): + return + self._set_mutation_pending(True) + if prescription_id: + + def operation() -> Any: + return self.repository.update_prescription( + prescription_id, + changes=payload, + ) + + message = "处方已保存并重新进入待审核。" + else: + + def operation() -> Any: + return self.repository.create_prescription(payload) + + message = "处方已新增并提交审核。" + run_async( + operation, + on_success=lambda _result: self._mutation_success(message), + on_error=self._mutation_error, + on_finished=lambda: self._set_mutation_pending(False), + ) + + def _delete_selected(self) -> None: + row = self._selected() + if ( + row is None + or not has_permission(self.permissions, "cf.prescription/del") + or not can_edit_or_delete(row) + ): + return + answer = QMessageBox.warning( + self, + "删除处方", + "确定删除该处方吗?此操作无法撤销。", + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.Cancel, + QMessageBox.StandardButton.Cancel, + ) + if answer != QMessageBox.StandardButton.Yes: + return + prescription_id = _int(first_value(row, "id", "prescription_id"), 0) + self._set_mutation_pending(True) + run_async( + lambda: self.repository.delete_prescription(prescription_id), + on_success=lambda _result: self._mutation_success("处方已删除。"), + on_error=self._mutation_error, + on_finished=lambda: self._set_mutation_pending(False), + ) + + def _patch_selected(self) -> None: + row = self._selected() + if ( + row is None + or not has_permission(self.permissions, "tcm.prescription/patchPatient") + or not can_patch_patient(row) + ): + return + dialog = PatchPatientDialog(row, self) + if dialog.exec() != QDialog.DialogCode.Accepted: + return + payload = dialog.payload() + self._set_mutation_pending(True) + run_async( + lambda: self.repository.patch_prescription_patient( + payload["id"], + patient_name=payload["patient_name"], + phone=payload["phone"], + gender=payload["gender"], + ), + on_success=lambda _result: self._mutation_success("患者信息已修正。"), + on_error=self._mutation_error, + on_finished=lambda: self._set_mutation_pending(False), + ) + + def _audit_selected(self) -> None: + row = self._selected() + if ( + row is None + or not has_permission(self.permissions, "cf.prescription/audit") + or not can_audit(row) + ): + return + dialog = AuditPrescriptionDialog(row, self) + if dialog.exec() != QDialog.DialogCode.Accepted: + return + payload = dialog.payload() + self._set_mutation_pending(True) + run_async( + lambda: self.repository.audit_prescription( + payload["id"], + action=payload["action"], + remark=payload["remark"], + ), + on_success=lambda result: self._audit_success(result, payload["action"]), + on_error=self._mutation_error, + on_finished=lambda: self._set_mutation_pending(False), + ) + + def _audit_success(self, result: Any, action: str) -> None: + message = "处方已驳回并作废。" if action == "reject" else "处方审核已通过。" + self._mutation_success(message) + if ( + isinstance(result, Mapping) + and result.get("wecom_notify_ok") is False + and result.get("wecom_notify_hint") + ): + show_toast(self, str(result["wecom_notify_hint"]), "warning", 5000) + + def _create_order(self) -> None: + row = self._selected() + if ( + row is None + or not has_permission(self.permissions, "tcm.prescriptionOrder/create") + or not can_create_order(row) + ): + return + self._load_detail(row, self._open_order_editor, message="正在准备业务订单…") + + def _open_order_editor(self, detail: Any) -> None: + if not has_permission(self.permissions, "tcm.prescriptionOrder/create"): + return + dialog = PrescriptionOrderDialog( + self.repository, + detail, + can_select_ship_mode=has_permission( + self.permissions, "tcm.prescriptionOrder/setShipMode" + ), + can_view_internal_cost=has_permission(self.permissions, "finance.account_log/lists"), + can_edit_pharmacy_remark=has_permission( + self.permissions, "tcm.prescriptionOrder/editRemarkExtra" + ), + parent=self, + ) + if dialog.exec() != QDialog.DialogCode.Accepted: + return + payload = dialog.payload() + self._set_mutation_pending(True) + run_async( + lambda: self.repository.create_prescription_order(payload), + on_success=lambda result: self._order_created(result), + on_error=self._mutation_error, + on_finished=lambda: self._set_mutation_pending(False), + ) + + def _order_created(self, result: Any) -> None: + order_no = first_value(result, "order_no", "data.order_no", default="") + message = f"业务订单已创建:{order_no}" if order_no else "业务订单已创建。" + self._mutation_success(message) + + def _open_orders(self, prescription_id: int | None = None) -> None: + if not has_permission(self.permissions, "tcm.prescriptionOrder/lists"): + return + PrescriptionOrderListDialog( + self.repository, + prescription_id=prescription_id, + parent=self, + ).exec() + + def _mutation_success(self, message: str) -> None: + self.banner.clear() + show_toast(self, message, "success", 3600) + self.refresh() + + def _mutation_error(self, error: Exception) -> None: + message = friendly_error(error) + self.banner.show_message(message, "danger") + show_toast(self, message, "danger", 5000) + + def showEvent(self, event: Any) -> None: + super().showEvent(event) + if self.table.rowCount() == 0 and not self._loading: + self.refresh() + + +__all__ = [ + "PrescriptionsPage", + "can_audit", + "can_create_order", + "can_edit_or_delete", + "can_patch_patient", + "is_approved_active", + "prescription_status", +] diff --git a/app/src/doctor_workstation/ui/pages/reception.py b/app/src/doctor_workstation/ui/pages/reception.py new file mode 100644 index 000000000..1b00196d4 --- /dev/null +++ b/app/src/doctor_workstation/ui/pages/reception.py @@ -0,0 +1,1772 @@ +"""Same-day reception queue and active patient workspace.""" + +from __future__ import annotations + +from collections.abc import Sequence +from contextlib import suppress +from datetime import date, timedelta +from pathlib import Path +from typing import Any + +from PySide6.QtCore import Qt, QTimer, Signal +from PySide6.QtGui import QTextCursor +from PySide6.QtWidgets import ( + QFileDialog, + QFrame, + QGridLayout, + QHBoxLayout, + QLabel, + QLineEdit, + QListWidget, + QListWidgetItem, + QMessageBox, + QPushButton, + QScrollArea, + QSplitter, + QStackedWidget, + QTabBar, + QTextEdit, + QVBoxLayout, + QWidget, +) + +from ..dialogs import DiagnosisDialog +from ..widgets import ( + EmptyState, + MessageBanner, + PageHeader, + StatusBadge, + clear_layout, + display_text, + first_value, + friendly_error, + gender_text, + get_value, + has_permission, + invoke, + page_items, + run_async, + section_title, + show_toast, +) + +STATUS_KIND = {1: "warning", 2: "neutral", 3: "success", 4: "danger"} +STATUS_TEXT = {1: "待接诊", 2: "已取消", 3: "已完成", 4: "已过号"} +RECEPTION_STATUSES = {1, 4} +NOTE_LIMIT = 500 +MAX_NOTE_MEDIA = 99 + + +def _as_int(value: object, default: int | None = None) -> int | None: + """Return an integer identifier/status without raising on API aliases.""" + + if value in (None, ""): + return default + try: + return int(value) # type: ignore[arg-type] + except (TypeError, ValueError): + return default + + +def _same_id(left: object, right: object) -> bool: + """Compare identifiers while accepting the API's string/int alternation.""" + + if left in (None, "") or right in (None, ""): + return False + return str(left) == str(right) + + +def _record_id(record: Any) -> int | None: + """Return the canonical appointment identifier from a queue row.""" + + return _as_int(first_value(record, "id", "appointment_id", default=None)) + + +def _mask_phone(value: object) -> str: + """Mask any phone value unless it was already masked by the server.""" + + text = str(value or "").strip() + if not text: + return "—" + if "*" in text: + return text + digits = "".join(character for character in text if character.isdigit()) + if len(digits) >= 7: + return f"{digits[:3]}****{digits[-4:]}" + if len(text) > 4: + return f"{text[:2]}***{text[-2:]}" + return "****" + + +def _sequence(value: object) -> list[Any]: + """Normalise direct arrays and comma-separated attachment values.""" + + if isinstance(value, str): + return [item.strip() for item in value.split(",") if item.strip()] + if isinstance(value, Sequence) and not isinstance(value, (bytes, bytearray)): + return list(value) + return [] + + +def _attachment_name(value: object) -> str: + """Return a compact, human-readable attachment label.""" + + text = str(value or "").strip() + if not text: + return "未命名附件" + name = text.replace("\\", "/").rstrip("/").rsplit("/", 1)[-1] + return name or text + + +def _is_local_material_reference(value: str) -> bool: + """Reject local filesystem references before a note JSON is constructed.""" + + text = value.strip() + return ( + text.lower().startswith("file:") + or text.startswith(("\\\\", "//")) + or (len(text) >= 3 and text[0].isalpha() and text[1] == ":" and text[2] in "\\/") + or "\\" in text + ) + + +class QueueRow(QWidget): + """Compact appointment summary rendered inside the queue list.""" + + def __init__(self, record: Any, parent: QWidget | None = None) -> None: + super().__init__(parent) + layout = QVBoxLayout(self) + layout.setContentsMargins(12, 9, 12, 9) + layout.setSpacing(5) + top = QHBoxLayout() + name = QLabel( + display_text(first_value(record, "patient_name", "name", default="未命名患者")) + ) + name.setStyleSheet("font-size:14px; font-weight:700; color:#17382F;") + top.addWidget(name) + top.addStretch(1) + status_number = _as_int(first_value(record, "status", default=1), 1) or 1 + badge = StatusBadge( + display_text( + first_value( + record, + "status_desc", + "status_text", + default=STATUS_TEXT.get(status_number, status_number), + ) + ), + STATUS_KIND.get(status_number, "neutral"), + ) + top.addWidget(badge) + layout.addLayout(top) + time = first_value( + record, "appointment_time_text", "appointment_time", "time", default="时间待确认" + ) + meta = QLabel( + f"{display_text(time)} · " + f"{gender_text(first_value(record, 'gender_desc', 'gender'))} / " + f"{display_text(first_value(record, 'age'))}岁" + ) + meta.setProperty("role", "muted") + layout.addWidget(meta) + assistant = first_value(record, "assistant_name", default=None) + if assistant: + owner = QLabel(f"医助:{assistant}") + owner.setProperty("role", "muted") + owner.setStyleSheet("font-size:11px;") + layout.addWidget(owner) + + +class ReceptionPage(QWidget): + """Run the complete same-day reception workflow without blocking Qt.""" + + video_requested = Signal(dict) + + def __init__( + self, + repository: Any, + permissions: Any = None, + current_user: Any = None, + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.repository = repository + self.permissions = permissions + self.current_user = current_user + self._queue_generation = 0 + self._detail_generation = 0 + self._selected_record: Any = None + self._selected_detail: Any = None + self._selected_appointment_id: int | None = None + self._queue_loading = False + self._queue_requests: set[int] = set() + self._queue_records: list[Any] = [] + self._queue_page = 0 + self._queue_page_size = 15 + self._queue_total = 0 + self._queue_query: dict[str, Any] | None = None + self._queue_query_key: tuple[Any, ...] | None = None + self._detail_loading = False + self._detail_requests: set[tuple[int, int]] = set() + self._pending_tongue_images: list[str] = [] + self._pending_report_files: list[str] = [] + self._note_busy = False + + self._can_complete = has_permission(self.permissions, "doctor.appointment/complete") + self._can_note = has_permission(self.permissions, "doctor.appointment/addDoctorNote") + self._can_edit = has_permission(self.permissions, "tcm.diagnosis/edit") + self._can_phone_plain = has_permission( + self.permissions, "tcm.diagnosis/phonePlain", default=False + ) + + root = QVBoxLayout(self) + root.setContentsMargins(24, 20, 24, 24) + root.setSpacing(18) + header = PageHeader("接诊台", "查看今日队列,在一个工作区内完成病历核对与接诊。") + refresh_button = QPushButton("刷新") + refresh_button.setProperty("variant", "secondary") + refresh_button.clicked.connect(lambda: self.refresh()) + header.add_action(refresh_button) + root.addWidget(header) + + splitter = QSplitter(Qt.Orientation.Horizontal) + splitter.setChildrenCollapsible(False) + splitter.addWidget(self._build_queue_panel()) + splitter.addWidget(self._build_detail_panel()) + splitter.setStretchFactor(0, 0) + splitter.setStretchFactor(1, 1) + splitter.setSizes([350, 760]) + root.addWidget(splitter, 1) + + self.diagnosis_dialog = DiagnosisDialog(repository, self) + self.diagnosis_dialog.saved.connect(self._diagnosis_saved) + + self.poll_timer = QTimer(self) + self.poll_timer.setInterval(5_000) + self.poll_timer.timeout.connect(lambda: self.refresh(silent=True)) + + def _build_queue_panel(self) -> QWidget: + panel = QFrame() + panel.setObjectName("Card") + panel.setMinimumWidth(290) + panel.setMaximumWidth(430) + layout = QVBoxLayout(panel) + layout.setContentsMargins(16, 16, 16, 16) + layout.setSpacing(11) + layout.addWidget(section_title("今日队列")) + + self.queue_tabs = QTabBar() + self.queue_tabs.setExpanding(True) + self.queue_tabs.addTab("待接诊") + self.queue_tabs.addTab("已过号") + self.queue_tabs.currentChanged.connect(self._on_tab_changed) + layout.addWidget(self.queue_tabs) + + search_row = QHBoxLayout() + self.search_edit = QLineEdit() + self.search_edit.setPlaceholderText("搜索患者姓名") + self.search_edit.setClearButtonEnabled(True) + self.search_edit.returnPressed.connect(lambda: self.refresh()) + self.search_edit.textChanged.connect(self._search_changed) + search_row.addWidget(self.search_edit, 1) + search_button = QPushButton("搜索") + search_button.clicked.connect(lambda: self.refresh()) + search_row.addWidget(search_button) + layout.addLayout(search_row) + + self.queue_banner = MessageBanner() + layout.addWidget(self.queue_banner) + self.queue_stack = QStackedWidget() + self.queue_list = QListWidget() + self.queue_list.setSpacing(4) + self.queue_list.currentItemChanged.connect(self._on_queue_selection) + self.queue_stack.addWidget(self.queue_list) + self.queue_empty = EmptyState("队列为空", "当前筛选下没有待处理患者。", "重新加载") + self.queue_empty.action_requested.connect(lambda: self.refresh()) + self.queue_stack.addWidget(self.queue_empty) + layout.addWidget(self.queue_stack, 1) + self.load_more_button = QPushButton("继续加载") + self.load_more_button.setProperty("variant", "secondary") + self.load_more_button.clicked.connect(self._load_more) + self.load_more_button.setVisible(False) + layout.addWidget(self.load_more_button) + self.queue_summary = QLabel("等待加载") + self.queue_summary.setProperty("role", "muted") + layout.addWidget(self.queue_summary) + return panel + + def _build_detail_panel(self) -> QWidget: + panel = QFrame() + panel.setObjectName("Card") + panel.setMinimumWidth(430) + panel_layout = QVBoxLayout(panel) + panel_layout.setContentsMargins(0, 0, 0, 0) + + self.detail_stack = QStackedWidget() + self.detail_empty = EmptyState("选择一位患者", "从左侧队列选择患者后,这里会显示接诊详情。") + self.detail_stack.addWidget(self.detail_empty) + scroll = QScrollArea() + scroll.setWidgetResizable(True) + scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + content = QWidget() + content.setMinimumWidth(390) + detail_layout = QVBoxLayout(content) + detail_layout.setContentsMargins(22, 20, 22, 24) + detail_layout.setSpacing(16) + + self.detail_banner = MessageBanner() + detail_layout.addWidget(self.detail_banner) + patient_head = QHBoxLayout() + identity = QVBoxLayout() + identity.setSpacing(3) + self.patient_name_label = QLabel("—") + self.patient_name_label.setProperty("role", "pageTitle") + identity.addWidget(self.patient_name_label) + self.patient_meta_label = QLabel("—") + self.patient_meta_label.setProperty("role", "muted") + identity.addWidget(self.patient_meta_label) + patient_head.addLayout(identity, 1) + self.detail_status = StatusBadge("—", "neutral") + patient_head.addWidget(self.detail_status, 0, Qt.AlignmentFlag.AlignTop) + detail_layout.addLayout(patient_head) + + action_row = QHBoxLayout() + action_row.setSpacing(8) + self.notify_button = QPushButton("通知医助") + self.notify_button.clicked.connect(self._notify_assistant) + action_row.addWidget(self.notify_button) + self.video_button = QPushButton("发起视频") + self.video_button.setProperty("variant", "secondary") + self.video_button.clicked.connect(self._request_video) + action_row.addWidget(self.video_button) + self.edit_button = QPushButton("编辑病历") + self.edit_button.setProperty("variant", "secondary") + self.edit_button.clicked.connect(self._edit_diagnosis) + self.edit_button.setVisible(self._can_edit) + action_row.addWidget(self.edit_button) + action_row.addStretch(1) + self.complete_button = QPushButton("完成接诊") + self.complete_button.setProperty("variant", "primary") + self.complete_button.clicked.connect(self._complete_appointment) + self.complete_button.setVisible(self._can_complete) + action_row.addWidget(self.complete_button) + detail_layout.addLayout(action_row) + + appointment_card, self.appointment_labels = self._field_card( + "预约信息", + ( + ("预约时间", "time"), + ("联系方式", "phone"), + ("接诊医生", "doctor"), + ("协助医助", "assistant"), + ("预约类型", "type"), + ("预约渠道", "channel"), + ("当前状态", "status"), + ("预约备注", "remark"), + ), + ) + detail_layout.addWidget(appointment_card) + patient_card, self.patient_labels = self._field_card( + "患者信息", + ( + ("患者编号", "patient_id"), + ("手机", "phone"), + ("性别 / 年龄", "gender_age"), + ("身高 / 体重", "body"), + ("所在地区", "region"), + ("身份证", "id_card"), + ("客服 / 来源", "customer"), + ("处方状态", "prescription"), + ), + ) + detail_layout.addWidget(patient_card) + + diagnosis_card = QFrame() + diagnosis_card.setObjectName("SubtleCard") + diagnosis_layout = QVBoxLayout(diagnosis_card) + diagnosis_layout.setContentsMargins(16, 14, 16, 14) + diagnosis_layout.setSpacing(9) + diagnosis_layout.addWidget(section_title("完整病例")) + self.diagnosis_text = QLabel("尚未填写病例信息") + self.diagnosis_text.setWordWrap(True) + self.diagnosis_text.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse) + diagnosis_layout.addWidget(self.diagnosis_text) + self.prescription_hint = QLabel("处方:—") + self.prescription_hint.setProperty("role", "muted") + diagnosis_layout.addWidget(self.prescription_hint) + detail_layout.addWidget(diagnosis_card) + + daily_card = QFrame() + daily_card.setObjectName("SubtleCard") + daily_layout = QVBoxLayout(daily_card) + daily_layout.setContentsMargins(16, 14, 16, 14) + daily_layout.setSpacing(9) + daily_layout.addWidget(section_title("近 30 日日常记录")) + self.daily_text = QLabel("选择患者后加载血糖血压、饮食、运动与跟踪备注。") + self.daily_text.setWordWrap(True) + self.daily_text.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse) + daily_layout.addWidget(self.daily_text) + detail_layout.addWidget(daily_card) + + notes_header = QWidget() + notes_header_layout = QHBoxLayout(notes_header) + notes_header_layout.setContentsMargins(0, 0, 0, 0) + note_title = QLabel("医生备注与附件") + note_title.setProperty("role", "sectionTitle") + notes_header_layout.addWidget(note_title) + notes_header_layout.addStretch(1) + self.notes_count = QLabel("0 条") + self.notes_count.setProperty("role", "muted") + notes_header_layout.addWidget(self.notes_count) + detail_layout.addWidget(notes_header) + self.notes_container = QWidget() + self.notes_layout = QVBoxLayout(self.notes_container) + self.notes_layout.setContentsMargins(0, 0, 0, 0) + self.notes_layout.setSpacing(8) + detail_layout.addWidget(self.notes_container) + + self.note_edit = QTextEdit() + self.note_edit.setPlaceholderText("记录本次沟通要点(最多 500 字,不会自动提交)") + self.note_edit.setMaximumHeight(105) + self.note_edit.textChanged.connect(self._limit_note_text) + self.note_edit.setVisible(self._can_note) + detail_layout.addWidget(self.note_edit) + self.note_counter = QLabel(f"0 / {NOTE_LIMIT}") + self.note_counter.setProperty("role", "muted") + self.note_counter.setAlignment(Qt.AlignmentFlag.AlignRight) + self.note_counter.setVisible(self._can_note) + detail_layout.addWidget(self.note_counter) + + attachment_actions = QHBoxLayout() + self.add_tongue_button = QPushButton("添加舌苔图") + self.add_tongue_button.setProperty("variant", "secondary") + self.add_tongue_button.clicked.connect(self._choose_tongue_images) + self.add_tongue_button.setVisible(self._can_note) + attachment_actions.addWidget(self.add_tongue_button) + self.add_report_button = QPushButton("添加检查报告") + self.add_report_button.setProperty("variant", "secondary") + self.add_report_button.clicked.connect(self._choose_report_files) + self.add_report_button.setVisible(self._can_note) + attachment_actions.addWidget(self.add_report_button) + attachment_actions.addStretch(1) + detail_layout.addLayout(attachment_actions) + self.pending_attachments = QWidget() + self.pending_attachments_layout = QVBoxLayout(self.pending_attachments) + self.pending_attachments_layout.setContentsMargins(0, 0, 0, 0) + self.pending_attachments_layout.setSpacing(4) + self.pending_attachments.setVisible(self._can_note) + detail_layout.addWidget(self.pending_attachments) + + note_action = QHBoxLayout() + note_action.addStretch(1) + self.save_note_button = QPushButton("保存备注") + self.save_note_button.setProperty("variant", "secondary") + self.save_note_button.clicked.connect(self._save_note) + self.save_note_button.setVisible(self._can_note) + note_action.addWidget(self.save_note_button) + detail_layout.addLayout(note_action) + detail_layout.addStretch(1) + + scroll.setWidget(content) + self.detail_stack.addWidget(scroll) + panel_layout.addWidget(self.detail_stack) + self._reset_detail_content() + return panel + + @staticmethod + def _field_card( + title: str, fields: Sequence[tuple[str, str]] + ) -> tuple[QFrame, dict[str, QLabel]]: + """Build a compact two-column field card and return its value labels.""" + + card = QFrame() + card.setObjectName("SubtleCard") + layout = QVBoxLayout(card) + layout.setContentsMargins(16, 14, 16, 14) + layout.setSpacing(10) + layout.addWidget(section_title(title)) + grid = QGridLayout() + grid.setHorizontalSpacing(24) + grid.setVerticalSpacing(10) + labels: dict[str, QLabel] = {} + for index, (caption_text, key) in enumerate(fields): + row, column = divmod(index, 2) + box = QVBoxLayout() + caption = QLabel(caption_text) + caption.setProperty("role", "muted") + value = QLabel("—") + value.setStyleSheet("font-weight:600;") + value.setWordWrap(True) + box.addWidget(caption) + box.addWidget(value) + labels[key] = value + grid.addLayout(box, row, column) + layout.addLayout(grid) + return card, labels + + @property + def queue_status(self) -> int: + """Return the admin queue status represented by the current tab.""" + + return 1 if self.queue_tabs.currentIndex() == 0 else 4 + + def _search_changed(self, value: str) -> None: + if not value and self.isVisible(): + self.refresh() + + def _on_tab_changed(self, _index: int) -> None: + self._clear_selection() + self._reset_queue_state() + self.refresh() + + def refresh(self, silent: bool = False) -> None: + """Replace the queue with page one using a GUI-thread query snapshot.""" + + today = date.today().isoformat() + query = { + "status": self.queue_status, + "start_date": today, + "end_date": today, + "page_no": 1, + "page_size": self._queue_page_size, + "patient_name": self.search_edit.text().strip(), + } + query_key = self._query_key(query) + if query_key != self._queue_query_key: + self._clear_selection() + self._reset_queue_state() + self._queue_query = dict(query) + self._queue_query_key = query_key + self._request_queue_page(query, append=False, silent=silent) + + @staticmethod + def _query_key(query: dict[str, Any]) -> tuple[Any, ...]: + return ( + query["status"], + query["start_date"], + query["end_date"], + query["patient_name"], + ) + + def _reset_queue_state(self) -> None: + self._queue_records = [] + self._queue_page = 0 + self._queue_total = 0 + self._queue_query = None + self._queue_query_key = None + if hasattr(self, "queue_list"): + self.queue_list.blockSignals(True) + self.queue_list.clear() + self.queue_list.blockSignals(False) + self.queue_stack.setCurrentIndex(1) + self.queue_summary.setText("等待加载") + self.load_more_button.setVisible(False) + + def _load_more(self) -> None: + if self._queue_loading or self._queue_query is None or not self._queue_has_more(): + return + query = dict(self._queue_query) + query["page_no"] = self._queue_page + 1 + self._request_queue_page(query, append=True, silent=True) + + def _queue_has_more(self) -> bool: + return self._queue_page * self._queue_page_size < self._queue_total + + def _request_queue_page( + self, + query: dict[str, Any], + *, + append: bool, + silent: bool, + ) -> None: + self._queue_generation += 1 + generation = self._queue_generation + self._queue_requests.add(generation) + self._queue_loading = True + self.load_more_button.setEnabled(False) + if not silent: + self.queue_banner.show_message("正在加载队列…", "info") + frozen_query = dict(query) + page_no = int(frozen_query["page_no"]) + query_key = self._query_key(frozen_query) + run_async( + lambda frozen_query=frozen_query: invoke( + self.repository, + "reception_queue", + **frozen_query, + ), + on_success=lambda result: self._apply_queue( + result, + generation, + page_no=page_no, + append=append, + query_key=query_key, + ), + on_error=lambda error: self._queue_error(error, generation), + on_finished=lambda: self._queue_finished(generation), + ) + + def _apply_queue( + self, + result: Any, + generation: int, + *, + page_no: int = 1, + append: bool = False, + query_key: tuple[Any, ...] | None = None, + ) -> None: + if generation != self._queue_generation or query_key not in (None, self._queue_query_key): + return + page_records = page_items(result) + if append: + records = list(self._queue_records) + existing_ids = { + record_id for record in records if (record_id := _record_id(record)) is not None + } + for record in page_records: + record_id = _record_id(record) + if record_id is None or record_id not in existing_ids: + records.append(record) + if record_id is not None: + existing_ids.add(record_id) + else: + records = list(page_records) + raw_total = get_value(result, "total", None) + if raw_total is None: + raw_total = get_value(result, "count", None) + total = _as_int(raw_total, None) + if total is None: + loaded_through = (page_no - 1) * self._queue_page_size + len(page_records) + total = ( + loaded_through if len(page_records) < self._queue_page_size else loaded_through + 1 + ) + self._queue_records = records + self._queue_page = page_no + self._queue_total = max(total, len(records)) + selected_id = self._selected_appointment_id + row_to_select = next( + ( + index + for index, record in enumerate(records) + if selected_id is not None and _same_id(_record_id(record), selected_id) + ), + -1, + ) + if row_to_select < 0 and records: + row_to_select = 0 + self.queue_list.blockSignals(True) + self.queue_list.clear() + for record in records: + item = QListWidgetItem() + item.setData(Qt.ItemDataRole.UserRole, record) + row_widget = QueueRow(record) + item.setSizeHint(row_widget.sizeHint()) + self.queue_list.addItem(item) + self.queue_list.setItemWidget(item, row_widget) + if row_to_select >= 0: + self.queue_list.setCurrentRow(row_to_select) + self.queue_list.blockSignals(False) + self.queue_summary.setText(f"已加载 {len(records)} / 共 {self._queue_total} 位患者") + has_more = self._queue_has_more() + self.load_more_button.setVisible(has_more) + self.load_more_button.setEnabled(has_more and not self._queue_loading) + self.queue_stack.setCurrentIndex(0 if records else 1) + self.queue_banner.clear() + if not records: + self._clear_selection() + return + chosen = records[row_to_select] + if selected_id is not None and _same_id(_record_id(chosen), selected_id): + self._selected_record = chosen + if not append: + self._load_detail(chosen, silent=True, clear=False) + else: + self._select_record(chosen, silent=True) + + def _queue_error(self, error: Exception, generation: int) -> None: + if generation == self._queue_generation: + self.queue_banner.show_message(friendly_error(error), "danger") + + def _queue_finished(self, generation: int) -> None: + self._queue_requests.discard(generation) + self._queue_loading = self._queue_generation in self._queue_requests + if generation == self._queue_generation or not self._queue_loading: + has_more = self._queue_has_more() + self.load_more_button.setVisible(has_more) + self.load_more_button.setEnabled(has_more and not self._queue_loading) + + def _on_queue_selection( + self, current: QListWidgetItem | None, _previous: QListWidgetItem | None + ) -> None: + if current is None: + self._clear_selection() + return + self._select_record(current.data(Qt.ItemDataRole.UserRole)) + + def _select_record(self, record: Any, *, silent: bool = False) -> None: + appointment_id = _record_id(record) + if appointment_id is None: + self._clear_selection() + self.detail_stack.setCurrentIndex(1) + self.detail_banner.show_message("该队列记录缺少挂号编号。", "danger") + return + selection_changed = not _same_id(appointment_id, self._selected_appointment_id) + if selection_changed: + self.note_edit.clear() + self._pending_tongue_images.clear() + self._pending_report_files.clear() + self._render_pending_attachments() + self._selected_record = record + self._selected_appointment_id = appointment_id + self._selected_detail = None + self._load_detail(record, silent=silent, clear=True) + + def _load_detail(self, record: Any, silent: bool = False, *, clear: bool = True) -> None: + """Start a new detail generation even while an older request is running.""" + + appointment_id = _record_id(record) + if appointment_id is None: + return + self._detail_generation += 1 + generation = self._detail_generation + self._selected_record = record + self._selected_appointment_id = appointment_id + if clear: + self._selected_detail = None + self._reset_detail_content(seed=record) + self.detail_stack.setCurrentIndex(1) + if not silent: + self.detail_banner.show_message("正在加载患者详情…", "info") + self._detail_loading = True + self._detail_requests.add((generation, appointment_id)) + run_async( + lambda: self._fetch_detail_bundle(record, appointment_id), + on_success=lambda bundle: self._apply_detail(bundle, generation, appointment_id), + on_error=lambda error: self._detail_error(error, generation, appointment_id), + on_finished=lambda: self._detail_finished(generation, appointment_id), + ) + + def _fetch_detail_bundle(self, record: Any, appointment_id: int) -> dict[str, Any]: + detail = invoke( + self.repository, + "reception_detail", + appointment_id=appointment_id, + id=appointment_id, + ) + if ( + get_value(detail, "data", None) is not None + and get_value(detail, "appointment", None) is None + ): + detail = get_value(detail, "data", detail) + diagnosis_id = _as_int( + first_value( + get_value(detail, "diagnosis", None) or {}, + "id", + "diagnosis_id", + default=first_value(record, "diagnosis_id", default=None), + ) + ) + notes = get_value(detail, "doctor_notes", None) or get_value(detail, "notes", None) or [] + notes = list(notes) if isinstance(notes, (list, tuple)) else [notes] + daily: Any = {} + tracking_notes: list[Any] = [] + warnings: list[str] = [] + if diagnosis_id is not None and callable( + getattr(self.repository, "get_doctor_notes", None) + ): + try: + notes = page_items( + invoke( + self.repository, + "get_doctor_notes", + diagnosis_id=diagnosis_id, + ) + ) + except Exception as error: + warnings.append(f"医生备注:{friendly_error(error)}") + if diagnosis_id is not None and callable( + getattr(self.repository, "get_tracking_window", None) + ): + end_date = date.today() + try: + daily = invoke( + self.repository, + "get_tracking_window", + diagnosis_id=diagnosis_id, + start_date=(end_date - timedelta(days=29)).isoformat(), + end_date=end_date.isoformat(), + ) + except Exception as error: + warnings.append(f"日常记录:{friendly_error(error)}") + if diagnosis_id is not None and callable( + getattr(self.repository, "list_tracking_notes", None) + ): + try: + tracking_notes = page_items( + invoke( + self.repository, + "list_tracking_notes", + diagnosis_id=diagnosis_id, + ) + ) + except Exception as error: + warnings.append(f"跟踪备注:{friendly_error(error)}") + return { + "detail": detail, + "notes": notes, + "daily": daily, + "tracking_notes": tracking_notes, + "warnings": warnings, + } + + def _apply_detail( + self, bundle: Any, generation: int, appointment_id: int | None = None + ) -> None: + expected_id = appointment_id or self._selected_appointment_id + if ( + generation != self._detail_generation + or expected_id is None + or not _same_id(expected_id, self._selected_appointment_id) + ): + return + detail = get_value(bundle, "detail", None) + if detail is None: + detail = bundle + if ( + get_value(detail, "data", None) is not None + and get_value(detail, "appointment", None) is None + ): + detail = get_value(detail, "data", detail) + appointment = get_value(detail, "appointment", None) or self._selected_record or {} + actual_id = first_value(appointment, "id", "appointment_id", default=expected_id) + if not _same_id(actual_id, expected_id): + self._selected_detail = None + self._reset_detail_content(seed=self._selected_record) + self.detail_banner.show_message("服务端返回了另一位患者的详情,已拒绝显示。", "danger") + return + self._selected_detail = detail + diagnosis = get_value(detail, "diagnosis", None) or {} + patient = get_value(detail, "patient", None) or {} + self._render_identity(appointment, patient, diagnosis) + self._render_appointment(appointment, patient, diagnosis) + self._render_patient(appointment, patient, diagnosis) + self._render_case(appointment, patient, diagnosis) + notes = get_value(bundle, "notes", None) + if notes is None: + notes = get_value(detail, "doctor_notes", None) or get_value(detail, "notes", None) + self._render_notes(list(notes or [])) + self._render_daily( + get_value(bundle, "daily", None) or {}, + list(get_value(bundle, "tracking_notes", None) or []), + ) + warnings = list(get_value(bundle, "warnings", None) or []) + if warnings: + self.detail_banner.show_message(";".join(str(item) for item in warnings), "warning") + else: + self.detail_banner.clear() + self._update_action_state(appointment, diagnosis) + + def _render_identity(self, appointment: Any, patient: Any, diagnosis: Any) -> None: + patient_name = first_value( + appointment, + "patient_name", + "name", + default=first_value( + diagnosis, + "patient_name", + default=first_value(patient, "patient_name", "name", default="未命名患者"), + ), + ) + self.patient_name_label.setText(display_text(patient_name)) + gender = gender_text( + first_value( + diagnosis, + "gender_desc", + "gender", + default=first_value( + patient, + "gender_desc", + "gender", + default=first_value(appointment, "gender_desc", "gender"), + ), + ) + ) + age = first_value( + diagnosis, + "age", + default=first_value(patient, "age", default=first_value(appointment, "age")), + ) + patient_id = first_value( + appointment, + "patient_id", + default=first_value(diagnosis, "patient_id", "source_patient_id", default="—"), + ) + self.patient_meta_label.setText( + f"{gender} · {display_text(age)}岁 · 患者编号 {display_text(patient_id)}" + ) + status_number = ( + _as_int(first_value(appointment, "status", default=self.queue_status), 0) or 0 + ) + status_text = first_value( + appointment, + "status_desc", + "status_text", + default=STATUS_TEXT.get(status_number, status_number), + ) + self.detail_status.set_status( + display_text(status_text), STATUS_KIND.get(status_number, "neutral") + ) + + def _render_appointment(self, appointment: Any, patient: Any, diagnosis: Any) -> None: + date_text = first_value(appointment, "appointment_date", "date", default="") + time_text = first_value( + appointment, "appointment_time_text", "appointment_time", "time", default="" + ) + period_text = first_value(appointment, "period_text", "period_desc", "period", default="") + time_parts = [ + str(part).strip() + for part in (date_text, time_text, period_text) + if part not in (None, "") and str(part).strip() + ] + self.appointment_labels["time"].setText(" ".join(time_parts) or "—") + self.appointment_labels["phone"].setText(self._phone_text(appointment, patient, diagnosis)) + self.appointment_labels["doctor"].setText( + display_text( + first_value( + appointment, + "doctor_name", + default=first_value(self.current_user, "name", "display_name"), + ) + ) + ) + self.appointment_labels["assistant"].setText( + display_text(first_value(appointment, "assistant_name")) + ) + self.appointment_labels["type"].setText( + display_text( + first_value( + appointment, + "appointment_type_text", + "type_text", + "appointment_type", + "type", + ) + ) + ) + self.appointment_labels["channel"].setText( + display_text( + first_value( + appointment, + "channel_text", + "channel_name", + "appointment_channel_text", + "channel", + ) + ) + ) + status_number = _as_int(first_value(appointment, "status", default=0), 0) or 0 + self.appointment_labels["status"].setText( + display_text( + first_value( + appointment, + "status_desc", + "status_text", + default=STATUS_TEXT.get(status_number, status_number), + ) + ) + ) + self.appointment_labels["remark"].setText(display_text(first_value(appointment, "remark"))) + + def _render_patient(self, appointment: Any, patient: Any, diagnosis: Any) -> None: + patient_id = first_value( + appointment, + "patient_id", + default=first_value( + diagnosis, "patient_id", "source_patient_id", default=first_value(patient, "id") + ), + ) + gender = gender_text( + first_value( + diagnosis, + "gender_desc", + "gender", + default=first_value( + patient, + "gender_desc", + "gender", + default=first_value(appointment, "gender_desc", "gender"), + ), + ) + ) + age = first_value( + diagnosis, + "age", + default=first_value(patient, "age", default=first_value(appointment, "age")), + ) + height = first_value( + diagnosis, + "height", + default=first_value(patient, "height", default=first_value(appointment, "height")), + ) + weight = first_value( + diagnosis, + "weight", + default=first_value(patient, "weight", default=first_value(appointment, "weight")), + ) + body = " / ".join( + part + for part in ( + f"{display_text(height)} cm" if height not in (None, "") else "", + f"{display_text(weight)} kg" if weight not in (None, "") else "", + ) + if part + ) + region = first_value( + diagnosis, + "region_text", + "region", + "address_region", + default=first_value(patient, "region_text", "region"), + ) + customer = first_value( + appointment, + "customer_service_name", + "service_name", + "source_text", + default=first_value(diagnosis, "source_text", "source_name", "source"), + ) + has_prescription = bool( + first_value( + appointment, + "has_prescription", + default=first_value(diagnosis, "has_prescription", default=False), + ) + ) + self.patient_labels["patient_id"].setText(display_text(patient_id)) + self.patient_labels["phone"].setText(self._phone_text(appointment, patient, diagnosis)) + self.patient_labels["gender_age"].setText(f"{gender} / {display_text(age)}岁") + self.patient_labels["body"].setText(body or "—") + self.patient_labels["region"].setText(display_text(region)) + self.patient_labels["id_card"].setText( + display_text(first_value(diagnosis, "id_card", default=first_value(patient, "id_card"))) + ) + self.patient_labels["customer"].setText(display_text(customer)) + self.patient_labels["prescription"].setText("已开具" if has_prescription else "暂未开具") + + def _render_case(self, appointment: Any, patient: Any, diagnosis: Any) -> None: + systolic = first_value( + diagnosis, "systolic", "systolic_pressure", "high_pressure", default=None + ) + diastolic = first_value( + diagnosis, "diastolic", "diastolic_pressure", "low_pressure", default=None + ) + blood_pressure = ( + f"{display_text(systolic)}/{display_text(diastolic)} mmHg" + if systolic not in (None, "") or diastolic not in (None, "") + else first_value(diagnosis, "blood_pressure", default=None) + ) + fields: tuple[tuple[str, tuple[str, ...]], ...] = ( + ("诊断日期", ("diagnosis_date",)), + ("诊断类型", ("diagnosis_type_text", "diagnosis_type_desc", "diagnosis_type")), + ("婚姻状态", ("marital_status_text", "marital_status_desc", "marital_status")), + ("主诉", ("chief_complaint", "complaint")), + ("主要症状", ("symptoms", "main_symptoms")), + ("现病史", ("present_illness", "present_illness_history")), + ("发现糖尿病病史", ("diabetes_discovery_year_text", "diabetes_discovery_year")), + ("当地就诊医院", ("local_hospital_name", "local_hospital")), + ("当地医院诊断结果", ("local_hospital_diagnosis", "local_diagnosis")), + ("口腔感觉", ("appetite_text", "appetite_desc", "appetite")), + ("每日饮水量", ("water_intake_text", "water_intake_desc", "water_intake")), + ("近月体重变化", ("weight_change_text", "weight_change_desc", "weight_change")), + ( + "脂肪肝程度", + ("fatty_liver_degree_text", "fatty_liver_degree_desc", "fatty_liver_degree"), + ), + ("饮食情况", ("diet_condition_text", "diet_condition_desc", "diet_condition")), + ("肢体感觉", ("body_feeling_text", "body_feeling_desc", "body_feeling")), + ("睡眠情况", ("sleep_condition_text", "sleep_condition_desc", "sleep_condition")), + ("眼睛情况", ("eye_condition_text", "eye_condition_desc", "eye_condition")), + ("头部感觉", ("head_feeling_text", "head_feeling_desc", "head_feeling")), + ("出汗情况", ("sweat_condition_text", "sweat_condition_desc", "sweat_condition")), + ("皮肤情况", ("skin_condition_text", "skin_condition_desc", "skin_condition")), + ("小便情况", ("urine_condition_text", "urine_condition_desc", "urine_condition")), + ("大便情况", ("stool_condition_text", "stool_condition_desc", "stool_condition")), + ("腰肾情况", ("kidney_condition_text", "kidney_condition_desc", "kidney_condition")), + ("既往史", ("past_history_text", "past_history_desc", "past_history")), + ("外伤史", ("trauma_history_text", "trauma_history_desc", "trauma_history")), + ("手术史", ("surgery_history_text", "surgery_history_desc", "surgery_history")), + ("过敏史", ("allergy_history_text", "allergy_history_desc", "allergy_history")), + ("个人史", ("personal_history_text", "personal_history_desc", "personal_history")), + ("家族史", ("family_history_text", "family_history_desc", "family_history")), + ( + "妊娠哺乳史", + ("pregnancy_history_text", "pregnancy_history_desc", "pregnancy_history"), + ), + ("糖尿病史", ("diabetes_history_text", "diabetes_history", "diabetes_desc")), + ( + "当前用药", + ("current_medications", "current_medicine", "current_medication"), + ), + ("临床诊断", ("clinical_diagnosis", "diagnosis")), + ("舌象", ("tongue", "tongue_coating")), + ("脉象", ("pulse", "pulse_condition")), + ("治则", ("treatment_principle",)), + ("处方意见", ("prescription_opinion", "prescription_advice")), + ("其他病史", ("other_history", "medical_history_other")), + ("病例备注", ("remark",)), + ) + lines: list[str] = [] + if blood_pressure: + lines.append(f"血压:{display_text(blood_pressure)}") + blood_sugar = first_value( + diagnosis, + "fasting_blood_sugar", + "fasting_glucose", + "fasting_blood_glucose", + "blood_sugar", + default=None, + ) + if blood_sugar not in (None, ""): + lines.append(f"空腹血糖:{display_text(blood_sugar)} mmol/L") + for caption, keys in fields: + value = first_value(diagnosis, *keys, default=None) + if value in (None, "", [], {}): + value = first_value(patient, *keys, default=None) + if value not in (None, "", [], {}): + if isinstance(value, (list, tuple, set)): + value = "、".join(str(item) for item in value if str(item).strip()) + lines.append(f"{caption}:{value}") + self.diagnosis_text.setText("\n".join(lines) if lines else "尚未填写病例信息。") + has_prescription = bool( + first_value( + appointment, + "has_prescription", + default=first_value(diagnosis, "has_prescription", default=False), + ) + ) + self.prescription_hint.setText("处方:已开具" if has_prescription else "处方:暂未开具") + + def _phone_text(self, appointment: Any, patient: Any, diagnosis: Any) -> str: + masked = first_value( + patient, + "phone_masked", + default=first_value( + diagnosis, + "phone_masked", + default=first_value(appointment, "phone_masked", default=None), + ), + ) + raw = first_value( + diagnosis, + "phone", + "patient_phone", + default=first_value( + patient, + "phone", + "patient_phone", + default=first_value(appointment, "patient_phone", "phone", default=masked), + ), + ) + if self._can_phone_plain: + return display_text(raw or masked) + return _mask_phone(masked or raw) + + def _render_daily(self, daily: Any, tracking_notes: list[Any]) -> None: + lines: list[str] = [] + groups = ( + ( + "血糖血压", + first_value(daily, "blood_records", "blood", "blood_pressure_records", default=[]), + ), + ("饮食", first_value(daily, "diet_records", "diet", default=[])), + ("运动", first_value(daily, "exercise_records", "exercise", default=[])), + ) + for title, raw_rows in groups: + rows = _sequence(raw_rows) + for row in rows[:8]: + record_date = display_text(first_value(row, "record_date", "date", "create_time")) + if title == "血糖血压": + systolic = first_value(row, "systolic", "high_pressure", default=None) + diastolic = first_value(row, "diastolic", "low_pressure", default=None) + glucose = first_value( + row, + "fasting_glucose", + "blood_sugar", + "postprandial_glucose", + default=None, + ) + values = [] + if systolic not in (None, "") or diastolic not in (None, ""): + values.append(f"血压 {display_text(systolic)}/{display_text(diastolic)}") + if glucose not in (None, ""): + values.append(f"血糖 {display_text(glucose)}") + content = ",".join(values) or display_text( + first_value(row, "content", "remark") + ) + else: + content = display_text( + first_value(row, "content", "description", "remark", "record_content") + ) + lines.append(f"{title} · {record_date}:{content}") + for row in tracking_notes[:8]: + lines.append( + f"跟踪备注 · {display_text(first_value(row, 'note_date', 'create_time'))}:" + f"{display_text(first_value(row, 'tracking_content', 'content', 'remark'))}" + ) + self.daily_text.setText("\n".join(lines) if lines else "近 30 日暂无日常记录。") + + def _render_notes(self, notes: list[Any]) -> None: + clear_layout(self.notes_layout) + self.notes_count.setText(f"{len(notes)} 条") + if not notes: + empty = QLabel("暂无医生备注") + empty.setProperty("role", "muted") + self.notes_layout.addWidget(empty) + return + for note in notes: + card = QFrame() + card.setObjectName("SubtleCard") + layout = QVBoxLayout(card) + layout.setContentsMargins(12, 10, 12, 10) + layout.setSpacing(5) + content = QLabel(display_text(first_value(note, "content", "note", "remark"))) + content.setWordWrap(True) + content.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse) + layout.addWidget(content) + meta = QLabel( + f"{display_text(first_value(note, 'doctor_name', 'creator_name'), '医生')} · " + f"{display_text(first_value(note, 'note_date', 'create_time', 'created_at', 'time'))}" + ) + meta.setProperty("role", "muted") + layout.addWidget(meta) + note_id = _as_int(first_value(note, "id", "note_id", default=None)) + for image_type, caption in ( + ("tongue_images", "舌苔图"), + ("report_files", "检查报告"), + ): + for path in _sequence(first_value(note, image_type, default=[])): + attachment = QWidget() + attachment_layout = QHBoxLayout(attachment) + attachment_layout.setContentsMargins(0, 0, 0, 0) + label = QLabel(f"{caption}:{_attachment_name(path)}") + label.setToolTip(str(path)) + label.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse) + attachment_layout.addWidget(label, 1) + if self._can_note and note_id is not None: + delete_button = QPushButton("删除") + delete_button.setProperty("variant", "secondary") + delete_button.clicked.connect( + lambda _checked=False, current_note_id=note_id, current_type=image_type, current_path=str(path), button=delete_button: ( + self._delete_note_attachment( + current_note_id, current_type, current_path, button + ) + ) + ) + attachment_layout.addWidget(delete_button) + layout.addWidget(attachment) + self.notes_layout.addWidget(card) + + def _reset_detail_content(self, seed: Any = None) -> None: + self.patient_name_label.setText( + display_text(first_value(seed, "patient_name", "name", default="—")) + ) + self.patient_meta_label.setText("正在核对患者、诊单与预约信息…" if seed else "—") + self.detail_status.set_status("—", "neutral") + for label in getattr(self, "appointment_labels", {}).values(): + label.setText("—") + for label in getattr(self, "patient_labels", {}).values(): + label.setText("—") + if hasattr(self, "diagnosis_text"): + self.diagnosis_text.setText("正在加载病例…" if seed else "尚未填写病例信息") + self.prescription_hint.setText("处方:—") + self.daily_text.setText("正在加载日常记录…" if seed else "选择患者后加载日常记录。") + self._render_notes([]) + self._update_action_state(seed or {}, {}) + + def _update_action_state(self, appointment: Any, diagnosis: Any) -> None: + appointment_id = _record_id(appointment) or self._selected_appointment_id + diagnosis_id = _as_int( + first_value( + diagnosis, + "id", + "diagnosis_id", + default=first_value(self._selected_record, "diagnosis_id", default=None), + ) + ) + patient_id = _as_int( + first_value( + appointment, + "patient_id", + default=first_value(diagnosis, "patient_id", "source_patient_id", default=None), + ) + ) + status = _as_int(first_value(appointment, "status", default=None)) + self.notify_button.setEnabled(appointment_id is not None) + self.video_button.setEnabled( + appointment_id is not None and diagnosis_id is not None and patient_id is not None + ) + self.edit_button.setEnabled(diagnosis_id is not None) + self.complete_button.setEnabled( + self._can_complete and appointment_id is not None and status in RECEPTION_STATUSES + ) + note_enabled = self._can_note and diagnosis_id is not None and not self._note_busy + self.note_edit.setEnabled(note_enabled) + self.add_tongue_button.setEnabled(note_enabled) + self.add_report_button.setEnabled(note_enabled) + self.save_note_button.setEnabled(note_enabled) + + def _detail_error( + self, error: Exception, generation: int, appointment_id: int | None = None + ) -> None: + expected_id = appointment_id or self._selected_appointment_id + if ( + generation == self._detail_generation + and expected_id is not None + and _same_id(expected_id, self._selected_appointment_id) + ): + self._selected_detail = None + self.detail_banner.show_message(friendly_error(error), "danger") + self._update_action_state(self._selected_record or {}, {}) + + def _detail_finished(self, generation: int, appointment_id: int) -> None: + self._detail_requests.discard((generation, appointment_id)) + self._detail_loading = bool(self._detail_requests) + + def _clear_selection(self) -> None: + self._detail_generation += 1 + self._selected_record = None + self._selected_detail = None + self._selected_appointment_id = None + self._pending_tongue_images.clear() + self._pending_report_files.clear() + if hasattr(self, "pending_attachments_layout"): + self._render_pending_attachments() + if hasattr(self, "detail_stack"): + self._reset_detail_content() + self.detail_banner.clear() + self.detail_stack.setCurrentIndex(0) + + def _selection_context(self) -> tuple[int, int, int | None, int | None] | None: + appointment_id = self._selected_appointment_id + if appointment_id is None: + return None + appointment = ( + get_value(self._selected_detail, "appointment", None) or self._selected_record or {} + ) + diagnosis = get_value(self._selected_detail, "diagnosis", None) or {} + diagnosis_id = _as_int( + first_value( + diagnosis, + "id", + "diagnosis_id", + default=first_value(self._selected_record, "diagnosis_id", default=None), + ) + ) + patient_id = _as_int( + first_value( + appointment, + "patient_id", + default=first_value( + diagnosis, + "patient_id", + "source_patient_id", + default=first_value(self._selected_record, "patient_id", default=None), + ), + ) + ) + return self._detail_generation, appointment_id, diagnosis_id, patient_id + + def _context_current(self, generation: int, appointment_id: int) -> bool: + return generation == self._detail_generation and _same_id( + appointment_id, self._selected_appointment_id + ) + + def _notify_assistant(self) -> None: + context = self._selection_context() + if context is None: + return + generation, appointment_id, _diagnosis_id, _patient_id = context + self.notify_button.setEnabled(False) + run_async( + lambda: invoke( + self.repository, + "notify_assistant", + appointment_id=appointment_id, + id=appointment_id, + ), + on_success=lambda _result: self._notification_sent(generation, appointment_id), + on_error=lambda error: show_toast(self, friendly_error(error), "danger", 4200), + on_finished=lambda: self._restore_action_state(generation, appointment_id), + ) + + def _notification_sent(self, generation: int, appointment_id: int) -> None: + show_toast(self, "已通知医助。", "success") + self.refresh(silent=True) + if self._context_current(generation, appointment_id) and self._selected_record is not None: + self._load_detail(self._selected_record, silent=True, clear=False) + + def _limit_note_text(self) -> None: + text = self.note_edit.toPlainText() + if len(text) > NOTE_LIMIT: + self.note_edit.blockSignals(True) + self.note_edit.setPlainText(text[:NOTE_LIMIT]) + self.note_edit.moveCursor(QTextCursor.MoveOperation.End) + self.note_edit.blockSignals(False) + text = text[:NOTE_LIMIT] + self.note_counter.setText(f"{len(text)} / {NOTE_LIMIT}") + + def _choose_tongue_images(self) -> None: + paths, _selected_filter = QFileDialog.getOpenFileNames( + self, + "选择舌苔图片", + "", + "图片 (*.png *.jpg *.jpeg *.webp *.bmp);;所有文件 (*)", + ) + self._add_pending_files("tongue_images", paths) + + def _choose_report_files(self) -> None: + paths, _selected_filter = QFileDialog.getOpenFileNames( + self, + "选择检查报告", + "", + "报告文件 (*.pdf *.png *.jpg *.jpeg *.doc *.docx);;所有文件 (*)", + ) + self._add_pending_files("report_files", paths) + + def _add_pending_files(self, image_type: str, paths: Sequence[str]) -> None: + target = ( + self._pending_tongue_images + if image_type == "tongue_images" + else self._pending_report_files + ) + for raw_path in paths: + path = str(Path(raw_path)) + if path not in target: + target.append(path) + if len(target) > MAX_NOTE_MEDIA: + del target[MAX_NOTE_MEDIA:] + show_toast(self, f"每类附件最多 {MAX_NOTE_MEDIA} 个。", "warning") + self._render_pending_attachments() + + def _render_pending_attachments(self) -> None: + clear_layout(self.pending_attachments_layout) + pairs = ( + ("舌苔图", "tongue_images", self._pending_tongue_images), + ("检查报告", "report_files", self._pending_report_files), + ) + for caption, image_type, paths in pairs: + for path in paths: + row = QWidget() + layout = QHBoxLayout(row) + layout.setContentsMargins(0, 0, 0, 0) + label = QLabel(f"待上传 {caption}:{_attachment_name(path)}") + label.setToolTip(path) + layout.addWidget(label, 1) + remove = QPushButton("移除") + remove.setProperty("variant", "secondary") + remove.clicked.connect( + lambda _checked=False, current_type=image_type, current_path=path: ( + self._remove_pending_file(current_type, current_path) + ) + ) + layout.addWidget(remove) + self.pending_attachments_layout.addWidget(row) + + def _remove_pending_file(self, image_type: str, path: str) -> None: + target = ( + self._pending_tongue_images + if image_type == "tongue_images" + else self._pending_report_files + ) + if path in target: + target.remove(path) + self._render_pending_attachments() + + def _save_note(self) -> None: + context = self._selection_context() + if context is None: + return + generation, appointment_id, diagnosis_id, _patient_id = context + content = self.note_edit.toPlainText().strip() + tongue_images = list(self._pending_tongue_images) + report_files = list(self._pending_report_files) + if not content and not tongue_images and not report_files: + show_toast(self, "请填写备注或添加附件。", "danger") + self.note_edit.setFocus() + return + if len(content) > NOTE_LIMIT: + show_toast(self, f"备注不能超过 {NOTE_LIMIT} 字。", "danger") + return + if diagnosis_id is None: + show_toast(self, "当前患者缺少诊单编号,无法保存备注。", "danger") + return + self._note_busy = True + self._update_action_state( + get_value(self._selected_detail, "appointment", None) or self._selected_record or {}, + get_value(self._selected_detail, "diagnosis", None) or {}, + ) + run_async( + lambda: self._upload_and_add_note( + diagnosis_id, + content, + tongue_images, + report_files, + ), + on_success=lambda _result: self._note_saved(generation, appointment_id), + on_error=lambda error: self._note_error(error, generation, appointment_id), + on_finished=lambda: self._note_finished(generation, appointment_id), + ) + + def _upload_and_add_note( + self, + diagnosis_id: int, + content: str, + tongue_paths: Sequence[str], + report_paths: Sequence[str], + ) -> Any: + """Upload every local file, then submit one server-reference-only note.""" + + uploaded_tongue = self._upload_note_materials( + tongue_paths, material_type="image", label="舌苔图" + ) + uploaded_reports = self._upload_note_materials( + report_paths, material_type="file", label="检查报告" + ) + return invoke( + self.repository, + "add_doctor_note", + diagnosis_id=diagnosis_id, + content=content, + tongue_images=uploaded_tongue, + report_files=uploaded_reports, + ) + + def _upload_note_materials( + self, + paths: Sequence[str], + *, + material_type: str, + label: str, + ) -> list[str]: + """Upload files in selection order with filename-specific failures.""" + + uploaded: list[str] = [] + for path in paths: + try: + result = invoke( + self.repository, + "upload_material", + path=path, + material_type=material_type, + cid=0, + ) + except Exception as error: + raise RuntimeError( + f"{label}“{_attachment_name(path)}”上传失败:{friendly_error(error)}" + ) from error + reference = str(result or "").strip() + if not reference or _is_local_material_reference(reference): + raise RuntimeError( + f"{label}“{_attachment_name(path)}”上传失败:服务端未返回安全的 uri/url" + ) + uploaded.append(reference) + return uploaded + + def _note_error( + self, + error: Exception, + generation: int, + appointment_id: int, + ) -> None: + if self._context_current(generation, appointment_id): + show_toast(self, friendly_error(error), "danger", 5200) + + def _note_saved(self, generation: int, appointment_id: int) -> None: + show_toast(self, "备注已保存。", "success") + if not self._context_current(generation, appointment_id): + return + self.note_edit.clear() + self._pending_tongue_images.clear() + self._pending_report_files.clear() + self._render_pending_attachments() + self.refresh(silent=True) + if self._selected_record is not None: + self._load_detail(self._selected_record, silent=True, clear=False) + + def _note_finished(self, generation: int, appointment_id: int) -> None: + self._note_busy = False + if self._context_current(generation, appointment_id): + self._restore_action_state(generation, appointment_id) + + def _delete_note_attachment( + self, + note_id: int, + image_type: str, + image_path: str, + button: QPushButton, + ) -> None: + context = self._selection_context() + if context is None: + return + generation, appointment_id, _diagnosis_id, _patient_id = context + answer = QMessageBox.question( + self, + "删除附件", + f"确认删除“{_attachment_name(image_path)}”吗?", + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.Cancel, + QMessageBox.StandardButton.Cancel, + ) + if answer != QMessageBox.StandardButton.Yes: + return + button.setEnabled(False) + run_async( + lambda: invoke( + self.repository, + "delete_doctor_note_image", + note_id=note_id, + image_type=image_type, + image_path=image_path, + ), + on_success=lambda _result: self._attachment_deleted(generation, appointment_id), + on_error=lambda error: self._attachment_delete_error(error, button), + on_finished=lambda: None, + ) + + def _attachment_deleted(self, generation: int, appointment_id: int) -> None: + show_toast(self, "附件已删除。", "success") + if self._context_current(generation, appointment_id) and self._selected_record is not None: + self._load_detail(self._selected_record, silent=True, clear=False) + + def _attachment_delete_error(self, error: Exception, button: QPushButton) -> None: + with suppress(RuntimeError): + button.setEnabled(True) + show_toast(self, friendly_error(error), "danger", 4200) + + def _edit_diagnosis(self) -> None: + if not self._can_edit: + show_toast(self, "当前账号没有编辑病历权限。", "danger") + return + context = self._selection_context() + if context is None or context[2] is None: + show_toast(self, "当前患者缺少诊单编号。", "danger") + return + self.diagnosis_dialog.open_for( + context[2], editable=True, seed=self._selected_detail or self._selected_record + ) + + def _diagnosis_saved(self) -> None: + show_toast(self, "病历已保存,正在刷新接诊信息。", "success") + self.refresh(silent=True) + if self._selected_record is not None: + self._load_detail(self._selected_record, silent=True, clear=False) + + def _complete_appointment(self) -> None: + if not self._can_complete: + show_toast(self, "当前账号没有完成接诊权限。", "danger") + return + context = self._selection_context() + if context is None: + return + generation, appointment_id, _diagnosis_id, _patient_id = context + appointment = ( + get_value(self._selected_detail, "appointment", None) or self._selected_record or {} + ) + status = _as_int(first_value(appointment, "status", default=None)) + if status not in RECEPTION_STATUSES: + show_toast(self, "仅待接诊或已过号记录可以完成接诊。", "danger") + return + answer = QMessageBox.question( + self, + "确认完成接诊", + "系统会再次核对服务端挂号状态;完成后不可撤销。确认继续吗?", + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.Cancel, + QMessageBox.StandardButton.Cancel, + ) + if answer != QMessageBox.StandardButton.Yes: + return + self.complete_button.setEnabled(False) + run_async( + lambda: self._complete_after_revalidation(appointment_id), + on_success=lambda _result: self._appointment_completed(generation, appointment_id), + on_error=lambda error: show_toast(self, friendly_error(error), "danger", 4200), + on_finished=lambda: self._restore_action_state(generation, appointment_id), + ) + + def _complete_after_revalidation(self, appointment_id: int) -> Any: + detail = invoke( + self.repository, + "reception_detail", + appointment_id=appointment_id, + id=appointment_id, + ) + if ( + get_value(detail, "data", None) is not None + and get_value(detail, "appointment", None) is None + ): + detail = get_value(detail, "data", detail) + appointment = get_value(detail, "appointment", None) or {} + actual_id = first_value(appointment, "id", "appointment_id", default=None) + status = _as_int(first_value(appointment, "status", default=None)) + if not _same_id(actual_id, appointment_id): + raise ValueError("服务端挂号记录与当前患者不一致,已停止完成操作") + if status not in RECEPTION_STATUSES: + raise ValueError("挂号状态已变化,请刷新队列后重试") + return invoke( + self.repository, + "complete_appointment", + appointment_id=appointment_id, + id=appointment_id, + ) + + def _appointment_completed(self, generation: int, appointment_id: int) -> None: + show_toast(self, "接诊已完成。", "success") + if self._context_current(generation, appointment_id): + self._clear_selection() + self.refresh(silent=True) + + def _restore_action_state(self, generation: int, appointment_id: int) -> None: + if not self._context_current(generation, appointment_id): + return + appointment = ( + get_value(self._selected_detail, "appointment", None) or self._selected_record or {} + ) + diagnosis = get_value(self._selected_detail, "diagnosis", None) or {} + self._update_action_state(appointment, diagnosis) + + def _request_video(self) -> None: + context = self._selection_context() + if context is None: + return + _generation, appointment_id, diagnosis_id, patient_id = context + if diagnosis_id is None or patient_id is None: + show_toast(self, "患者或诊单编号不完整,无法发起视频。", "danger") + return + appointment = get_value(self._selected_detail, "appointment", None) or self._selected_record + diagnosis = get_value(self._selected_detail, "diagnosis", None) or {} + payload = { + "source": "reception", + "appointment_id": appointment_id, + "patient_id": patient_id, + "diagnosis_id": diagnosis_id, + "patient_name": first_value( + appointment, + "patient_name", + default=first_value(diagnosis, "patient_name", default="患者"), + ), + "record": self._selected_record, + } + self.video_requested.emit(payload) + + def showEvent(self, event: Any) -> None: + super().showEvent(event) + if not self.poll_timer.isActive(): + self.poll_timer.start() + if self.queue_list.count() == 0 and not self._queue_loading: + self.refresh() + + def hideEvent(self, event: Any) -> None: + self.poll_timer.stop() + super().hideEvent(event) + + +__all__ = ["ReceptionPage"] diff --git a/app/src/doctor_workstation/ui/shell.py b/app/src/doctor_workstation/ui/shell.py new file mode 100644 index 000000000..80439b3a0 --- /dev/null +++ b/app/src/doctor_workstation/ui/shell.py @@ -0,0 +1,521 @@ +"""Authenticated application shell with permission-aware navigation.""" + +from __future__ import annotations + +from collections.abc import Mapping, Sequence +from dataclasses import dataclass +from typing import Any + +from PySide6.QtCore import Qt, Signal +from PySide6.QtWidgets import ( + QButtonGroup, + QFrame, + QHBoxLayout, + QLabel, + QMainWindow, + QPushButton, + QStackedWidget, + QVBoxLayout, + QWidget, +) + +from .pages import ( + ConsultationsPage, + PatientsPage, + PrescriptionLibraryPage, + PrescriptionsPage, + ReceptionPage, +) +from .widgets import EmptyState, StatusBadge, display_text, first_value, get_value + + +@dataclass(frozen=True) +class NavigationItem: + key: str + title: str + glyph: str + page_type: type[QWidget] + permissions: tuple[str, ...] + + +NAVIGATION = ( + NavigationItem( + "reception", + "接诊台", + "◎", + ReceptionPage, + ("doctor.appointment/lists",), + ), + NavigationItem( + "prescription_library", + "我的处方库", + "方", + PrescriptionLibraryPage, + ("tcm.prescriptionLibrary/lists",), + ), + NavigationItem( + "prescriptions", + "已开处方", + "笺", + PrescriptionsPage, + ("tcm.prescription/lists",), + ), + NavigationItem( + "patients", + "我的患者", + "患", + PatientsPage, + ("firstvisit.myPatient/lists",), + ), + NavigationItem( + "consultations", + "问诊列表", + "询", + ConsultationsPage, + ("tcm.diagnosis/lists",), + ), +) + + +_NAVIGATION_BY_PERMISSION = {item.permissions[0]: item for item in NAVIGATION} +_MENU_ROUTE_IDENTIFIERS = { + "reception": { + "reception", + "patient/reception", + "patient/reception/index", + }, + "prescription_library": { + "prescription-library", + "prescription_library", + "consumer/prescription/list", + }, + "prescriptions": { + "prescriptions", + "consumer/prescription/index", + }, + "patients": { + "patients", + "first_visit/my_patients", + "first_visit/my_patients/index", + }, + "consultations": { + "consultations", + "tcm/diagnosis", + "tcm/diagnosis/index", + }, +} + + +def _canonical_allowed(permissions: Any, code: str) -> bool: + """Apply the core exact/wildcard semantics without slash-dot aliases.""" + + if permissions is None: + return True + for method_name in ("allows", "has", "can_access_page", "has_page", "can"): + method = getattr(permissions, method_name, None) + if callable(method): + try: + return bool(method(code)) + except (TypeError, ValueError): + continue + raw = permissions + for attr in ("codes", "permissions", "values"): + candidate = getattr(permissions, attr, None) + if candidate is not None and not callable(candidate): + raw = candidate + break + if isinstance(raw, Mapping): + nested = first_value(raw, "codes", "permissions", "values", default=None) + if nested is not None: + raw = nested + if isinstance(raw, Mapping): + available = {str(key) for key, enabled in raw.items() if enabled} + elif isinstance(raw, str): + available = {raw} + else: + try: + available = {str(value) for value in raw} + except TypeError: + return False + if "*" in available or code in available: + return True + return any(grant.endswith("/*") and code.startswith(grant[:-1]) for grant in available) + + +def _menu_rows(value: Any) -> list[Mapping[str, Any]]: + if not isinstance(value, Sequence) or isinstance(value, (str, bytes, bytearray)): + return [] + return [row for row in value if isinstance(row, Mapping)] + + +def _menu_visible(row: Mapping[str, Any]) -> bool: + value = get_value(row, "is_show", 1) + if isinstance(value, str): + return value.strip().lower() not in {"0", "false", "hidden", "no"} + return value != 0 + + +def _menu_enabled(row: Mapping[str, Any]) -> bool: + value = get_value(row, "is_disable", 0) + if isinstance(value, str): + return value.strip().lower() not in {"1", "true", "disabled", "yes"} + return value != 1 + + +def _menu_sort(row: Mapping[str, Any]) -> float: + try: + return float(first_value(row, "sort", "sort_order", "order", default=0)) + except (TypeError, ValueError): + return 0.0 + + +def _visible_menu_nodes(value: Any) -> list[Mapping[str, Any]]: + """Flatten visible, enabled nodes; larger admin sort values come first.""" + + nodes = _menu_rows(value) + ordered = sorted(enumerate(nodes), key=lambda pair: (-_menu_sort(pair[1]), pair[0])) + result: list[Mapping[str, Any]] = [] + for _index, node in ordered: + if not _menu_visible(node) or not _menu_enabled(node): + continue + result.append(node) + children = first_value(node, "children", "child", "childs", default=[]) + result.extend(_visible_menu_nodes(children)) + return result + + +def _normalise_route(value: Any) -> str: + route = str(value or "").strip().replace("\\", "/").lower() + route = route.split("?", 1)[0].split("#", 1)[0].strip("/") + if route.endswith(".vue"): + route = route[:-4] + return route + + +def _menu_permissions(row: Mapping[str, Any]) -> tuple[str, ...]: + value = first_value(row, "perms", "permission", "meta.perms", default="") + if isinstance(value, str): + return (value.strip(),) if value.strip() else () + if isinstance(value, Sequence): + return tuple(str(item).strip() for item in value if str(item).strip()) + return () + + +def _match_navigation(row: Mapping[str, Any]) -> NavigationItem | None: + for permission in _menu_permissions(row): + item = _NAVIGATION_BY_PERMISSION.get(permission) + if item is not None: + return item + identifiers = { + _normalise_route(first_value(row, "paths", "path")), + _normalise_route(get_value(row, "component", "")), + } + identifiers.discard("") + for item in NAVIGATION: + if identifiers & _MENU_ROUTE_IDENTIFIERS[item.key]: + return item + return None + + +def _resolve_navigation( + menu: Any, + permissions: Any, + *, + demo_mode: bool, +) -> list[tuple[NavigationItem, str]]: + """Resolve only locally supported pages from the authoritative menu tree.""" + + rows = _menu_rows(menu) + if rows: + resolved: list[tuple[NavigationItem, str]] = [] + seen: set[str] = set() + for row in _visible_menu_nodes(rows): + item = _match_navigation(row) + if item is None or item.key in seen: + continue + if not _canonical_allowed(permissions, item.permissions[0]): + continue + title_value = first_value(row, "name", "title", "meta.title", default=item.title) + title = str(title_value).strip() or item.title + resolved.append((item, title)) + seen.add(item.key) + return resolved + if demo_mode: + return [ + (item, item.title) + for item in NAVIGATION + if _canonical_allowed(permissions, item.permissions[0]) + ] + return [] + + +class ShellWindow(QMainWindow): + """Main workstation window. + + The expected construction signature is ``ShellWindow(repository, session, + permissions=None)``. ``session`` may be a Session dataclass, the payload + emitted by :class:`LoginWindow`, or a plain mapping. + """ + + logout_requested = Signal() + video_requested = Signal(dict) + page_changed = Signal(str) + + def __init__( + self, + repository: Any, + session: Any, + permissions: Any = None, + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.repository = repository + self.login_payload = session + self.session = get_value(session, "session", None) or session + self.current_user = ( + get_value(session, "user", None) + or get_value(self.session, "user", None) + or get_value(session, "current_user", None) + or session + ) + if permissions is not None: + self.permissions = permissions + else: + session_permissions = get_value(self.session, "permissions", None) + self.permissions = ( + session_permissions + if session_permissions is not None + else get_value(self.current_user, "permissions", None) + ) + session_menu = get_value(self.session, "menu", None) + self.menu = session_menu if session_menu is not None else get_value(session, "menu", []) + self.demo_mode = bool( + get_value(session, "demo_mode", False) + or get_value(self.session, "metadata.demo", False) + or get_value(self.session, "metadata.demo_mode", False) + ) + self.navigation = _resolve_navigation( + self.menu, + self.permissions, + demo_mode=self.demo_mode, + ) + self.pages: dict[str, QWidget] = {} + self.nav_buttons: dict[str, QPushButton] = {} + self.page_titles: dict[int, str] = {} + + self.setWindowTitle("臻阳堂 · 医生工作站") + self.setMinimumSize(1024, 640) + self.resize(1280, 800) + + canvas = QWidget() + canvas.setObjectName("AppCanvas") + self.setCentralWidget(canvas) + root = QHBoxLayout(canvas) + root.setContentsMargins(0, 0, 0, 0) + root.setSpacing(0) + root.addWidget(self._build_sidebar()) + + workspace = QWidget() + workspace_layout = QVBoxLayout(workspace) + workspace_layout.setContentsMargins(0, 0, 0, 0) + workspace_layout.setSpacing(0) + workspace_layout.addWidget(self._build_topbar()) + self.stack = QStackedWidget() + workspace_layout.addWidget(self.stack, 1) + root.addWidget(workspace, 1) + + self._register_pages() + + def _build_sidebar(self) -> QWidget: + sidebar = QWidget() + sidebar.setObjectName("Sidebar") + sidebar.setFixedWidth(216) + layout = QVBoxLayout(sidebar) + layout.setContentsMargins(18, 22, 18, 18) + layout.setSpacing(8) + + brand = QHBoxLayout() + mark = QLabel("诊") + mark.setAlignment(Qt.AlignmentFlag.AlignCenter) + mark.setFixedSize(38, 38) + mark.setStyleSheet( + "color:#0F6D64; background:#DDF1EC; border-radius:11px; font-size:18px; font-weight:700;" + ) + brand.addWidget(mark) + brand_text = QVBoxLayout() + brand_text.setSpacing(0) + name = QLabel("医生工作站") + name.setStyleSheet("color:#FFFFFF; font-size:15px; font-weight:700;") + brand_text.addWidget(name) + institution = QLabel("臻阳堂医疗") + institution.setStyleSheet("color:#82A198; font-size:10px;") + brand_text.addWidget(institution) + brand.addLayout(brand_text) + brand.addStretch(1) + layout.addLayout(brand) + layout.addSpacing(28) + + navigation_label = QLabel("工作区") + navigation_label.setStyleSheet("color:#78998F; font-size:10px; font-weight:700;") + layout.addWidget(navigation_label) + self.nav_layout = QVBoxLayout() + self.nav_layout.setSpacing(6) + layout.addLayout(self.nav_layout) + layout.addStretch(1) + + safety = QFrame() + safety.setStyleSheet("background:#20483D; border-radius:12px;") + safety_layout = QVBoxLayout(safety) + safety_layout.setContentsMargins(12, 11, 12, 11) + safety_layout.setSpacing(4) + safety_title = QLabel("● 安全连接") + safety_title.setStyleSheet("color:#B9DDD3; font-size:11px; font-weight:700;") + safety_layout.addWidget(safety_title) + safety_text = QLabel("医疗数据按账号权限展示") + safety_text.setWordWrap(True) + safety_text.setStyleSheet("color:#91ACA3; font-size:10px;") + safety_layout.addWidget(safety_text) + layout.addWidget(safety) + version = QLabel("Doctor Workstation") + version.setAlignment(Qt.AlignmentFlag.AlignCenter) + version.setStyleSheet("color:#617F76; font-size:9px;") + layout.addWidget(version) + return sidebar + + def _build_topbar(self) -> QWidget: + topbar = QFrame() + topbar.setObjectName("TopBar") + topbar.setFixedHeight(68) + layout = QHBoxLayout(topbar) + layout.setContentsMargins(24, 0, 22, 0) + layout.setSpacing(11) + self.context_label = QLabel("工作台") + self.context_label.setStyleSheet("color:#315147; font-size:14px; font-weight:600;") + layout.addWidget(self.context_label) + layout.addStretch(1) + self.connection_badge = StatusBadge("服务正常", "success") + layout.addWidget(self.connection_badge) + + display_name = display_text( + first_value( + self.current_user, "name", "display_name", "nickname", "account", default="医生" + ) + ) + avatar = QLabel(display_name[:1] if display_name else "医") + avatar.setObjectName("UserAvatar") + avatar.setAlignment(Qt.AlignmentFlag.AlignCenter) + layout.addWidget(avatar) + identity = QVBoxLayout() + identity.setSpacing(0) + user_name = QLabel(display_name) + user_name.setStyleSheet("font-weight:700; color:#17382F;") + identity.addWidget(user_name) + role = QLabel(self._role_text()) + role.setProperty("role", "muted") + role.setStyleSheet("font-size:10px;") + identity.addWidget(role) + layout.addLayout(identity) + logout = QPushButton("退出") + logout.setProperty("variant", "ghost") + logout.setToolTip("退出当前账号") + logout.clicked.connect(lambda: self.logout_requested.emit()) + layout.addWidget(logout) + return topbar + + def _role_text(self) -> str: + department = first_value( + self.current_user, "department_name", "department.name", default="" + ) + role_ids = first_value(self.current_user, "role_ids", "role_id", default=[]) or [] + if not isinstance(role_ids, (list, tuple, set, frozenset)): + role_ids = [role_ids] + role_values = {str(value) for value in role_ids} + role = "医生" if "1" in role_values else "医助" if "2" in role_values else "医疗人员" + return f"{department} · {role}" if department else role + + def _register_pages(self) -> None: + self.nav_group = QButtonGroup(self) + self.nav_group.setExclusive(True) + first_button: QPushButton | None = None + for item, title in self.navigation: + page = item.page_type( + self.repository, + permissions=self.permissions, + current_user=self.current_user, + ) + if hasattr(page, "video_requested"): + page.video_requested.connect(lambda payload: self.video_requested.emit(payload)) + index = self.stack.addWidget(page) + self.pages[item.key] = page + self.page_titles[index] = title + + button = QPushButton(f"{item.glyph} {title}") + button.setProperty("variant", "nav") + button.setCheckable(True) + button.setCursor(Qt.CursorShape.PointingHandCursor) + button.clicked.connect( + lambda _checked=False, page_index=index, key=item.key: self._navigate( + page_index, key + ) + ) + self.nav_group.addButton(button, index) + self.nav_layout.addWidget(button) + self.nav_buttons[item.key] = button + if first_button is None: + first_button = button + + if first_button is None: + denied = EmptyState( + "暂无可用工作区", + "当前账号没有医生工作站页面权限,请联系管理员调整授权。", + ) + index = self.stack.addWidget(denied) + self.page_titles[index] = "权限受限" + self.stack.setCurrentIndex(index) + self.context_label.setText("权限受限") + return + first_button.setChecked(True) + first_index = self.nav_group.id(first_button) + self._navigate( + first_index, + next(key for key, button in self.nav_buttons.items() if button is first_button), + ) + + def _navigate(self, index: int, key: str) -> None: + if index < 0 or index >= self.stack.count(): + return + self.stack.setCurrentIndex(index) + self.context_label.setText(self.page_titles.get(index, "工作台")) + button = self.nav_buttons.get(key) + if button is not None: + button.setChecked(True) + page = self.stack.widget(index) + refresh = getattr(page, "refresh", None) + if callable(refresh): + refresh() + self.page_changed.emit(key) + + def navigate(self, key: str) -> bool: + """Navigate to a visible page by stable key; return whether it exists.""" + + button = self.nav_buttons.get(key) + page = self.pages.get(key) + if button is None or page is None: + return False + self._navigate(self.stack.indexOf(page), key) + return True + + def refresh_current_page(self) -> None: + page = self.stack.currentWidget() + refresh = getattr(page, "refresh", None) + if callable(refresh): + refresh() + + def set_connection_state(self, online: bool, message: str = "") -> None: + self.connection_badge.set_status( + message or ("服务正常" if online else "连接中断"), + "success" if online else "danger", + ) + + +__all__ = ["NAVIGATION", "NavigationItem", "ShellWindow"] diff --git a/app/src/doctor_workstation/ui/theme.py b/app/src/doctor_workstation/ui/theme.py new file mode 100644 index 000000000..f47823f4d --- /dev/null +++ b/app/src/doctor_workstation/ui/theme.py @@ -0,0 +1,298 @@ +"""Application-wide visual theme. + +The UI deliberately uses a restrained, clinical palette: warm whites for long +working sessions, ink green navigation, and teal for actionable state. The +theme is pure QSS so it remains dependable in frozen Windows and macOS builds. +""" + +from __future__ import annotations + +from PySide6.QtGui import QColor, QPalette +from PySide6.QtWidgets import QApplication + +COLORS = { + "canvas": "#F4F3EF", + "surface": "#FCFBF8", + "surface_alt": "#F0F2EF", + "ink": "#17382F", + "ink_soft": "#315147", + "teal": "#168579", + "teal_dark": "#0F6D64", + "teal_pale": "#DDF1EC", + "text": "#18211E", + "muted": "#66736D", + "line": "#D9DEDA", + "danger": "#B5473F", + "danger_pale": "#F8E8E5", + "warning": "#9A6A19", + "warning_pale": "#F8F0DA", + "success": "#287659", + "success_pale": "#E1F1E9", + "info": "#35698B", + "info_pale": "#E5EFF5", +} + + +GLOBAL_QSS = r""" +QWidget { + color: #18211E; + background-color: transparent; + font-family: "Microsoft YaHei UI", "PingFang SC", "Noto Sans CJK SC", sans-serif; + font-size: 13px; +} + +QMainWindow, QDialog, QWidget#AppCanvas, QWidget#LoginCanvas { + background-color: #F4F3EF; +} + +QLabel[role="muted"] { color: #66736D; } +QLabel[role="eyebrow"] { + color: #168579; + font-size: 11px; + font-weight: 700; +} +QLabel[role="pageTitle"] { + color: #17382F; + font-size: 25px; + font-weight: 700; +} +QLabel[role="sectionTitle"] { + color: #17382F; + font-size: 16px; + font-weight: 700; +} +QLabel[role="display"] { + color: #FCFBF8; + font-size: 30px; + font-weight: 700; +} +QLabel[role="metric"] { + color: #17382F; + font-size: 22px; + font-weight: 700; +} + +QFrame#Card, QFrame#Panel, QFrame#FilterBar, QFrame#DetailPanel { + background-color: #FCFBF8; + border: 1px solid #D9DEDA; + border-radius: 16px; +} +QFrame#SubtleCard { + background-color: #F0F2EF; + border: 1px solid #E1E5E1; + border-radius: 12px; +} +QFrame#Divider { background-color: #D9DEDA; min-height: 1px; max-height: 1px; } + +QPushButton { + min-height: 36px; + padding: 0 15px; + border: 1px solid #CBD3CE; + border-radius: 9px; + background-color: #FCFBF8; + color: #24443B; + font-weight: 600; +} +QPushButton:hover { background-color: #F0F2EF; border-color: #AEBBB4; } +QPushButton:pressed { background-color: #E6EAE6; } +QPushButton:disabled { color: #9AA39E; background-color: #EFF1EF; border-color: #E1E5E1; } +QPushButton[variant="primary"] { + color: #FFFFFF; + background-color: #168579; + border-color: #168579; +} +QPushButton[variant="primary"]:hover { background-color: #0F6D64; border-color: #0F6D64; } +QPushButton[variant="secondary"] { + color: #0F6D64; + background-color: #DDF1EC; + border-color: #B7DDD4; +} +QPushButton[variant="secondary"]:hover { background-color: #CCE8E1; } +QPushButton[variant="danger"] { + color: #A43C35; + background-color: #F8E8E5; + border-color: #EBC6C1; +} +QPushButton[variant="danger"]:hover { background-color: #F1D7D3; } +QPushButton[variant="ghost"] { border-color: transparent; background-color: transparent; } +QPushButton[variant="ghost"]:hover { background-color: #E8ECE9; } +QPushButton[variant="nav"] { + min-height: 44px; + padding: 0 15px; + border: 0; + border-radius: 10px; + background-color: transparent; + color: #C8D7D1; + text-align: left; + font-weight: 600; +} +QPushButton[variant="nav"]:hover { background-color: #244B40; color: #FFFFFF; } +QPushButton[variant="nav"]:checked { background-color: #DDF1EC; color: #0D5E56; } +QToolButton { + min-width: 32px; + min-height: 32px; + border: 0; + border-radius: 8px; + color: #315147; +} +QToolButton:hover { background-color: #E8ECE9; } + +QLineEdit, QTextEdit, QPlainTextEdit, QComboBox, QDateEdit, QSpinBox, QDoubleSpinBox { + min-height: 36px; + padding: 0 11px; + border: 1px solid #CBD3CE; + border-radius: 9px; + background-color: #FFFFFF; + selection-background-color: #B7DDD4; + selection-color: #17382F; +} +QTextEdit, QPlainTextEdit { padding: 9px 11px; } +QLineEdit:hover, QTextEdit:hover, QPlainTextEdit:hover, QComboBox:hover, QDateEdit:hover, +QSpinBox:hover, QDoubleSpinBox:hover { border-color: #9DAEA5; } +QLineEdit:focus, QTextEdit:focus, QPlainTextEdit:focus, QComboBox:focus, QDateEdit:focus, +QSpinBox:focus, QDoubleSpinBox:focus { border: 2px solid #168579; } +QLineEdit:disabled, QTextEdit:disabled, QComboBox:disabled { background-color: #EFF1EF; color: #8A958F; } +QComboBox::drop-down, QDateEdit::drop-down { border: 0; width: 25px; } +QComboBox QAbstractItemView { + background-color: #FFFFFF; + border: 1px solid #CBD3CE; + border-radius: 8px; + padding: 4px; + selection-background-color: #DDF1EC; + selection-color: #17382F; +} +QCheckBox, QRadioButton { spacing: 8px; } +QCheckBox::indicator, QRadioButton::indicator { width: 17px; height: 17px; } +QCheckBox::indicator:unchecked { + background-color: #FFFFFF; + border: 1px solid #AEBBB4; + border-radius: 4px; +} +QCheckBox::indicator:checked { + background-color: #168579; + border: 1px solid #168579; + border-radius: 4px; +} + +QTableWidget, QTableView { + background-color: #FCFBF8; + alternate-background-color: #F6F7F4; + border: 0; + border-radius: 12px; + gridline-color: #E5E8E5; + selection-background-color: #DDF1EC; + selection-color: #17382F; + outline: 0; +} +QTableWidget::item, QTableView::item { padding: 9px 8px; border-bottom: 1px solid #E6E9E6; } +QHeaderView::section { + background-color: #EEF1EE; + color: #53635C; + border: 0; + border-bottom: 1px solid #D9DEDA; + padding: 10px 8px; + font-size: 12px; + font-weight: 700; +} +QTableCornerButton::section { background-color: #EEF1EE; border: 0; } + +QListWidget { + background-color: transparent; + border: 0; + outline: 0; +} +QListWidget::item { border: 0; margin: 2px 0; } +QListWidget::item:selected { background-color: #DDF1EC; color: #17382F; border-radius: 11px; } +QListWidget::item:hover { background-color: #F0F2EF; border-radius: 11px; } + +QTabBar::tab { + min-height: 36px; + padding: 0 16px; + margin-right: 4px; + color: #66736D; + background-color: transparent; + border: 0; + border-radius: 9px; + font-weight: 600; +} +QTabBar::tab:hover { background-color: #F0F2EF; } +QTabBar::tab:selected { background-color: #DDF1EC; color: #0F6D64; } + +QScrollArea { border: 0; background-color: transparent; } +QScrollBar:vertical { background: transparent; width: 10px; margin: 2px; } +QScrollBar::handle:vertical { background: #C5CEC8; min-height: 30px; border-radius: 4px; } +QScrollBar::handle:vertical:hover { background: #9FAEA6; } +QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { height: 0; } +QScrollBar:horizontal { background: transparent; height: 10px; margin: 2px; } +QScrollBar::handle:horizontal { background: #C5CEC8; min-width: 30px; border-radius: 4px; } +QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal { width: 0; } + +QProgressBar { min-height: 6px; max-height: 6px; border: 0; border-radius: 3px; background: #E1E5E1; } +QProgressBar::chunk { border-radius: 3px; background-color: #168579; } + +QLabel#StatusBadge { + padding: 4px 9px; + border-radius: 9px; + font-size: 11px; + font-weight: 700; +} +QLabel#StatusBadge[kind="neutral"] { color: #53635C; background-color: #E8ECE9; } +QLabel#StatusBadge[kind="success"] { color: #216348; background-color: #E1F1E9; } +QLabel#StatusBadge[kind="warning"] { color: #805714; background-color: #F8F0DA; } +QLabel#StatusBadge[kind="danger"] { color: #A43C35; background-color: #F8E8E5; } +QLabel#StatusBadge[kind="info"] { color: #2F5F7E; background-color: #E5EFF5; } +QLabel#StatusBadge[kind="accent"] { color: #0F6D64; background-color: #DDF1EC; } + +QFrame#MessageBanner { border-radius: 10px; } +QFrame#MessageBanner[kind="info"] { background-color: #E5EFF5; border: 1px solid #C6DCE8; } +QFrame#MessageBanner[kind="success"] { background-color: #E1F1E9; border: 1px solid #C2E1D1; } +QFrame#MessageBanner[kind="warning"] { background-color: #F8F0DA; border: 1px solid #EADAAE; } +QFrame#MessageBanner[kind="danger"] { background-color: #F8E8E5; border: 1px solid #EBC6C1; } +QLabel#Toast { + color: #FFFFFF; + background-color: #17382F; + border: 1px solid #315147; + border-radius: 11px; + padding: 11px 16px; + font-weight: 600; +} +QLabel#Toast[kind="danger"] { background-color: #8F3832; border-color: #A94740; } +QLabel#Toast[kind="success"] { background-color: #216348; border-color: #2B7759; } + +QWidget#Sidebar { background-color: #17382F; } +QFrame#TopBar { background-color: #FCFBF8; border-bottom: 1px solid #D9DEDA; } +QLabel#UserAvatar { + min-width: 36px; max-width: 36px; min-height: 36px; max-height: 36px; + color: #0F6D64; background-color: #DDF1EC; border-radius: 18px; + font-size: 15px; font-weight: 700; +} +QWidget#LoginBrandPanel { background-color: #17382F; border-radius: 22px; } +QFrame#LoginCard { background-color: #FCFBF8; border: 1px solid #D9DEDA; border-radius: 20px; } +QFrame#BusyOverlay { background-color: rgba(244, 243, 239, 220); border-radius: 16px; } + +QSplitter::handle { background-color: transparent; width: 8px; height: 8px; } +QSplitter::handle:hover { background-color: #DDE3DF; } +QToolTip { color: #FFFFFF; background-color: #17382F; border: 0; padding: 6px; } +""" + + +def apply_theme(app: QApplication) -> None: + """Apply the global palette and stylesheet to ``app``.""" + + app.setStyle("Fusion") + palette = QPalette() + palette.setColor(QPalette.ColorRole.Window, QColor(COLORS["canvas"])) + palette.setColor(QPalette.ColorRole.WindowText, QColor(COLORS["text"])) + palette.setColor(QPalette.ColorRole.Base, QColor("#FFFFFF")) + palette.setColor(QPalette.ColorRole.AlternateBase, QColor(COLORS["surface_alt"])) + palette.setColor(QPalette.ColorRole.Text, QColor(COLORS["text"])) + palette.setColor(QPalette.ColorRole.Button, QColor(COLORS["surface"])) + palette.setColor(QPalette.ColorRole.ButtonText, QColor(COLORS["text"])) + palette.setColor(QPalette.ColorRole.Highlight, QColor(COLORS["teal_pale"])) + palette.setColor(QPalette.ColorRole.HighlightedText, QColor(COLORS["ink"])) + palette.setColor(QPalette.ColorRole.PlaceholderText, QColor("#8A958F")) + app.setPalette(palette) + app.setStyleSheet(GLOBAL_QSS) + + +__all__ = ["COLORS", "GLOBAL_QSS", "apply_theme"] diff --git a/app/src/doctor_workstation/ui/widgets.py b/app/src/doctor_workstation/ui/widgets.py new file mode 100644 index 000000000..77eeaeef4 --- /dev/null +++ b/app/src/doctor_workstation/ui/widgets.py @@ -0,0 +1,687 @@ +"""Shared widgets and safe asynchronous helpers for the UI layer.""" + +from __future__ import annotations + +import inspect +import traceback +from collections.abc import Callable, Iterable, Mapping, Sequence +from dataclasses import dataclass +from datetime import date, datetime +from typing import Any + +from PySide6.QtCore import QObject, QRunnable, Qt, QThreadPool, QTimer, Signal, Slot +from PySide6.QtGui import QResizeEvent +from PySide6.QtWidgets import ( + QAbstractItemView, + QFrame, + QHBoxLayout, + QLabel, + QProgressBar, + QPushButton, + QSizePolicy, + QTableWidget, + QTableWidgetItem, + QVBoxLayout, + QWidget, +) + +from doctor_workstation.core.errors import AuthenticationExpiredError + +AuthenticationExpiredHandler = Callable[[AuthenticationExpiredError], bool] +_AUTHENTICATION_EXPIRED_HANDLER: AuthenticationExpiredHandler | None = None + + +def set_authentication_expired_handler( + handler: AuthenticationExpiredHandler | None, +) -> None: + """Install the application-level expired-session callback. + + The callback returns ``True`` when it consumed the error. Returning + ``False`` preserves the originating operation's local error handling, as is + required when authentication itself fails on the login screen. + """ + + global _AUTHENTICATION_EXPIRED_HANDLER + _AUTHENTICATION_EXPIRED_HANDLER = handler + + +def get_value(value: Any, key: str, default: Any = None) -> Any: + """Read a dotted key from mappings, dataclasses, or ordinary objects.""" + + current = value + for part in key.split("."): + if current is None: + return default + if isinstance(current, Mapping): + current = current.get(part, default) + else: + marker = object() + candidate = getattr(current, part, marker) + if candidate is marker: + raw = getattr(current, "raw", None) + candidate = raw.get(part, marker) if isinstance(raw, Mapping) else marker + current = default if candidate is marker else candidate + if current is default: + return default + return current + + +def first_value(value: Any, *keys: str, default: Any = None) -> Any: + """Return the first present, non-empty value from ``keys``.""" + + for key in keys: + candidate = get_value(value, key, None) + if candidate is not None and candidate != "": + return candidate + return default + + +def display_text(value: Any, default: str = "—") -> str: + if value is None or value == "": + return default + if isinstance(value, bool): + return "是" if value else "否" + if isinstance(value, (datetime, date)): + return value.strftime("%Y-%m-%d %H:%M" if isinstance(value, datetime) else "%Y-%m-%d") + return str(value) + + +def gender_text(value: Any, default: str = "—") -> str: + """Format the legacy gender codes without exposing numeric API values.""" + + normalized = str(value).strip().lower() if value not in (None, "") else "" + labels = { + "0": "未知", + "1": "男", + "2": "女", + "m": "男", + "male": "男", + "f": "女", + "female": "女", + "unknown": "未知", + } + return labels.get(normalized, display_text(value, default)) + + +def page_items(result: Any) -> list[Any]: + """Extract rows from common PageResult/dict response shapes.""" + + if result is None: + return [] + if isinstance(result, (list, tuple)): + return list(result) + for key in ("items", "lists", "results", "rows", "data"): + items = get_value(result, key, None) + if isinstance(items, (list, tuple)): + return list(items) + if key == "data" and items is not None and items is not result: + nested = page_items(items) + if nested: + return nested + return [] + + +def page_total(result: Any, fallback: int = 0) -> int: + for key in ("total", "count", "total_count", "data.total", "data.count"): + value = get_value(result, key, None) + if value is not None: + try: + return int(value) + except (TypeError, ValueError): + pass + return fallback + + +def has_permission(permissions: Any, codes: str | Sequence[str], default: bool = True) -> bool: + """Check canonical permissions with exact and resource-wildcard semantics. + + A sequence uses OR semantics, matching the admin client's route guards. + Permission names are opaque: ``resource/action`` never aliases + ``resource.action``. + """ + + if permissions is None: + return default + requested = tuple( + code.strip() + for code in ((codes,) if isinstance(codes, str) else tuple(codes)) + if code and code.strip() + ) + if not requested: + return True + + for method_name in ("allows", "has", "can", "contains", "has_permission"): + method = getattr(permissions, method_name, None) + if callable(method): + for code in requested: + try: + if bool(method(code)): + return True + except (TypeError, ValueError): + continue + + raw = permissions + for attr in ("codes", "permissions", "values"): + candidate = getattr(permissions, attr, None) + if candidate is not None and not callable(candidate): + raw = candidate + break + if isinstance(raw, Mapping): + available = {str(key).strip() for key, enabled in raw.items() if enabled} + elif isinstance(raw, str): + available = {raw} + else: + try: + available = {str(item).strip() for item in raw} + except TypeError: + return default + return any( + "*" in available + or code in available + or any(grant.endswith("/*") and code.startswith(grant[:-1]) for grant in available) + for code in requested + ) + + +def invoke(repository: Any, method_name: str, /, **kwargs: Any) -> Any: + """Invoke a repository method with keyword filtering for contract tolerance.""" + + method = getattr(repository, method_name, None) + if method is None and method_name == "save_prescription_template": + template = kwargs.get("template") or {} + template_id = kwargs.get("template_id", kwargs.get("id")) + if template_id is None: + creator = ( + getattr(repository, "create_prescription_template", None) + or repository.add_prescription_template + ) + return creator(template=template) + updater = ( + getattr(repository, "update_prescription_template", None) + or repository.edit_prescription_template + ) + return updater(template_id, changes=template) + + aliases = { + "reception_queue": "list_appointments", + "reception_detail": "get_reception", + "prescription_library": "list_prescription_templates", + "prescriptions": "list_prescriptions", + "prescription_detail": "get_prescription", + "patients": "list_patients", + "consultations": "list_consultations", + } + resolved_name = method_name + if method is None: + resolved_name = aliases.get(method_name, method_name) + method = getattr(repository, resolved_name, None) + if method is None and method_name == "reception_detail": + resolved_name = "reception" + method = getattr(repository, resolved_name) + if method is None: + raise AttributeError(f"repository has no method {method_name!r}") + + call_kwargs = dict(kwargs) + if resolved_name.startswith("list_") and "page" in call_kwargs and "page_no" not in call_kwargs: + call_kwargs["page_no"] = call_kwargs.pop("page") + if ( + resolved_name == "get_prescription" + and "id" in call_kwargs + and "prescription_id" not in call_kwargs + ): + call_kwargs["prescription_id"] = call_kwargs.pop("id") + try: + signature = inspect.signature(method) + except (TypeError, ValueError): + return method(**call_kwargs) + parameters = signature.parameters + if any(p.kind == inspect.Parameter.VAR_KEYWORD for p in parameters.values()): + return method(**call_kwargs) + accepted = { + name: value + for name, value in call_kwargs.items() + if name in parameters + and parameters[name].kind + in (inspect.Parameter.POSITIONAL_OR_KEYWORD, inspect.Parameter.KEYWORD_ONLY) + } + if len(parameters) == 1 and not accepted: + only = next(iter(parameters.values())) + if only.name in {"payload", "data", "query", "filters", "params"}: + return method(call_kwargs) + return method(**accepted) + + +class WorkerSignals(QObject): + result = Signal(object) + error = Signal(object, str) + finished = Signal() + + +class Worker(QRunnable): + """A small QRunnable that marshals results back through Qt signals.""" + + def __init__(self, function: Callable[..., Any], *args: Any, **kwargs: Any) -> None: + super().__init__() + self.function = function + self.args = args + self.kwargs = kwargs + self.signals = WorkerSignals() + + @Slot() + def run(self) -> None: + try: + result = self.function(*self.args, **self.kwargs) + except Exception as exc: # UI boundary: report domain and transport errors alike. + self.signals.error.emit(exc, traceback.format_exc()) + else: + self.signals.result.emit(result) + finally: + self.signals.finished.emit() + + +_RUNNING_WORKERS: set[Worker] = set() + + +def _dispatch_async_error( + error: Exception, + local_handler: Callable[[Exception], None] | None, +) -> None: + """Route session expiry globally before falling back to a page handler.""" + + handled = False + if isinstance(error, AuthenticationExpiredError): + handler = _AUTHENTICATION_EXPIRED_HANDLER + if handler is not None: + try: + handled = bool(handler(error)) + except Exception: + traceback.print_exc() + if not handled and local_handler is not None: + local_handler(error) + + +def run_async( + function: Callable[..., Any], + *args: Any, + on_success: Callable[[Any], None] | None = None, + on_error: Callable[[Exception], None] | None = None, + on_finished: Callable[[], None] | None = None, + pool: QThreadPool | None = None, + **kwargs: Any, +) -> Worker: + """Run ``function`` off the GUI thread and return its Worker handle.""" + + worker = Worker(function, *args, **kwargs) + _RUNNING_WORKERS.add(worker) + if on_success is not None: + worker.signals.result.connect(on_success) + worker.signals.error.connect(lambda exc, _tb: _dispatch_async_error(exc, on_error)) + if on_finished is not None: + worker.signals.finished.connect(on_finished) + worker.signals.finished.connect(lambda: _RUNNING_WORKERS.discard(worker)) + (pool or QThreadPool.globalInstance()).start(worker) + return worker + + +def friendly_error(error: Any) -> str: + text = str(error).strip() + return text or "操作未完成,请稍后重试。" + + +class PageHeader(QWidget): + """Consistent title, subtitle, and action area for business pages.""" + + def __init__( + self, + title: str, + subtitle: str = "", + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + layout = QHBoxLayout(self) + layout.setContentsMargins(0, 0, 0, 0) + layout.setSpacing(16) + text_layout = QVBoxLayout() + text_layout.setSpacing(3) + self.title_label = QLabel(title) + self.title_label.setProperty("role", "pageTitle") + text_layout.addWidget(self.title_label) + self.subtitle_label = QLabel(subtitle) + self.subtitle_label.setProperty("role", "muted") + self.subtitle_label.setWordWrap(True) + self.subtitle_label.setVisible(bool(subtitle)) + text_layout.addWidget(self.subtitle_label) + layout.addLayout(text_layout, 1) + self.actions = QHBoxLayout() + self.actions.setSpacing(8) + layout.addLayout(self.actions) + + def add_action(self, widget: QWidget) -> QWidget: + self.actions.addWidget(widget) + return widget + + def set_subtitle(self, text: str) -> None: + self.subtitle_label.setText(text) + self.subtitle_label.setVisible(bool(text)) + + +class StatusBadge(QLabel): + def __init__( + self, text: str = "", kind: str = "neutral", parent: QWidget | None = None + ) -> None: + super().__init__(text, parent) + self.setObjectName("StatusBadge") + self.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.setSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed) + self.set_kind(kind) + + def set_kind(self, kind: str) -> None: + self.setProperty("kind", kind) + self.style().unpolish(self) + self.style().polish(self) + + def set_status(self, text: str, kind: str = "neutral") -> None: + self.setText(text) + self.set_kind(kind) + + +class EmptyState(QWidget): + action_requested = Signal() + + def __init__( + self, + title: str = "暂无数据", + description: str = "调整筛选条件后再试试。", + action_text: str = "", + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + layout = QVBoxLayout(self) + layout.setContentsMargins(24, 44, 24, 44) + layout.setAlignment(Qt.AlignmentFlag.AlignCenter) + layout.setSpacing(8) + glyph = QLabel("○") + glyph.setAlignment(Qt.AlignmentFlag.AlignCenter) + glyph.setStyleSheet("font-size: 30px; color: #9DAEA5;") + layout.addWidget(glyph) + title_label = QLabel(title) + title_label.setProperty("role", "sectionTitle") + title_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + layout.addWidget(title_label) + description_label = QLabel(description) + description_label.setProperty("role", "muted") + description_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + description_label.setWordWrap(True) + layout.addWidget(description_label) + self.action_button = QPushButton(action_text) + self.action_button.setProperty("variant", "secondary") + self.action_button.setVisible(bool(action_text)) + self.action_button.clicked.connect(self.action_requested) + layout.addWidget(self.action_button, 0, Qt.AlignmentFlag.AlignCenter) + + +class MessageBanner(QFrame): + def __init__(self, text: str = "", kind: str = "info", parent: QWidget | None = None) -> None: + super().__init__(parent) + self.setObjectName("MessageBanner") + self.setProperty("kind", kind) + layout = QHBoxLayout(self) + layout.setContentsMargins(12, 9, 12, 9) + layout.setSpacing(9) + self.icon = QLabel("i") + self.icon.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.icon.setFixedSize(20, 20) + self.icon.setStyleSheet("font-weight: 700;") + self.label = QLabel(text) + self.label.setWordWrap(True) + layout.addWidget(self.icon) + layout.addWidget(self.label, 1) + self.setVisible(bool(text)) + + def show_message(self, text: str, kind: str = "info") -> None: + glyphs = {"info": "i", "success": "✓", "warning": "!", "danger": "!"} + self.label.setText(text) + self.icon.setText(glyphs.get(kind, "i")) + self.setProperty("kind", kind) + self.style().unpolish(self) + self.style().polish(self) + self.setVisible(bool(text)) + + def clear(self) -> None: + self.setVisible(False) + self.label.clear() + + +class Toast(QLabel): + def __init__(self, parent: QWidget) -> None: + super().__init__(parent) + self.setObjectName("Toast") + self.setWordWrap(True) + self.setMaximumWidth(420) + self.hide() + self._timer = QTimer(self) + self._timer.setSingleShot(True) + self._timer.timeout.connect(self.hide) + + def show_message(self, text: str, kind: str = "info", duration: int = 2800) -> None: + self.setText(text) + self.setProperty("kind", kind) + self.style().unpolish(self) + self.style().polish(self) + self.adjustSize() + parent = self.parentWidget() + if parent is not None: + self.move(max(16, parent.width() - self.width() - 24), 20) + self.raise_() + self.show() + self._timer.start(duration) + + +def show_toast(parent: QWidget, text: str, kind: str = "info", duration: int = 2800) -> None: + window = parent.window() + toast = getattr(window, "_doctor_workstation_toast", None) + if not isinstance(toast, Toast): + toast = Toast(window) + window._doctor_workstation_toast = toast + toast.show_message(text, kind, duration) + + +class BusyOverlay(QFrame): + """Non-blocking visual guard for a card or page while a worker is active.""" + + def __init__(self, parent: QWidget, text: str = "正在加载…") -> None: + super().__init__(parent) + self.setObjectName("BusyOverlay") + layout = QVBoxLayout(self) + layout.setAlignment(Qt.AlignmentFlag.AlignCenter) + layout.setSpacing(10) + self.label = QLabel(text) + self.label.setProperty("role", "muted") + progress = QProgressBar() + progress.setRange(0, 0) + progress.setFixedWidth(140) + layout.addWidget(self.label, 0, Qt.AlignmentFlag.AlignCenter) + layout.addWidget(progress, 0, Qt.AlignmentFlag.AlignCenter) + self.hide() + + def set_message(self, text: str) -> None: + self.label.setText(text) + + def showEvent(self, event: Any) -> None: + self.setGeometry(self.parentWidget().rect()) + self.raise_() + super().showEvent(event) + + +class OverlayHost(QWidget): + """Widget base that automatically sizes a BusyOverlay child.""" + + def resizeEvent(self, event: QResizeEvent) -> None: + overlay = getattr(self, "busy_overlay", None) + if isinstance(overlay, BusyOverlay): + overlay.setGeometry(self.rect()) + super().resizeEvent(event) + + +@dataclass(frozen=True) +class TableColumn: + key: str + title: str + width: int = 0 + formatter: Callable[[Any, Any], str] | None = None + alignment: Qt.AlignmentFlag = Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter + + +class SortableTable(QTableWidget): + """A QTableWidget that safely retains the source object after sorting.""" + + def __init__(self, columns: Sequence[TableColumn], parent: QWidget | None = None) -> None: + super().__init__(parent) + self.columns = list(columns) + self.setColumnCount(len(self.columns)) + self.setHorizontalHeaderLabels([column.title for column in self.columns]) + self.setAlternatingRowColors(True) + self.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) + self.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection) + self.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers) + self.setSortingEnabled(True) + self.verticalHeader().setVisible(False) + self.horizontalHeader().setStretchLastSection(True) + for index, column in enumerate(self.columns): + if column.width: + self.setColumnWidth(index, column.width) + + def set_rows(self, rows: Iterable[Any]) -> None: + selected_id = first_value(self.current_data(), "id", "appointment_id", default=None) + self.setSortingEnabled(False) + self.clearContents() + materialized = list(rows) + self.setRowCount(len(materialized)) + row_to_select = -1 + for row_index, row in enumerate(materialized): + row_id = first_value(row, "id", "appointment_id", default=None) + if selected_id is not None and row_id == selected_id: + row_to_select = row_index + for column_index, column in enumerate(self.columns): + raw = get_value(row, column.key, None) + text = column.formatter(raw, row) if column.formatter else display_text(raw) + item = QTableWidgetItem(text) + item.setTextAlignment(column.alignment) + item.setData(Qt.ItemDataRole.UserRole, row) + item.setToolTip(text if len(text) > 18 else "") + self.setItem(row_index, column_index, item) + self.setSortingEnabled(True) + if row_to_select >= 0: + self.selectRow(row_to_select) + + def current_data(self) -> Any: + row = self.currentRow() + if row < 0: + return None + item = self.item(row, 0) + return item.data(Qt.ItemDataRole.UserRole) if item is not None else None + + +class Pager(QWidget): + page_changed = Signal(int) + + def __init__(self, page_size: int = 20, parent: QWidget | None = None) -> None: + super().__init__(parent) + self.page = 1 + self.page_size = page_size + self.total = 0 + layout = QHBoxLayout(self) + layout.setContentsMargins(0, 4, 0, 0) + layout.addStretch(1) + self.summary = QLabel("共 0 条") + self.summary.setProperty("role", "muted") + layout.addWidget(self.summary) + self.previous = QPushButton("上一页") + self.previous.setProperty("variant", "ghost") + self.previous.clicked.connect(lambda: self._request(self.page - 1)) + layout.addWidget(self.previous) + self.page_label = QLabel("1 / 1") + self.page_label.setMinimumWidth(58) + self.page_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + layout.addWidget(self.page_label) + self.next = QPushButton("下一页") + self.next.setProperty("variant", "ghost") + self.next.clicked.connect(lambda: self._request(self.page + 1)) + layout.addWidget(self.next) + self.update_state(1, 0) + + @property + def page_count(self) -> int: + return max(1, (self.total + self.page_size - 1) // self.page_size) + + def update_state(self, page: int, total: int) -> None: + self.page = max(1, page) + self.total = max(0, total) + self.summary.setText(f"共 {self.total} 条") + self.page_label.setText(f"{self.page} / {self.page_count}") + self.previous.setEnabled(self.page > 1) + self.next.setEnabled(self.page < self.page_count) + + def _request(self, page: int) -> None: + if 1 <= page <= self.page_count and page != self.page: + self.page_changed.emit(page) + + +def card_layout(card: QFrame, margins: int = 18, spacing: int = 12) -> QVBoxLayout: + layout = QVBoxLayout(card) + layout.setContentsMargins(margins, margins, margins, margins) + layout.setSpacing(spacing) + return layout + + +def section_title(text: str, trailing: QWidget | None = None) -> QWidget: + container = QWidget() + layout = QHBoxLayout(container) + layout.setContentsMargins(0, 0, 0, 0) + title = QLabel(text) + title.setProperty("role", "sectionTitle") + layout.addWidget(title) + layout.addStretch(1) + if trailing is not None: + layout.addWidget(trailing) + return container + + +def clear_layout(layout: QVBoxLayout | QHBoxLayout) -> None: + while layout.count(): + item = layout.takeAt(0) + widget = item.widget() + child_layout = item.layout() + if widget is not None: + widget.deleteLater() + elif child_layout is not None: + clear_layout(child_layout) # type: ignore[arg-type] + + +__all__ = [ + "BusyOverlay", + "EmptyState", + "MessageBanner", + "OverlayHost", + "PageHeader", + "Pager", + "SortableTable", + "StatusBadge", + "TableColumn", + "Toast", + "Worker", + "card_layout", + "clear_layout", + "display_text", + "first_value", + "friendly_error", + "get_value", + "has_permission", + "invoke", + "page_items", + "page_total", + "run_async", + "section_title", + "set_authentication_expired_handler", + "show_toast", +] diff --git a/app/src/doctor_workstation/video/__init__.py b/app/src/doctor_workstation/video/__init__.py new file mode 100644 index 000000000..3d960521c --- /dev/null +++ b/app/src/doctor_workstation/video/__init__.py @@ -0,0 +1,23 @@ +"""Optional video-call integration for the doctor workstation.""" + +from .launcher import ( + BackendMode, + VideoCallLauncher, + VideoCallRequest, + VideoTicketError, + launch_video_call, + normalize_backend_ticket, + require_supported_backend, +) +from .lifecycle import OrderedCallLifecycle + +__all__ = [ + "BackendMode", + "OrderedCallLifecycle", + "VideoCallLauncher", + "VideoCallRequest", + "VideoTicketError", + "launch_video_call", + "normalize_backend_ticket", + "require_supported_backend", +] diff --git a/app/src/doctor_workstation/video/launcher.py b/app/src/doctor_workstation/video/launcher.py new file mode 100644 index 000000000..a45883f00 --- /dev/null +++ b/app/src/doctor_workstation/video/launcher.py @@ -0,0 +1,405 @@ +"""Pure-Python contract and launcher for the optional video companion. + +The backend is the only authority that may issue ``userSig``. This module +normalizes that short-lived ticket and deliberately keeps Qt imports out of the +contract layer so it remains importable in core-only installations and tests. +""" + +from __future__ import annotations + +from collections.abc import Callable, Mapping +from dataclasses import dataclass, field +from enum import StrEnum +from pathlib import Path +from typing import Any + + +class VideoTicketError(ValueError): + """Raised when a backend video ticket is incomplete or unsafe.""" + + +class BackendMode(StrEnum): + """Supported rendering backends for a video call.""" + + EMBEDDED = "embedded" + BROWSER = "browser" + + @classmethod + def parse(cls, value: BackendMode | str) -> BackendMode: + if isinstance(value, cls): + return value + try: + return cls(str(value).strip().lower()) + except ValueError as exc: + raise VideoTicketError("backend mode must be 'embedded' or 'browser'") from exc + + +def require_supported_backend(value: BackendMode | str) -> BackendMode: + """Reject browser launch until a server-issued one-time handoff exists.""" + + mode = BackendMode.parse(value) + if mode is BackendMode.BROWSER: + raise VideoTicketError( + "browser video mode is disabled until a server-issued one-time handoff is available" + ) + return mode + + +Identifier = int | str + + +def _identifier(value: Any, field_name: str) -> Identifier: + if isinstance(value, bool) or value is None: + raise VideoTicketError(f"{field_name} must be a non-empty identifier") + if isinstance(value, int): + if value <= 0: + raise VideoTicketError(f"{field_name} must be a positive identifier") + return value + if isinstance(value, str): + cleaned = value.strip() + if not cleaned: + raise VideoTicketError(f"{field_name} must be a non-empty identifier") + return cleaned + raise VideoTicketError(f"{field_name} must be a string or integer") + + +def _non_empty_string(value: Any, field_name: str) -> str: + if not isinstance(value, str) or not value.strip(): + raise VideoTicketError(f"{field_name} must be a non-empty string") + return value.strip() + + +def _sdk_app_id(value: Any, field_name: str = "SDKAppID") -> int: + if isinstance(value, bool): + raise VideoTicketError(f"{field_name} must be a positive integer") + try: + parsed = int(value) + except (TypeError, ValueError) as exc: + raise VideoTicketError(f"{field_name} must be a positive integer") from exc + if parsed <= 0 or str(value).strip() != str(parsed): + raise VideoTicketError(f"{field_name} must be a positive integer") + return parsed + + +def _normalized_key(key: Any) -> str: + return "".join(character for character in str(key).lower() if character.isalnum()) + + +_FORBIDDEN_SECRET_KEYS = {"sdksecret", "sdksecretkey", "secretkey"} + + +def _reject_server_secrets(payload: Mapping[str, Any]) -> None: + for key in payload: + if _normalized_key(key) in _FORBIDDEN_SECRET_KEYS: + raise VideoTicketError("backend ticket contains forbidden server-side secret material") + + +def _contains_ticket_fields(payload: Mapping[str, Any]) -> bool: + keys = {_normalized_key(key) for key in payload} + return bool(keys & {"sdkappid", "userid", "usersig", "targetuserid", "patientuserid"}) + + +def _ticket_payload(ticket: Mapping[str, Any]) -> Mapping[str, Any]: + _reject_server_secrets(ticket) + if _contains_ticket_fields(ticket): + return ticket + + for envelope_key in ("data", "result", "ticket"): + nested = ticket.get(envelope_key) + if isinstance(nested, Mapping): + _reject_server_secrets(nested) + if _contains_ticket_fields(nested): + return nested + return ticket + + +def _ticket_mapping(ticket: Any) -> Mapping[str, Any]: + """Adapt the repository's CallTicket model without importing core models.""" + + if isinstance(ticket, Mapping): + return ticket + + raw = getattr(ticket, "raw", None) + if isinstance(raw, Mapping): + _reject_server_secrets(raw) + + attribute_aliases = { + "sdkAppId": "sdk_app_id", + "userId": "user_id", + "userSig": "user_sig", + "patientUserId": "patient_user_id", + "diagnosisId": "diagnosis_id", + "patientId": "patient_id", + } + adapted = { + json_name: getattr(ticket, attribute_name) + for json_name, attribute_name in attribute_aliases.items() + if hasattr(ticket, attribute_name) + } + if adapted: + return adapted + raise VideoTicketError("backend ticket must be a mapping or call-ticket object") + + +def _read_aliases( + payload: Mapping[str, Any], + aliases: tuple[str, ...], + field_name: str, + converter: Callable[[Any, str], Any], + *, + required: bool = True, +) -> Any: + converted: list[Any] = [] + for alias in aliases: + if alias in payload and payload[alias] is not None: + converted.append(converter(payload[alias], field_name)) + + if not converted: + if required: + raise VideoTicketError(f"backend ticket is missing {field_name}") + return None + if any(value != converted[0] and str(value) != str(converted[0]) for value in converted[1:]): + raise VideoTicketError(f"backend ticket has conflicting {field_name} aliases") + return converted[0] + + +def _merge_identifier( + payload_value: Identifier | None, + explicit_value: Any, + field_name: str, +) -> Identifier: + if explicit_value is None: + if payload_value is None: + raise VideoTicketError(f"backend ticket is missing {field_name}") + return payload_value + normalized = _identifier(explicit_value, field_name) + if ( + payload_value is not None + and payload_value != normalized + and str(payload_value) != str(normalized) + ): + raise VideoTicketError(f"backend ticket conflicts with requested {field_name}") + return normalized + + +@dataclass(frozen=True, slots=True) +class VideoCallRequest: + """Validated data required to start one doctor-to-patient video call. + + ``user_sig`` is excluded from ``repr``. Use :meth:`safe_log_context` for + structured logs; never serialize the dataclass itself into diagnostics. + """ + + sdk_app_id: int + user_id: str + user_sig: str = field(repr=False) + target_user_id: str + diagnosis_id: Identifier + patient_id: Identifier | None = None + backend_mode: BackendMode = BackendMode.EMBEDDED + + def __post_init__(self) -> None: + object.__setattr__(self, "sdk_app_id", _sdk_app_id(self.sdk_app_id)) + object.__setattr__(self, "user_id", _non_empty_string(self.user_id, "userID")) + object.__setattr__(self, "user_sig", _non_empty_string(self.user_sig, "userSig")) + object.__setattr__( + self, + "target_user_id", + _non_empty_string(self.target_user_id, "targetUserId"), + ) + object.__setattr__( + self, + "diagnosis_id", + _identifier(self.diagnosis_id, "diagnosisId"), + ) + if self.patient_id is not None: + object.__setattr__( + self, + "patient_id", + _identifier(self.patient_id, "patientId"), + ) + object.__setattr__(self, "backend_mode", BackendMode.parse(self.backend_mode)) + + @classmethod + def from_backend_ticket( + cls, + ticket: Any, + *, + diagnosis_id: Any = None, + patient_id: Any = None, + backend_mode: BackendMode | str = BackendMode.EMBEDDED, + ) -> VideoCallRequest: + return normalize_backend_ticket( + ticket, + diagnosis_id=diagnosis_id, + patient_id=patient_id, + backend_mode=backend_mode, + ) + + def to_web_config(self) -> dict[str, Any]: + """Return the canonical JavaScript bridge payload. + + The returned mapping contains the short-lived credential and therefore + must only be passed in memory to the trusted companion page. + """ + + return { + "SDKAppID": self.sdk_app_id, + "userID": self.user_id, + "userSig": self.user_sig, + "targetUserId": self.target_user_id, + "diagnosisId": self.diagnosis_id, + } + + def safe_log_context(self) -> dict[str, Any]: + """Return non-secret call metadata suitable for structured logging.""" + + return { + "diagnosis_id": self.diagnosis_id, + "patient_id": self.patient_id, + "backend_mode": self.backend_mode.value, + } + + +def normalize_backend_ticket( + ticket: Any, + *, + diagnosis_id: Any = None, + patient_id: Any = None, + backend_mode: BackendMode | str = BackendMode.EMBEDDED, +) -> VideoCallRequest: + """Normalize backend camel-case aliases into a validated call request.""" + + payload = _ticket_payload(_ticket_mapping(ticket)) + payload_diagnosis = _read_aliases( + payload, + ("diagnosisId", "diagnosis_id"), + "diagnosisId", + _identifier, + required=False, + ) + payload_patient = _read_aliases( + payload, + ("patientId", "patient_id"), + "patientId", + _identifier, + required=False, + ) + + normalized_diagnosis = _merge_identifier( + payload_diagnosis, + diagnosis_id, + "diagnosisId", + ) + if patient_id is not None: + normalized_patient = _merge_identifier(payload_patient, patient_id, "patientId") + else: + normalized_patient = payload_patient + + return VideoCallRequest( + sdk_app_id=_read_aliases( + payload, + ("SDKAppID", "sdkAppId", "sdkAppID"), + "SDKAppID", + _sdk_app_id, + ), + user_id=_read_aliases( + payload, + ("userID", "userId"), + "userID", + _non_empty_string, + ), + user_sig=_read_aliases( + payload, + ("userSig", "user_sig"), + "userSig", + _non_empty_string, + ), + target_user_id=_read_aliases( + payload, + ("targetUserId", "patientUserId"), + "targetUserId", + _non_empty_string, + ), + diagnosis_id=normalized_diagnosis, + patient_id=normalized_patient, + backend_mode=BackendMode.parse(backend_mode), + ) + + +@dataclass(slots=True) +class VideoCallLauncher: + """Small composition root that defers the optional Qt import until launch.""" + + repository: Any + backend_mode: BackendMode | str = BackendMode.EMBEDDED + local_dist: str | Path | None = None + remote_url: str | None = None + logger: Any = None + browser_opener: Callable[[str], bool] | None = None + + def prepare( + self, + ticket: Any, + *, + diagnosis_id: Any = None, + patient_id: Any = None, + ) -> VideoCallRequest: + require_supported_backend(self.backend_mode) + return normalize_backend_ticket( + ticket, + diagnosis_id=diagnosis_id, + patient_id=patient_id, + backend_mode=self.backend_mode, + ) + + def launch( + self, + ticket: Any, + *, + diagnosis_id: Any = None, + patient_id: Any = None, + ) -> Any: + request = self.prepare( + ticket, + diagnosis_id=diagnosis_id, + patient_id=patient_id, + ) + from .window import open_video_call + + return open_video_call( + request, + repository=self.repository, + local_dist=self.local_dist, + remote_url=self.remote_url, + logger=self.logger, + browser_opener=self.browser_opener, + ) + + +def launch_video_call( + ticket: Any, + *, + repository: Any, + diagnosis_id: Any = None, + patient_id: Any = None, + backend_mode: BackendMode | str = BackendMode.EMBEDDED, + local_dist: str | Path | None = None, + remote_url: str | None = None, + logger: Any = None, + browser_opener: Callable[[str], bool] | None = None, +) -> Any: + """Normalize a ticket and open a call with the requested backend.""" + + return VideoCallLauncher( + repository=repository, + backend_mode=backend_mode, + local_dist=local_dist, + remote_url=remote_url, + logger=logger, + browser_opener=browser_opener, + ).launch( + ticket, + diagnosis_id=diagnosis_id, + patient_id=patient_id, + ) diff --git a/app/src/doctor_workstation/video/lifecycle.py b/app/src/doctor_workstation/video/lifecycle.py new file mode 100644 index 000000000..1f9a3dbcd --- /dev/null +++ b/app/src/doctor_workstation/video/lifecycle.py @@ -0,0 +1,307 @@ +"""Ordered, non-blocking backend lifecycle writes for one video call. + +The repository uses synchronous HTTP. A dedicated daemon worker keeps +``start_call -> bind_call_room -> end_call`` ordered without ever blocking the +Qt GUI thread. Only non-secret call metadata is logged. +""" + +from __future__ import annotations + +import asyncio +import inspect +import logging +import queue +import threading +from collections.abc import Callable, Mapping +from concurrent.futures import Future +from dataclasses import dataclass +from typing import Any, TypeVar + +from .launcher import VideoCallRequest + +ResultT = TypeVar("ResultT") + + +def _settled_future(value: ResultT) -> Future[ResultT]: + future: Future[ResultT] = Future() + future.set_result(value) + return future + + +def _resolve_result(result: Any) -> Any: + if inspect.isawaitable(result): + return asyncio.run(result) + return result + + +def _call_repository_method(method: Callable[..., Any], payload: Mapping[str, Any]) -> Any: + """Invoke common repository signatures with a non-secret payload only.""" + + try: + signature = inspect.signature(method) + except (TypeError, ValueError): + return _resolve_result(method(**payload)) + + parameters = list(signature.parameters.values()) + if any(parameter.kind is inspect.Parameter.VAR_KEYWORD for parameter in parameters): + return _resolve_result(method(**payload)) + + keyword_names = { + parameter.name + for parameter in parameters + if parameter.kind + in (inspect.Parameter.POSITIONAL_OR_KEYWORD, inspect.Parameter.KEYWORD_ONLY) + } + accepted = {key: value for key, value in payload.items() if key in keyword_names} + required = [ + parameter + for parameter in parameters + if parameter.default is inspect.Parameter.empty + and parameter.kind + in (inspect.Parameter.POSITIONAL_ONLY, inspect.Parameter.POSITIONAL_OR_KEYWORD) + ] + + if len(parameters) == 1 and not accepted: + result = method(dict(payload)) + elif any(parameter.kind is inspect.Parameter.POSITIONAL_ONLY for parameter in required): + missing = [parameter.name for parameter in required if parameter.name not in payload] + if missing: + raise TypeError("repository method requires unsupported positional parameters") + ordered = [payload[parameter.name] for parameter in required] + result = method(*ordered, **accepted) + else: + result = method(**accepted) + return _resolve_result(result) + + +@dataclass(slots=True) +class _WorkItem: + operation: str + callback: Callable[[], Any] + future: Future[Any] + + +class _OrderedDaemonWorker: + """A minimal FIFO executor with timeout-aware idle observation.""" + + def __init__(self, logger: logging.Logger, log_context: Mapping[str, Any]) -> None: + self._logger = logger + self._log_context = dict(log_context) + self._queue: queue.Queue[_WorkItem | None] = queue.Queue() + self._lock = threading.Lock() + self._idle = threading.Event() + self._idle.set() + self._pending = 0 + self._stopping = False + self._thread = threading.Thread( + target=self._run, + name="video-call-lifecycle", + daemon=True, + ) + self._thread.start() + + @property + def is_daemon(self) -> bool: + return self._thread.daemon + + def submit(self, operation: str, callback: Callable[[], ResultT]) -> Future[ResultT]: + with self._lock: + if self._stopping: + raise RuntimeError("video lifecycle worker is stopping") + future: Future[ResultT] = Future() + self._pending += 1 + self._idle.clear() + self._queue.put(_WorkItem(operation, callback, future)) + return future + + def stop_when_idle(self) -> None: + with self._lock: + if self._stopping: + return + self._stopping = True + self._queue.put(None) + + def wait(self, timeout: float = 0.25) -> bool: + bounded = max(0.0, min(float(timeout), 5.0)) + return self._idle.wait(bounded) + + def _run(self) -> None: + while True: + item = self._queue.get() + if item is None: + self._queue.task_done() + return + try: + if item.future.set_running_or_notify_cancel(): + try: + item.future.set_result(item.callback()) + except BaseException as error: + item.future.set_exception(error) + self._logger.error( + "video lifecycle operation failed", + extra={ + "video_call": self._log_context, + "operation": item.operation, + "error_type": type(error).__name__, + }, + ) + finally: + with self._lock: + self._pending -= 1 + if self._pending == 0: + self._idle.set() + self._queue.task_done() + + +class OrderedCallLifecycle: + """Idempotent lifecycle state machine backed by one FIFO daemon worker.""" + + def __init__( + self, + request: VideoCallRequest, + repository: Any, + logger: logging.Logger, + ) -> None: + if repository is None: + raise ValueError("a video call repository is required") + self.request = request + self.repository = repository + self.logger = logger + self.started = False + self.ended = False + self.bound_room_id: str | None = None + self._claimed_room_id: str | None = None + self._start_future: Future[bool] | None = None + self._bind_future: Future[bool] | None = None + self._end_future: Future[bool] | None = None + self._lock = threading.RLock() + self._worker = _OrderedDaemonWorker(logger, request.safe_log_context()) + + @property + def worker_is_daemon(self) -> bool: + return self._worker.is_daemon + + def start(self) -> Future[bool]: + with self._lock: + if self._start_future is not None: + return self._start_future + method = getattr(self.repository, "start_call", None) + if not callable(method): + raise ValueError("video repository does not implement start_call") + payload: dict[str, Any] = { + "diagnosis_id": self.request.diagnosis_id, + "call_type": 2, + } + if self.request.patient_id is not None: + payload["patient_id"] = self.request.patient_id + + def operation() -> bool: + _call_repository_method(method, payload) + with self._lock: + self.started = True + self.logger.info( + "video call record started", + extra={"video_call": self.request.safe_log_context()}, + ) + return True + + self._start_future = self._worker.submit("start", operation) + return self._start_future + + def bind_room(self, room_id: Any) -> Future[bool]: + cleaned = str(room_id or "").strip() + if not cleaned or cleaned == "0": + return _settled_future(False) + + with self._lock: + if self._end_future is not None: + return _settled_future(False) + if self.bound_room_id: + if self.bound_room_id != cleaned: + self.logger.warning( + "ignoring a changed TRTC room identifier", + extra={"video_call": self.request.safe_log_context()}, + ) + return _settled_future(self.bound_room_id == cleaned) + if self._claimed_room_id: + if self._claimed_room_id != cleaned: + self.logger.warning( + "ignoring a changed TRTC room identifier", + extra={"video_call": self.request.safe_log_context()}, + ) + return _settled_future(False) + return self._bind_future or _settled_future(False) + if self._start_future is None: + self.start() + self._claimed_room_id = cleaned + method = getattr(self.repository, "bind_call_room", None) + + def operation() -> bool: + with self._lock: + started = self.started + if not started: + return False + if not callable(method): + self.logger.warning( + "video repository does not implement bind_call_room", + extra={"video_call": self.request.safe_log_context()}, + ) + return False + _call_repository_method( + method, + {"diagnosis_id": self.request.diagnosis_id, "room_id": cleaned}, + ) + with self._lock: + self.bound_room_id = cleaned + self.logger.info( + "TRTC room bound to video call record", + extra={"video_call": self.request.safe_log_context()}, + ) + return True + + self._bind_future = self._worker.submit("bind", operation) + return self._bind_future + + def end(self, reason: str) -> Future[bool]: + with self._lock: + if self._end_future is not None: + return self._end_future + method = getattr(self.repository, "end_call", None) + + def operation() -> bool: + with self._lock: + started = self.started + if not started: + with self._lock: + self.ended = True + return False + if not callable(method): + raise ValueError("video repository does not implement end_call") + _call_repository_method( + method, + {"diagnosis_id": self.request.diagnosis_id}, + ) + with self._lock: + self.ended = True + self.logger.info( + "video call record ended", + extra={ + "video_call": { + **self.request.safe_log_context(), + "reason": str(reason)[:80], + } + }, + ) + return True + + self._end_future = self._worker.submit("end", operation) + self._end_future.add_done_callback(lambda _future: self._worker.stop_when_idle()) + return self._end_future + + def wait(self, timeout: float = 0.25) -> bool: + """Wait for queued writes for at most five seconds; never waits indefinitely.""" + + return self._worker.wait(timeout) + + +__all__ = ["OrderedCallLifecycle"] diff --git a/app/src/doctor_workstation/video/security.py b/app/src/doctor_workstation/video/security.py new file mode 100644 index 000000000..1cb35bcf4 --- /dev/null +++ b/app/src/doctor_workstation/video/security.py @@ -0,0 +1,109 @@ +"""Pure-Python trust policy for the embedded video companion document.""" + +from __future__ import annotations + +import os +from dataclasses import dataclass +from pathlib import Path +from urllib.parse import unquote, urlsplit +from urllib.request import url2pathname + + +class TrustedDocumentError(ValueError): + """Raised when a companion location cannot form a safe allowlist.""" + + +def _normalized_host(host: str | None) -> str: + if not host: + return "" + try: + return host.encode("idna").decode("ascii").lower() + except UnicodeError: + return host.lower() + + +def _normalized_file_path(value: str) -> str | None: + parsed = urlsplit(value) + if parsed.scheme.lower() != "file" or parsed.netloc not in {"", "localhost"}: + return None + path = Path(url2pathname(unquote(parsed.path))).resolve() + rendered = str(path) + return rendered.casefold() if os.name == "nt" else rendered + + +@dataclass(frozen=True, slots=True) +class TrustedDocumentPolicy: + """Exact main-document allowlist plus origin matching for media grants.""" + + scheme: str + host: str + port: int | None + path: str + query: str + local_path: str | None = None + + @classmethod + def from_url(cls, url: str, *, is_local: bool) -> TrustedDocumentPolicy: + parsed = urlsplit(url) + scheme = parsed.scheme.lower() + if is_local: + local_path = _normalized_file_path(url) + if local_path is None: + raise TrustedDocumentError("local video companion must be a file URL") + return cls("file", "", None, parsed.path, parsed.query, local_path) + if scheme != "https" or not parsed.hostname: + raise TrustedDocumentError("remote embedded video companion must use HTTPS") + if parsed.username or parsed.password: + raise TrustedDocumentError("remote embedded video companion must not use credentials") + try: + port = parsed.port or 443 + except ValueError as error: + raise TrustedDocumentError( + "remote embedded video companion has an invalid port" + ) from error + return cls( + "https", + _normalized_host(parsed.hostname), + port, + parsed.path or "/", + parsed.query, + ) + + def allows_main_document(self, candidate: str) -> bool: + """Allow only the configured file or HTTPS document, including its query.""" + + parsed = urlsplit(candidate) + if self.scheme == "file": + return ( + parsed.query == self.query and _normalized_file_path(candidate) == self.local_path + ) + try: + port = parsed.port or (443 if parsed.scheme.lower() == "https" else None) + except ValueError: + return False + return ( + parsed.scheme.lower() == self.scheme + and _normalized_host(parsed.hostname) == self.host + and port == self.port + and (parsed.path or "/") == self.path + and parsed.query == self.query + ) + + def allows_origin(self, candidate: str) -> bool: + """Match only the origin that supplied the trusted main document.""" + + parsed = urlsplit(candidate) + if self.scheme == "file": + return parsed.scheme.lower() == "file" and parsed.netloc in {"", "localhost"} + try: + port = parsed.port or (443 if parsed.scheme.lower() == "https" else None) + except ValueError: + return False + return ( + parsed.scheme.lower() == self.scheme + and _normalized_host(parsed.hostname) == self.host + and port == self.port + ) + + +__all__ = ["TrustedDocumentError", "TrustedDocumentPolicy"] diff --git a/app/src/doctor_workstation/video/window.py b/app/src/doctor_workstation/video/window.py new file mode 100644 index 000000000..c8cf16747 --- /dev/null +++ b/app/src/doctor_workstation/video/window.py @@ -0,0 +1,585 @@ +"""Hardened QtWebEngine host for the video companion. + +Browser launch is intentionally disabled until the backend provides a +single-use handoff ticket. PySide6 remains optional at import time, while an +actual call requires an isolated QtWebEngine profile and an active QApplication. +""" + +from __future__ import annotations + +import json +import logging +import sys +from collections.abc import Callable, Mapping +from concurrent.futures import Future +from contextlib import suppress +from dataclasses import dataclass +from pathlib import Path +from typing import Any +from urllib.parse import parse_qsl, urlsplit + +from .launcher import ( + VideoCallRequest, + VideoTicketError, + require_supported_backend, +) +from .lifecycle import OrderedCallLifecycle +from .security import TrustedDocumentError, TrustedDocumentPolicy + +try: # Optional by design: core-only builds must still import this module. + from PySide6.QtCore import QObject, Qt, QUrl, Signal, Slot + from PySide6.QtWebChannel import QWebChannel + from PySide6.QtWebEngineCore import ( + QWebEnginePage, + QWebEngineProfile, + QWebEngineSettings, + ) + from PySide6.QtWebEngineWidgets import QWebEngineView + from PySide6.QtWidgets import QApplication, QMainWindow +except (ImportError, OSError) as _qt_import_error: # pragma: no cover - no Qt runtime. + QObject = Qt = QUrl = Signal = Slot = None # type: ignore[assignment] + QWebChannel = QWebEnginePage = QWebEngineProfile = None # type: ignore[assignment] + QWebEngineSettings = QWebEngineView = None # type: ignore[assignment] + QApplication = QMainWindow = None # type: ignore[assignment] + _WEBENGINE_IMPORT_ERROR: Exception | None = _qt_import_error +else: # pragma: no cover - requires a GUI runtime. + _WEBENGINE_IMPORT_ERROR = None + + +WEBENGINE_AVAILABLE = _WEBENGINE_IMPORT_ERROR is None +_LOGGER = logging.getLogger(__name__) +_SENSITIVE_QUERY_KEYS = {"usersig", "sdksecret", "sdksecretkey", "secretkey"} + + +class VideoWindowError(RuntimeError): + """Raised when the trusted embedded companion cannot be opened.""" + + +@dataclass(frozen=True, slots=True) +class CompanionLocation: + url: str + is_local: bool + + +def _validate_remote_url(value: str) -> str: + parsed = urlsplit(value) + if parsed.scheme.lower() != "https" or not parsed.hostname: + raise VideoWindowError("remote video companion URL must use HTTPS") + if parsed.username or parsed.password: + raise VideoWindowError("remote video companion URL must not contain credentials") + url_parameter_keys = { + "".join(character for character in key.lower() if character.isalnum()) + for key, _ in (*parse_qsl(parsed.query), *parse_qsl(parsed.fragment)) + } + if url_parameter_keys & _SENSITIVE_QUERY_KEYS: + raise VideoWindowError("remote video companion URL must not contain RTC credentials") + return value + + +def _candidate_index(local_dist: str | Path) -> Path: + candidate = Path(local_dist).expanduser().resolve() + return candidate if candidate.name.lower() == "index.html" else candidate / "index.html" + + +def _default_local_indexes() -> tuple[Path, ...]: + candidates: list[Path] = [] + bundle_root = getattr(sys, "_MEIPASS", None) + if bundle_root: + candidates.append(Path(bundle_root) / "video_companion_dist" / "index.html") + project_root = Path(__file__).resolve().parents[3] + candidates.append(project_root / "video_companion" / "dist" / "index.html") + return tuple(candidates) + + +def resolve_companion_location( + *, + local_dist: str | Path | None = None, + remote_url: str | None = None, +) -> CompanionLocation: + """Resolve the trusted document used inside QtWebEngine.""" + + indexes = ( + (_candidate_index(local_dist),) if local_dist is not None else _default_local_indexes() + ) + for index in indexes: + if index.is_file(): + return CompanionLocation(index.as_uri(), is_local=True) + if remote_url: + return CompanionLocation(_validate_remote_url(remote_url), is_local=False) + raise VideoWindowError( + "video companion is unavailable: build video_companion/dist or configure an HTTPS URL" + ) + + +def webengine_unavailable_reason() -> str | None: + """Return a non-sensitive diagnostic reason without importing Qt again.""" + + if _WEBENGINE_IMPORT_ERROR is None: + return None + return f"{type(_WEBENGINE_IMPORT_ERROR).__name__}: QtWebEngine is not installed" + + +if WEBENGINE_AVAILABLE: # pragma: no cover - GUI behavior needs an integration test. + + class _RestrictedWebEnginePage(QWebEnginePage): # type: ignore[misc, valid-type] + def __init__( + self, + profile: Any, + policy: TrustedDocumentPolicy, + logger: logging.Logger, + parent: Any, + ) -> None: + super().__init__(profile, parent) + self._policy = policy + self._logger = logger + self._shutting_down = False + + def begin_shutdown(self) -> None: + self._shutting_down = True + + def acceptNavigationRequest( + self, + url: Any, + navigation_type: Any, + is_main_frame: bool, + ) -> bool: + del navigation_type + if not is_main_frame: + return True + rendered = url.toString() + if self._shutting_down and rendered == "about:blank": + return True + if self._policy.allows_main_document(rendered): + return True + self._logger.warning( + "blocked video companion main-document navigation", + extra={ + "target_scheme": url.scheme(), + "target_host": url.host(), + }, + ) + return False + + def createWindow(self, window_type: Any) -> Any: + del window_type + self._logger.warning("blocked video companion popup window") + return None + + class _QtVideoBridge(QObject): # type: ignore[misc, valid-type] + def __init__(self, callback: Callable[[Mapping[str, Any]], None]) -> None: + super().__init__() + self._callback = callback + + @Slot(str) # type: ignore[misc] + def notify(self, payload: str) -> None: + if not isinstance(payload, str) or len(payload) > 16_384: + return + try: + message = json.loads(payload) + except (TypeError, ValueError): + return + if isinstance(message, Mapping) and message.get("source") == "doctor-call": + self._callback(message) + + class _EmbeddedVideoWindow(QMainWindow): # type: ignore[misc, valid-type] + status_changed = Signal(str) # type: ignore[misc] + call_ended = Signal(str) # type: ignore[misc] + call_error = Signal(str) # type: ignore[misc] + _start_completed = Signal(bool) # type: ignore[misc] + + def __init__( + self, + request: VideoCallRequest, + location: CompanionLocation, + lifecycle: OrderedCallLifecycle, + *, + logger: logging.Logger, + ) -> None: + super().__init__() + self.request = request + self.location = location + self.lifecycle = lifecycle + self.logger = logger + try: + self._policy = TrustedDocumentPolicy.from_url( + location.url, + is_local=location.is_local, + ) + except TrustedDocumentError as error: + raise VideoWindowError(str(error)) from error + self._injected = False + self._media_active = False + self._closing = False + self._companion_ended = False + self._released = False + self._close_reason = "window-closed" + self._legacy_grants: list[tuple[Any, Any]] = [] + self._permission_grants: list[Any] = [] + + self.setWindowTitle("视频面诊") + self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose, True) + self.resize(1120, 760) + self.setMinimumSize(760, 520) + + self._profile = QWebEngineProfile(self) + if not self._profile.isOffTheRecord(): + raise VideoWindowError("video WebEngine profile must be off-the-record") + profile_policy = QWebEngineProfile.PersistentCookiesPolicy + cache_type = QWebEngineProfile.HttpCacheType + self._profile.setPersistentCookiesPolicy(profile_policy.NoPersistentCookies) + self._profile.setHttpCacheType(cache_type.MemoryHttpCache) + self._profile.downloadRequested.connect(self._deny_download) + + self.web_view = QWebEngineView(self) + self._page = _RestrictedWebEnginePage( + self._profile, + self._policy, + self.logger, + self.web_view, + ) + self.web_view.setPage(self._page) + self.setCentralWidget(self.web_view) + + self._configure_settings(self._page.settings()) + self._bridge = _QtVideoBridge(self._handle_bridge_message) + self._channel = QWebChannel(self._page) + self._channel.registerObject("qtVideoBridge", self._bridge) + self._page.setWebChannel(self._channel) + self._connect_permissions() + + self._start_completed.connect(self._on_lifecycle_started) + self.web_view.loadFinished.connect(self._on_load_finished) + self.web_view.setUrl(QUrl(self.location.url)) + + def _configure_settings(self, settings: Any) -> None: + attributes = getattr(QWebEngineSettings, "WebAttribute", QWebEngineSettings) + values = ( + ("LocalContentCanAccessRemoteUrls", self.location.is_local), + ("PlaybackRequiresUserGesture", False), + ("JavascriptCanOpenWindows", False), + ("AllowRunningInsecureContent", False), + ) + for name, enabled in values: + attribute = getattr(attributes, name, None) + if attribute is not None: + settings.setAttribute(attribute, enabled) + + def _connect_permissions(self) -> None: + if hasattr(self._page, "featurePermissionRequested"): + self._page.featurePermissionRequested.connect(self._grant_legacy_media_permission) + if hasattr(self._page, "permissionRequested"): + self._page.permissionRequested.connect(self._grant_media_permission) + + def _permission_context_is_trusted(self, origin: Any) -> bool: + if self._closing or self._released or not self._media_active: + return False + if not self._policy.allows_main_document(self._page.url().toString()): + return False + return self._policy.allows_origin(origin.toString()) + + def _grant_legacy_media_permission(self, origin: Any, feature: Any) -> None: + features = QWebEnginePage.Feature + allowed = { + features.MediaAudioCapture, + features.MediaVideoCapture, + features.MediaAudioVideoCapture, + } + policies = QWebEnginePage.PermissionPolicy + trusted = self._permission_context_is_trusted(origin) and feature in allowed + policy = ( + policies.PermissionGrantedByUser if trusted else policies.PermissionDeniedByUser + ) + self._page.setFeaturePermission(origin, feature, policy) + if trusted: + self._legacy_grants.append((origin, feature)) + + def _grant_media_permission(self, permission: Any) -> None: + permission_type = permission.permissionType() + allowed_names = { + "MediaAudioCapture", + "MediaVideoCapture", + "MediaAudioVideoCapture", + } + trusted = ( + permission.isValid() + and permission_type.name in allowed_names + and self._permission_context_is_trusted(permission.origin()) + ) + if trusted: + permission.grant() + self._permission_grants.append(permission) + else: + permission.deny() + + def _deny_download(self, download: Any) -> None: + download.cancel() + + def _on_load_finished(self, succeeded: bool) -> None: + if self._closing: + return + if not succeeded: + self.logger.error( + "embedded video companion failed to load", + extra={"video_call": self.request.safe_log_context()}, + ) + self._close_reason = "page-load-failed" + self.close() + return + + try: + start_future = self.lifecycle.start() + except Exception: + self.logger.error( + "video call record could not be queued", + extra={"video_call": self.request.safe_log_context()}, + ) + self._close_reason = "record-start-queue-failed" + self.close() + return + start_future.add_done_callback(self._notify_start_completed) + + def _notify_start_completed(self, future: Future[bool]) -> None: + try: + succeeded = bool(future.result()) + except Exception: + succeeded = False + with suppress(RuntimeError): + self._start_completed.emit(succeeded) + + def _on_lifecycle_started(self, succeeded: bool) -> None: + if self._closing: + return + if not succeeded: + self._close_reason = "record-start-failed" + self.close() + return + self._media_active = True + config_json = json.dumps( + self.request.to_web_config(), + ensure_ascii=True, + separators=(",", ":"), + ) + script = f""" + (() => {{ + if (!window.doctorCall || typeof window.doctorCall.start !== 'function') {{ + return false; + }} + void window.doctorCall.start({config_json}).catch(() => undefined); + return true; + }})() + """ + self._page.runJavaScript(script, self._after_injection) + + def _after_injection(self, result: Any) -> None: + self._injected = result is not False + if not self._injected: + self._close_reason = "bridge-api-missing" + self.close() + + def _handle_bridge_message(self, message: Mapping[str, Any]) -> None: + if self._closing: + return + event = str(message.get("event", "")) + room_id = message.get("roomId", message.get("room_id")) + if room_id not in (None, ""): + self.lifecycle.bind_room(room_id) + if event == "room": + return + if event == "status": + status = str(message.get("status", "unknown"))[:80] + self.status_changed.emit(status) + if status == "idle": + self._close_from_companion("remote-idle") + elif event == "hangup": + status = str(message.get("status", "ended"))[:80] + self.call_ended.emit(status) + self._close_from_companion("companion-hangup") + elif event == "error": + message_text = str(message.get("message", "视频通话错误"))[:400] + self.call_error.emit(message_text) + self._close_from_companion("companion-error") + + def _close_from_companion(self, reason: str) -> None: + self._companion_ended = True + self._close_reason = reason + self.close() + + def hangup(self) -> None: + self._close_reason = "desktop-hangup" + self.close() + + def _begin_shutdown(self) -> None: + if self._closing: + return + self._closing = True + self._media_active = False + if self._injected and not self._companion_ended and not self._released: + self._page.runJavaScript( + "void window.doctorCall?.hangup?.().catch(() => undefined)" + ) + self.lifecycle.end(self._close_reason) + self._release_webengine() + + def _release_webengine(self) -> None: + if self._released: + return + self._released = True + policies = QWebEnginePage.PermissionPolicy + for origin, feature in self._legacy_grants: + with suppress(RuntimeError): + self._page.setFeaturePermission( + origin, + feature, + policies.PermissionDeniedByUser, + ) + self._legacy_grants.clear() + for permission in self._permission_grants: + try: + if permission.isValid(): + permission.reset() + except RuntimeError: + pass + self._permission_grants.clear() + + try: + self._channel.deregisterObject(self._bridge) + self._page.setWebChannel(None) + except RuntimeError: + pass + try: + self._profile.cookieStore().deleteAllCookies() + self._profile.clearHttpCache() + self._profile.clearAllVisitedLinks() + except RuntimeError: + pass + try: + self._page.begin_shutdown() + self._page.setUrl(QUrl("about:blank")) + except RuntimeError: + pass + + view = self.takeCentralWidget() + if view is not None: + view.close() + view.deleteLater() + self._page.deleteLater() + self._profile.deleteLater() + + def closeEvent(self, event: Any) -> None: + self._begin_shutdown() + event.accept() + + +else: + _EmbeddedVideoWindow = None # type: ignore[assignment, misc] + + +class VideoCallWindow: + """Facade for the only currently supported backend: embedded QtWebEngine.""" + + def __init__( + self, + request: VideoCallRequest, + *, + repository: Any, + local_dist: str | Path | None = None, + remote_url: str | None = None, + logger: logging.Logger | None = None, + browser_opener: Callable[[str], bool] | None = None, + ) -> None: + del browser_opener # Reserved for a future authenticated handoff implementation. + try: + self.backend_mode = require_supported_backend(request.backend_mode) + except VideoTicketError as error: + raise VideoWindowError(str(error)) from error + if not WEBENGINE_AVAILABLE: + raise VideoWindowError( + "embedded video is unavailable and automatic browser fallback is disabled" + ) + if QApplication is None or QApplication.instance() is None: + raise VideoWindowError("embedded video requires an active QApplication") + + self.request = request + self.logger = logger or _LOGGER + self.location = resolve_companion_location( + local_dist=local_dist, + remote_url=remote_url, + ) + self.lifecycle = OrderedCallLifecycle(request, repository, self.logger) + self._session: Any = None + + @property + def qt_window(self) -> Any: + return self._session + + def open(self) -> VideoCallWindow: + try: + self._session = _EmbeddedVideoWindow( + self.request, + self.location, + self.lifecycle, + logger=self.logger, + ) + except Exception: + self.lifecycle.end("window-open-failed") + raise + self._session.show() + self._session.raise_() + self._session.activateWindow() + return self + + show = open + + def hangup(self) -> None: + if self._session is not None: + self._session.hangup() + else: + self.lifecycle.end("unopened-session") + + def close(self) -> None: + if self._session is not None: + self._session.close() + else: + self.lifecycle.end("unopened-session") + + def wait_for_lifecycle(self, timeout: float = 0.25) -> bool: + """Wait briefly for ordered backend writes; timeout is capped at five seconds.""" + + return self.lifecycle.wait(timeout) + + wait = wait_for_lifecycle + + +def open_video_call( + request: VideoCallRequest, + *, + repository: Any, + local_dist: str | Path | None = None, + remote_url: str | None = None, + logger: logging.Logger | None = None, + browser_opener: Callable[[str], bool] | None = None, +) -> VideoCallWindow: + """Create and immediately open a trusted embedded video window.""" + + if not isinstance(request, VideoCallRequest): + raise VideoTicketError("request must be a VideoCallRequest") + return VideoCallWindow( + request, + repository=repository, + local_dist=local_dist, + remote_url=remote_url, + logger=logger, + browser_opener=browser_opener, + ).open() + + +__all__ = [ + "CompanionLocation", + "TrustedDocumentPolicy", + "VideoCallWindow", + "VideoWindowError", + "WEBENGINE_AVAILABLE", + "open_video_call", + "resolve_companion_location", + "webengine_unavailable_reason", +] diff --git a/app/tests/test_api_client.py b/app/tests/test_api_client.py new file mode 100644 index 000000000..d8772a1bb --- /dev/null +++ b/app/tests/test_api_client.py @@ -0,0 +1,272 @@ +"""Contract tests for the UI-independent API client and token store.""" + +from __future__ import annotations + +import json +from pathlib import Path + +import httpx +import pytest + +from doctor_workstation.core.errors import ( + ApiBusinessError, + ApiError, + ApiProtocolError, + ApiTimeoutError, + AuthenticationExpiredError, + OpenPageRequiredError, + WorkWechatBindingRequiredError, +) +from doctor_workstation.services.api_client import ApiClient +from doctor_workstation.services.token_store import TokenStore + + +def test_get_normalises_adminapi_and_sends_contract_headers() -> None: + """The site base and already-prefixed base resolve to the same API URL.""" + + requests: list[httpx.Request] = [] + + def handler(request: httpx.Request) -> httpx.Response: + requests.append(request) + return httpx.Response(200, json={"code": 1, "data": {"ok": True}}) + + with ApiClient( + "https://example.test/root/", + token="secret-token", + transport=httpx.MockTransport(handler), + ) as client: + assert client.get("/doctor.appointment/lists", {"page_no": 2}) == {"ok": True} + + request = requests[0] + assert str(request.url) == ( + "https://example.test/root/adminapi/doctor.appointment/lists?page_no=2" + ) + assert request.headers["token"] == "secret-token" + assert request.headers["version"] == "1.9.4" + assert ApiClient.normalise_base_url("https://example.test/adminapi") == ( + "https://example.test/adminapi/" + ) + + +def test_post_uses_json_and_never_retries_timeout() -> None: + """Writes use JSON and a timeout never causes an automatic duplicate POST.""" + + attempts = 0 + bodies: list[dict[str, object]] = [] + + def handler(request: httpx.Request) -> httpx.Response: + nonlocal attempts + attempts += 1 + bodies.append(json.loads(request.content)) + raise httpx.ReadTimeout("slow write", request=request) + + client = ApiClient( + "https://example.test", + max_retries=5, + transport=httpx.MockTransport(handler), + ) + with pytest.raises(ApiTimeoutError) as caught: + client.post("doctor.appointment/complete", {"id": 42}) + client.close() + + assert attempts == 1 + assert bodies == [{"id": 42}] + assert caught.value.data["attempts"] == 1 + + +def test_multipart_post_lets_httpx_set_boundary_and_sends_form_fields( + tmp_path: Path, +) -> None: + """Uploads use real multipart encoding without the JSON content type.""" + + requests: list[httpx.Request] = [] + + def handler(request: httpx.Request) -> httpx.Response: + requests.append(request) + return httpx.Response( + 200, + json={"code": 1, "data": {"uri": "/uploads/demo.jpg"}}, + ) + + source = tmp_path / "demo.jpg" + source.write_bytes(b"jpeg-demo-bytes") + with ( + ApiClient( + "https://example.test", + transport=httpx.MockTransport(handler), + ) as client, + source.open("rb") as stream, + ): + result = client.post_multipart( + "upload/image", + files={"file": (source.name, stream, "image/jpeg")}, + data={"cid": "0"}, + ) + + assert result == {"uri": "/uploads/demo.jpg"} + request = requests[0] + content_type = request.headers["content-type"] + assert content_type.startswith("multipart/form-data; boundary=") + assert "application/json" not in content_type + assert b'name="file"; filename="demo.jpg"' in request.content + assert b'name="cid"' in request.content + assert b"jpeg-demo-bytes" in request.content + + +def test_get_retries_only_timeouts_then_returns_data() -> None: + """A GET may recover from a bounded number of timeout failures.""" + + attempts = 0 + + def handler(request: httpx.Request) -> httpx.Response: + nonlocal attempts + attempts += 1 + if attempts < 3: + raise httpx.ReadTimeout("temporary", request=request) + return httpx.Response(200, json={"code": "1", "data": ["ready"]}) + + with ApiClient( + "https://example.test/adminapi/", + max_retries=2, + transport=httpx.MockTransport(handler), + ) as client: + assert client.get("health") == ["ready"] + assert attempts == 3 + + +@pytest.mark.parametrize( + ("code", "exception_type"), + [ + (0, ApiBusinessError), + (-1, AuthenticationExpiredError), + (10, WorkWechatBindingRequiredError), + ], +) +def test_envelope_error_codes_are_structured(code: int, exception_type: type[Exception]) -> None: + """Known control-flow codes become typed exceptions with response data.""" + + transport = httpx.MockTransport( + lambda request: httpx.Response( + 200, + headers={"x-request-id": "req-123"}, + json={"code": code, "msg": "action needed", "data": {"reason": "demo"}}, + ) + ) + with ( + ApiClient("https://example.test", transport=transport) as client, + pytest.raises(exception_type) as caught, + ): + client.get("auth.admin/mySelf") + error = caught.value + assert isinstance(error, ApiError) + assert error.code == code + assert error.data == {"reason": "demo"} + assert error.request_id == "req-123" + + +def test_open_page_signal_does_not_open_a_browser() -> None: + """Code 2 is surfaced to the UI as data, not executed by the service layer.""" + + transport = httpx.MockTransport( + lambda request: httpx.Response( + 200, + json={"code": 2, "data": {"url": "https://example.test/continue"}}, + ) + ) + with ( + ApiClient("https://example.test", transport=transport) as client, + pytest.raises(OpenPageRequiredError) as caught, + ): + client.get("continue") + assert caught.value.url == "https://example.test/continue" + + +def test_invalid_envelope_raises_protocol_error() -> None: + """Successful HTTP is not mistaken for API success without a valid envelope.""" + + transport = httpx.MockTransport( + lambda request: httpx.Response(200, json={"data": "missing code"}) + ) + with ( + ApiClient("https://example.test", transport=transport) as client, + pytest.raises(ApiProtocolError), + ): + client.get("broken") + + +def test_token_store_file_fallback_never_persists_password(tmp_path: Path) -> None: + """The fallback contains only an access token and an optional account name.""" + + path = tmp_path / "credentials.json" + store = TokenStore(path, keyring_backend=None) + store.save_token("token-value", account="doctor") + + assert store.load_token() == "token-value" + assert store.load_account() == "doctor" + payload = json.loads(path.read_text(encoding="utf-8")) + assert payload == {"token": "token-value", "account": "doctor"} + assert "password" not in path.read_text(encoding="utf-8").lower() + store.clear_token() + assert store.load_token() is None + assert store.load_account() == "doctor" + + +class _MemoryKeyring: + """Minimal deterministic keyring double.""" + + def __init__(self) -> None: + self.values: dict[tuple[str, str], str] = {} + + def get_password(self, service: str, username: str) -> str | None: + """Return an in-memory secret.""" + + return self.values.get((service, username)) + + def set_password(self, service: str, username: str, password: str) -> None: + """Store an in-memory secret.""" + + self.values[(service, username)] = password + + def delete_password(self, service: str, username: str) -> None: + """Delete an in-memory secret.""" + + self.values.pop((service, username), None) + + +def test_token_store_prefers_available_keyring(tmp_path: Path) -> None: + """A working keyring keeps the token out of the fallback JSON file.""" + + backend = _MemoryKeyring() + path = tmp_path / "credentials.json" + store = TokenStore(path, keyring_backend=backend) + store.save_token("keyring-token", account="doctor") + + assert store.uses_keyring + assert store.load_token() == "keyring-token" + assert json.loads(path.read_text(encoding="utf-8")) == {"account": "doctor"} + + +def test_token_store_scopes_automatic_restore_and_forgets_account(tmp_path: Path) -> None: + """Automatic restore never returns a token issued for another API base.""" + + path = tmp_path / "credentials.json" + store = TokenStore(path, keyring_backend=None) + api_scope = "https://example.test/adminapi/" + store.save_token( + "scoped-token", + account="doctor", + scope=api_scope, + ) + + assert store.load_token(scope="https://example.test/adminapi") == "scoped-token" + assert store.load_token(scope="https://other.test/adminapi/") is None + assert store.load_token() == "scoped-token" + assert json.loads(path.read_text(encoding="utf-8")) == { + "token": "scoped-token", + "account": "doctor", + "scope": "https://example.test/adminapi", + } + + store.save_token("next-token", account="", scope=api_scope) + assert store.load_account() is None + assert "account" not in json.loads(path.read_text(encoding="utf-8")) diff --git a/app/tests/test_config.py b/app/tests/test_config.py new file mode 100644 index 000000000..c9ec1d3d3 --- /dev/null +++ b/app/tests/test_config.py @@ -0,0 +1,50 @@ +from __future__ import annotations + +from pathlib import Path + +import pytest + +from doctor_workstation.config import AppConfig, normalize_api_base_url + + +@pytest.mark.parametrize( + ("raw", "expected"), + [ + ("https://api.example.com", "https://api.example.com/adminapi"), + ("https://api.example.com/", "https://api.example.com/adminapi"), + ("https://api.example.com/adminapi", "https://api.example.com/adminapi"), + ("http://127.0.0.1:8080/gateway", "http://127.0.0.1:8080/gateway/adminapi"), + ("", ""), + ], +) +def test_normalize_api_base_url(raw: str, expected: str) -> None: + assert normalize_api_base_url(raw) == expected + + +@pytest.mark.parametrize( + "raw", + ["api.example.com", "ftp://api.example.com", "https://u:p@example.com", "https://x.test?a=1"], +) +def test_normalize_api_base_url_rejects_unsafe_values(raw: str) -> None: + with pytest.raises(ValueError): + normalize_api_base_url(raw) + + +def test_config_update_validates_video_mode() -> None: + with pytest.raises(ValueError): + AppConfig().with_updates(video_mode="unknown") + + +def test_runtime_directories_can_be_isolated_without_replacing_user_home( + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, +) -> None: + config_dir = tmp_path / "config" + log_dir = tmp_path / "logs" + monkeypatch.setenv("DOCTOR_CONFIG_DIR", str(config_dir)) + monkeypatch.setenv("DOCTOR_LOG_DIR", str(log_dir)) + + config = AppConfig() + + assert config.config_dir == config_dir + assert config.log_dir == log_dir diff --git a/app/tests/test_consultations_parity_ui.py b/app/tests/test_consultations_parity_ui.py new file mode 100644 index 000000000..e3fa3d3da --- /dev/null +++ b/app/tests/test_consultations_parity_ui.py @@ -0,0 +1,405 @@ +from __future__ import annotations + +import os +from types import SimpleNamespace +from typing import Any + +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") + +import pytest +from PySide6.QtCore import QDate +from PySide6.QtWidgets import QApplication, QDialog + +from doctor_workstation.core import PermissionSet +from doctor_workstation.ui.dialogs import diagnosis as diagnosis_module +from doctor_workstation.ui.pages import consultations as consultations_module +from doctor_workstation.ui.pages.consultations import ( + ConsultationsPage, + _video_payload, + appointment_rows, + is_diagnosis_confirmed, + is_video_available, + prescription_action_label, +) + + +@pytest.fixture(scope="module") +def application() -> QApplication: + return QApplication.instance() or QApplication([]) + + +@pytest.fixture +def immediate_async(monkeypatch: pytest.MonkeyPatch) -> None: + def run_immediately( + function: Any, + *args: Any, + on_success: Any = None, + on_error: Any = None, + on_finished: Any = None, + **kwargs: Any, + ) -> object: + try: + result = function(*args, **kwargs) + except Exception as error: + if on_error: + on_error(error) + else: + if on_success: + on_success(result) + finally: + if on_finished: + on_finished() + return object() + + monkeypatch.setattr(consultations_module, "run_async", run_immediately) + monkeypatch.setattr(diagnosis_module, "run_async", run_immediately) + + +def _row(**changes: Any) -> dict[str, Any]: + row = { + "id": 501, + "diagnosis_id": 501, + "patient_id": 301, + "patient_name": "林晓岚", + "gender": 2, + "age": 36, + "status": 4, + "has_appointment": 1, + "appointment_id": 101, + "appointment_status": 1, + "appointments": [ + { + "id": 101, + "status": 1, + "doctor_name": "陈医生", + "appointment_date": "2026-08-10", + "time_text": "09:00", + } + ], + "DiagnosisViewRecord": [{"is_confirmed": 1}], + "has_prescription": 0, + } + row.update(changes) + return row + + +def test_video_condition_never_uses_diagnosis_status_or_missed_status() -> None: + assert is_video_available(_row(status=4, appointment_status=1)) + assert not is_video_available(_row(status=1, appointment_status=4)) + assert not is_video_available(_row(status=1, appointment_status=1, has_appointment=0)) + + payload = _video_payload(_row(id=777, diagnosis_id=777, appointment_id=222)) + assert payload["appointment_id"] == 222 + assert payload["diagnosis_id"] == 777 + assert payload["patient_id"] == 301 + + +def test_nested_appointments_confirmation_and_prescription_labels() -> None: + row = _row( + appointment_id=None, + appointment_status=None, + DiagnosisViewRecord=[{"is_confirmed": 0}, {"is_confirmed": "1"}], + ) + assert appointment_rows(row)[0]["id"] == 101 + assert is_diagnosis_confirmed(row) + assert ( + prescription_action_label({"prescription_audit_status": 1, "prescription_void_status": 0}) + == "查看处方" + ) + assert ( + prescription_action_label({"prescription_audit_status": 1, "prescription_void_status": 1}) + == "开方" + ) + + +def test_default_query_matches_admin_today_and_page_size_contract( + application: QApplication, + immediate_async: None, +) -> None: + calls: list[dict[str, Any]] = [] + + class Repository: + def list_consultations(self, **kwargs: Any) -> dict[str, Any]: + calls.append(kwargs) + return {"lists": [], "count": 0} + + page = ConsultationsPage(Repository(), permissions=PermissionSet(["*"])) + page.refresh(silent=True) + + assert len(calls) == 1 + query = calls[0] + assert query["page_no"] == 1 + assert query["page_size"] == 15 + assert query["appointment_date"] == QDate.currentDate().toString("yyyy-MM-dd") + assert "status" not in query + assert query["has_appointment"] == "" + assert query["diagnosis_confirmed"] == "" + assert { + "diagnosis_type", + "syndrome_type", + "assistant_id", + "latest_appointment_start_date", + "latest_appointment_end_date", + "latest_appointment_channel_source", + "latest_assign_start_date", + "latest_assign_end_date", + "sort_unserved_days", + }.issubset(query) + assert "consultation_type" not in query + page.close() + application.processEvents() + + +def test_double_click_opens_readonly_and_never_emits_video( + application: QApplication, + monkeypatch: pytest.MonkeyPatch, +) -> None: + page = ConsultationsPage( + SimpleNamespace(), + permissions=PermissionSet(["tcm.diagnosis/readonlyDetail", "tcm.diagnosis/videoQr"]), + ) + page.table.set_rows([_row()]) + page.table.selectRow(0) + opened: list[tuple[int, bool]] = [] + videos: list[dict[str, Any]] = [] + monkeypatch.setattr( + page._diagnosis_dialog, + "open_for", + lambda diagnosis_id, *, editable=False, seed=None: opened.append((diagnosis_id, editable)), + ) + page.video_requested.connect(videos.append) + + page.table.itemDoubleClicked.emit(page.table.item(0, 0)) + application.processEvents() + + assert opened == [(501, False)] + assert videos == [] + page.close() + + +def test_action_visibility_requires_exact_canonical_permissions( + application: QApplication, +) -> None: + aliases = PermissionSet( + [ + "tcm.diagnosis.readonlyDetail", + "tcm.diagnosis.edit", + "tcm.diagnosis.add", + "tcm.diagnosis.delete", + ] + ) + page = ConsultationsPage(SimpleNamespace(), permissions=aliases) + assert not page.view_button.isVisible() + assert not page.edit_button.isVisible() + assert not page.add_button.isVisible() + assert not page.delete_button.isVisible() + page.close() + + exact = PermissionSet( + [ + "tcm.diagnosis/readonlyDetail", + "tcm.diagnosis/edit", + "tcm.diagnosis/add", + "tcm.diagnosis/delete", + ] + ) + page = ConsultationsPage(SimpleNamespace(), permissions=exact) + assert not page.view_button.isHidden() + assert not page.edit_button.isHidden() + assert not page.add_button.isHidden() + assert not page.delete_button.isHidden() + page.close() + application.processEvents() + + +def test_refresh_generation_ignores_late_results( + application: QApplication, + monkeypatch: pytest.MonkeyPatch, +) -> None: + callbacks: list[dict[str, Any]] = [] + + def queue_async(_function: Any, **options: Any) -> object: + callbacks.append(options) + return object() + + monkeypatch.setattr(consultations_module, "run_async", queue_async) + page = ConsultationsPage(SimpleNamespace(), permissions=PermissionSet(["*"])) + page.refresh(silent=True) + page.refresh(silent=True) + + callbacks[1]["on_success"]({"lists": [_row(id=902, diagnosis_id=902)], "count": 1}) + callbacks[0]["on_success"]({"lists": [_row(id=901, diagnosis_id=901)], "count": 1}) + application.processEvents() + + assert page.table.rowCount() == 1 + assert page.table.item(0, 0).text().startswith("902") + page.close() + + +def test_current_appointment_is_the_only_prescription_authority( + application: QApplication, +) -> None: + calls: list[tuple[str, int]] = [] + + class Repository: + def get_prescription_by_appointment(self, appointment_id: int) -> None: + calls.append(("appointment", appointment_id)) + return None + + def list_prescriptions_by_diagnosis(self, diagnosis_id: int) -> list[dict[str, Any]]: + raise AssertionError(f"diagnosis fallback is forbidden: {diagnosis_id}") + + page = ConsultationsPage(Repository(), permissions=PermissionSet(["*"])) + assert page._load_context_prescription(_row(appointment_id=202)) is None + assert calls == [("appointment", 202)] + page.close() + application.processEvents() + + +def test_empty_appointment_wrapper_is_treated_as_a_new_prescription( + application: QApplication, +) -> None: + class Repository: + def get_prescription_by_appointment(self, appointment_id: int) -> dict[str, Any]: + assert appointment_id == 202 + return {"data": {}} + + page = ConsultationsPage(Repository(), permissions=PermissionSet(["*"])) + assert page._load_context_prescription(_row(appointment_id=202)) is None + page.close() + application.processEvents() + + +def test_prescription_query_error_is_fail_closed_without_diagnosis_fallback( + application: QApplication, +) -> None: + class Repository: + def get_prescription_by_appointment(self, appointment_id: int) -> None: + raise RuntimeError(f"appointment {appointment_id} unavailable") + + def list_prescriptions_by_diagnosis(self, diagnosis_id: int) -> list[dict[str, Any]]: + raise AssertionError(f"diagnosis fallback is forbidden: {diagnosis_id}") + + page = ConsultationsPage(Repository(), permissions=PermissionSet(["*"])) + with pytest.raises(RuntimeError, match="appointment 202 unavailable"): + page._load_context_prescription(_row(appointment_id=202)) + page.close() + application.processEvents() + + +def test_new_prescription_uses_authoritative_case_snapshot_and_exact_ids( + application: QApplication, + immediate_async: None, + monkeypatch: pytest.MonkeyPatch, +) -> None: + calls: list[tuple[str, int]] = [] + created: list[dict[str, Any]] = [] + dialog_seeds: list[dict[str, Any]] = [] + case_record = { + "diagnosis": {"id": 501, "patient_name": "林晓岚", "chief_complaint": "咳嗽"}, + "patient": {"id": 301, "gender": 2, "age": 36}, + } + + class Repository: + def get_prescription_by_appointment(self, appointment_id: int) -> None: + calls.append(("appointment", appointment_id)) + return None + + def list_prescriptions_by_diagnosis(self, diagnosis_id: int) -> list[dict[str, Any]]: + raise AssertionError(f"diagnosis fallback is forbidden: {diagnosis_id}") + + def get_diagnosis_detail(self, diagnosis_id: int, **_kwargs: Any) -> dict[str, Any]: + calls.append(("diagnosis_detail", diagnosis_id)) + return case_record + + def create_prescription(self, prescription: Any) -> dict[str, Any]: + created.append(dict(prescription)) + return {"id": 901} + + def list_consultations(self, **_kwargs: Any) -> dict[str, Any]: + return {"lists": [], "count": 0} + + class AcceptedEditor: + def __init__( + self, + _repository: Any, + seed: dict[str, Any], + **_kwargs: Any, + ) -> None: + dialog_seeds.append(seed) + + def exec(self) -> QDialog.DialogCode: + return QDialog.DialogCode.Accepted + + def payload(self) -> dict[str, Any]: + return {"formula_name": "止咳方", "medicines": []} + + monkeypatch.setattr(consultations_module, "PrescriptionEditorDialog", AcceptedEditor) + page = ConsultationsPage(Repository(), permissions=PermissionSet(["*"])) + page._begin_prescription_load(_row(appointment_id=202), mode="open") + + assert calls[:2] == [("appointment", 202), ("diagnosis_detail", 501)] + assert len(created) == 1 + assert created[0]["diagnosis_id"] == 501 + assert created[0]["appointment_id"] == 202 + assert created[0]["case_record"] == case_record + assert created[0]["case_record"] is not case_record + assert dialog_seeds[0]["case_record"] == case_record + assert dialog_seeds[0]["case_record"] is not case_record + page.close() + application.processEvents() + + +def test_switching_rows_invalidates_prescription_worker_and_clears_busy( + application: QApplication, + immediate_async: None, + monkeypatch: pytest.MonkeyPatch, +) -> None: + page = ConsultationsPage(SimpleNamespace(), permissions=PermissionSet(["*"])) + callbacks: list[dict[str, Any]] = [] + + def queue_async(_function: Any, **options: Any) -> object: + callbacks.append(options) + return object() + + monkeypatch.setattr(consultations_module, "run_async", queue_async) + page.table.set_rows( + [ + _row(id=501, diagnosis_id=501, appointment_id=101), + _row(id=502, diagnosis_id=502, appointment_id=202), + ] + ) + page.table.selectRow(0) + page._begin_prescription_load(page.table.current_data(), mode="open") + assert page._prescription_busy + assert not page.prescription_button.isEnabled() + + page.table.selectRow(1) + application.processEvents() + assert not page._prescription_busy + assert page.prescription_button.isEnabled() + + callbacks[0]["on_success"]({"id": 88, "appointment_id": 101}) + callbacks[0]["on_finished"]() + assert page.table.current_data()["appointment_id"] == 202 + assert not page._prescription_busy + page.close() + application.processEvents() + + +def test_native_call_does_not_reuse_video_qr_permission( + application: QApplication, +) -> None: + page = ConsultationsPage(SimpleNamespace(), permissions=PermissionSet([])) + emitted: list[dict[str, Any]] = [] + page.video_requested.connect(emitted.append) + page.table.set_rows([_row()]) + page.table.selectRow(0) + application.processEvents() + + assert not page.video_button.isHidden() + assert page.video_button.isEnabled() + page._request_video() + assert emitted == [_video_payload(_row())] + page.close() + application.processEvents() diff --git a/app/tests/test_entrypoint.py b/app/tests/test_entrypoint.py new file mode 100644 index 000000000..c7257bc46 --- /dev/null +++ b/app/tests/test_entrypoint.py @@ -0,0 +1,33 @@ +from __future__ import annotations + +from typing import Any + +import pytest + +from doctor_workstation import __main__ as entrypoint + + +def test_smoke_entrypoint_returns_nonzero_instead_of_opening_crash_dialog( + monkeypatch: Any, + capsys: Any, +) -> None: + def fail_startup() -> int: + raise RuntimeError("startup failed") + + monkeypatch.setattr(entrypoint, "main", fail_startup) + monkeypatch.setenv("DOCTOR_SMOKE_TEST", "1") + + assert entrypoint._run() == 1 + assert "RuntimeError: startup failed" in capsys.readouterr().err + + +def test_normal_entrypoint_preserves_startup_exception(monkeypatch: Any) -> None: + def fail_startup() -> int: + raise RuntimeError("startup failed") + + monkeypatch.setattr(entrypoint, "main", fail_startup) + monkeypatch.delenv("DOCTOR_SMOKE_TEST", raising=False) + monkeypatch.setattr(entrypoint.sys, "argv", ["doctor-workstation"]) + + with pytest.raises(RuntimeError, match="startup failed"): + entrypoint._run() diff --git a/app/tests/test_logging_setup.py b/app/tests/test_logging_setup.py new file mode 100644 index 000000000..82efcc822 --- /dev/null +++ b/app/tests/test_logging_setup.py @@ -0,0 +1,23 @@ +from __future__ import annotations + +import logging + +from doctor_workstation.logging_setup import SecretRedactionFilter + + +def test_redaction_filter_hides_credentials() -> None: + record = logging.LogRecord( + name="test", + level=logging.INFO, + pathname=__file__, + lineno=1, + msg="token: abc123 userSig='secret-value' password=hunter2", + args=(), + exc_info=None, + ) + assert SecretRedactionFilter().filter(record) + rendered = record.getMessage() + assert "abc123" not in rendered + assert "secret-value" not in rendered + assert "hunter2" not in rendered + assert rendered.count("") == 3 diff --git a/app/tests/test_mock_repository.py b/app/tests/test_mock_repository.py new file mode 100644 index 000000000..b6ed905df --- /dev/null +++ b/app/tests/test_mock_repository.py @@ -0,0 +1,494 @@ +"""Behaviour tests for mutable demo data and tolerant model parsing.""" + +from __future__ import annotations + +from datetime import date +from pathlib import Path +from typing import Any + +import pytest + +from doctor_workstation.core.errors import ( + ApiBusinessError, + ApiProtocolError, + AuthenticationExpiredError, + RepositoryNotFoundError, +) +from doctor_workstation.core.models import Appointment, PageResult +from doctor_workstation.services.mock_repository import DemoDoctorRepository +from doctor_workstation.services.repository import RemoteDoctorRepository +from doctor_workstation.services.token_store import TokenStore + + +@pytest.fixture +def repository() -> DemoDoctorRepository: + """Return a fresh deterministic repository for each test.""" + + return DemoDoctorRepository(today=date(2026, 8, 10)) + + +def test_demo_login_has_all_doctor_permissions( + repository: DemoDoctorRepository, +) -> None: + """Documented credentials produce a typed, globally authorised session.""" + + with pytest.raises(ApiBusinessError): + repository.login("doctor", "wrong") + + session = repository.login("doctor", "doctor123") + assert session.authenticated + assert session.user.name == "陈医生(演示)" + assert session.permissions.is_superuser + assert session.permissions.can("doctor.appointment", "complete") + assert session.permissions.can("tcm.prescriptionLibrary", "delete") + + +def test_complete_appointment_mutates_all_related_views( + repository: DemoDoctorRepository, +) -> None: + """Completing reception is observable in queue, patient and diagnosis lists.""" + + repository.complete_appointment(101) + + completed = repository.list_appointments(status=3).items + assert [item.id for item in completed] == [101] + patient = repository.list_patients(keyword="林晓岚").items[0] + assert patient.appointment_status == 3 + assert patient.status_filter == "completed" + consultation = repository.list_consultations(patient_name="林晓岚").items[0] + assert consultation.status == 3 + assert repository.get_reception(101)["appointment"]["status"] == 3 + + +def test_add_note_persists_in_reception_detail( + repository: DemoDoctorRepository, +) -> None: + """Text and media added to a diagnosis remain available on later reads.""" + + before = len(repository.get_reception(101)["doctor_notes"]) + created = repository.add_doctor_note( + 501, + "午后睡意减轻", + tongue_images=["demo://tongue.png"], + report_files=["demo://report.pdf"], + ) + + after = repository.get_reception(101)["doctor_notes"] + assert len(after) == before + 1 + assert after[-1] == created + assert after[-1]["tongue_images"] == ["demo://tongue.png"] + + +def test_demo_upload_material_returns_safe_uri_and_note_rejects_local_path( + repository: DemoDoctorRepository, + tmp_path: Path, +) -> None: + """Demo mode exercises the same upload-before-note contract as production.""" + + source = tmp_path / "tongue.jpg" + source.write_bytes(b"demo-image") + uri = repository.upload_material(source, "image") + created = repository.add_doctor_note(501, tongue_images=[uri]) + + assert uri.startswith("/demo/uploads/image/") + assert str(tmp_path) not in uri + assert created["tongue_images"] == [uri] + with pytest.raises(ValueError, match="server uri/url"): + repository.add_doctor_note(501, tongue_images=[str(source)]) + + +def test_prescription_template_crud_is_real_and_isolated( + repository: DemoDoctorRepository, +) -> None: + """Create, update and delete change subsequent list/detail reads.""" + + original_count = repository.list_prescription_templates().total + created = repository.create_prescription_template( + name="益气演示方", + formula_type=1, + herbs=[{"name": "黄芪", "dosage": "20g"}], + is_public=False, + ) + assert repository.list_prescription_templates().total == original_count + 1 + + updated = repository.update_prescription_template( + created.id, + {"name": "益气健脾演示方", "is_public": True}, + ) + assert updated.name == "益气健脾演示方" + assert updated.is_public + assert repository.get_prescription_template(created.id).name == updated.name + + repository.delete_prescription_template(created.id) + assert repository.list_prescription_templates().total == original_count + with pytest.raises(RepositoryNotFoundError): + repository.get_prescription_template(created.id) + + +def test_demo_pagination_and_returned_copies(repository: DemoDoctorRepository) -> None: + """Pagination metadata is stable and callers cannot mutate repository state.""" + + page = repository.list_appointments(page_no=1, page_size=1) + assert page.total == 3 + assert page.pages == 3 + page.items[0].patient_name = "外部改写" + assert repository.list_appointments(page_no=1, page_size=1).items[0].patient_name != ( + "外部改写" + ) + + +def test_demo_prescription_lookup_is_appointment_authoritative( + repository: DemoDoctorRepository, +) -> None: + """Demo getByAppointment never substitutes another diagnosis-level record.""" + + first = repository.get_prescription_by_appointment(101) + second = repository.get_prescription_by_appointment(102) + missing = repository.get_prescription_by_appointment(103) + + assert first is not None and first.id == 802 and first.appointment_id == 101 + assert second is not None and second.id == 801 and second.appointment_id == 102 + assert missing is None + assert first.case_record["appointment_id"] == 101 + + +def test_demo_consultation_filters_and_dictionaries_cover_exposed_ui( + repository: DemoDoctorRepository, +) -> None: + """Every visible consultation filter has deterministic offline semantics.""" + + for dictionary_type in ( + "diagnosis_type", + "consultation_type", + "syndrome_type", + "appointment_channel_source", + "channels", + ): + assert repository.get_dictionary(dictionary_type) + + assert {row.id for row in repository.list_consultations(diagnosis_confirmed="1").items} == { + 501, + 503, + } + assert {row.id for row in repository.list_consultations(diagnosis_type="integrated").items} == { + 502, + 504, + } + assert [row.id for row in repository.list_consultations(syndrome_type="phlegm_damp").items] == [ + 502, + 504, + ] + assert [ + row.id + for row in repository.list_consultations(latest_appointment_channel_source="clinic").items + ] == [502] + assert [row.id for row in repository.list_consultations(pending_booking="1").items] == [504] + assert [row.id for row in repository.list_consultations(pending_assign="1").items] == [504] + assert [row.id for row in repository.list_consultations(completed_appointment="1").items] == [ + 501 + ] + sorted_rows = repository.list_consultations(sort_unserved_days="desc").items + assert [row.unserved_days for row in sorted_rows] == [14, 8, 1, 0] + + +def test_demo_roster_and_slots_fail_closed_to_known_doctor( + repository: DemoDoctorRepository, +) -> None: + """Offline booking uses the same roster/slot boundary as production.""" + + rosters = repository.list_appointment_rosters( + doctor_id=1001, + start_date="2026-08-10", + end_date="2026-08-16", + ) + slots = repository.get_available_appointment_slots( + doctor_id=1001, + appointment_date="2026-08-10", + ) + + assert rosters.total == 7 + assert rosters.items[0]["date"] == "2026-08-10" + assert any(row["time"] == "09:00" and not row["available"] for row in slots["slots"]) + assert ( + repository.get_available_appointment_slots( + doctor_id=9999, + appointment_date="2026-08-10", + )["slots"] + == [] + ) + + +def test_demo_call_lifecycle_mutates_record(repository: DemoDoctorRepository) -> None: + """Start, room binding and end operations share one mutable call record.""" + + ticket = repository.get_call_ticket(301, 501) + assert ticket.patient_user_id == "patient_301" + started = repository.start_call(501, 301) + assert started["status"] == "ringing" + bound = repository.bind_call_room(501, "room-501") + assert bound["room_id"] == "room-501" + ended = repository.end_call(501) + assert ended["status"] == "ended" + assert ended["room_id"] == "room-501" + + +def test_tolerant_page_parsing_accepts_aliases_and_bad_rows() -> None: + """List parsing handles nullable fields, aliases and non-object rows safely.""" + + page = PageResult.from_payload( + { + "rows": [ + { + "appointment_id": "9", + "patient_name": "测试患者", + "status": "waiting", + }, + None, + ], + "total": "12", + "current_page": "2", + "per_page": "5", + "meta": {"scope": "demo"}, + }, + Appointment.from_dict, + ) + + assert len(page.items) == 1 + assert page.items[0].id == 9 + assert page.items[0].status == "waiting" + assert page.total == 12 + assert page.page_no == 2 + assert page.extend == {"scope": "demo"} + + +class _StubApiClient: + """No-network API client double that records repository endpoint use.""" + + def __init__(self) -> None: + self.base_url = "https://example.test/adminapi/" + self.token = "" + self.get_calls: list[tuple[str, dict[str, Any]]] = [] + self.post_calls: list[tuple[str, dict[str, Any]]] = [] + + def set_token(self, token: str) -> None: + """Retain the synthetic login token.""" + + self.token = token + + def clear_token(self) -> None: + """Clear the synthetic login token.""" + + self.token = "" + + def get(self, endpoint: str, params: dict[str, Any] | None = None) -> Any: + """Return a shape appropriate for the requested read endpoint.""" + + self.get_calls.append((endpoint, dict(params or {}))) + if endpoint == "auth.admin/mySelf": + return { + "user": {"id": 1, "name": "远程医生", "role_ids": [1]}, + "permissions": ["doctor.appointment/lists"], + "menu": [], + } + if endpoint.endswith("/detail"): + if endpoint.startswith("tcm.prescriptionLibrary"): + return {"id": 7, "prescription_name": "远程模板", "herbs": []} + if endpoint.startswith("tcm.prescription"): + return {"id": 8, "sn": "RX8", "patient_name": "远程患者"} + if endpoint == "doctor.appointment/reception": + return {"appointment": {"id": params["id"]}, "doctor_notes": []} + return {"lists": [], "count": 0, "extend": {}} + + def post(self, endpoint: str, payload: dict[str, Any] | None = None) -> Any: + """Return synthetic mutation data and record the exact JSON payload.""" + + body = dict(payload or {}) + self.post_calls.append((endpoint, body)) + if endpoint == "login/account": + return {"token": "remote-token", "is_paw": 1} + if endpoint == "tcm.prescriptionLibrary/add": + return {"id": 9} + if endpoint == "tcm.diagnosis/getCallSignature": + return { + "sdkAppId": 123, + "userId": "doctor_1", + "userSig": "short-lived", + "patientUserId": "patient_2", + } + return {"ok": True} + + +def test_remote_repository_uses_all_confirmed_endpoints_without_network() -> None: + """Every required remote operation maps to its audited admin endpoint.""" + + client = _StubApiClient() + repository = RemoteDoctorRepository(client) # type: ignore[arg-type] + + session = repository.login(" doctor ", "secret") + assert session.token == "remote-token" + assert repository.get_current_user().name == "远程医生" + assert [path for path, _ in client.get_calls].count("auth.admin/mySelf") == 1 + + repository.list_appointments(keyword="林", page_no=2, page_size=15) + repository.get_reception(5) + repository.notify_assistant(5) + repository.add_doctor_note(6, "记录") + repository.complete_appointment(5) + repository.list_prescription_templates(keyword="方", formula_type="aux") + repository.get_prescription_template(7) + repository.create_prescription_template( + name="新方", formula_type="main", herbs=[{"name": "茯苓", "dosage": "10g"}] + ) + repository.update_prescription_template(7, {"name": "改方"}) + repository.delete_prescription_template(7) + repository.list_prescriptions(keyword="RX8", status=1) + repository.get_prescription(8) + repository.list_patients(status="completed") + repository.list_consultations(keyword="远程") + ticket = repository.get_call_ticket(2, 6) + repository.start_call(6, 2) + repository.end_call(6) + repository.bind_call_room(6, "room-6") + + assert ticket.user_sig == "short-lived" + get_endpoints = {path for path, _ in client.get_calls} + assert { + "doctor.appointment/lists", + "doctor.appointment/reception", + "tcm.prescriptionLibrary/lists", + "tcm.prescriptionLibrary/detail", + "tcm.prescription/lists", + "tcm.prescription/detail", + "firstvisit.myPatient/lists", + "tcm.diagnosis/lists", + } <= get_endpoints + post_endpoints = {path for path, _ in client.post_calls} + assert { + "login/account", + "doctor.appointment/notifyAssistant", + "doctor.appointment/addDoctorNote", + "doctor.appointment/complete", + "tcm.prescriptionLibrary/add", + "tcm.prescriptionLibrary/edit", + "tcm.prescriptionLibrary/delete", + "tcm.diagnosis/getCallSignature", + "tcm.diagnosis/startCall", + "tcm.diagnosis/endCall", + "tcm.diagnosis/bindCallRoom", + } <= post_endpoints + template_list_call = next( + params + for endpoint, params in client.get_calls + if endpoint == "tcm.prescriptionLibrary/lists" + ) + assert template_list_call["formula_type"] == "辅方" + prescription_list_call = next( + params for endpoint, params in client.get_calls if endpoint == "tcm.prescription/lists" + ) + assert prescription_list_call == { + "sn": "RX8", + "audit_filter": "passed", + "page_no": 1, + "page_size": 20, + } + patient_call = next( + params for endpoint, params in client.get_calls if endpoint == "firstvisit.myPatient/lists" + ) + assert patient_call["status_filter"] == "completed" + + +class _FailingProfileClient(_StubApiClient): + """Client double whose post-login session validation always fails.""" + + def __init__(self, error: Exception) -> None: + super().__init__() + self.error = error + + def get(self, endpoint: str, params: dict[str, Any] | None = None) -> Any: + """Raise the configured error only for the authoritative profile call.""" + + if endpoint == "auth.admin/mySelf": + self.get_calls.append((endpoint, dict(params or {}))) + raise self.error + return super().get(endpoint, params) + + +def test_remote_login_persists_only_after_session_validation( + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """A failed ``mySelf`` call rolls back memory and never saves its token.""" + + client = _FailingProfileClient(ApiProtocolError("bad profile")) + store = TokenStore(tmp_path / "credentials.json", keyring_backend=None) + store.save_token("older-token", account="older", scope=client.base_url) + saved: list[tuple[str, dict[str, Any]]] = [] + original_save = store.save_token + + def record_save(token: str, **metadata: Any) -> None: + saved.append((token, metadata)) + original_save(token, **metadata) + + monkeypatch.setattr(store, "save_token", record_save) + repository = RemoteDoctorRepository(client, store) # type: ignore[arg-type] + + with pytest.raises(ApiProtocolError, match="bad profile"): + repository.login( + "doctor", + "secret", + remember_account=True, + ) + + assert saved == [] + assert client.token == "" + assert store.load_token() is None + + +def test_remote_login_applies_remember_account_to_token_store(tmp_path: Path) -> None: + """The checkbox choice controls account metadata while retaining the token.""" + + client = _StubApiClient() + store = TokenStore(tmp_path / "credentials.json", keyring_backend=None) + repository = RemoteDoctorRepository(client, store) # type: ignore[arg-type] + + repository.login("doctor", "secret", remember_account=True) + assert store.load_account() == "doctor" + assert store.load_token(scope=client.base_url) == "remote-token" + + repository.logout() + repository.login("doctor", "secret", remember_account=False) + assert store.load_account() is None + assert store.load_token(scope=client.base_url) == "remote-token" + + +def test_expired_persisted_token_is_removed_during_restore(tmp_path: Path) -> None: + """An invalid startup token cannot trigger the same failed restore next run.""" + + client = _FailingProfileClient(AuthenticationExpiredError("expired", code=-1)) + store = TokenStore(tmp_path / "credentials.json", keyring_backend=None) + store.save_token("expired-token", account="doctor", scope=client.base_url) + repository = RemoteDoctorRepository(client, store) # type: ignore[arg-type] + + with pytest.raises(AuthenticationExpiredError): + repository.restore_session() + + assert client.token == "" + assert store.load_token() is None + assert store.load_account() == "doctor" + + +def test_restore_never_sends_token_to_a_different_api_scope(tmp_path: Path) -> None: + """Changing the configured server invalidates automatic token reuse.""" + + client = _StubApiClient() + store = TokenStore(tmp_path / "credentials.json", keyring_backend=None) + store.save_token( + "other-server-token", + account="doctor", + scope="https://other.test/adminapi/", + ) + repository = RemoteDoctorRepository(client, store) # type: ignore[arg-type] + + assert repository.restore_session() is None + assert client.token == "" + assert client.get_calls == [] diff --git a/app/tests/test_one_click_entrypoints.py b/app/tests/test_one_click_entrypoints.py new file mode 100644 index 000000000..8f3c84df4 --- /dev/null +++ b/app/tests/test_one_click_entrypoints.py @@ -0,0 +1,55 @@ +from __future__ import annotations + +from pathlib import Path + +PROJECT_ROOT = Path(__file__).resolve().parents[1] + + +def read(relative_path: str) -> str: + return (PROJECT_ROOT / relative_path).read_text(encoding="utf-8") + + +def test_windows_one_click_entrypoints_and_release_pipeline() -> None: + for name in ( + "Run_DoctorWorkstation.bat", + "Build_DoctorWorkstation.bat", + "一键运行_医生工作站.bat", + "一键打包_医生工作站.bat", + ): + assert (PROJECT_ROOT / name).is_file() + + run_script = read("scripts/run_windows.ps1") + package_script = read("scripts/package_windows.ps1") + release_launcher = read("packaging/windows/start_release.bat") + + assert run_script.index("$FrozenExecutable") < run_script.index("Find-Uv") + assert "& $Uv sync --frozen" in run_script + assert "& $Uv sync --frozen --extra build" in package_script + assert "& $Npm ci --prefix" in package_script + assert "build_windows.ps1" in package_script + assert "DoctorWorkstation-Windows-x64-$ProjectVersion.zip" in package_script + assert "Get-FileHash" in package_script + assert "Start_DoctorWorkstation.bat" in package_script + assert "DoctorWorkstation\\DoctorWorkstation.exe" in release_launcher + assert "explorer.exe" in read("Build_DoctorWorkstation.bat") + + +def test_macos_one_click_entrypoints_and_release_pipeline() -> None: + for name in ( + "run_macos.command", + "package_macos.command", + "一键运行.command", + "一键打包.command", + ): + assert (PROJECT_ROOT / name).is_file() + + run_script = read("scripts/run_macos.sh") + package_script = read("scripts/package_macos.sh") + + assert run_script.index('/usr/bin/open "$artifact"') < run_script.index("macos_ensure_uv") + assert "sync --locked" in run_script + assert "sync --locked --extra build" in package_script + assert 'ci --prefix "$project_root/video_companion"' in package_script + assert "/usr/bin/ditto -c -k --sequesterRsrc --keepParent" in package_script + assert "/usr/bin/shasum -a 256" in package_script + assert "DoctorWorkstation-macOS-$release_arch-$project_version.zip" in package_script diff --git a/app/tests/test_patients_ui.py b/app/tests/test_patients_ui.py new file mode 100644 index 000000000..6a32232e7 --- /dev/null +++ b/app/tests/test_patients_ui.py @@ -0,0 +1,556 @@ +from __future__ import annotations + +import os +from types import SimpleNamespace +from typing import Any + +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") + +import pytest +from PySide6.QtCore import QDate +from PySide6.QtWidgets import QApplication, QInputDialog + +from doctor_workstation.core import PermissionSet +from doctor_workstation.services import DemoDoctorRepository +from doctor_workstation.ui.dialogs import diagnosis as diagnosis_module +from doctor_workstation.ui.dialogs.diagnosis import DiagnosisDialog +from doctor_workstation.ui.pages import patients as patients_module +from doctor_workstation.ui.pages.patients import ( + PatientListWorkspace, + PatientOrdersWorkspace, + PatientProgressWorkspace, + PatientsPage, + _AppointmentDialog, + _PaymentDialog, + _RefundDialog, +) +from doctor_workstation.ui.shell import NAVIGATION, ShellWindow, _resolve_navigation + + +@pytest.fixture(scope="module") +def application() -> QApplication: + return QApplication.instance() or QApplication([]) + + +@pytest.fixture +def immediate_async(monkeypatch: pytest.MonkeyPatch) -> None: + def run_immediately( + function: Any, + *args: Any, + on_success: Any = None, + on_error: Any = None, + on_finished: Any = None, + **kwargs: Any, + ) -> object: + try: + result = function(*args, **kwargs) + except Exception as error: + if on_error: + on_error(error) + else: + if on_success: + on_success(result) + finally: + if on_finished: + on_finished() + return object() + + monkeypatch.setattr(patients_module, "run_async", run_immediately) + monkeypatch.setattr(diagnosis_module, "run_async", run_immediately) + + +def test_shell_resolves_dynamic_menu_order_visibility_and_canonical_permissions() -> None: + permissions = PermissionSet( + [ + "firstvisit.myPatient/lists", + "tcm.diagnosis/lists", + "tcm.prescription/lists", + "doctor.appointment/lists", + ] + ) + menu = [ + { + "name": "隐藏接诊", + "perms": "doctor.appointment/lists", + "sort": 999, + "is_show": 0, + }, + { + "name": "诊疗中心", + "sort": 20, + "children": [ + { + "name": "患者工作区", + "component": "first_visit/my_patients/index", + "sort": 80, + }, + { + "name": "问诊工作区", + "perms": "tcm.diagnosis/lists", + "sort": 60, + }, + ], + }, + { + "name": "停用处方", + "perms": "tcm.prescription/lists", + "sort": 30, + "is_disable": 1, + }, + ] + + resolved = _resolve_navigation(menu, permissions, demo_mode=False) + + assert [(item.key, title) for item, title in resolved] == [ + ("patients", "患者工作区"), + ("consultations", "问诊工作区"), + ] + assert _resolve_navigation([], permissions, demo_mode=False) == [] + assert [item.key for item, _title in _resolve_navigation([], permissions, demo_mode=True)] == [ + "reception", + "prescriptions", + "patients", + "consultations", + ] + assert ( + _resolve_navigation( + [{"perms": "firstvisit.myPatient/lists"}], + PermissionSet(["firstvisit.myPatient.lists"]), + demo_mode=False, + ) + == [] + ) + + +def test_patient_page_runs_all_three_demo_workspaces_and_progress_timer( + application: QApplication, + immediate_async: None, +) -> None: + repository = DemoDoctorRepository() + session = repository.login(repository.DEMO_ACCOUNT, repository.DEMO_PASSWORD) + page = PatientsPage(repository, permissions=session.permissions, current_user=session.user) + page.resize(808, 560) + page.show() + application.processEvents() + + assert [page.tabs.tabText(index) for index in range(page.tabs.count())] == [ + "患者列表", + "订单管理", + "面诊进度", + ] + assert page.patient_workspace.table.rowCount() > 0 + assert page.patient_workspace.scope_label.text() != "" + + page.tabs.setCurrentIndex(1) + application.processEvents() + assert page.order_workspace.table.rowCount() > 0 + assert page.order_workspace.metrics["orders"].text() == "1" + assert page.order_workspace.metrics["amount"].text() == "¥368.00" + + page.tabs.setCurrentIndex(2) + application.processEvents() + assert page.progress_workspace.timer.isActive() + assert page.progress_workspace.schedule_table.rowCount() == 7 + + page.tabs.setCurrentIndex(0) + assert not page.progress_workspace.timer.isActive() + page.close() + application.processEvents() + + +def test_patient_refresh_generation_ignores_late_results( + application: QApplication, + monkeypatch: pytest.MonkeyPatch, +) -> None: + callbacks: list[dict[str, Any]] = [] + + def queue_async(_function: Any, **options: Any) -> object: + callbacks.append(options) + return object() + + monkeypatch.setattr(patients_module, "run_async", queue_async) + workspace = PatientListWorkspace(SimpleNamespace(), PermissionSet(["*"])) + workspace.refresh() + workspace.refresh() + newer = { + "lists": [{"id": 2, "diagnosis_id": 2, "patient_name": "新结果"}], + "count": 1, + } + stale = { + "lists": [{"id": 1, "diagnosis_id": 1, "patient_name": "旧结果"}], + "count": 1, + } + + callbacks[1]["on_success"](newer) + callbacks[0]["on_success"](stale) + application.processEvents() + + assert workspace.table.rowCount() == 1 + assert workspace.table.item(0, 0).text().startswith("新结果") + workspace.close() + + +def test_workspace_queries_use_frozen_page_no_contract( + application: QApplication, + immediate_async: None, +) -> None: + calls: list[tuple[str, dict[str, Any]]] = [] + + class Repository: + def list_patients(self, **kwargs: Any) -> dict[str, Any]: + calls.append(("patients", kwargs)) + return {"lists": [], "count": 0} + + def patient_orders(self, **kwargs: Any) -> dict[str, Any]: + calls.append(("orders", kwargs)) + return {"lists": [], "count": 0} + + def patient_progress(self, **kwargs: Any) -> dict[str, Any]: + calls.append(("progress", kwargs)) + return {"lists": [], "count": 0} + + repository = Repository() + patient = PatientListWorkspace(repository, PermissionSet(["*"])) + orders = PatientOrdersWorkspace(repository, PermissionSet(["*"])) + progress = PatientProgressWorkspace(repository) + patient.refresh() + orders.refresh() + progress.refresh() + + assert [name for name, _kwargs in calls] == ["patients", "orders", "progress"] + for _name, kwargs in calls: + assert kwargs["page_no"] == 1 + assert kwargs["page_size"] == 15 + assert "page" not in kwargs + patient.close() + orders.close() + progress.close() + application.processEvents() + + +def test_workspace_workers_use_gui_thread_query_snapshots( + application: QApplication, + monkeypatch: pytest.MonkeyPatch, +) -> None: + queued: list[tuple[Any, tuple[Any, ...], dict[str, Any]]] = [] + patient_calls: list[dict[str, Any]] = [] + order_calls: list[dict[str, Any]] = [] + + def queue_async(function: Any, *args: Any, **options: Any) -> object: + queued.append((function, args, options)) + return object() + + class Repository: + def list_patients(self, **kwargs: Any) -> dict[str, Any]: + patient_calls.append(kwargs) + return {"lists": [], "count": 0} + + def patient_orders(self, **kwargs: Any) -> dict[str, Any]: + order_calls.append(kwargs) + return {"lists": [], "count": 0} + + repository = Repository() + patient = PatientListWorkspace(repository, PermissionSet(["*"])) + orders = PatientOrdersWorkspace(repository, PermissionSet(["*"])) + monkeypatch.setattr(patients_module, "run_async", queue_async) + + patient.keyword_edit.setText("captured patient") + patient.refresh() + patient.keyword_edit.setText("changed patient") + function, args, _options = queued[0] + function(*args) + + orders.keyword_edit.setText("captured order") + orders.refresh() + orders.keyword_edit.setText("changed order") + function, args, _options = queued[1] + function(*args) + + assert patient_calls[0]["keyword"] == "captured patient" + assert order_calls[0]["keyword"] == "captured order" + patient.close() + orders.close() + application.processEvents() + + +def test_appointment_form_uses_rosters_slots_and_diagnosis_id_contract( + application: QApplication, + immediate_async: None, +) -> None: + tomorrow = QDate.currentDate().addDays(1).toString("yyyy-MM-dd") + appointment_queries: list[dict[str, Any]] = [] + roster_queries: list[dict[str, Any]] = [] + slot_queries: list[dict[str, Any]] = [] + + class Repository: + def list_diagnosis_doctors(self) -> list[dict[str, Any]]: + return [{"id": 77, "name": "陈医生", "department_name": "中医科"}] + + def get_dictionary(self, dictionary_type: str) -> list[dict[str, Any]]: + assert dictionary_type == "channels" + return [{"id": 1, "name": "线上复诊", "value": "online", "status": 1, "sort": 10}] + + def list_appointments(self, **kwargs: Any) -> dict[str, Any]: + appointment_queries.append(kwargs) + return {"lists": [], "count": 0} + + def list_appointment_rosters(self, **kwargs: Any) -> dict[str, Any]: + roster_queries.append(kwargs) + return {"lists": [{"date": tomorrow}], "count": 1} + + def get_available_appointment_slots(self, **kwargs: Any) -> dict[str, Any]: + slot_queries.append(kwargs) + return {"slots": [{"time": "09:30-10:00", "available": True, "quota": 2}]} + + row = { + "id": 501, + "diagnosis_id": 501, + "patient_id": 999, + "source_patient_id": 999, + "patient_name": "林晓岚", + "doctor_id": 77, + } + dialog = _AppointmentDialog(row, repository=Repository()) + application.processEvents() + dialog.channel_source.setCurrentIndex(dialog.channel_source.findData("online")) + dialog.slot_combo.setCurrentIndex(dialog.slot_combo.findData("09:30-10:00")) + dialog.remark.setPlainText("复诊预约") + application.processEvents() + + payload = dialog.payload() + assert appointment_queries[0]["patient_id"] == 501 + assert roster_queries[0]["doctor_id"] == 77 + assert slot_queries[0] == { + "doctor_id": 77, + "appointment_date": tomorrow, + "period": "all", + } + assert dialog.ok_button.isEnabled() + assert payload == { + "diagnosis_id": 501, + "patient_id": 501, + "doctor_id": 77, + "appointment_date": tomorrow, + "appointment_time": "09:30-10:00", + "period": "all", + "appointment_type": "video", + "remark": "复诊预约", + "channel_source": "online", + "channel_source_detail": "", + } + assert payload["patient_id"] != row["source_patient_id"] + dialog.close() + application.processEvents() + + +def test_payment_and_refund_forms_expose_full_contract( + application: QApplication, +) -> None: + payment = _PaymentDialog({"amount": 368, "linked_pay_paid_total": 100}) + payment.pay_create_type.setCurrentIndex(payment.pay_create_type.findData("express_cod")) + payment.pay_amount.setValue(268) + payment.pay_remark.setPlainText("货到代收") + payment.completion_request.setChecked(True) + assert payment.payload() == { + "order_type": 3, + "pay_amount": 268.0, + "pay_remark": "货到代收", + "completion_request": 1, + "pay_create_type": "express_cod", + } + + refund = _RefundDialog({"amount": 368}) + refund.reason.setPlainText("患者取消") + assert refund.payload() == {"reason": "患者取消", "refund_amount": None} + refund.specify_amount.setChecked(True) + refund.refund_amount.setValue(88.5) + assert refund.payload() == {"reason": "患者取消", "refund_amount": 88.5} + payment.close() + refund.close() + application.processEvents() + + +def test_out_of_order_mutation_successes_each_trigger_reconciliation( + application: QApplication, + monkeypatch: pytest.MonkeyPatch, +) -> None: + page = PatientsPage(SimpleNamespace(), permissions=PermissionSet(["*"])) + callbacks: list[dict[str, Any]] = [] + reconciliations: list[str] = [] + + def queue_async(_function: Any, **options: Any) -> object: + callbacks.append(options) + return object() + + monkeypatch.setattr(patients_module, "run_async", queue_async) + monkeypatch.setattr(page, "_after_mutation", lambda: reconciliations.append("refresh")) + page._run_action("first", lambda: None, success="first done") + page._run_action("second", lambda: None, success="second done") + + callbacks[1]["on_success"](None) + callbacks[0]["on_success"](None) + callbacks[1]["on_finished"]() + callbacks[0]["on_finished"]() + + assert reconciliations == ["refresh", "refresh"] + assert page._pending_action_tokens == set() + page.close() + application.processEvents() + + +def test_diagnosis_dialog_loads_histories_and_saves_canonical_fields( + application: QApplication, + immediate_async: None, +) -> None: + repository = DemoDoctorRepository() + repository.login(repository.DEMO_ACCOUNT, repository.DEMO_PASSWORD) + diagnosis_id = repository.list_patients().items[0].diagnosis_id + before = repository.get_diagnosis_detail(diagnosis_id) + dialog = DiagnosisDialog(repository) + + dialog.open_for(diagnosis_id, editable=True) + application.processEvents() + + assert ( + dialog.edit_fields["chief_complaint"].toPlainText() + == before["diagnosis"]["chief_complaint"] + ) + assert dialog.appointment_table.rowCount() >= 1 + dialog.edit_fields["chief_complaint"].setPlainText("离屏回归主诉") + dialog._save() + + assert ( + repository.get_diagnosis_detail(diagnosis_id)["diagnosis"]["chief_complaint"] + == "离屏回归主诉" + ) + dialog.close() + application.processEvents() + + +def test_order_action_matrix_requires_exact_permissions_and_states( + application: QApplication, +) -> None: + codes = { + "tcm.prescriptionOrder/detail", + "tcm.prescriptionOrder/edit", + "tcm.prescriptionOrder/auditPrescription", + "tcm.prescriptionOrder/auditPayment", + "tcm.prescriptionOrder/ddcode", + "tcm.prescriptionOrder/ship", + "tcm.prescriptionOrder/addPayOrder", + "tcm.prescriptionOrder/complete", + "tcm.prescriptionOrder/refund", + "tcm.prescriptionOrder/withdraw", + "tcm.prescriptionOrder/uploadToPharmacy", + } + workspace = PatientOrdersWorkspace(SimpleNamespace(), PermissionSet(codes)) + pending = { + "id": 1, + "fulfillment_status": 1, + "prescription_audit_status": 0, + "payment_slip_audit_status": 0, + "amount": 100, + "linked_pay_paid_total": 0, + } + shipped = { + **pending, + "fulfillment_status": 5, + "prescription_audit_status": 1, + "payment_slip_audit_status": 1, + "linked_pay_paid_total": 80, + } + + assert [key for key, _label, _danger in workspace._available_actions(pending)] == [ + "edit", + "audit_prescription", + "ddcode", + "withdraw", + ] + assert [key for key, _label, _danger in workspace._available_actions(shipped)] == [ + "revoke_pay_audit", + "ddcode", + "add_pay_order", + "complete", + "refund", + "upload_pharmacy", + ] + remote_locked = {**pending, "gancao_reciperl_order_no": "GC-REMOTE-1"} + assert [key for key, _label, _danger in workspace._available_actions(remote_locked)] == [ + "audit_prescription", + "ddcode", + ] + alias_only = PatientOrdersWorkspace( + SimpleNamespace(), PermissionSet(["tcm.prescriptionOrder.edit"]) + ) + assert alias_only._available_actions(pending) == [] + workspace.close() + alias_only.close() + application.processEvents() + + +def test_order_audit_action_uses_repository_contract_values( + application: QApplication, + immediate_async: None, + monkeypatch: pytest.MonkeyPatch, +) -> None: + repository = DemoDoctorRepository() + session = repository.login(repository.DEMO_ACCOUNT, repository.DEMO_PASSWORD) + page = PatientsPage(repository, permissions=session.permissions, current_user=session.user) + order_id = repository.patient_orders().items[0]["id"] + repository.revoke_patient_order_payment_audit(order_id) + repository.revoke_patient_order_prescription_audit(order_id) + row = repository.get_patient_order(order_id) + monkeypatch.setattr( + QInputDialog, + "getItem", + staticmethod(lambda *_args, **_kwargs: ("通过", True)), + ) + monkeypatch.setattr( + QInputDialog, + "getText", + staticmethod(lambda *_args, **_kwargs: ("离屏审核", True)), + ) + + page._handle_order_action("audit_prescription", row) + + assert repository.get_patient_order(row["id"])["prescription_audit_status"] == 1 + page.close() + application.processEvents() + + +def test_shell_uses_demo_session_menu_and_fits_minimum_window( + application: QApplication, + immediate_async: None, +) -> None: + repository = DemoDoctorRepository() + session = repository.login(repository.DEMO_ACCOUNT, repository.DEMO_PASSWORD) + patient_menu = next( + row for row in session.menu if row.get("perms") == "firstvisit.myPatient/lists" + ) + patient_menu["name"] = "患者中心" + patient_menu["sort"] = 99 + session.menu = [patient_menu] + shell = ShellWindow( + repository, + {"session": session, "demo_mode": True}, + permissions=session.permissions, + ) + shell.resize(1024, 640) + shell.show() + application.processEvents() + + assert list(shell.pages) == ["patients"] + assert shell.nav_buttons["patients"].text().endswith("患者中心") + assert shell.minimumWidth() == 1024 + assert shell.minimumHeight() == 640 + assert shell.size().width() == 1024 + assert shell.size().height() == 640 + assert {item.key for item in NAVIGATION} == { + "reception", + "prescription_library", + "prescriptions", + "patients", + "consultations", + } + shell.close() + application.processEvents() diff --git a/app/tests/test_permissions.py b/app/tests/test_permissions.py new file mode 100644 index 000000000..c0ff4aad8 --- /dev/null +++ b/app/tests/test_permissions.py @@ -0,0 +1,52 @@ +"""Tests for permission semantics reused by page and action guards.""" + +from doctor_workstation.core.permissions import PermissionSet + + +def test_global_wildcard_grants_every_page_and_action() -> None: + """The server's global wildcard remains authoritative.""" + + permissions = PermissionSet(["*"]) + + assert permissions.is_superuser + assert permissions.can_access_page("doctor.appointment/lists") + assert permissions.can_perform_action("doctor.appointment/complete") + assert permissions.can("doctor.appointment", "complete") + + +def test_all_and_any_accept_sequences_or_positional_values() -> None: + """AND and OR helpers preserve the two web-client permission semantics.""" + + permissions = PermissionSet(["doctor.appointment/lists", "doctor.appointment/complete"]) + + assert permissions.all("doctor.appointment/lists", "doctor.appointment/complete") + assert permissions.has_all(["doctor.appointment/lists", "doctor.appointment/complete"]) + assert not permissions.all("doctor.appointment/lists", "doctor.appointment/cancel") + assert permissions.any(["doctor.appointment/cancel", "doctor.appointment/complete"]) + assert not permissions.has_any([]) + assert permissions.has_all([]) + + +def test_page_action_categories_and_resource_wildcards() -> None: + """Explicit page/action categories share checks without overloading UI code.""" + + permissions = PermissionSet( + pages=["patients/view"], + actions=["tcm.prescriptionLibrary/*"], + ) + + assert permissions.can_access_page("patients/view") + assert permissions.can("tcm.prescriptionLibrary", "add") + assert permissions.can_perform_action("tcm.prescriptionLibrary/delete") + assert not permissions.can_perform_action("tcm.prescription/delete") + assert "patients/view" in permissions + + +def test_permission_set_normalises_and_deduplicates_values() -> None: + """Whitespace and duplicates do not create surprising guard results.""" + + permissions = PermissionSet([" alpha/read ", "alpha/read", ""]) + + assert list(permissions) == ["alpha/read"] + assert len(permissions) == 1 + assert bool(permissions) diff --git a/app/tests/test_prescription_security_ui.py b/app/tests/test_prescription_security_ui.py new file mode 100644 index 000000000..eea5c8528 --- /dev/null +++ b/app/tests/test_prescription_security_ui.py @@ -0,0 +1,386 @@ +from __future__ import annotations + +import os +from types import SimpleNamespace +from typing import Any + +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") + +import pytest +from PySide6.QtCore import Qt +from PySide6.QtWidgets import QApplication, QDialog + +from doctor_workstation.core import PermissionSet +from doctor_workstation.ui import widgets +from doctor_workstation.ui.dialogs import diagnosis as diagnosis_module +from doctor_workstation.ui.dialogs import prescription as dialog_module +from doctor_workstation.ui.dialogs.diagnosis import DiagnosisDialog +from doctor_workstation.ui.dialogs.prescription import ( + PrescriptionEditorDialog, + PrescriptionOrderDialog, + PrescriptionTemplateDialog, +) +from doctor_workstation.ui.pages import prescription_library as library_module +from doctor_workstation.ui.pages import prescriptions as prescription_module +from doctor_workstation.ui.pages.prescription_library import PrescriptionLibraryPage +from doctor_workstation.ui.pages.prescriptions import PrescriptionsPage + + +@pytest.fixture(scope="module") +def application() -> QApplication: + return QApplication.instance() or QApplication([]) + + +def _immediate_async( + function: Any, + *args: Any, + on_success: Any = None, + on_error: Any = None, + on_finished: Any = None, + **_kwargs: Any, +) -> object: + try: + result = function(*args) + except Exception as error: + if on_error: + on_error(error) + else: + if on_success: + on_success(result) + finally: + if on_finished: + on_finished() + return object() + + +class _DiagnosisRepository: + def __init__(self) -> None: + self.order_queries: list[dict[str, Any]] = [] + self.phone_checks: list[dict[str, Any]] = [] + self.id_card_checks: list[dict[str, Any]] = [] + self.updates: list[tuple[int, dict[str, Any]]] = [] + + def get_diagnosis_detail(self, diagnosis_id: int, *, readonly: bool = False) -> dict[str, Any]: + del readonly + return { + "diagnosis": { + "id": diagnosis_id, + "patient_id": 321, + "patient_name": "林晓岚", + "phone": "13812345678", + "id_card": "510107199001011234", + "gender": 0, + "age": 36, + "height": 162.5, + "weight": 52.0, + "fasting_blood_sugar": "6.2", + "chief_complaint": "乏力", + "symptoms": "口干", + "appetite": ["一般", "少食"], + "clinical_diagnosis": "气阴两虚", + "can_edit_patient_basic": True, + }, + "patient": {"id": 321}, + "appointment": {}, + } + + def appointment_history(self, **_kwargs: Any) -> dict[str, Any]: + return {"lists": [], "count": 0} + + def assign_history(self, **_kwargs: Any) -> dict[str, Any]: + return {"lists": [], "count": 0} + + def list_prescription_orders(self, **kwargs: Any) -> dict[str, Any]: + self.order_queries.append(kwargs) + return { + "lists": [ + { + "id": 8, + "order_no": "ORDER-8", + "prescription_id": 5, + "patient_name": "林晓岚", + "amount": 128, + } + ], + "count": 1, + } + + def check_diagnosis_phone(self, payload: dict[str, Any]) -> dict[str, Any]: + self.phone_checks.append(payload) + return {"exists": False} + + def check_diagnosis_id_card(self, payload: dict[str, Any]) -> dict[str, Any]: + self.id_card_checks.append(payload) + return {"duplicate": False} + + def update_diagnosis( + self, diagnosis: int, changes: dict[str, Any] | None = None + ) -> dict[str, Any]: + self.updates.append((diagnosis, dict(changes or {}))) + return {"id": diagnosis, **dict(changes or {})} + + +def test_canonical_permission_helper_rejects_dot_aliases_and_accepts_wildcards() -> None: + assert not widgets.has_permission( + PermissionSet(["cf.prescription.edit"]), "cf.prescription/edit" + ) + assert widgets.has_permission(PermissionSet(["cf.prescription/*"]), "cf.prescription/edit") + assert widgets.has_permission(PermissionSet(["*"]), "cf.prescription/edit") + assert not widgets.has_permission({}, "cf.prescription/edit") + + +def test_diagnosis_masks_sensitive_fields_and_loads_exact_context_orders( + application: QApplication, + monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.setattr(diagnosis_module, "run_async", _immediate_async) + repository = _DiagnosisRepository() + dialog = DiagnosisDialog( + repository, + permissions=PermissionSet(["tcm.diagnosis/patientOrders"]), + ) + + dialog.open_for(77, editable=False) + + assert dialog.summary_fields["phone"].text() == "138****5678" + assert dialog.summary_fields["id_card"].text() == "510107********1234" + assert dialog.edit_fields["phone"].toPlainText() == "138****5678" + assert dialog.edit_fields["id_card"].toPlainText() == "510107********1234" + assert dialog.edit_fields["phone"].isReadOnly() + assert dialog.edit_fields["id_card"].isReadOnly() + assert dialog.orders_table.rowCount() == 1 + assert repository.order_queries == [ + { + "page_no": 1, + "page_size": 10, + "context_diagnosis_id": 77, + "patient_id": 321, + "scene": "diagnosis_edit", + } + ] + dialog.close() + application.processEvents() + + +def test_diagnosis_edit_checks_unique_identity_and_saves_expanded_dto( + application: QApplication, + monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.setattr(diagnosis_module, "run_async", _immediate_async) + repository = _DiagnosisRepository() + dialog = DiagnosisDialog( + repository, + permissions=PermissionSet(["tcm.diagnosis/edit", "tcm.diagnosis/phonePlain"]), + ) + dialog.open_for(77, editable=True) + dialog.edit_fields["symptoms"].setPlainText("口干、多饮") + dialog.edit_fields["appetite"].setPlainText("一般、少食") + + dialog._save() + + assert repository.phone_checks == [{"phone": "13812345678", "id": 77}] + assert repository.id_card_checks == [{"id_card": "510107199001011234", "id": 77}] + diagnosis_id, changes = repository.updates[-1] + assert diagnosis_id == 77 + assert changes["phone"] == "13812345678" + assert changes["id_card"] == "510107199001011234" + assert changes["symptoms"] == "口干、多饮" + assert changes["appetite"] == ["一般", "少食"] + dialog.close() + application.processEvents() + + +def test_duplicate_herbs_are_rejected_for_templates_and_issued_prescriptions( + application: QApplication, +) -> None: + herbs = [ + {"medicine_id": 11, "name": "黄芪", "dosage": 10}, + {"medicine_id": 11, "name": "黄芪", "dosage": 15}, + ] + repository = SimpleNamespace() + template = PrescriptionTemplateDialog( + repository, + {"id": 1, "prescription_name": "重复方", "herbs": herbs}, + mode="edit", + ) + template.accept() + assert template.result() == QDialog.DialogCode.Rejected + assert "药材不可重复:黄芪" in template.validation.label.text() + + editor = PrescriptionEditorDialog( + repository, + mode="add", + current_user=SimpleNamespace(id=9, name="周医生"), + ) + editor.patient_name.setText("林晓岚") + editor.clinical_diagnosis.setPlainText("气虚") + editor.signature._has_strokes = True + editor.herbs.set_rows(herbs, locked=False) + editor.accept() + assert editor.result() == QDialog.DialogCode.Rejected + assert "药材不可重复:黄芪" in editor.validation.label.text() + template.close() + editor.close() + application.processEvents() + + +def test_paid_order_response_is_bound_to_active_diagnosis_and_blocks_save( + application: QApplication, + monkeypatch: pytest.MonkeyPatch, +) -> None: + callbacks: list[dict[str, Any]] = [] + + def queue_async(_function: Any, **options: Any) -> object: + callbacks.append(options) + return object() + + monkeypatch.setattr(dialog_module, "run_async", queue_async) + monkeypatch.setattr(dialog_module.QTimer, "singleShot", staticmethod(lambda *_args: None)) + dialog = PrescriptionOrderDialog( + SimpleNamespace(list_paid_prescription_orders=lambda diagnosis_id: {}), + {"id": 12, "diagnosis_id": 6, "patient_name": "林晓岚"}, + ) + + dialog._load_paid_orders() + assert not dialog.save_button.isEnabled() + dialog.diagnosis_id.setValue(7) + assert len(callbacks) == 2 + + callbacks[0]["on_success"]( + {"lists": [{"id": 66, "order_no": "OLD"}], "deposit_min_amount": 100} + ) + assert dialog.paid_orders.count() == 0 + assert not dialog.save_button.isEnabled() + + callbacks[1]["on_success"]({"lists": [{"id": 77, "order_no": "NEW"}], "deposit_min_amount": 50}) + assert dialog.paid_orders.item(0).data(Qt.ItemDataRole.UserRole) == 77 + assert dialog.save_button.isEnabled() + assert dialog._paid_orders_diagnosis_id == 7 + dialog.close() + application.processEvents() + + +def _finish_queued(callback: dict[str, Any], result: Any) -> None: + callback["on_success"](result) + if callback.get("on_finished"): + callback["on_finished"]() + + +def test_prescription_lists_snapshot_queries_and_replay_pending_refresh( + application: QApplication, + monkeypatch: pytest.MonkeyPatch, +) -> None: + library_callbacks: list[tuple[Any, dict[str, Any]]] = [] + library_calls: list[dict[str, Any]] = [] + + def queue_library(function: Any, **options: Any) -> object: + library_callbacks.append((function, options)) + return object() + + class LibraryRepository: + def list_prescription_templates(self, **kwargs: Any) -> dict[str, Any]: + library_calls.append(kwargs) + return {"lists": [], "count": 0} + + monkeypatch.setattr(library_module, "run_async", queue_library) + library = PrescriptionLibraryPage( + LibraryRepository(), PermissionSet(["wcf.prescription/*"]), SimpleNamespace(id=1) + ) + library.refresh() + library.name_filter.setText("新条件") + library.refresh() + assert len(library_callbacks) == 1 + first_function, first_options = library_callbacks[0] + first_result = first_function() + _finish_queued(first_options, first_result) + assert len(library_callbacks) == 2 + second_function, second_options = library_callbacks[1] + second_result = second_function() + _finish_queued(second_options, second_result) + assert [call["prescription_name"] for call in library_calls] == ["", "新条件"] + + issued_callbacks: list[tuple[Any, dict[str, Any]]] = [] + issued_calls: list[dict[str, Any]] = [] + + def queue_issued(function: Any, **options: Any) -> object: + issued_callbacks.append((function, options)) + return object() + + class IssuedRepository: + def list_prescriptions(self, **kwargs: Any) -> dict[str, Any]: + issued_calls.append(kwargs) + return {"lists": [], "count": 0} + + monkeypatch.setattr(prescription_module, "run_async", queue_issued) + issued = PrescriptionsPage( + IssuedRepository(), PermissionSet(["cf.prescription/*"]), SimpleNamespace(id=1) + ) + issued.refresh() + issued.patient_filter.setText("新患者") + issued.refresh() + assert len(issued_callbacks) == 1 + first_function, first_options = issued_callbacks[0] + first_result = first_function() + _finish_queued(first_options, first_result) + assert len(issued_callbacks) == 2 + second_function, second_options = issued_callbacks[1] + second_result = second_function() + _finish_queued(second_options, second_result) + assert [call["patient_name"] for call in issued_calls] == ["", "新患者"] + library.close() + issued.close() + application.processEvents() + + +def test_diagnosis_detail_requires_permission_and_ignores_stale_target( + application: QApplication, + monkeypatch: pytest.MonkeyPatch, +) -> None: + repository_calls: list[int] = [] + + class Repository: + def get_diagnosis_detail( + self, diagnosis_id: int, *, readonly: bool = False + ) -> dict[str, Any]: + repository_calls.append(diagnosis_id) + return {"id": diagnosis_id, "readonly": readonly} + + denied = PrescriptionsPage(Repository(), PermissionSet([]), SimpleNamespace(id=1)) + denied._open_diagnosis(1) + assert repository_calls == [] + + callbacks: list[tuple[Any, dict[str, Any]]] = [] + + def queue_async(function: Any, **options: Any) -> object: + callbacks.append((function, options)) + return object() + + shown: list[int] = [] + + class FakeDiagnosisDetailDialog: + def __init__(self, detail: dict[str, Any], _parent: Any) -> None: + shown.append(detail["id"]) + + def exec(self) -> int: + return 0 + + monkeypatch.setattr(prescription_module, "run_async", queue_async) + monkeypatch.setattr(prescription_module, "DiagnosisDetailDialog", FakeDiagnosisDetailDialog) + allowed = PrescriptionsPage( + Repository(), + PermissionSet(["tcm.diagnosis/readonlyDetail"]), + SimpleNamespace(id=1), + ) + allowed._open_diagnosis(11) + allowed._open_diagnosis(12) + assert len(callbacks) == 2 + old_function, old_options = callbacks[0] + old_options["on_success"](old_function()) + assert shown == [] + new_function, new_options = callbacks[1] + new_options["on_success"](new_function()) + assert shown == [12] + assert repository_calls == [11, 12] + denied.close() + allowed.close() + application.processEvents() diff --git a/app/tests/test_prescription_ui.py b/app/tests/test_prescription_ui.py new file mode 100644 index 000000000..c2e124eec --- /dev/null +++ b/app/tests/test_prescription_ui.py @@ -0,0 +1,424 @@ +from __future__ import annotations + +import os +from types import SimpleNamespace +from typing import Any + +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") + +import pytest +from PySide6.QtCore import Qt +from PySide6.QtWidgets import QApplication + +from doctor_workstation.services import DemoDoctorRepository +from doctor_workstation.ui.dialogs import prescription as dialog_module +from doctor_workstation.ui.dialogs.prescription import ( + AuditPrescriptionDialog, + PrescriptionDetailDialog, + PrescriptionEditorDialog, + PrescriptionOrderDialog, + PrescriptionTemplateDialog, + RemoteMedicineComboBox, + parse_pasted_herbs, + render_prescription_html, +) +from doctor_workstation.ui.pages import prescription_library as library_module +from doctor_workstation.ui.pages import prescriptions as prescription_module +from doctor_workstation.ui.pages.prescription_library import PrescriptionLibraryPage +from doctor_workstation.ui.pages.prescriptions import ( + PrescriptionsPage, + can_audit, + can_create_order, + can_edit_or_delete, + can_patch_patient, + prescription_status, +) + + +@pytest.fixture(scope="module") +def application() -> QApplication: + return QApplication.instance() or QApplication([]) + + +@pytest.fixture +def immediate_async(monkeypatch: pytest.MonkeyPatch) -> None: + def run_immediately( + function: Any, + *args: Any, + on_success: Any = None, + on_error: Any = None, + on_finished: Any = None, + **kwargs: Any, + ) -> object: + try: + result = function(*args, **kwargs) + except Exception as error: + if on_error: + on_error(error) + else: + if on_success: + on_success(result) + finally: + if on_finished: + on_finished() + return object() + + monkeypatch.setattr(dialog_module, "run_async", run_immediately) + monkeypatch.setattr(library_module, "run_async", run_immediately) + monkeypatch.setattr(prescription_module, "run_async", run_immediately) + + +def test_admin_status_and_action_guards_are_exact() -> None: + pending = { + "id": 1, + "audit_status": 0, + "void_status": 0, + "has_prescription_order": 0, + } + approved = {**pending, "audit_status": 1} + rejected = { + **approved, + "business_prescription_audit_rejected": 1, + "business_prescription_audit_remark": "剂量需调整", + } + voided = {**approved, "void_status": 1} + + assert prescription_status(pending) == ("待审核", "warning") + assert prescription_status(approved) == ("已通过", "success") + assert prescription_status(rejected) == ("已驳回", "danger") + assert prescription_status(voided) == ("已作废", "danger") + assert can_patch_patient(pending) + assert can_create_order(pending) + assert can_audit(pending) + assert can_edit_or_delete(pending) + assert not can_audit(approved) + assert not can_edit_or_delete(approved) + assert can_edit_or_delete(voided) + assert not can_patch_patient(voided) + + +def test_paste_parser_matches_common_admin_recipe_forms() -> None: + parsed = parse_pasted_herbs("Rp: 黄芪15 党参12、茯苓10g\n柴胡、白术各6克\n饭后温服") + + assert parsed == [ + {"name": "黄芪", "dosage": 15.0}, + {"name": "党参", "dosage": 12.0}, + {"name": "茯苓", "dosage": 10.0}, + {"name": "柴胡", "dosage": 6.0}, + {"name": "白术", "dosage": 6.0}, + ] + + +def test_remote_medicine_selector_rejects_new_free_text( + application: QApplication, +) -> None: + repository = SimpleNamespace(list_medicines=lambda **_kwargs: {"lists": [], "count": 0}) + selector = RemoteMedicineComboBox(repository, name="历史药名") + + assert selector.has_valid_selection + selector._queue_search("随意输入") + selector._timer.stop() + selector.setEditText("随意输入") + assert not selector.has_valid_selection + selector.set_value(11, "黄芪") + assert selector.has_valid_selection + selector.close() + application.processEvents() + + +def test_template_disable_edit_controls_import_not_template_maintenance( + application: QApplication, + immediate_async: None, +) -> None: + repository = SimpleNamespace( + list_medicines=lambda **_kwargs: { + "lists": [{"id": 11, "name": "黄芪"}], + "count": 1, + } + ) + template = { + "id": 8, + "prescription_name": "益气方", + "formula_type": "主方", + "is_public": 1, + "disable_edit": 1, + "herbs": [{"medicine_id": 11, "name": "黄芪", "dosage": 15}], + } + dialog = PrescriptionTemplateDialog(repository, template, mode="edit") + + assert dialog.disable_edit_check.isChecked() + assert dialog.herbs.rows[0].medicine.isEnabled() + assert dialog.herbs.rows[0].dosage.isEnabled() + assert dialog.payload() == { + "id": 8, + "prescription_name": "益气方", + "formula_type": "主方", + "is_public": 1, + "disable_edit": 1, + "herbs": [{"medicine_id": 11, "name": "黄芪", "dosage": 15.0}], + } + dialog.close() + application.processEvents() + + +def test_library_page_uses_canonical_permissions_and_full_columns( + application: QApplication, + immediate_async: None, +) -> None: + class Repository: + def list_prescription_templates(self, **_filters: Any) -> dict[str, Any]: + return { + "lists": [ + { + "id": 3, + "prescription_name": "安神方", + "formula_type": "辅方", + "herbs": [{"name": "酸枣仁", "dosage": 12}], + "is_public": 0, + "disable_edit": 1, + "creator_id": 9, + "creator_name": "张医生", + "create_time": "2026-08-10 12:00:00", + } + ], + "count": 1, + } + + permissions = { + "wcf.prescription/add", + "wcf.prescription/read", + "wcf.prescription/edit", + "wcf.prescription/delete", + } + page = PrescriptionLibraryPage( + Repository(), + permissions, + SimpleNamespace(id=9, root=0, role_ids=[]), + ) + page.refresh() + page.table.selectRow(0) + page._selection_changed() + + assert page.table.columnCount() == 9 + assert not page.view_button.isHidden() and page.view_button.isEnabled() + assert not page.edit_button.isHidden() and page.edit_button.isEnabled() + assert not page.delete_button.isHidden() and page.delete_button.isEnabled() + assert page.pager.page_size == 15 + page.close() + application.processEvents() + + +def test_issued_page_sends_exact_filter_dto_and_row_guards( + application: QApplication, + immediate_async: None, +) -> None: + calls: list[dict[str, Any]] = [] + pending = { + "id": 21, + "sn": "CF-21", + "patient_name": "林晓岚", + "gender": 0, + "age": 33, + "audit_status": 0, + "void_status": 0, + "has_prescription_order": 0, + "creator_id": 7, + "doctor_name": "周医生", + "prescription_date": "2026-08-10", + "create_time": "2026-08-10 12:00:00", + "herbs": [{"name": "黄芪", "dosage": 15}], + } + + class Repository: + def list_diagnosis_doctors(self) -> list[dict[str, Any]]: + return [{"id": 9, "name": "孙医生"}] + + def list_prescriptions(self, **filters: Any) -> dict[str, Any]: + calls.append(filters) + return {"lists": [pending], "count": 1} + + permissions = { + "cf.prescription/add", + "cf.prescription/read", + "cf.prescription/edit", + "cf.prescription/audit", + "cf.prescription/del", + "tcm.prescription/patchPatient", + "tcm.prescriptionOrder/create", + "tcm.prescriptionOrder/lists", + } + page = PrescriptionsPage( + Repository(), + permissions, + SimpleNamespace(id=7, name="周医生"), + ) + page.refresh() + page.table.selectRow(0) + page._selection_changed() + + assert calls == [ + { + "page_no": 1, + "page_size": 15, + "sn": "", + "patient_name": "", + "audit_filter": "", + "source_filter": "", + "start_time": "", + "end_time": "", + } + ] + page.quick_date.setCurrentIndex(1) + assert len(calls) == 2 + assert calls[-1]["start_time"].endswith("00:00:00") + assert calls[-1]["end_time"].endswith("23:59:59") + assert page.audit_button.isEnabled() + assert page.doctor_filter._options[9] == "孙医生" + assert page.patch_button.isEnabled() + assert page.create_order_button.isEnabled() + assert page.edit_button.isEnabled() + assert page.delete_button.isEnabled() + + page.table.set_rows([{**pending, "audit_status": 1}]) + page.table.selectRow(0) + page._selection_changed() + assert not page.audit_button.isEnabled() + assert not page.edit_button.isEnabled() + assert not page.delete_button.isEnabled() + assert page.patch_button.isEnabled() + assert page.create_order_button.isEnabled() + page.close() + application.processEvents() + + +def test_editor_builds_complete_add_payload( + application: QApplication, + immediate_async: None, +) -> None: + repository = SimpleNamespace( + list_medicines=lambda **_kwargs: { + "lists": [{"id": 31, "name": "黄芪"}], + "count": 1, + } + ) + user = SimpleNamespace(id=7, name="周医生") + editor = PrescriptionEditorDialog(repository, mode="add", current_user=user) + editor.patient_name.setText("林晓岚") + editor.clinical_diagnosis.setPlainText("脾气虚") + editor.herbs.rows[0].medicine.set_value(31, "黄芪") + editor.herbs.rows[0].dosage.setValue(15) + editor.signature._has_strokes = True + payload = editor.payload() + + assert payload["creator_id"] == 7 + assert payload["audit_status"] == 0 + assert payload["patient_name"] == "林晓岚" + assert payload["clinical_diagnosis"] == "脾气虚" + assert payload["herbs"] == [ + { + "medicine_id": 31, + "name": "黄芪", + "dosage": 15.0, + "formula_type": "主方", + } + ] + assert payload["doctor_name"] == "周医生" + assert payload["doctor_signature"].startswith("data:image/png;base64,") + assert isinstance(payload["aux_usage"], dict) + editor.close() + application.processEvents() + + +def test_audit_reject_requires_remark( + application: QApplication, +) -> None: + dialog = AuditPrescriptionDialog({"id": 4}) + dialog._choose("reject") + assert dialog.action == "" + assert not dialog.banner.isHidden() + dialog.remark.setPlainText("剂量需调整") + dialog._choose("reject") + assert dialog.action == "reject" + assert dialog.payload() == { + "id": 4, + "action": "reject", + "remark": "剂量需调整", + } + dialog.close() + application.processEvents() + + +def test_order_payload_and_a4_print_document( + application: QApplication, + immediate_async: None, +) -> None: + repository = SimpleNamespace( + list_paid_prescription_orders=lambda diagnosis_id: { + "lists": [{"id": 88, "order_no": "PAY-88", "amount": 100}], + "deposit_min_amount": 100, + } + ) + prescription = { + "id": 12, + "diagnosis_id": 6, + "sn": "CF-12", + "patient_name": "林晓岚", + "phone": "13800000000", + "gender": 0, + "age": 33, + "clinical_diagnosis": "脾气虚", + "doctor_name": "周医生", + "prescription_date": "2026-08-10", + "audit_status": 1, + "dose_count": 7, + "dose_unit": "剂", + "usage_days": 7, + "times_per_day": 2, + "herbs": [ + {"name": "黄芪", "dosage": 15, "formula_type": "主方"}, + {"name": "酸枣仁", "dosage": 12, "formula_type": "辅方"}, + ], + } + order = PrescriptionOrderDialog(repository, prescription) + order._load_paid_orders() + order.shipping_province.setText("四川省") + order.shipping_city.setText("成都市") + order.shipping_district.setText("双流区") + order.shipping_address.setText("黄龙大道 280 号") + order.amount.setValue(100) + order.paid_orders.item(0).setCheckState(Qt.CheckState.Checked) + payload = order.payload() + + assert payload["prescription_id"] == 12 + assert payload["diagnosis_id"] == 6 + assert payload["pay_order_ids"] == [88] + assert payload["amount"] == 100 + assert payload["ship_mode"] == "gancao" + + rendered = render_prescription_html(prescription) + assert "林晓岚" in rendered + assert "黄芪" in rendered + assert "酸枣仁" in rendered + viewer = PrescriptionDetailDialog(prescription) + assert "中医处方笺" in viewer.document.toHtml() + viewer.close() + order.close() + application.processEvents() + + +def test_demo_repository_pages_render_offscreen( + application: QApplication, + immediate_async: None, +) -> None: + repository = DemoDoctorRepository() + user = SimpleNamespace(id=1, name="演示医生", root=1, role_ids=[0]) + library = PrescriptionLibraryPage(repository, None, user) + issued = PrescriptionsPage(repository, None, user) + library.refresh() + issued.refresh() + + assert library.table.rowCount() > 0 + assert issued.table.rowCount() > 0 + library.close() + issued.close() + application.processEvents() diff --git a/app/tests/test_reception_parity_ui.py b/app/tests/test_reception_parity_ui.py new file mode 100644 index 000000000..c751d8efa --- /dev/null +++ b/app/tests/test_reception_parity_ui.py @@ -0,0 +1,546 @@ +from __future__ import annotations + +import json +import os +from datetime import date +from pathlib import Path +from typing import Any + +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") + +import httpx +import pytest +from PySide6.QtWidgets import QApplication + +from doctor_workstation.core import PermissionSet +from doctor_workstation.services.api_client import ApiClient +from doctor_workstation.services.repository import RemoteDoctorRepository +from doctor_workstation.ui.pages import reception as reception_module +from doctor_workstation.ui.pages.reception import NOTE_LIMIT, ReceptionPage + + +@pytest.fixture(scope="module") +def application() -> QApplication: + return QApplication.instance() or QApplication([]) + + +@pytest.fixture +def immediate_async(monkeypatch: pytest.MonkeyPatch) -> None: + def run_immediately( + function: Any, + *args: Any, + on_success: Any = None, + on_error: Any = None, + on_finished: Any = None, + **kwargs: Any, + ) -> object: + try: + result = function(*args, **kwargs) + except Exception as error: + if on_error: + on_error(error) + else: + if on_success: + on_success(result) + finally: + if on_finished: + on_finished() + return object() + + monkeypatch.setattr(reception_module, "run_async", run_immediately) + + +def _detail( + appointment_id: int, + *, + name: str, + status: int = 1, + phone: str = "13800138000", +) -> dict[str, Any]: + patient_id = appointment_id + 100 + diagnosis_id = appointment_id + 200 + return { + "appointment": { + "id": appointment_id, + "patient_id": patient_id, + "patient_name": name, + "status": status, + "appointment_date": date.today().isoformat(), + "appointment_time": "09:30", + "doctor_name": "张医生", + "assistant_name": "李医助", + "appointment_type_text": "复诊", + "channel_text": "线上", + "remark": "准时到诊", + }, + "patient": { + "id": patient_id, + "phone": phone, + "gender": 2, + "age": 42, + "height": 165, + "weight": 55, + "region_text": "浙江省杭州市", + }, + "diagnosis": { + "id": diagnosis_id, + "patient_id": patient_id, + "patient_name": name, + "phone": phone, + "chief_complaint": "反复口渴", + "present_illness": "持续两周", + "clinical_diagnosis": "消渴", + }, + } + + +def test_queue_uses_admin_same_day_contract( + application: QApplication, + immediate_async: None, +) -> None: + calls: list[dict[str, Any]] = [] + + class Repository: + def list_appointments(self, **kwargs: Any) -> dict[str, Any]: + calls.append(kwargs) + return {"lists": [], "count": 0} + + page = ReceptionPage(Repository(), PermissionSet([])) + page.search_edit.setText(" 王小明 ") + page.refresh() + + assert calls == [ + { + "status": 1, + "start_date": date.today().isoformat(), + "end_date": date.today().isoformat(), + "page_no": 1, + "page_size": 15, + "patient_name": "王小明", + } + ] + + page.queue_tabs.setCurrentIndex(1) + assert calls[-1]["status"] == 4 + assert calls[-1]["start_date"] == calls[-1]["end_date"] + page.close() + application.processEvents() + + +def test_fast_patient_switch_rejects_late_detail( + application: QApplication, + monkeypatch: pytest.MonkeyPatch, +) -> None: + callbacks: list[dict[str, Any]] = [] + + def queue_async(_function: Any, **options: Any) -> object: + callbacks.append(options) + return object() + + monkeypatch.setattr(reception_module, "run_async", queue_async) + page = ReceptionPage(object(), PermissionSet(["*"])) + first = {"id": 11, "patient_id": 111, "diagnosis_id": 211, "patient_name": "甲患者"} + second = {"id": 22, "patient_id": 122, "diagnosis_id": 222, "patient_name": "乙患者"} + + page._select_record(first) + page.note_edit.setPlainText("甲患者的未保存草稿") + page._pending_report_files = [r"C:\records\first.pdf"] + page._select_record(second) + assert len(callbacks) == 2 + assert page.patient_name_label.text() == "乙患者" + assert page.note_edit.toPlainText() == "" + assert page._pending_report_files == [] + + callbacks[0]["on_success"]({"detail": _detail(11, name="甲患者")}) + callbacks[0]["on_finished"]() + assert page._selected_appointment_id == 22 + assert page.patient_name_label.text() == "乙患者" + assert page._selected_detail is None + + callbacks[1]["on_success"]({"detail": _detail(22, name="乙患者")}) + callbacks[1]["on_finished"]() + assert page._selected_detail == _detail(22, name="乙患者") + assert page.patient_name_label.text() == "乙患者" + assert "反复口渴" in page.diagnosis_text.text() + page.close() + application.processEvents() + + +def test_queue_load_more_accumulates_to_total_boundary( + application: QApplication, + immediate_async: None, +) -> None: + calls: list[dict[str, Any]] = [] + all_rows = [ + { + "id": index, + "patient_id": 1000 + index, + "diagnosis_id": 2000 + index, + "patient_name": f"患者{index:02d}", + "status": 1, + } + for index in range(1, 23) + ] + + class Repository: + def list_appointments(self, **kwargs: Any) -> dict[str, Any]: + calls.append(kwargs) + start = (kwargs["page_no"] - 1) * kwargs["page_size"] + return { + "lists": all_rows[start : start + kwargs["page_size"]], + "count": len(all_rows), + } + + def get_reception(self, appointment_id: int) -> dict[str, Any]: + row = all_rows[appointment_id - 1] + return { + "appointment": row, + "diagnosis": {"id": row["diagnosis_id"], "patient_id": row["patient_id"]}, + } + + page = ReceptionPage(Repository(), PermissionSet([])) + page.refresh() + assert page.queue_list.count() == 15 + assert page.load_more_button.isVisibleTo(page) + + page._load_more() + assert [call["page_no"] for call in calls] == [1, 2] + assert all(call["page_size"] == 15 for call in calls) + assert page.queue_list.count() == 22 + assert page.queue_summary.text() == "已加载 22 / 共 22 位患者" + assert page.load_more_button.isHidden() + page.close() + application.processEvents() + + +def test_search_and_tab_changes_reset_accumulated_pages( + application: QApplication, + immediate_async: None, +) -> None: + calls: list[dict[str, Any]] = [] + + class Repository: + def list_appointments(self, **kwargs: Any) -> dict[str, Any]: + calls.append(kwargs) + if kwargs["status"] == 4: + rows = [{"id": 401, "patient_name": "过号患者", "status": 4}] + elif kwargs["patient_name"]: + rows = [{"id": 201, "patient_name": "搜索患者", "status": 1}] + else: + rows = [ + {"id": index, "patient_name": f"患者{index}", "status": 1} + for index in range(1, 19) + ] + start = (kwargs["page_no"] - 1) * kwargs["page_size"] + return {"lists": rows[start : start + kwargs["page_size"]], "count": len(rows)} + + def get_reception(self, appointment_id: int) -> dict[str, Any]: + return { + "appointment": { + "id": appointment_id, + "patient_id": appointment_id + 1000, + "status": 1, + }, + "diagnosis": { + "id": appointment_id + 2000, + "patient_id": appointment_id + 1000, + }, + } + + page = ReceptionPage(Repository(), PermissionSet([])) + page.refresh() + page._load_more() + assert page.queue_list.count() == 18 + + page.search_edit.setText("搜索") + page.refresh() + assert page.queue_list.count() == 1 + assert page._queue_page == 1 + assert calls[-1]["patient_name"] == "搜索" + + page.queue_tabs.setCurrentIndex(1) + assert page.queue_list.count() == 1 + assert page._queue_page == 1 + assert calls[-1]["status"] == 4 + page.close() + application.processEvents() + + +def test_queue_worker_uses_frozen_widget_snapshot( + application: QApplication, + monkeypatch: pytest.MonkeyPatch, +) -> None: + jobs: list[Any] = [] + calls: list[dict[str, Any]] = [] + + def queue_async(function: Any, **_options: Any) -> object: + jobs.append(function) + return object() + + class Repository: + def list_appointments(self, **kwargs: Any) -> dict[str, Any]: + calls.append(kwargs) + return {"lists": [], "count": 0} + + monkeypatch.setattr(reception_module, "run_async", queue_async) + page = ReceptionPage(Repository(), PermissionSet([])) + page.search_edit.setText("甲患者") + page.refresh() + page.search_edit.blockSignals(True) + page.search_edit.setText("乙患者") + page.search_edit.blockSignals(False) + page.queue_tabs.blockSignals(True) + page.queue_tabs.setCurrentIndex(1) + page.queue_tabs.blockSignals(False) + + jobs[0]() + assert calls == [ + { + "status": 1, + "start_date": date.today().isoformat(), + "end_date": date.today().isoformat(), + "page_no": 1, + "page_size": 15, + "patient_name": "甲患者", + } + ] + page.close() + application.processEvents() + + +def test_phone_permission_and_ungated_notify_video_actions( + application: QApplication, + immediate_async: None, +) -> None: + detail = _detail(31, name="脱敏患者") + + class Repository: + def get_reception(self, appointment_id: int) -> dict[str, Any]: + assert appointment_id == 31 + return detail + + masked_page = ReceptionPage(Repository(), PermissionSet([])) + masked_page._select_record(detail["appointment"]) + assert masked_page.patient_labels["phone"].text() == "138****8000" + assert not masked_page.notify_button.isHidden() + assert not masked_page.video_button.isHidden() + + plain_page = ReceptionPage(Repository(), PermissionSet(["tcm.diagnosis/phonePlain"])) + plain_page._select_record(detail["appointment"]) + assert plain_page.patient_labels["phone"].text() == "13800138000" + assert plain_page.appointment_labels["doctor"].text() == "张医生" + assert plain_page.appointment_labels["assistant"].text() == "李医助" + assert plain_page.patient_labels["region"].text() == "浙江省杭州市" + + masked_page.close() + plain_page.close() + application.processEvents() + + +def test_video_payload_keeps_three_identifiers_distinct( + application: QApplication, + immediate_async: None, +) -> None: + detail = _detail(41, name="视频患者") + + class Repository: + def get_reception(self, appointment_id: int) -> dict[str, Any]: + assert appointment_id == 41 + return detail + + page = ReceptionPage(Repository(), PermissionSet([])) + page._select_record(detail["appointment"]) + emitted: list[dict[str, Any]] = [] + page.video_requested.connect(emitted.append) + page._request_video() + + assert emitted == [ + { + "source": "reception", + "appointment_id": 41, + "patient_id": 141, + "diagnosis_id": 241, + "patient_name": "视频患者", + "record": detail["appointment"], + } + ] + page.close() + application.processEvents() + + +def test_completion_revalidates_server_status_before_write( + application: QApplication, +) -> None: + completed: list[int] = [] + + class Repository: + status = 3 + + def get_reception(self, appointment_id: int) -> dict[str, Any]: + return { + "appointment": { + "id": appointment_id, + "patient_id": 151, + "status": self.status, + } + } + + def complete_appointment(self, appointment_id: int) -> dict[str, bool]: + completed.append(appointment_id) + return {"ok": True} + + repository = Repository() + page = ReceptionPage(repository, PermissionSet(["doctor.appointment/complete"])) + + with pytest.raises(ValueError, match="状态已变化"): + page._complete_after_revalidation(51) + assert completed == [] + + repository.status = 4 + assert page._complete_after_revalidation(51) == {"ok": True} + assert completed == [51] + page.close() + application.processEvents() + + +def test_note_limit_and_attachment_payload_contract( + application: QApplication, + monkeypatch: pytest.MonkeyPatch, +) -> None: + jobs: list[tuple[Any, dict[str, Any]]] = [] + received: list[dict[str, Any]] = [] + uploads: list[dict[str, Any]] = [] + + def queue_async(function: Any, **options: Any) -> object: + jobs.append((function, options)) + return object() + + class Repository: + def upload_material(self, **kwargs: Any) -> str: + uploads.append(kwargs) + suffix = "tongue.jpg" if kwargs["material_type"] == "image" else "report.pdf" + return f"/uploads/{kwargs['material_type']}/{suffix}" + + def add_doctor_note(self, diagnosis_id: int, content: str, **kwargs: Any) -> None: + received.append({"diagnosis_id": diagnosis_id, "content": content, **kwargs}) + + monkeypatch.setattr(reception_module, "run_async", queue_async) + page = ReceptionPage(Repository(), PermissionSet(["doctor.appointment/addDoctorNote"])) + detail = _detail(61, name="备注患者") + page._selected_record = detail["appointment"] + page._selected_appointment_id = 61 + page._selected_detail = detail + page._detail_generation = 7 + page.note_edit.setPlainText("字" * (NOTE_LIMIT + 20)) + page._pending_tongue_images = [r"C:\records\tongue.jpg"] + page._pending_report_files = [r"C:\records\report.pdf"] + + assert len(page.note_edit.toPlainText()) == NOTE_LIMIT + assert page.note_counter.text() == f"{NOTE_LIMIT} / {NOTE_LIMIT}" + page._save_note() + assert len(jobs) == 1 + jobs[0][0]() + + assert uploads == [ + {"path": r"C:\records\tongue.jpg", "material_type": "image", "cid": 0}, + {"path": r"C:\records\report.pdf", "material_type": "file", "cid": 0}, + ] + assert received == [ + { + "diagnosis_id": 261, + "content": "字" * NOTE_LIMIT, + "tongue_images": ["/uploads/image/tongue.jpg"], + "report_files": ["/uploads/file/report.pdf"], + } + ] + jobs[0][1]["on_finished"]() + assert not page._note_busy + page.close() + application.processEvents() + + +def test_remote_note_uses_multipart_then_server_urls_only( + application: QApplication, + tmp_path: Path, +) -> None: + requests: list[httpx.Request] = [] + tongue = tmp_path / "tongue.jpg" + report = tmp_path / "report.pdf" + tongue.write_bytes(b"tongue-image") + report.write_bytes(b"report-file") + + def handler(request: httpx.Request) -> httpx.Response: + requests.append(request) + if request.url.path.endswith("/upload/image"): + return httpx.Response( + 200, + json={"code": 1, "data": {"uri": "/materials/tongue.jpg"}}, + ) + if request.url.path.endswith("/upload/file"): + return httpx.Response( + 200, + json={"code": 1, "data": {"url": "https://cdn.test/report.pdf"}}, + ) + return httpx.Response(200, json={"code": 1, "data": {"id": 9}}) + + with ApiClient( + "https://example.test", + transport=httpx.MockTransport(handler), + ) as client: + repository = RemoteDoctorRepository(client) + page = ReceptionPage(repository, PermissionSet([])) + result = page._upload_and_add_note( + 501, + "两阶段备注", + [str(tongue)], + [str(report)], + ) + + assert result == {"id": 9} + assert [request.url.path.rsplit("/", 2)[-2:] for request in requests] == [ + ["upload", "image"], + ["upload", "file"], + ["doctor.appointment", "addDoctorNote"], + ] + for upload_request in requests[:2]: + assert upload_request.headers["content-type"].startswith("multipart/form-data; boundary=") + assert b'name="cid"' in upload_request.content + assert b"\r\n0\r\n" in upload_request.content + note_payload = json.loads(requests[-1].content) + assert note_payload == { + "diagnosis_id": 501, + "content": "两阶段备注", + "tongue_images": ["/materials/tongue.jpg"], + "report_files": ["https://cdn.test/report.pdf"], + } + assert str(tmp_path) not in requests[-1].content.decode("utf-8") + page.close() + application.processEvents() + + +def test_partial_upload_failure_never_submits_note( + application: QApplication, +) -> None: + submitted: list[dict[str, Any]] = [] + + class Repository: + def upload_material(self, path: str, material_type: str, cid: int = 0) -> str: + del material_type, cid + if path.endswith("bad.pdf"): + raise OSError("磁盘读取失败") + return "/materials/good.jpg" + + def add_doctor_note(self, **kwargs: Any) -> None: + submitted.append(kwargs) + + page = ReceptionPage(Repository(), PermissionSet([])) + with pytest.raises(RuntimeError, match="bad.pdf.*上传失败"): + page._upload_and_add_note( + 501, + "不会提交", + [r"C:\records\good.jpg"], + [r"C:\records\bad.pdf"], + ) + assert submitted == [] + page.close() + application.processEvents() diff --git a/app/tests/test_repository_parity.py b/app/tests/test_repository_parity.py new file mode 100644 index 000000000..b5196b748 --- /dev/null +++ b/app/tests/test_repository_parity.py @@ -0,0 +1,358 @@ +"""No-network contracts for the audited five doctor workspaces.""" + +from __future__ import annotations + +from datetime import date +from typing import Any + +import pytest + +from doctor_workstation.core.models import Appointment, Consultation, PageResult, Prescription +from doctor_workstation.services.mock_repository import DemoDoctorRepository +from doctor_workstation.services.repository import ( + PRESCRIPTION_LIBRARY_PERMISSIONS, + PRESCRIPTION_PERMISSIONS, + RemoteDoctorRepository, +) + + +class RecordingClient: + """Small API client double retaining exact endpoint and DTO calls.""" + + def __init__(self) -> None: + self.base_url = "https://example.test/adminapi/" + self.token = "token" + self.get_calls: list[tuple[str, dict[str, Any]]] = [] + self.post_calls: list[tuple[str, dict[str, Any]]] = [] + + def set_token(self, token: str) -> None: + """Set the current synthetic token.""" + + self.token = token + + def clear_token(self) -> None: + """Clear the current synthetic token.""" + + self.token = "" + + def get(self, endpoint: str, params: dict[str, Any] | None = None) -> Any: + """Record a GET and return a shape appropriate for its contract.""" + + self.get_calls.append((endpoint, dict(params or {}))) + if endpoint == "auth.admin/mySelf": + return { + "user": {"id": 1, "name": "Doctor", "role_ids": [1]}, + "permissions": ["tcm.diagnosis/lists"], + "menu": [ + { + "name": "问诊列表", + "component": "tcm/diagnosis/index", + "future": {"badge": 3}, + "children": [{"name": "只读", "perms": "tcm.diagnosis/readonlyDetail"}], + "unsafe": lambda: None, + 7: "non-string key", + } + ], + } + if endpoint in { + "tcm.diagnosis/detail", + "tcm.diagnosis/readonlyDetail", + "firstvisit.myPatient/orderDetail", + "tcm.prescriptionOrder/detail", + }: + return {"id": int((params or {}).get("id", 0)), "patient_name": "测试患者"} + if endpoint == "tcm.prescription/getByAppointment": + return {} + if endpoint == "doctor.appointment/availableSlots": + return {"slots": [{"time": "09:00", "available": True}]} + if endpoint == "tcm.prescriptionOrder/paidPayOrders": + return {"lists": [{"id": 9}], "deposit_min_amount": 50} + return {"lists": [], "count": 0, "extend": {"scope": {"label": "server"}}} + + def post(self, endpoint: str, payload: dict[str, Any] | None = None) -> Any: + """Record a POST and return a stable synthetic mutation result.""" + + body = dict(payload or {}) + self.post_calls.append((endpoint, body)) + if endpoint in {"tcm.prescription/add", "tcm.prescriptionOrder/create"}: + return {"id": 88} + return {"ok": True} + + +def test_page_result_preserves_outer_and_nested_extend() -> None: + """Server scope metadata must survive nested data pagination envelopes.""" + + page = PageResult.from_payload( + { + "extend": {"scope": {"label": "doctor"}}, + "data": { + "lists": [{"id": 1}], + "count": 4, + "extend": {"schedule_mode": "roster"}, + }, + }, + Appointment.from_dict, + ) + + assert page.total == 4 + assert page.extend == { + "scope": {"label": "doctor"}, + "schedule_mode": "roster", + } + + +def test_consultation_keeps_diagnosis_and_appointment_status_separate() -> None: + """Video eligibility fields cannot be overwritten by diagnosis enablement.""" + + row = Consultation.from_dict( + { + "id": 3, + "status": 1, + "status_desc": "启用", + "has_appointment": 1, + "appointment_status": 4, + "appointment_status_text": "已过号", + "appointments": [{"id": 8, "status": 4}], + "DiagnosisViewRecord": [{"is_confirmed": 1}], + } + ) + + assert row.status == 1 + assert row.appointment_status == 4 + assert row.has_appointment + assert row.confirmed + assert row.appointments == [{"id": 8, "status": 4}] + + +def test_prescription_round_trips_appointment_and_case_record() -> None: + """Appointment authority and immutable case snapshot survive model DTOs.""" + + prescription = Prescription.from_dict( + { + "id": 8, + "diagnosis_id": 5, + "appointment_id": 17, + "case_record": { + "diagnosis_id": 5, + "appointment_id": 17, + "clinical_diagnosis": "气阴两虚证", + }, + } + ) + + assert prescription.appointment_id == 17 + assert prescription.case_record["clinical_diagnosis"] == "气阴两虚证" + payload = prescription.to_api_dict() + assert payload["appointment_id"] == 17 + assert payload["case_record"] == { + "diagnosis_id": 5, + "appointment_id": 17, + "clinical_diagnosis": "气阴两虚证", + } + + +def test_remote_reception_is_forcibly_scoped_to_today() -> None: + """Status 1/4 queue reads always carry the audited same-day date range.""" + + client = RecordingClient() + repository = RemoteDoctorRepository(client) # type: ignore[arg-type] + + repository.list_appointments(status=1, keyword="林", page_no=2, page_size=15) + + endpoint, params = client.get_calls[-1] + assert endpoint == "doctor.appointment/lists" + assert params == { + "status": 1, + "patient_name": "林", + "start_date": date.today().isoformat(), + "end_date": date.today().isoformat(), + "page_no": 2, + "page_size": 15, + } + + +def test_remote_new_contracts_use_exact_admin_endpoints_and_dtos() -> None: + """Prescription, patient and diagnosis methods remain thin endpoint adapters.""" + + client = RecordingClient() + repository = RemoteDoctorRepository(client) # type: ignore[arg-type] + + repository.create_prescription( + patient_name="测试患者", + diagnosis_id=5, + herbs=[{"medicine_id": 1, "name": "黄芪", "dosage": 10}], + ) + repository.patch_prescription_patient(8, patient_name="修正患者", phone="13800000000", gender=2) + repository.audit_prescription(8, action="reject", remark="剂量不符") + repository.create_prescription_order( + prescription_id=8, + diagnosis_id=5, + recipient_name="修正患者", + recipient_phone="13800000000", + ) + repository.list_paid_prescription_orders(5, prescription_order_id=3) + repository.list_medicines(name="黄芪") + repository.patient_orders(page_no=1, page_size=15, fulfillment_status=2) + repository.patient_progress(page_no=1, page_size=15, status=1) + repository.patient_detail(5) + repository.appointment_history(5) + repository.assign_history(5) + repository.assign_patient(5, 20, is_inherit=1) + repository.fill_patient_id_card(5, "410000199001010000") + repository.book_patient_appointment({"diagnosis_id": 5, "appointment_date": "2026-08-10"}) + repository.cancel_patient_appointment(7) + repository.update_diagnosis(5, {"clinical_diagnosis": "气虚证"}) + repository.list_appointment_rosters( + doctor_id=1, + start_date="2026-08-10", + end_date="2026-08-16", + ) + slots = repository.get_available_appointment_slots( + doctor_id=1, + appointment_date="2026-08-10", + ) + + assert ( + "tcm.prescription/patchPatient", + { + "id": 8, + "patient_name": "修正患者", + "phone": "13800000000", + "gender": 2, + }, + ) in client.post_calls + assert ( + "tcm.prescription/audit", + { + "id": 8, + "action": "reject", + "remark": "剂量不符", + }, + ) in client.post_calls + assert ( + "firstvisit.myPatient/assign", + { + "id": 5, + "assistant_id": 20, + "is_inherit": 1, + }, + ) in client.post_calls + assert ("tcm.diagnosis/edit", {"id": 5, "clinical_diagnosis": "气虚证"}) in client.post_calls + assert slots == {"slots": [{"time": "09:00", "available": True}]} + get_endpoints = {endpoint for endpoint, _ in client.get_calls} + assert { + "tcm.prescriptionOrder/paidPayOrders", + "doctor.medicine/lists", + "firstvisit.myPatient/orders", + "firstvisit.myPatient/progress", + "tcm.diagnosis/readonlyDetail", + "doctor.appointment/lists", + "tcm.diagnosis/assignLogList", + "doctor.roster/lists", + "doctor.appointment/availableSlots", + } <= get_endpoints + + +@pytest.mark.parametrize( + "unsafe_reference", + [r"C:\records\tongue.jpg", r"\\server\share\report.pdf", "file:///tmp/a.jpg"], +) +def test_remote_note_rejects_local_material_references(unsafe_reference: str) -> None: + """No drive, UNC or file URI can reach addDoctorNote JSON.""" + + client = RecordingClient() + repository = RemoteDoctorRepository(client) # type: ignore[arg-type] + + with pytest.raises(ValueError, match="server uri/url"): + repository.add_doctor_note(5, tongue_images=[unsafe_reference]) + assert not any( + endpoint == "doctor.appointment/addDoctorNote" for endpoint, _payload in client.post_calls + ) + + +def test_remote_dynamic_menu_preserves_json_metadata_but_drops_runtime_objects() -> None: + """Future menu fields pass through safely without evaluating arbitrary values.""" + + repository = RemoteDoctorRepository(RecordingClient()) # type: ignore[arg-type] + + menu = repository.get_session().menu + + assert menu[0]["component"] == "tcm/diagnosis/index" + assert menu[0]["future"] == {"badge": 3} + assert menu[0]["children"][0]["perms"] == "tcm.diagnosis/readonlyDetail" + assert "unsafe" not in menu[0] + assert 7 not in menu[0] + + +def test_canonical_prescription_permissions_match_routed_views() -> None: + """Service exports one canonical spelling for each routed action.""" + + assert PRESCRIPTION_LIBRARY_PERMISSIONS == { + "create": "wcf.prescription/add", + "read": "wcf.prescription/read", + "update": "wcf.prescription/edit", + "delete": "wcf.prescription/delete", + } + assert PRESCRIPTION_PERMISSIONS["delete"] == "cf.prescription/del" + assert PRESCRIPTION_PERMISSIONS["patch_patient"] == "tcm.prescription/patchPatient" + + +def test_demo_mutates_prescriptions_orders_and_patient_workspaces() -> None: + """Offline mode supports the full workflow rather than static placeholders.""" + + repository = DemoDoctorRepository(today=date(2026, 8, 10)) + created = repository.create_prescription( + diagnosis_id=501, + patient_name="林晓岚", + phone="13800131203", + gender=2, + herbs=[{"medicine_id": 17, "name": "黄芪", "dosage": 20}], + doctor_name="陈医生(演示)", + doctor_signature="data:image/png;base64,demo", + ) + updated = repository.update_prescription(created.id, {"clinical_diagnosis": "气虚证"}) + repository.patch_prescription_patient( + created.id, patient_name="林晓岚(修正)", phone="13800131203", gender=2 + ) + audit = repository.audit_prescription(created.id, action="approve") + order = repository.create_prescription_order( + prescription_id=created.id, + diagnosis_id=501, + recipient_name="林晓岚(修正)", + recipient_phone="13800131203", + amount=268, + ) + + assert updated.clinical_diagnosis == "气虚证" + assert audit["audit_status"] == 1 + assert repository.get_prescription(created.id).has_prescription_order + assert repository.get_prescription_order(order["id"])["prescription_id"] == created.id + assert repository.patient_orders().extend["summary"]["order_count"] == 2 + + assigned = repository.assign_patient(501, 2002) + repository.fill_patient_id_card(501, "410000199001010000") + appointment = repository.book_patient_appointment( + diagnosis_id=501, + appointment_date="2026-08-11", + appointment_time="15:00-15:30", + ) + repository.update_diagnosis(501, {"chief_complaint": "乏力"}) + + assert assigned["assistant_name"] == "许医助" + assert repository.assign_history(501).total == 2 + assert repository.patient_detail(501)["diagnosis"]["chief_complaint"] == "乏力" + assert repository.appointment_history(501).total == 2 + repository.cancel_patient_appointment(appointment["id"]) + assert repository.appointment_history(501).items[-1].status == 2 + assert repository.list_medicines(name="黄芪").items[0]["name"] == "黄芪" + + +def test_reject_actions_require_a_remark() -> None: + """Audit rejection mirrors the admin dialog's mandatory reason boundary.""" + + repository = DemoDoctorRepository(today=date(2026, 8, 10)) + + with pytest.raises(ValueError, match="remark"): + repository.audit_prescription(802, action="reject") + with pytest.raises(ValueError, match="remark"): + repository.audit_patient_order_payment(901, "reject") diff --git a/app/tests/test_ui_contract.py b/app/tests/test_ui_contract.py new file mode 100644 index 000000000..20b968faf --- /dev/null +++ b/app/tests/test_ui_contract.py @@ -0,0 +1,229 @@ +from __future__ import annotations + +from types import SimpleNamespace +from typing import Any + +from PySide6.QtCore import QSettings +from PySide6.QtWidgets import QApplication + +from doctor_workstation import app as app_module +from doctor_workstation.app import ApplicationController +from doctor_workstation.core.errors import AuthenticationExpiredError +from doctor_workstation.services import DemoDoctorRepository +from doctor_workstation.ui import login as login_module +from doctor_workstation.ui import widgets as widget_module +from doctor_workstation.ui.login import LoginWindow +from doctor_workstation.ui.pages.consultations import _video_payload +from doctor_workstation.ui.shell import NAVIGATION +from doctor_workstation.ui.widgets import ( + gender_text, + invoke, + set_authentication_expired_handler, +) + + +def test_consultation_video_payload_keeps_appointment_and_diagnosis_ids_distinct() -> None: + record = SimpleNamespace( + id=501, + appointment_id=101, + patient_id=301, + patient_name="林晓岚", + ) + + payload = _video_payload(record) + + assert payload["appointment_id"] == 101 + assert payload["diagnosis_id"] == 501 + assert payload["patient_id"] == 301 + + +def test_gender_text_maps_legacy_codes_and_preserves_labels() -> None: + assert gender_text(1) == "男" + assert gender_text("2") == "女" + assert gender_text(0) == "未知" + assert gender_text("未知标签") == "未知标签" + + +def test_navigation_requires_each_pages_actual_list_capability() -> None: + assert {item.key: item.permissions for item in NAVIGATION} == { + "reception": ("doctor.appointment/lists",), + "prescription_library": ("tcm.prescriptionLibrary/lists",), + "prescriptions": ("tcm.prescription/lists",), + "patients": ("firstvisit.myPatient/lists",), + "consultations": ("tcm.diagnosis/lists",), + } + + +def test_video_release_does_not_remove_a_newer_call() -> None: + older = object() + newer = object() + controller = SimpleNamespace(video_calls={"501": newer}) + + ApplicationController._release_video_call(controller, "501", older) + assert controller.video_calls == {"501": newer} + + ApplicationController._release_video_call(controller, "501", newer) + assert controller.video_calls == {} + + +def test_invoke_leaves_prescription_filters_for_repository_mapping() -> None: + """The UI adapter only normalises pagination, not API-specific DTO fields.""" + + class Repository: + def list_prescriptions(self, **filters: Any) -> dict[str, Any]: + return filters + + assert invoke( + Repository(), + "prescriptions", + keyword="CF-2026-8", + status=2, + page=3, + page_size=15, + ) == { + "keyword": "CF-2026-8", + "status": 2, + "page_no": 3, + "page_size": 15, + } + + +def test_async_error_dispatch_consumes_active_session_expiry_globally() -> None: + """A consumed authentication expiry does not also reach a stale page.""" + + global_errors: list[Exception] = [] + local_errors: list[Exception] = [] + error = AuthenticationExpiredError("expired", code=-1) + try: + set_authentication_expired_handler(lambda caught: global_errors.append(caught) is None) + widget_module._dispatch_async_error(error, local_errors.append) + finally: + set_authentication_expired_handler(None) + + assert global_errors == [error] + assert local_errors == [] + + +def test_controller_session_expiry_returns_to_login_once() -> None: + """The composition root owns the single transition out of an active shell.""" + + messages: list[str] = [] + controller = SimpleNamespace( + shell_window=object(), + current_repository=object(), + _authentication_expiry_in_progress=False, + _logout=lambda *, message="": messages.append(message), + ) + error = AuthenticationExpiredError("expired", code=-1) + + assert ApplicationController._on_authentication_expired(controller, error) + assert ApplicationController._on_authentication_expired(controller, error) + assert messages == ["登录状态已失效,请重新登录。"] + + +def test_persisted_session_restore_blocks_manual_submit_before_worker_start( + monkeypatch: Any, +) -> None: + """Login controls are locked before the asynchronous restore is dispatched.""" + + pending_states: list[bool] = [] + worker_calls: list[tuple[Any, dict[str, Any]]] = [] + worker = object() + repository = SimpleNamespace(restore_session=lambda: None) + login_window = SimpleNamespace(set_session_restore_pending=pending_states.append) + controller = SimpleNamespace( + remote_repository=repository, + _shutting_down=False, + config=SimpleNamespace(demo_mode=False), + current_repository=None, + _restore_generation=0, + _restore_in_progress=False, + _restore_worker=None, + login_window=login_window, + _on_restore_success=lambda *args: None, + _on_restore_error=lambda *args: None, + _on_restore_finished=lambda *args: None, + ) + + def fake_run_async(function: Any, **callbacks: Any) -> object: + assert pending_states == [True] + worker_calls.append((function, callbacks)) + return worker + + monkeypatch.setattr(app_module, "run_async", fake_run_async) + ApplicationController._begin_session_restore(controller) + + assert controller._restore_in_progress + assert controller._restore_worker is worker + assert worker_calls[0][0] == repository.restore_session + + +def test_login_restore_pending_uses_existing_submit_guard() -> None: + """A manual submit is a no-op for the whole persisted-token validation window.""" + + class Banner: + def clear(self) -> None: + pass + + class LoginDouble: + def __init__(self) -> None: + self._loading = False + self.error_banner = Banner() + self.loading_options: dict[str, Any] = {} + + def _set_loading(self, loading: bool, **options: Any) -> None: + self._loading = loading + self.loading_options = options + + login = LoginDouble() + LoginWindow.set_session_restore_pending(login, True) # type: ignore[arg-type] + LoginWindow.submit(login) # type: ignore[arg-type] + + assert login._loading + assert login.loading_options["button_text"] == "正在恢复登录…" + + +def test_real_demo_login_reaches_success_without_widget_adapter( + monkeypatch: Any, + tmp_path: Any, +) -> None: + """Exercise the actual login widgets and demo repository as one contract.""" + + application = QApplication.instance() or QApplication([]) + repository = DemoDoctorRepository() + settings = QSettings(str(tmp_path / "login.ini"), QSettings.Format.IniFormat) + config = SimpleNamespace( + api_base_url="https://127.0.0.1:9", + request_timeout=30, + demo_mode=True, + remembered_account="", + ) + payloads: list[dict[str, Any]] = [] + + def run_immediately(function: Any, **callbacks: Any) -> object: + try: + callbacks["on_success"](function()) + except Exception as error: # pragma: no cover - assertion output is more useful + callbacks["on_error"](error) + finally: + callbacks["on_finished"]() + return object() + + monkeypatch.setattr(login_module, "run_async", run_immediately) + window = LoginWindow( + object(), + config=config, + demo_repository=repository, + settings=settings, + ) + window.login_succeeded.connect(payloads.append) + + window.submit() + + assert len(payloads) == 1 + assert payloads[0]["repository"] is repository + assert payloads[0]["demo_mode"] is True + assert window.busy_overlay.label.text() == "正在验证账号…" + assert not window._loading + window.close() + application.processEvents() diff --git a/app/tests/test_video_contract.py b/app/tests/test_video_contract.py new file mode 100644 index 000000000..52336b95f --- /dev/null +++ b/app/tests/test_video_contract.py @@ -0,0 +1,308 @@ +from __future__ import annotations + +import logging +import sys +import threading +import time +from pathlib import Path +from types import SimpleNamespace + +import pytest + +PROJECT_ROOT = Path(__file__).resolve().parents[1] +SOURCE_ROOT = PROJECT_ROOT / "src" +if str(SOURCE_ROOT) not in sys.path: + sys.path.insert(0, str(SOURCE_ROOT)) + +from doctor_workstation.video.launcher import ( # noqa: E402 + BackendMode, + VideoCallLauncher, + VideoCallRequest, + VideoTicketError, + normalize_backend_ticket, +) +from doctor_workstation.video.lifecycle import OrderedCallLifecycle # noqa: E402 +from doctor_workstation.video.security import ( # noqa: E402 + TrustedDocumentError, + TrustedDocumentPolicy, +) + + +def test_normalizes_admin_ticket_aliases_to_companion_contract() -> None: + request = normalize_backend_ticket( + { + "sdkAppId": "1400123456", + "userId": " doctor_42 ", + "userSig": "short-lived-ticket", + "patientUserId": " patient_8 ", + "diagnosisId": 123, + "patientId": 8, + } + ) + + assert request == VideoCallRequest( + sdk_app_id=1400123456, + user_id="doctor_42", + user_sig="short-lived-ticket", + target_user_id="patient_8", + diagnosis_id=123, + patient_id=8, + ) + assert request.to_web_config() == { + "SDKAppID": 1400123456, + "userID": "doctor_42", + "userSig": "short-lived-ticket", + "targetUserId": "patient_8", + "diagnosisId": 123, + } + + +def test_accepts_uppercase_aliases_and_nested_backend_envelope() -> None: + request = VideoCallRequest.from_backend_ticket( + { + "data": { + "SDKAppID": 1400123456, + "userID": "doctor_42", + "userSig": "ticket-value", + "targetUserId": "patient_8", + } + }, + diagnosis_id="diagnosis-123", + patient_id=8, + backend_mode="embedded", + ) + + assert request.diagnosis_id == "diagnosis-123" + assert request.backend_mode is BackendMode.EMBEDDED + + +def test_accepts_repository_call_ticket_object_without_importing_core_models() -> None: + ticket = SimpleNamespace( + sdk_app_id=1400123456, + user_id="doctor_42", + user_sig="ticket-value", + patient_user_id="patient_8", + diagnosis_id=123, + raw={"sdkAppId": 1400123456}, + ) + + request = normalize_backend_ticket(ticket, patient_id=8) + + assert request.patient_id == 8 + assert request.to_web_config()["targetUserId"] == "patient_8" + + +def test_secret_is_excluded_from_repr_and_safe_log_context() -> None: + request = normalize_backend_ticket( + { + "sdkAppId": 1400123456, + "userId": "doctor_42", + "userSig": "never-write-this-value", + "patientUserId": "patient_8", + }, + diagnosis_id=123, + ) + + assert "never-write-this-value" not in repr(request) + assert "never-write-this-value" not in str(request.safe_log_context()) + assert "user_sig" not in request.safe_log_context() + + +@pytest.mark.parametrize("forbidden_key", ["SDKSecretKey", "sdk_secret_key", "secretKey"]) +def test_rejects_server_side_secret_material(forbidden_key: str) -> None: + with pytest.raises(VideoTicketError, match="forbidden server-side secret"): + normalize_backend_ticket( + { + "sdkAppId": 1400123456, + "userId": "doctor_42", + "userSig": "ticket-value", + "patientUserId": "patient_8", + "diagnosisId": 123, + forbidden_key: "must-never-reach-a-client", + } + ) + + +@pytest.mark.parametrize( + ("field", "value"), + [ + ("sdkAppId", 0), + ("userId", ""), + ("userSig", ""), + ("patientUserId", " "), + ("diagnosisId", None), + ], +) +def test_rejects_incomplete_or_invalid_ticket(field: str, value: object) -> None: + ticket: dict[str, object] = { + "sdkAppId": 1400123456, + "userId": "doctor_42", + "userSig": "ticket-value", + "patientUserId": "patient_8", + "diagnosisId": 123, + } + ticket[field] = value + + with pytest.raises(VideoTicketError): + normalize_backend_ticket(ticket) + + +def test_rejects_conflicting_aliases_and_modes() -> None: + with pytest.raises(VideoTicketError, match="conflicting SDKAppID aliases"): + normalize_backend_ticket( + { + "SDKAppID": 1400123456, + "sdkAppId": 1400654321, + "userID": "doctor_42", + "userSig": "ticket-value", + "targetUserId": "patient_8", + "diagnosisId": 123, + } + ) + + with pytest.raises(VideoTicketError, match="backend mode"): + BackendMode.parse("native") + + +def test_launcher_rejects_browser_before_importing_window_or_writing_repository() -> None: + class Repository: + def start_call(self, **payload: object) -> None: + raise AssertionError(f"unexpected repository write: {payload}") + + launcher = VideoCallLauncher(repository=Repository(), backend_mode="browser") + with pytest.raises(VideoTicketError, match="one-time handoff"): + launcher.prepare( + { + "sdkAppId": 1400123456, + "userId": "doctor_42", + "userSig": "ticket-value", + "patientUserId": "patient_8", + "diagnosisId": 123, + } + ) + + +def test_call_lifecycle_is_fifo_daemon_and_never_blocks_caller() -> None: + events: list[tuple[object, ...]] = [] + start_entered = threading.Event() + release_start = threading.Event() + + class Repository: + def start_call(self, diagnosis_id: int, patient_id: int, *, call_type: int) -> None: + start_entered.set() + assert release_start.wait(2) + events.append(("start", diagnosis_id, patient_id, call_type)) + + def bind_call_room(self, diagnosis_id: int, room_id: str) -> None: + events.append(("bind", diagnosis_id, room_id)) + + def end_call(self, diagnosis_id: int) -> None: + events.append(("end", diagnosis_id)) + + request = VideoCallRequest( + sdk_app_id=1400123456, + user_id="doctor_42", + user_sig="short-lived-ticket", + target_user_id="patient_8", + diagnosis_id=123, + patient_id=8, + ) + lifecycle = OrderedCallLifecycle(request, Repository(), logging.getLogger(__name__)) + + started_at = time.monotonic() + start_future = lifecycle.start() + bind_future = lifecycle.bind_room("456789") + duplicate_bind = lifecycle.bind_room("456789") + changed_bind = lifecycle.bind_room("another-room") + end_future = lifecycle.end("test") + elapsed = time.monotonic() - started_at + + assert start_entered.wait(1) + assert elapsed < 0.2 + assert lifecycle.worker_is_daemon is True + assert lifecycle.wait(0.01) is False + assert duplicate_bind is bind_future + assert changed_bind.result(timeout=0) is False + + release_start.set() + assert start_future.result(timeout=2) is True + assert bind_future.result(timeout=2) is True + assert end_future.result(timeout=2) is True + assert lifecycle.wait(1) is True + + assert events == [ + ("start", 123, 8, 2), + ("bind", 123, "456789"), + ("end", 123), + ] + + +def test_failed_start_prevents_bind_and_end_writes() -> None: + events: list[str] = [] + + class Repository: + def start_call(self, diagnosis_id: int, *, call_type: int) -> None: + del diagnosis_id, call_type + events.append("start") + raise RuntimeError("backend unavailable") + + def bind_call_room(self, diagnosis_id: int, room_id: str) -> None: + del diagnosis_id, room_id + events.append("bind") + + def end_call(self, diagnosis_id: int) -> None: + del diagnosis_id + events.append("end") + + request = VideoCallRequest( + sdk_app_id=1400123456, + user_id="doctor_42", + user_sig="short-lived-ticket", + target_user_id="patient_8", + diagnosis_id=123, + ) + lifecycle = OrderedCallLifecycle(request, Repository(), logging.getLogger(__name__)) + start_future = lifecycle.start() + bind_future = lifecycle.bind_room("456789") + end_future = lifecycle.end("test") + + with pytest.raises(RuntimeError, match="backend unavailable"): + start_future.result(timeout=1) + assert bind_future.result(timeout=1) is False + assert end_future.result(timeout=1) is False + assert lifecycle.wait(1) is True + assert events == ["start"] + + +def test_https_document_policy_is_exact_and_origin_scoped() -> None: + policy = TrustedDocumentPolicy.from_url( + "https://RTC.Example.com/doctor-call/index.html?tenant=a#boot", + is_local=False, + ) + + assert policy.allows_main_document( + "https://rtc.example.com:443/doctor-call/index.html?tenant=a#ready" + ) + assert not policy.allows_main_document( + "https://rtc.example.com/doctor-call/index.html?tenant=b" + ) + assert not policy.allows_main_document("https://rtc.example.com/other/index.html?tenant=a") + assert policy.allows_origin("https://rtc.example.com") + assert not policy.allows_origin("https://sub.rtc.example.com") + assert not policy.allows_origin("http://rtc.example.com") + + with pytest.raises(TrustedDocumentError, match="HTTPS"): + TrustedDocumentPolicy.from_url("http://rtc.example.com/doctor-call", is_local=False) + + +def test_local_document_policy_rejects_sibling_files(tmp_path: Path) -> None: + index = tmp_path / "dist" / "index.html" + index.parent.mkdir() + index.touch() + sibling = index.with_name("other.html") + sibling.touch() + policy = TrustedDocumentPolicy.from_url(index.as_uri(), is_local=True) + + assert policy.allows_main_document(index.as_uri()) + assert not policy.allows_main_document(sibling.as_uri()) + assert policy.allows_origin("file:///") diff --git a/app/uv.lock b/app/uv.lock new file mode 100644 index 000000000..7baa696d0 --- /dev/null +++ b/app/uv.lock @@ -0,0 +1,790 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "altgraph" +version = "0.17.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/f8/97fdf103f38fed6792a1601dbc16cc8aac56e7459a9fff08c812d8ae177a/altgraph-0.17.5.tar.gz", hash = "sha256:c87b395dd12fabde9c99573a9749d67da8d29ef9de0125c7f536699b4a9bc9e7", size = 48428, upload-time = "2025-11-21T20:35:50.583Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/ba/000a1996d4308bc65120167c21241a3b205464a2e0b58deda26ae8ac21d1/altgraph-0.17.5-py2.py3-none-any.whl", hash = "sha256:f3a22400bce1b0c701683820ac4f3b159cd301acab067c51c653e06961600597", size = 21228, upload-time = "2025-11-21T20:35:49.444Z" }, +] + +[[package]] +name = "anyio" +version = "4.14.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176, upload-time = "2026-07-12T20:29:07.082Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload-time = "2026-07-12T20:29:05.763Z" }, +] + +[[package]] +name = "backports-tarfile" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406, upload-time = "2024-05-28T17:01:54.731Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181, upload-time = "2024-05-28T17:01:53.112Z" }, +] + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "cffi" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/5a/4707a0dc1f203f5dde5a907b0d4e3c25d71120241048bd5bc6f1bb9d4e71/cffi-2.1.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0", size = 211805, upload-time = "2026-08-03T21:19:31.867Z" }, + { url = "https://files.pythonhosted.org/packages/ad/66/c19feabb28485b6e0bbaaafa90837a1ef5d302e90f2178bd33f17a49879b/cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3311ed60d36f83378794e1009ac6258bafbf81f7888b4caa7b35a521e3f95813", size = 218716, upload-time = "2026-08-03T21:19:32.896Z" }, + { url = "https://files.pythonhosted.org/packages/a7/92/500760486c8baab49a7a8a58ba7fc3355ec3974b454b8a09e528efde9e1d/cffi-2.1.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6e192623c49c94421616a5778fba35cf0d5a8d000650c1967ef4448ee5cdd990", size = 205569, upload-time = "2026-08-03T21:19:34.142Z" }, + { url = "https://files.pythonhosted.org/packages/a5/a7/a67c733254d6e7373f7822f8082d8d6beade791e0cf12a7611f376fa61c7/cffi-2.1.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a6e721d4b0e45d5b65e87534470e67b18dcd092c83f68fba09f152b9cbc061af", size = 204907, upload-time = "2026-08-03T21:19:35.174Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a4/4399daaf8f7dfee9d7c3327fdb0426ee041cc63edc358b93911ceb2bfc7a/cffi-2.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e261f78cb6ceaaa36f42f2613f4380d94d9c759a9c73c769ee6e0247364632", size = 217807, upload-time = "2026-08-03T21:19:36.286Z" }, + { url = "https://files.pythonhosted.org/packages/28/f7/dabe6da2466ecbd82dc62e7342dc6b1065dad990c06f00f0ede9ebf2a0ed/cffi-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7225e4514edb64eb6740324353e0da0711954fd8d7da4576755b1c6e09b697cd", size = 221252, upload-time = "2026-08-03T21:19:37.416Z" }, + { url = "https://files.pythonhosted.org/packages/ce/87/616202d8e51342c07d2534c510111c4cc37201775ce8f60802c9335d1edd/cffi-2.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df913725b79db7bcf03448f36b7bf8815363417d5b58deecf9305e3e30f0f21a", size = 214214, upload-time = "2026-08-03T21:19:38.507Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c6/ab025d75d2c26c19b087c0124e75ee31cb65032f4fe345d356d8c507ab97/cffi-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f5cfbc5fe74540d335175b656c725d74d90e3730c626d92575eea35029d9afaa", size = 219408, upload-time = "2026-08-03T21:19:39.809Z" }, + { url = "https://files.pythonhosted.org/packages/56/e6/8941622732edec876dd17d0453dce07317ae96db34f2ec1436c9d3785986/cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a", size = 214799, upload-time = "2026-08-03T21:19:47.218Z" }, + { url = "https://files.pythonhosted.org/packages/44/de/f98430906df1545ffde0d543dd124a7a439bc2cd32b36b9c53f805df7333/cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890", size = 222389, upload-time = "2026-08-03T21:19:48.331Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5b/717f1526b9957b34456313c31645c5b82b8fb5c3fe9e4752999be7128bfc/cffi-2.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50", size = 210249, upload-time = "2026-08-03T21:19:49.543Z" }, + { url = "https://files.pythonhosted.org/packages/64/b3/f8aa4f3e34986c7e4ec45072d1b1b9dd295b6b18007b45518d79726dd725/cffi-2.1.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e", size = 208775, upload-time = "2026-08-03T21:19:50.918Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/dceb9dd5b231e1da801793f8acc9f3c52a7e1afe40bb1aae37e02b0faad5/cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf", size = 221822, upload-time = "2026-08-03T21:19:52.054Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d2/6cd24ae3be000a634109c247d1475d62e5616d0dc78c82770942ec384248/cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517", size = 225232, upload-time = "2026-08-03T21:19:53.109Z" }, + { url = "https://files.pythonhosted.org/packages/cb/52/3fa190537004dd7f0ab860a6dc7c0175b8667f68d1e618a46f5498d30250/cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735", size = 223597, upload-time = "2026-08-03T21:19:54.515Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f4/035513d4117049066b4779dc3b7c0c0fdad175fa13731c9f4003f1cd1478/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e", size = 194248, upload-time = "2026-08-03T21:19:59.399Z" }, + { url = "https://files.pythonhosted.org/packages/76/af/2aeb4dbb5fc41a04161ae9ff1518de7cec08e164f44a8ce6a4cf7fd2cd1d/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c", size = 196908, upload-time = "2026-08-03T21:20:00.746Z" }, + { url = "https://files.pythonhosted.org/packages/43/1f/1c3d90d91811c8f86ced9ed637956c54bfe5b79ca98fe976d7f8c8979f6b/cffi-2.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c", size = 214722, upload-time = "2026-08-03T21:20:04.377Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/3b5ce4c3b2192d250f04908f2bfd91ef34552ec8f7716a5d4abdb8d67bb2/cffi-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125", size = 222369, upload-time = "2026-08-03T21:20:05.544Z" }, + { url = "https://files.pythonhosted.org/packages/02/10/4b3c75dde3d9663c9e02ba05c2668b954f671d4bbe346413ca8c696b295a/cffi-2.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264", size = 210175, upload-time = "2026-08-03T21:20:06.75Z" }, + { url = "https://files.pythonhosted.org/packages/df/62/14f74b9543e605d17701dc797b815958b8bb70b7624ce1b832ddad48ed6c/cffi-2.1.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aa9511c62d14da7aacc9b4bf51f3f697a621e83b2d6919008243c3aad168eea3", size = 208670, upload-time = "2026-08-03T21:20:08.04Z" }, + { url = "https://files.pythonhosted.org/packages/95/95/86342356ff5953b3fb06f7ef7c5bee212d45e770abc7218d451b9148313c/cffi-2.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2", size = 221824, upload-time = "2026-08-03T21:20:09.274Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ff/7b3429ff53aafe931ed8a5fc69f481bbef7ba6de87ddcbb63d08f483f613/cffi-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b", size = 225148, upload-time = "2026-08-03T21:20:10.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/34/a95870b9221e09cf4f2ce3178b1a210abdfe63a1bd357da940418d7b8d15/cffi-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7", size = 223564, upload-time = "2026-08-03T21:20:12.165Z" }, + { url = "https://files.pythonhosted.org/packages/d3/7b/d6bbf82b8b96e7391438898c42f5bd96dd02030fd5b64937d248220003e2/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c", size = 194064, upload-time = "2026-08-03T21:20:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/94/e6/bcc91b283be94735e268487a054004f0aa19947b6348fa367db53230abc8/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb", size = 196720, upload-time = "2026-08-03T21:20:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/67/b8/b42132ca113dc567d37684437b46ca1dafc885902b02a110a02d5b511857/cffi-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1", size = 222328, upload-time = "2026-08-03T21:20:22.118Z" }, + { url = "https://files.pythonhosted.org/packages/80/10/c5c0cbf0a657aecf59ef511409734230bf556f05a0d6c9eed7aa5c0a0166/cffi-2.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062", size = 209985, upload-time = "2026-08-03T21:20:23.401Z" }, + { url = "https://files.pythonhosted.org/packages/d5/6c/bfa0b87b03b9238148beca990292843c9396ba069b54496596594173de7b/cffi-2.1.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03", size = 208530, upload-time = "2026-08-03T21:20:24.628Z" }, + { url = "https://files.pythonhosted.org/packages/e9/02/4e7d553a7ac4b4238b38b3c1b80d486e9d4436f8d2acbf87a0997fe3f402/cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96", size = 221525, upload-time = "2026-08-03T21:20:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/82/1d/a4aaf9babd75acb4d5f223bff71533bee748dd770a382619a798960ee9ba/cffi-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527", size = 225053, upload-time = "2026-08-03T21:20:26.985Z" }, + { url = "https://files.pythonhosted.org/packages/81/10/5dc0e7bdd18e22107054288283380fc97a06ae3f1656a106908d666a3c88/cffi-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13", size = 223213, upload-time = "2026-08-03T21:20:28.277Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9c/92934c3bea9f785b23eba304538c0b4d37a2a96d2431eb3a1bc87a11aa19/cffi-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94", size = 223864, upload-time = "2026-08-03T21:20:32.571Z" }, + { url = "https://files.pythonhosted.org/packages/4d/45/ba4c93527bc38616a8bd36488acb69a2212d60486794f0c1f318949bbb76/cffi-2.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc", size = 211538, upload-time = "2026-08-03T21:20:33.808Z" }, + { url = "https://files.pythonhosted.org/packages/80/e9/b6ef565e452acb932fb0cb5443f44a78efbd1233e566f02b5a83855e9115/cffi-2.1.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29", size = 210688, upload-time = "2026-08-03T21:20:34.974Z" }, + { url = "https://files.pythonhosted.org/packages/9a/95/eff5f0cee78d2eabc7eebffec40d3fc1876b5f3c95582e018bb4b99601f2/cffi-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676", size = 223803, upload-time = "2026-08-03T21:20:36.564Z" }, + { url = "https://files.pythonhosted.org/packages/fa/01/579d39fb8bef00a335a23d83757b44feb24cd6345a2c451b64cb67b9c362/cffi-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e", size = 226763, upload-time = "2026-08-03T21:20:37.816Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b0/0b44f47c60b01b57b6e2bbd92343f13a85a1d93bc46ccf6e47e244acd99c/cffi-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f", size = 225688, upload-time = "2026-08-03T21:20:38.959Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8f/9ebe220eab48a093d1a5a5e339ab0dc7316eef3bb04d63c42f0251b61f50/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d", size = 194043, upload-time = "2026-08-03T21:20:48.179Z" }, + { url = "https://files.pythonhosted.org/packages/ff/69/844bad3ece306c4782c2ecb93597035b6690d48704b803914c199da1e8b3/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b", size = 196737, upload-time = "2026-08-03T21:20:49.457Z" }, + { url = "https://files.pythonhosted.org/packages/e2/31/9e1313b0a6e30e91b3b3d3fff51ae99c857c07738e3afcce1f7334e1b7ab/cffi-2.1.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6", size = 222271, upload-time = "2026-08-03T21:20:53.462Z" }, + { url = "https://files.pythonhosted.org/packages/50/e3/f6234a833e6e08c7007003074723c406559eecf9b48dfc97471e5a8eb7a0/cffi-2.1.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:246fa40ce8645a614ff682e0b70f37134e460eaf93a775e0cbe3cca585a67a80", size = 209919, upload-time = "2026-08-03T21:20:54.783Z" }, + { url = "https://files.pythonhosted.org/packages/0d/fc/5f74e293fced6edb51af3a46c4ccf6c23c9943774ecb375ddbd522c76add/cffi-2.1.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:471cee653ae88de62096552e6d24ccb4a5adb8c8c9f10b5054d0122c15bf2779", size = 208529, upload-time = "2026-08-03T21:20:56.066Z" }, + { url = "https://files.pythonhosted.org/packages/44/16/29e6d01b388bef055ecd6ca8244b3f4d336bd09e92d5d892187b9601084e/cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399", size = 221630, upload-time = "2026-08-03T21:20:57.336Z" }, + { url = "https://files.pythonhosted.org/packages/a4/18/fa7f1f6857d5eb88a4ca99ffcbfb7c387a287ccc154c64a73e86314745d7/cffi-2.1.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688", size = 225134, upload-time = "2026-08-03T21:20:58.675Z" }, + { url = "https://files.pythonhosted.org/packages/e0/9f/e8e3dfa04a1b4c241f8c91faacad872b4d4efd051d49764ad4e2fd4b9fea/cffi-2.1.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7", size = 223197, upload-time = "2026-08-03T21:20:59.968Z" }, + { url = "https://files.pythonhosted.org/packages/53/b2/6187f46f2912276a3ae284076109cc5c8680482f11f766ccf26db4a86427/cffi-2.1.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e", size = 223779, upload-time = "2026-08-03T21:21:03.553Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f6/c3ad28bd19f77047a03084424fbd4cbe997303267c14423737324be0385d/cffi-2.1.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:df423d40ee8654634421812bc3b196da3f9bd7d32929da813f8394c4348a5358", size = 211520, upload-time = "2026-08-03T21:21:04.863Z" }, + { url = "https://files.pythonhosted.org/packages/a0/cd/ccac9013a5bd9fd764de118674ab9c805b5ca10c19270d90ee273f8b2240/cffi-2.1.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a730a083190634c65cca36ba5f489531576ebd79bcd5c8e172130f6453127231", size = 210673, upload-time = "2026-08-03T21:21:06.223Z" }, + { url = "https://files.pythonhosted.org/packages/52/86/2976131c639aead931c5bee5aba67e4b09fbeb8018b6f282f70803f923a7/cffi-2.1.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6", size = 223835, upload-time = "2026-08-03T21:21:07.539Z" }, + { url = "https://files.pythonhosted.org/packages/ac/0c/33a7aeab2f9c76918c52e084beb39c570db3588133412929e8ec06fab90b/cffi-2.1.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94", size = 226705, upload-time = "2026-08-03T21:21:08.774Z" }, + { url = "https://files.pythonhosted.org/packages/e3/26/2cde30fdde421130bfc18f70395731a6e6b2053c6a1978a5258ff04e72fa/cffi-2.1.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5", size = 225539, upload-time = "2026-08-03T21:21:09.911Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "coverage" +version = "7.15.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/c3/4f2195f512fb172aa425a8803a874b2baa9ba7f80ff7b6080998761fc701/coverage-7.15.4.tar.gz", hash = "sha256:0548198fff07ccf4faf469520bce1c2eceb1ce3e62891921138dec10907f9d00", size = 936952, upload-time = "2026-08-06T13:50:24.442Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/66/edcec7d7a0b524aa8923e22925fde6fe50ce005a113dca13ae1581455c4c/coverage-7.15.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bbac5abad70df71019988f83f26ac7092ff2642975def4429e98dc7585ef3490", size = 222367, upload-time = "2026-08-06T13:47:15.578Z" }, + { url = "https://files.pythonhosted.org/packages/e6/c6/ab8de429e2e8548faf58ec7e1674a4ce00414b4113942d3fe87109cf0f68/coverage-7.15.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:357a173465c7ce028d07a95cc2b63b5bf59f50ecdd5ad75c5cbb78ada984048e", size = 222874, upload-time = "2026-08-06T13:47:16.961Z" }, + { url = "https://files.pythonhosted.org/packages/be/c4/3b7b49587e8a6b9af79b3eb468d443d6042b6d65b47aa26586846a0d6566/coverage-7.15.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:21b803935e2efc3acebe9697197a294fccf5dc4e5382bd6369542ff7a7d2a1d7", size = 253287, upload-time = "2026-08-06T13:47:18.291Z" }, + { url = "https://files.pythonhosted.org/packages/fb/65/ec03b743a2a229c72cc1eff3e57be9d3564e9c6b4d5aba2d70744a3fc0d8/coverage-7.15.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7a2b580774a4786c1053157c0165e04476e03ff293993d7c148eee784a94bae6", size = 255199, upload-time = "2026-08-06T13:47:19.765Z" }, + { url = "https://files.pythonhosted.org/packages/41/4b/5163729e4b6582d61975cfd3ccab45b4ec53e21cf156d9941cb025188468/coverage-7.15.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9464451c4efffe8d47ace5a540b10b0dc10e879066290f8600872b7f54a419d", size = 257308, upload-time = "2026-08-06T13:47:21.206Z" }, + { url = "https://files.pythonhosted.org/packages/86/08/2167a0f08fb87d702fa423a48578a32865464b7c9e1db3911ad7812ab414/coverage-7.15.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:de602f34123c2f4af1c1869c6dbbbd60da6d5983bf01937367295d135cccbfce", size = 259268, upload-time = "2026-08-06T13:47:22.503Z" }, + { url = "https://files.pythonhosted.org/packages/1e/e5/68eebae3053dbd48508edea559c21b23fbdf3460784f91370c83a86a6acd/coverage-7.15.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6879ded16a27f3eeca19b900c147e81616e7054db451471a611b2755ee5249f7", size = 253392, upload-time = "2026-08-06T13:47:23.88Z" }, + { url = "https://files.pythonhosted.org/packages/1a/46/fd4ced40a2b691c774e515c9b69500bfa64c7960b67fcee4b2f6fad97fc3/coverage-7.15.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:986be58c3ab54aae8d3496a6225eea74f760fdbe739b38bd442c7e8d133aa53b", size = 255001, upload-time = "2026-08-06T13:47:25.469Z" }, + { url = "https://files.pythonhosted.org/packages/53/25/ae2e5fa710bb6957a9aadeb9e3598d3b3e4af6587ce857ad42e8639a3f30/coverage-7.15.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c6103639613fe6c1e989082948419bc77a2d26b6c825c99d7fad25f7d3d87afc", size = 253061, upload-time = "2026-08-06T13:47:26.845Z" }, + { url = "https://files.pythonhosted.org/packages/d7/31/67ddc0365db2c6e93ac8580bc4bbc50f65273262f973f63ebcdbc15c0495/coverage-7.15.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3af93dddb5659276c63bc16ac6466ac2033a70ca816097bbc06345b8ccdf571", size = 256831, upload-time = "2026-08-06T13:47:28.217Z" }, + { url = "https://files.pythonhosted.org/packages/f6/78/82b8fd18f57fb13f12d98fe874995bb2c4f9f17be8aff762c426323fdb96/coverage-7.15.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:b10075e5421d04265766a6d1dac809bbeb8a946fbb23c8f82c227409b2190719", size = 252781, upload-time = "2026-08-06T13:47:29.712Z" }, + { url = "https://files.pythonhosted.org/packages/0a/eb/6c74ef4dd12b252e573c49bdef9e2ac265bf3dbb79b8d7feb3266e084e9e/coverage-7.15.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a67a9f78b2942d87ba8ce3059c642164d2aedd65337377fb52fe9803656bc5c7", size = 253692, upload-time = "2026-08-06T13:47:31.192Z" }, + { url = "https://files.pythonhosted.org/packages/5a/66/eb9aed1c3fd2d36ee00eb173f434b14fa607fc056739c9a89ff4244010ea/coverage-7.15.4-cp311-cp311-win32.whl", hash = "sha256:69484d1aca26e322e1c3ce03f09341e84524ababad2d7202161738d83cc9f82e", size = 224461, upload-time = "2026-08-06T13:47:32.572Z" }, + { url = "https://files.pythonhosted.org/packages/e2/6d/81fa4161dfb3ed9d74e40d58647eff83a56b7612e78352581280fce2f477/coverage-7.15.4-cp311-cp311-win_amd64.whl", hash = "sha256:63fd6fcd1dd6e158f7eb78606e72933b3f6d01e7b747f99c6c12d764307a0fdc", size = 224937, upload-time = "2026-08-06T13:47:34.205Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c1/d8dacf683c6cad3cf85ce68fd3774a6774ec402128822fdfaed920f11e6a/coverage-7.15.4-cp311-cp311-win_arm64.whl", hash = "sha256:ea82116c9893fa89e929b7f197ee5a1950a76e91cc5c85ba503fc02379d04890", size = 224479, upload-time = "2026-08-06T13:47:36.118Z" }, + { url = "https://files.pythonhosted.org/packages/1d/48/bc8d4ba7b37551a767bd863f15b3f80182b271c2f55975356f5f7dbe94c2/coverage-7.15.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d4fedd1f7f428f9fe83b1ead5e7cc87a43427be31aadafbac3ac0636dc7abb22", size = 222543, upload-time = "2026-08-06T13:47:37.562Z" }, + { url = "https://files.pythonhosted.org/packages/20/dd/88d6f83f1fffc974a3691a34a97951c5b12df7512a6782c5963883cbc058/coverage-7.15.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:37e2f0cdf58e2e1fed4e4d5a8f8786ae2f7eb80b478016876667dc4a01d60a97", size = 222905, upload-time = "2026-08-06T13:47:38.927Z" }, + { url = "https://files.pythonhosted.org/packages/bd/5c/54ee0d4748585bb0acab9891cd8d92f2d3593165b4e59fc9de113bfb3140/coverage-7.15.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fb55d0e70bb15f2e81477613627286581414693d74ac7963c93a790dd453ca9d", size = 254407, upload-time = "2026-08-06T13:47:40.488Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3f/f0642a372f494bd0d7dad3b497083b910194a5f1c88be2c94fef707c3b59/coverage-7.15.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:899b9da30f3c6c336566e3707495bb23e8302d39d862f01fa78c48b99b9437e2", size = 257145, upload-time = "2026-08-06T13:47:41.931Z" }, + { url = "https://files.pythonhosted.org/packages/71/17/8b46d0ed68251016002ec972c8fc0119961a765d0984cafb8bf317c43758/coverage-7.15.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d15715e8c46552827e5e4f30a35575a2dbcad14454cf3284c54483946bd16931", size = 258257, upload-time = "2026-08-06T13:47:43.527Z" }, + { url = "https://files.pythonhosted.org/packages/30/b8/8498a0e72d0adbe15477dd07463d2b3bb2c9f6a4815e8589e50939e2c3ae/coverage-7.15.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:002a438859f7b430bc99afeaf01a6d187dad1d0dc907b64cdeffc632a5db8fd8", size = 260517, upload-time = "2026-08-06T13:47:45.121Z" }, + { url = "https://files.pythonhosted.org/packages/41/e1/7dce19c3bdb1e3dd63e769508216500edad81bd5f69a26d724e32aceaf78/coverage-7.15.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e4193a04b518f7968f3099755f5509ee7cccc6dc2b92a6b14841934d22e222c9", size = 254785, upload-time = "2026-08-06T13:47:46.541Z" }, + { url = "https://files.pythonhosted.org/packages/dd/b1/e1494703c675a2561723cd9b89f45c9168782c31280c611b1f767851e57c/coverage-7.15.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e98dcc55d572b38e69d117da7e8e8efb8500f1f5eaf81ecd460a63220790b839", size = 256176, upload-time = "2026-08-06T13:47:48.155Z" }, + { url = "https://files.pythonhosted.org/packages/73/76/a5629d270fb638a43a4b10466f51e2f49d532c1aa4da2913cbbb150bbe0a/coverage-7.15.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:af6c538498ce66c10d3fd541c2a8d5b03da5850355add34e6cba564210cb9e72", size = 254321, upload-time = "2026-08-06T13:47:49.757Z" }, + { url = "https://files.pythonhosted.org/packages/ff/4f/9c44447218435d5766b911534f9d798144a5560f85e9a54ebe5f3f5d19f9/coverage-7.15.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1d10025d96ea89fc2f73714dbc4cbd433fe012c1ac9e23f895d7728b238b6e52", size = 258390, upload-time = "2026-08-06T13:47:51.248Z" }, + { url = "https://files.pythonhosted.org/packages/de/36/c1e127616fb3fa18a9ff71e76c417f2fd7424332a4870015ac224ef4c039/coverage-7.15.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d802e1947603162ded419bff83ac7489820355d2b856dfb09206574e3a37ac0c", size = 253894, upload-time = "2026-08-06T13:47:52.816Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b9/fdb92c8ae7a8bb9b850cc253b7b3b9c8526f68130002048b5671cd510d09/coverage-7.15.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c2de40895718f91951b86712b4c5b694acaf9a0a49be13874896f599a1eed3f4", size = 255763, upload-time = "2026-08-06T13:47:54.296Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c0/a7d51b2587c7bdb76e71b0896d2565bf7d60436b5122fc83e511adb1f7cd/coverage-7.15.4-cp312-cp312-win32.whl", hash = "sha256:5c3431b2161279b7db5c2a1aa58ae02e5cb8c3c42d93a5094be3f5537bd5b11b", size = 224597, upload-time = "2026-08-06T13:47:56.074Z" }, + { url = "https://files.pythonhosted.org/packages/49/b9/5c5f80cc55f5acaaca6dee677626bfcec8c87204a7809b438b08e84f4571/coverage-7.15.4-cp312-cp312-win_amd64.whl", hash = "sha256:6befeab5fb2b51c958ca4ac6c5d141a1e8240f4f76e46350f1911963deda49cd", size = 225135, upload-time = "2026-08-06T13:47:57.52Z" }, + { url = "https://files.pythonhosted.org/packages/47/e4/2a4561f89ff6bf7c925c287d0f2cce8bdf139c3a33735c87e3203401cf94/coverage-7.15.4-cp312-cp312-win_arm64.whl", hash = "sha256:67bc345491ab55b837277d76f5775d057e8c7f1ac44d890d8c2c82adde258c6f", size = 224515, upload-time = "2026-08-06T13:47:58.977Z" }, + { url = "https://files.pythonhosted.org/packages/f1/84/651a9310859673aaa3b3203f1aa1641ca60fcf2494683e1c9474c7172780/coverage-7.15.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c705b28feb2775dc82a25f1d473a370bc37ff93f5177f4e29ce2425f560f6921", size = 222565, upload-time = "2026-08-06T13:48:00.796Z" }, + { url = "https://files.pythonhosted.org/packages/82/f9/4dcf700137e8af550670f4d74d1b63828ce93e1e2b05e5f10710eb2ea987/coverage-7.15.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ff205ab5e3ecc670f6a4dd19d9cbf12ede53dd41cfc1e15716ec961ea6d314e", size = 222936, upload-time = "2026-08-06T13:48:02.391Z" }, + { url = "https://files.pythonhosted.org/packages/07/4a/612ff1e780b3fbfd637486f542f84adc5503873d8b5d279dec1ffeef9414/coverage-7.15.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5172326e861a38b48b48befca15e0f477a26b283337a33a739c8fed229934e36", size = 253926, upload-time = "2026-08-06T13:48:04.382Z" }, + { url = "https://files.pythonhosted.org/packages/b0/04/d1cff1c2ead4708a6a79c01d3736b6a25bd38a36678398f72a8dd33dfad9/coverage-7.15.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:12b59c90084e3234fb11184886bf4a40f4f16a8c8f867be2e087b81f8e8868d4", size = 256523, upload-time = "2026-08-06T13:48:05.996Z" }, + { url = "https://files.pythonhosted.org/packages/b9/80/d34e13fb4b293cbdb9665838cf5522077b8ad14ef947550631a4bced36a5/coverage-7.15.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:349062d66f00b40fa2c1c222438bad25fabf755631b5d82937fe985c8008615c", size = 257759, upload-time = "2026-08-06T13:48:08.036Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e7/2c5fe7636fdb0732fe0f09f308a5b066864078b7fc61f6678e8478554f2e/coverage-7.15.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4256ced708e598e05209bc1a8ab4074e04a51dba4c62fb45926a229af675ace7", size = 259890, upload-time = "2026-08-06T13:48:09.834Z" }, + { url = "https://files.pythonhosted.org/packages/92/28/9689f0858dfff59c2ea688938ab9fa2925631235df67126a42b6c5c70ae1/coverage-7.15.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d80f974b20782d9612c8b4c9beeca867074c7cf4079d1419843fa25a26428b25", size = 254121, upload-time = "2026-08-06T13:48:11.459Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e2/785077c230c157243eb5aa9a26c3be260ecd02001bead54a3cada3df8e03/coverage-7.15.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2e179f19bfe1d31f8eeeaa12990194d761c4f62f0759661000bca6cd8729f40b", size = 255891, upload-time = "2026-08-06T13:48:13.209Z" }, + { url = "https://files.pythonhosted.org/packages/d4/90/e20371b17b40f912f21305c2db2f30efa3de306f7320fc916804872c85a4/coverage-7.15.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8bc16bb47b7679670eceff71d78bfb7d6e5b143f6c2cd117487ec7c75e0d4b78", size = 253859, upload-time = "2026-08-06T13:48:14.736Z" }, + { url = "https://files.pythonhosted.org/packages/05/49/25371987ee459a5f67c0427fb75c74f9358e65f2c71fe75bf41c1b6c5fcb/coverage-7.15.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1cd685005cd2c4200adfc14cf39a603b9320efab3f18a8f7f156d20c9cc3345f", size = 258011, upload-time = "2026-08-06T13:48:16.464Z" }, + { url = "https://files.pythonhosted.org/packages/30/6e/32e67467f6154bf4f1c4f63b05acc5097cba4237d45bbeeea446b52e8ac1/coverage-7.15.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:337399ad2c93b3acd2a937627dae8b3e86b66707cd3d3e856347999aadf1ef8d", size = 253676, upload-time = "2026-08-06T13:48:18.493Z" }, + { url = "https://files.pythonhosted.org/packages/03/c1/8b24192e89286399765155251f99ee9f070a9d637109018ac23d99b99f6f/coverage-7.15.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:96e257121228ec5cd2bb919276e94ac11074471bc37d68dbae0e8308cce15fff", size = 255453, upload-time = "2026-08-06T13:48:20.057Z" }, + { url = "https://files.pythonhosted.org/packages/16/6f/8b41ebdf67c87854e17c035336a90f1cfbad0c14c2a584301be6ff148718/coverage-7.15.4-cp313-cp313-win32.whl", hash = "sha256:c65a9e0dfc6143491879da4e13b5e30f8be192055de508d737fb14601edbd22c", size = 224605, upload-time = "2026-08-06T13:48:21.655Z" }, + { url = "https://files.pythonhosted.org/packages/e0/e2/2946c7f0b42b152ecb21ff1bdad72e3d301e790c0c487e4a86e8c9f69347/coverage-7.15.4-cp313-cp313-win_amd64.whl", hash = "sha256:2ff8f5e9b8f7a94f0c11c45631eee103dbcb7d63274edd12c56efe1be690b3b4", size = 225148, upload-time = "2026-08-06T13:48:23.376Z" }, + { url = "https://files.pythonhosted.org/packages/9e/83/3f4a69957f48ae7a0aba76c34743f88963d607b19e03f3f8e66f91cae0f9/coverage-7.15.4-cp313-cp313-win_arm64.whl", hash = "sha256:6e0a8a5083b096487d6cfced94cdd514d8f5db6f113610fb36c0620edb1028cf", size = 224536, upload-time = "2026-08-06T13:48:25.117Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ac/748cf29eeb2d6be34a3176ce26a4f49e38085ee08e8935f05f6f26ed7e0f/coverage-7.15.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:770e9325ab5ea6d56f77e59b29ecfe0ac20b57a82a601876f90494a4dda0386f", size = 222608, upload-time = "2026-08-06T13:48:26.806Z" }, + { url = "https://files.pythonhosted.org/packages/0b/02/1abbf5c984677b0aa439cdacaccbf38d248939d8ef8fe1cc7a50d73edb77/coverage-7.15.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d12b33a3a50a1676b7784dc8d00a0c6d66a9f2add4b85a041c19b6a7e53ef23c", size = 222940, upload-time = "2026-08-06T13:48:28.432Z" }, + { url = "https://files.pythonhosted.org/packages/eb/e1/ff8f9f53d9fcf586125b55d0b1f04ec1c14955fee41e83d5814bee141bb5/coverage-7.15.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5669c8378ebde86f5def7a25d29586631b58acc27ffde04399f678f3dfc6e082", size = 253985, upload-time = "2026-08-06T13:48:29.995Z" }, + { url = "https://files.pythonhosted.org/packages/a1/26/595759762e514e81be1d7d01ed03444303bcd152226a6529998d253f9201/coverage-7.15.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ff97a14362eef486483ed44042ca2027ea257df6ff768e62358ee0c9776925ac", size = 256492, upload-time = "2026-08-06T13:48:31.634Z" }, + { url = "https://files.pythonhosted.org/packages/24/68/b79aabac54d482be23b5fcdd4f4662bff24a78edc4ee29201726929936d5/coverage-7.15.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a325e815318638aed1655d9c06e6d7c2d3d46c09231ce988070428a8762d734", size = 257837, upload-time = "2026-08-06T13:48:33.186Z" }, + { url = "https://files.pythonhosted.org/packages/09/0f/bf7f297885a5bf6fd71e5782404e0ff059ca09e8711ceb3a08544abde45a/coverage-7.15.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:474223409d88eb20d2d6a0d37ea60e8647a65a90cc008dc1f0410af5f64f1e0d", size = 260152, upload-time = "2026-08-06T13:48:34.75Z" }, + { url = "https://files.pythonhosted.org/packages/fd/f1/296744e854ff8368542343457414380465e9ceefb9192342feb9d3bc461d/coverage-7.15.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7f2f62ae3cd189dd2e13aece758c57b3eecbd27be070dbd4cbd10936049e5dbf", size = 253978, upload-time = "2026-08-06T13:48:36.434Z" }, + { url = "https://files.pythonhosted.org/packages/55/b0/bbdb2e9057493e66220a2e149ca2d301ba0e3a58a83bd6b90de9826d16f3/coverage-7.15.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:39ece820e29e0a2ba34b3ecb3be83c27e997eed8926f2ba6fe7ce7a0bda5843b", size = 255846, upload-time = "2026-08-06T13:48:38.317Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/38015b2b6d21258713bd17e76b59d033b191efb5703589cffd037dfbca20/coverage-7.15.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f21b56dcace11dfe013014201f577dcd592b2a9b72182d930361b47cf6f73f25", size = 253808, upload-time = "2026-08-06T13:48:39.993Z" }, + { url = "https://files.pythonhosted.org/packages/0b/64/0d515c1e60ee6fbfd1a0e79c07cd87d388a233b7adc37758735677203808/coverage-7.15.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:93a3a0b662abcc10c73a47cbc72cd60f63618d6989fb2d1286e50eacd974f303", size = 258081, upload-time = "2026-08-06T13:48:41.971Z" }, + { url = "https://files.pythonhosted.org/packages/91/71/04d9e7a3642146c6351338aef4ef85ab11dbbb54744c13245caba1aad1c0/coverage-7.15.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:141fae2cabf5569b782c10afc4c850ce10f618c13f8db54765cba99cc839da1f", size = 253624, upload-time = "2026-08-06T13:48:43.731Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a7/6c28b74c81ebff66987b0e2522ba5cffa3e90b0c33cb6a2eb264d4ee8cf1/coverage-7.15.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:81294c7e6ab30c5f74c0353b11b2fd6320e72d9bee6ac73b357caa8b916323a5", size = 255280, upload-time = "2026-08-06T13:48:45.58Z" }, + { url = "https://files.pythonhosted.org/packages/52/af/bc19996a7014b98d7bbb0f0939453c67074af65784a3aa16a789a07381fa/coverage-7.15.4-cp314-cp314-win32.whl", hash = "sha256:7bbd7d6418e0dab31a206af5203bd43ae36edb8e7fba1940b055d3e9249290d7", size = 224768, upload-time = "2026-08-06T13:48:47.525Z" }, + { url = "https://files.pythonhosted.org/packages/ee/90/219484e476d6e101ba0a444852579e05f5b75c37c611a42ed1190f73ef62/coverage-7.15.4-cp314-cp314-win_amd64.whl", hash = "sha256:f0204ed122758782970526057093f448051a39db9d810d4e344bb87a3546f425", size = 225259, upload-time = "2026-08-06T13:48:49.513Z" }, + { url = "https://files.pythonhosted.org/packages/b7/66/fa77daf4e383e5f776dac62c2409b6af81910ae6fe326bd5170dba74cc63/coverage-7.15.4-cp314-cp314-win_arm64.whl", hash = "sha256:9e71e7bc71c686a123347ae47a0de33a175e797a85bb57b791492adf4eec8ed8", size = 224684, upload-time = "2026-08-06T13:48:51.235Z" }, + { url = "https://files.pythonhosted.org/packages/58/5b/f03bf0ce362bbf3f785fa5219620d00778d4ac6fc9e407734828e9c672f6/coverage-7.15.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7c922735321eef3f87c280a3d39afff6b646723a2880b862cda4ac7a093b8aa8", size = 223338, upload-time = "2026-08-06T13:48:52.896Z" }, + { url = "https://files.pythonhosted.org/packages/0f/76/e77d0ae22501831cc9f92193e8a957a5caa1dd177f90a6d1d9b106242d92/coverage-7.15.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f41c17c4668a655ce96d090d8d5ffdc24ef64b5a02f9753884d08483e8a4a41a", size = 223609, upload-time = "2026-08-06T13:48:54.688Z" }, + { url = "https://files.pythonhosted.org/packages/82/1a/b1f089da8d38ac612fa2dd6dc7f4a1a7657d12f3e261d2996edd3a838d0b/coverage-7.15.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:46822e9b6ff1c6a72b518c162c44a8f45a61a1d609c51084bf5b16c023c5037b", size = 264970, upload-time = "2026-08-06T13:48:56.403Z" }, + { url = "https://files.pythonhosted.org/packages/bf/31/e66d98d6e9c7fcc88470f1e234eaf6b1950dc0dfbf797f7282c1c861da24/coverage-7.15.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3d6f4955b73b5445271379a59e3792b0d978f42d4a01e0cf7a67d9c33a3bb0a5", size = 267088, upload-time = "2026-08-06T13:48:58.41Z" }, + { url = "https://files.pythonhosted.org/packages/59/a1/ae94eb2c541add426378408379f233591e069040b1e2cdb33df9498a0682/coverage-7.15.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3fc9e047706fb4a9abb54f719d3aa643e80e5bb3818182c40aee01ac0f0247ba", size = 269508, upload-time = "2026-08-06T13:49:00.42Z" }, + { url = "https://files.pythonhosted.org/packages/9c/c7/88a10694a1c6a213569766aba9f25847b28155d4ac731b13226db216356d/coverage-7.15.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05e491d4f3165d62d4f5c8fd48dfeabf2ae8f42cbbd484319af33ea851b78982", size = 270629, upload-time = "2026-08-06T13:49:02.234Z" }, + { url = "https://files.pythonhosted.org/packages/b3/34/d8b8232e5e55169933b59aabcef2fedfa4b9d8897361bb80fcbda146505f/coverage-7.15.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:226c66e80ec0598d3b9b4874123df167ccca342aca8714f77cac6829688ee09c", size = 264043, upload-time = "2026-08-06T13:49:04.102Z" }, + { url = "https://files.pythonhosted.org/packages/7e/35/58b009dbf8c471c7224716478b9fed4a7e1af15320e1ed41660978504663/coverage-7.15.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ac41cc14bebda0dbfb0628036b7f75706935c95bcc07fefe9a0f93614aa60a57", size = 266963, upload-time = "2026-08-06T13:49:05.821Z" }, + { url = "https://files.pythonhosted.org/packages/62/aa/57fbda1b42c892968273c56b6ee9dc0f1310850859230a507bc7873b1f65/coverage-7.15.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8af623e5cd92080acddd02b38f2f406a2c3a0893c38950b211890361448fbf26", size = 264569, upload-time = "2026-08-06T13:49:07.706Z" }, + { url = "https://files.pythonhosted.org/packages/98/8a/360e6e7f24d477b7e889703af0afa878d15b6d4d8d2a822b2835c169a879/coverage-7.15.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:07545711d4f0f32852a18f18ad11f76f0109909d09e78b9008b4cfc67e829429", size = 268299, upload-time = "2026-08-06T13:49:09.587Z" }, + { url = "https://files.pythonhosted.org/packages/4e/89/6f701261aee21b6b5fa8f7872229406dc917e125069448292223bf213606/coverage-7.15.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a0865421cfdc53654b342d515e5a233187590882d20b95752150e53f65460017", size = 263413, upload-time = "2026-08-06T13:49:11.604Z" }, + { url = "https://files.pythonhosted.org/packages/3f/0f/6f04036edc260ed425af83e834f627fad48941ce97b50bfe6edd8b6fa623/coverage-7.15.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:460115e32ee40566476db5048f9bec1e842c127ad8e6f8be745aad3ac9cbc839", size = 265725, upload-time = "2026-08-06T13:49:13.38Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ce/d19b5d4d5c49a7bfb925fd74310fee7d28bc99520ac3367ccbc54e662518/coverage-7.15.4-cp314-cp314t-win32.whl", hash = "sha256:cbde877ef9dd7baf272b9bfef2b8a25edd45d9170fc326951dd20eb480335e85", size = 225079, upload-time = "2026-08-06T13:49:15.265Z" }, + { url = "https://files.pythonhosted.org/packages/26/bb/7aa1b3b173faee0679037ca950bbbe1247273656697994d8d13f80f8d4b4/coverage-7.15.4-cp314-cp314t-win_amd64.whl", hash = "sha256:3da9e92d1c551fd7563833e9ade686efb0c4b7363ab7681a94283958c950bf5e", size = 225911, upload-time = "2026-08-06T13:49:17.279Z" }, + { url = "https://files.pythonhosted.org/packages/81/1c/4ea9e47426d80038d9222db3c4534cb6021a74b237d3ff97ffd33b6600dd/coverage-7.15.4-cp314-cp314t-win_arm64.whl", hash = "sha256:3a54f5a0d85050c73a38f6793090ee83974531e67fe5e57a1da9bee11398aa5e", size = 225219, upload-time = "2026-08-06T13:49:19.293Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c4/dc5d2ac8f9142e7ec7de66e7bf0591db29d78955a040bd915870d9c0e657/coverage-7.15.4-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:2c9872e4d9dc5d3cf616bf4b382f5a00359305a5be666a3dd0b5cdb4e49597f9", size = 222604, upload-time = "2026-08-06T13:49:21.279Z" }, + { url = "https://files.pythonhosted.org/packages/70/39/33e63df81fe2ee100897451841c821467635923e58e37c6bd4b46dd8106c/coverage-7.15.4-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:e101dbb4b9b72f0cddd8cdc8c9c5b47f456766f5e0ac82dbfb75e5c55409b78a", size = 222944, upload-time = "2026-08-06T13:49:23.187Z" }, + { url = "https://files.pythonhosted.org/packages/99/1f/ef3ffb5557febc75a0d97aa459d0266d7d741110265121cc6d8539343d44/coverage-7.15.4-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7d1abebdb047729e852b9c77a00497dfbeb11eb3a117e037d7dbc3ac8e5f5c54", size = 254050, upload-time = "2026-08-06T13:49:25.008Z" }, + { url = "https://files.pythonhosted.org/packages/6f/f5/1f0f6f77698c3601ca0ae7431e34b24c62ca2f06fecb23b73ed1f651d2be/coverage-7.15.4-cp315-cp315-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d28a4a899354d0ea6214cc59b4fa19eefbce1b9ff1688ab579acf49e894bd3fb", size = 256967, upload-time = "2026-08-06T13:49:26.896Z" }, + { url = "https://files.pythonhosted.org/packages/03/7a/2ed9bed79925f4367c83c77f66a89e5ca7229c288d2d19ad5f36d1ca0070/coverage-7.15.4-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffb3c2aacea411cc7e1d27712490c11108e2de1d39019ae32915493a59a8b9ed", size = 258587, upload-time = "2026-08-06T13:49:28.692Z" }, + { url = "https://files.pythonhosted.org/packages/45/8c/fa34044f71b7cc4ecb6da9c2408770959b0591fa9b5fb6fb6bca38f94298/coverage-7.15.4-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9447978a92f405d301123cfd39ff49895490efb769a758fe2734c7f631bf8ce", size = 260785, upload-time = "2026-08-06T13:49:30.472Z" }, + { url = "https://files.pythonhosted.org/packages/4f/54/d5727ce36b4524a7394ab9f5f1df378e1f23affcdab01037dc8655185cc7/coverage-7.15.4-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:050467a7983b8e2fe7dd41a78bb30c3e7f8c0b8cafda14b1c46f8b5e3cf2dd3c", size = 254545, upload-time = "2026-08-06T13:49:32.271Z" }, + { url = "https://files.pythonhosted.org/packages/dc/e6/6e3783e576719590194bdffb6dd6d85490801785b7c331e35a245d8cb8b5/coverage-7.15.4-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:d003b7a5708ddad5c206c79607a6b92abb6fc13c57d99d8a4468cc03a2941ced", size = 256682, upload-time = "2026-08-06T13:49:34.089Z" }, + { url = "https://files.pythonhosted.org/packages/dc/f2/bacdbde18b69ed2de424fcf64d9fb0a4913753d4f0eca8bae9daad69f4bd/coverage-7.15.4-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:c38efe30fd74e5c19e9433f11fb1f5dc9c6522770971b7c6145bbaa413dc8800", size = 254560, upload-time = "2026-08-06T13:49:36.052Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a3/1fb927196e3477c1b48831169ab58ba08f451ba87ae311ff1de68b26a616/coverage-7.15.4-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:1f4f826d70f772ab8b0c052329580d7fe8b8abd191e4ce0c8f81aec6614665d3", size = 258792, upload-time = "2026-08-06T13:49:38.01Z" }, + { url = "https://files.pythonhosted.org/packages/41/58/30d4c149c69053de0edfe325614c1d28d508f62b1783e0e4a234d2e49136/coverage-7.15.4-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:4a4bf917c9953f57c957be31c1cd504e3bd2f34d4a352b9d391a3025336f6768", size = 253968, upload-time = "2026-08-06T13:49:39.934Z" }, + { url = "https://files.pythonhosted.org/packages/89/e4/77f639371b918aad30dda4051f95404b43578f7f2e2f87ba73e02ed1ff37/coverage-7.15.4-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:1c9bf40ebef178a45192c75c4964760bb261b0e6ad725da5fc4c93f674f19753", size = 255893, upload-time = "2026-08-06T13:49:41.825Z" }, + { url = "https://files.pythonhosted.org/packages/5c/62/13be29b3ddab35f14c87967a4820a05106d2a3eccb4fa4ff550bf30b75e0/coverage-7.15.4-cp315-cp315-win32.whl", hash = "sha256:43619d04c3671792d2c4706ae8bf45e265dc87bbd4078189ef8b847ea1e74be2", size = 224768, upload-time = "2026-08-06T13:49:44.08Z" }, + { url = "https://files.pythonhosted.org/packages/a1/70/af0c6be0f964af6954f6b74bc109b0dbca02824696d2520fb17fe1ab06e3/coverage-7.15.4-cp315-cp315-win_amd64.whl", hash = "sha256:be619439dbcd31a2eab10b32de9fff62c26ed4bab69dc32b8363fdaaa0882809", size = 225242, upload-time = "2026-08-06T13:49:45.899Z" }, + { url = "https://files.pythonhosted.org/packages/4f/2d/f3bd3aab899fc9efc18b53133ee68f5f98574ef480649b23e12962226387/coverage-7.15.4-cp315-cp315-win_arm64.whl", hash = "sha256:def597967dafc2e8d97c9097ea453c464e0bb8ed38f193a43070f10dc623bb6d", size = 224674, upload-time = "2026-08-06T13:49:48.322Z" }, + { url = "https://files.pythonhosted.org/packages/f5/ca/f69251cd63eabc6438321aea22148754cce758a26bde07dd490e3fe7cfc5/coverage-7.15.4-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c7dbc748ac8a1e3e59a2b28bea47675e6e778081dbbf081bde0d75def2fcbe1d", size = 223333, upload-time = "2026-08-06T13:49:50.293Z" }, + { url = "https://files.pythonhosted.org/packages/a7/a7/037b53b2885b0d8447064432491a4d5a1014cd9f97a594d53acd0c04541a/coverage-7.15.4-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:2413074a5ecbb61a01a7888fc72db0ca324d13588c5b38bc0dd8564cdcdfea26", size = 223630, upload-time = "2026-08-06T13:49:52.637Z" }, + { url = "https://files.pythonhosted.org/packages/80/4f/152b8a4779ae90da11bb24f7467df8a59f0be48a5c52acb856325ca48289/coverage-7.15.4-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4e6f6f632b7b2f714bf7a1346e8f97b650ee71f3c298aaad42a2ab60f0f07645", size = 264489, upload-time = "2026-08-06T13:49:54.52Z" }, + { url = "https://files.pythonhosted.org/packages/10/2d/84b4b9e0e1dd6528a51920ff7031f35b789382e467a28ec6a5a578cb8812/coverage-7.15.4-cp315-cp315t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8df457da2249d3c75ca2e5e835d59c725abfe92d27fdff6cd99eed85b51d5e9a", size = 267567, upload-time = "2026-08-06T13:49:56.721Z" }, + { url = "https://files.pythonhosted.org/packages/53/fc/ba01cc25299f9f8a2c8b02d3b28c53f3543d9fbfbe4e74fa2760b48f163e/coverage-7.15.4-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:050f66a08805acb5b8a23c6d4a517b1ecf82c08e81ed0e4bd727df065e5c6624", size = 270123, upload-time = "2026-08-06T13:49:58.736Z" }, + { url = "https://files.pythonhosted.org/packages/cf/d0/db2647cbf40b14f8c308f94ff7bf89c06d564e59f396906edf50086ec788/coverage-7.15.4-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1587fb771d1ccceef708fdde1e5af8c7ed24b486b61d13a321acb7d8145390aa", size = 271107, upload-time = "2026-08-06T13:50:00.811Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/4d2d17924552c458bb4f77dd631f0e3bc92fbbdf2d2d916cd4b33bbfd5b1/coverage-7.15.4-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8b4f1c3a69ca580f3fbd6b2046915f536d7f586874f25c1bb23add2a3c88d50f", size = 264955, upload-time = "2026-08-06T13:50:03.023Z" }, + { url = "https://files.pythonhosted.org/packages/ee/de/dc010c7a3691f396d93bbc26bfcafa1c2a3a351cd520470f15faf5795bd5/coverage-7.15.4-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:ffb58d7eff5b7f6ecc6fa21d6288ab7f968a212cb67d682c269c09b9eba3b66f", size = 267949, upload-time = "2026-08-06T13:50:05.557Z" }, + { url = "https://files.pythonhosted.org/packages/78/ea/dc96a11375e83c045c2f7c61fb6918277cfe9401db7c0f7b1d111a84b2e5/coverage-7.15.4-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:d9df165544774574ee004b953023d1bebada1894a80b1052a43d798b0f676e67", size = 264421, upload-time = "2026-08-06T13:50:07.612Z" }, + { url = "https://files.pythonhosted.org/packages/c8/86/b77131a0f9503ce461cd577076147d7a9040f0c5dda772686f729e2cc9cb/coverage-7.15.4-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:f9de0a24a4079b53e523b5c5e2c5945ec251ab486652659955187cf255a259bc", size = 269121, upload-time = "2026-08-06T13:50:09.58Z" }, + { url = "https://files.pythonhosted.org/packages/24/24/944bc35007862955e7ebf05754e645419dcf5d7526c52735cfa2715e8ebf/coverage-7.15.4-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:150089274bdc9f940628552cb92844e0223c987f1902ab8efe9f45a2ec758d88", size = 264565, upload-time = "2026-08-06T13:50:11.722Z" }, + { url = "https://files.pythonhosted.org/packages/c7/cc/a3bb9f93e7e740659163e2ea584f8196ddcd2c456a5dbe15f6c50105fec1/coverage-7.15.4-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:a58a94fed5da6997d258e8f7668c1e195fbd04a691d781b7558f1e468f9e68bc", size = 266522, upload-time = "2026-08-06T13:50:13.786Z" }, + { url = "https://files.pythonhosted.org/packages/49/dd/e0e40f3560d878d888c580698ff5ad1179f5e1c3ac949684ef66b41a3817/coverage-7.15.4-cp315-cp315t-win32.whl", hash = "sha256:ebd5a6d8466ff30836572f3ba2cae8a5e8f85029b1c6d5e2ed338dc472a5166a", size = 225068, upload-time = "2026-08-06T13:50:15.825Z" }, + { url = "https://files.pythonhosted.org/packages/c6/7e/37732ea80eebc30e976e4cdab15c190bc42d96959a42e38ddf6f8c60468f/coverage-7.15.4-cp315-cp315t-win_amd64.whl", hash = "sha256:288bde2a2d7ab6b6c2d7252fcde8b524387f2d970bdba9658fc6f8bbcaef0f9b", size = 225895, upload-time = "2026-08-06T13:50:17.928Z" }, + { url = "https://files.pythonhosted.org/packages/c6/08/1e00f7923eaaba45fb3d51dd794125fc766304b1df264f3a9c6557bfb30e/coverage-7.15.4-cp315-cp315t-win_arm64.whl", hash = "sha256:68be5e1de60ff13c9095bbec0e5a7fa45b33b101752215b91345ea1f61c4a278", size = 225213, upload-time = "2026-08-06T13:50:19.981Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d9/e70c286c979378f061d8266e279b686ab0b0b688e1fe0af864684f23a77d/coverage-7.15.4-py3-none-any.whl", hash = "sha256:964730a1e9de9c0cf11be6a1a3c79ce419c34882842abd256086ba4698705e84", size = 214332, upload-time = "2026-08-06T13:50:22.192Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version <= '3.11'" }, +] + +[[package]] +name = "cryptography" +version = "50.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/41/6cbdcf9142d00fe82836fbb51e503e58088575cf7a0fe1dbff6695bf0840/cryptography-50.0.0.tar.gz", hash = "sha256:eeac2acb5a20ed25e0ad6d1df9891a520b78b404266b6d11778f25d5d691a6c9", size = 880201, upload-time = "2026-07-31T14:25:10.11Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/ef/8f2df13c7216bcad3e1c74e07f6e193d93e998e114f524a53877c9af27ad/cryptography-50.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fd9192b7b70c573d7f214eb1ae35e00d359f6f5e4b27c7e21e30de1fc6204645", size = 4719554, upload-time = "2026-07-31T14:23:35.611Z" }, + { url = "https://files.pythonhosted.org/packages/d9/41/029086c34d91052fc3b88bcc8056f709a7c915c7a23b235a54eb800b1c97/cryptography-50.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:06a32a980526a6ab9a4b9bf8f7385800791e2bb960903cb6b530e4817509a3b7", size = 4702130, upload-time = "2026-07-31T14:23:37.635Z" }, + { url = "https://files.pythonhosted.org/packages/7d/ff/b6ce0954962e7f7b969f850a883744197bb3910bdfd7b6da162eab7d9f68/cryptography-50.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a1b30560f2acc95aa8b2e06e716a13dbfc97314747b80d9707e307f77b40d6b3", size = 4725244, upload-time = "2026-07-31T14:23:39.471Z" }, + { url = "https://files.pythonhosted.org/packages/06/1e/63a1027cb7fec360a182208e1b7767d5aa1fe57be3d6aa856e69a321edc0/cryptography-50.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:8d89f3976b10b4ce31118de72329025f70d2c6ead14a8217c5514dd2c6d5a78f", size = 5342265, upload-time = "2026-07-31T14:23:41.286Z" }, + { url = "https://files.pythonhosted.org/packages/6b/72/a1116d683a6d7ece94590013882515de087edf9ef0e6292aae615a44df73/cryptography-50.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b42a28c1844fd9de8f3f7d540e36b66f3a9c83fceac7170ebc7a6a19edd9dcae", size = 4734609, upload-time = "2026-07-31T14:23:43.139Z" }, + { url = "https://files.pythonhosted.org/packages/15/37/36a9c479bbe49acea2636c7fd3360d20f7b7e079c300352011c44850b181/cryptography-50.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:900131fafd8aead39ac7dd3a7e833be754c17a95cfd91221636949fe4eb0aa8a", size = 4356517, upload-time = "2026-07-31T14:23:44.939Z" }, + { url = "https://files.pythonhosted.org/packages/32/98/8a151d64367204cbc63ec65d37502f1d9c53cf4bfc6ec3c532614dbec60d/cryptography-50.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:07949c449a1abcf60d1ee6e88956d89404c7df3c8258f46589e912988e551987", size = 4724529, upload-time = "2026-07-31T14:23:46.93Z" }, + { url = "https://files.pythonhosted.org/packages/22/f6/ec13b470172126464a86bf54d2294a46d29837fc51ba3e45d4047946fb5e/cryptography-50.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:f89831ef99dd7dd169ab06d63a831adb9e20a87aac6d380266bbda5823349169", size = 5299852, upload-time = "2026-07-31T14:23:48.851Z" }, + { url = "https://files.pythonhosted.org/packages/da/3a/f05e32c99d440c9bb891ea0e36c9091891e36be5a9a87ab2ee6ea20729f6/cryptography-50.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:82148ec5bddac30b51a5b3c1945075f896fa022cb93f8e4a01e9f6ee95292c5f", size = 4734462, upload-time = "2026-07-31T14:23:50.861Z" }, + { url = "https://files.pythonhosted.org/packages/ca/dc/bd72b26be8953f80625f63151efd38eee71c76ca6cf591c08ff34615a79e/cryptography-50.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1489e263a8048bb8b6a8bac662eb2d402ea5d2b7b4699b72f385f1e2772db105", size = 4852708, upload-time = "2026-07-31T14:23:52.715Z" }, + { url = "https://files.pythonhosted.org/packages/27/20/c930314a2ab476d15dec966ec87e2e9637bb02b06106b12c0396c57bb603/cryptography-50.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7cec5b856506da6defb290f30c9ee687d5f5e8cb0bd3f6459dde43b0b4fa40ef", size = 5004179, upload-time = "2026-07-31T14:23:54.887Z" }, + { url = "https://files.pythonhosted.org/packages/d4/67/91eb047e69c5e845f2f14b8a2e4a1aab0f283cb885531e9e22c8adb176bc/cryptography-50.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:19736989797678c6af1e55cd49055cdbcb55d8f6b5583ac5335f933aba9101dc", size = 4700648, upload-time = "2026-07-31T14:24:00.702Z" }, + { url = "https://files.pythonhosted.org/packages/30/82/85f0f7425c856b9f96459411eb12e74ef72df9caf6f8f15bf23a33ff131f/cryptography-50.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80b63928fa35083b33966ce1efb70e5b9607181e49dcd1c22c8c005e319f667f", size = 4682442, upload-time = "2026-07-31T14:24:02.538Z" }, + { url = "https://files.pythonhosted.org/packages/1a/28/b555a365adff1cca2fbe7b9e487d68a40de6bc67ff2cb587473eb43de0e7/cryptography-50.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:d58c3db7cd6eed54e6c06744db55456b65ebd7492ddeae9c1e93cfca7aa857d3", size = 4707596, upload-time = "2026-07-31T14:24:04.394Z" }, + { url = "https://files.pythonhosted.org/packages/72/d8/f52538140cc719df62a01cf87d1c7142318d235817109d6f4054d7c352d6/cryptography-50.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:df2a58a472f332225671c35b0a830208b86d004f82baa8530fa3782c85646533", size = 5314552, upload-time = "2026-07-31T14:24:06.31Z" }, + { url = "https://files.pythonhosted.org/packages/38/14/6120e5bd7c5aa022ad15424ba4d5c5269d0d9448ed4d55e492ea91e3c1c4/cryptography-50.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:11b74db56cdbe3cdee6e3f6982ecb70334fa10dce99ed58bf7894aaaa3b2a037", size = 4717113, upload-time = "2026-07-31T14:24:08.349Z" }, + { url = "https://files.pythonhosted.org/packages/fa/71/190bf38c3ee2e0f8efc9860ae100c9df4169742eef274b91e7aa1cb133b9/cryptography-50.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f59e38625469987d7ef6d495323c55e7db6c212eaf6112267e0d3b565a2e9c9f", size = 4338580, upload-time = "2026-07-31T14:24:10.227Z" }, + { url = "https://files.pythonhosted.org/packages/3a/63/504ccfbbe61fd8aa983f7f146399cdf034c72c2fc55f5b2dfdcdcdb20c99/cryptography-50.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ecfed7367f965a0328cfbdd70da860f15441f002f613185668c6e6ebf5a0ac11", size = 4707038, upload-time = "2026-07-31T14:24:12.169Z" }, + { url = "https://files.pythonhosted.org/packages/01/77/2cf79bbfc4d12ca106437a6e170d6aaa01a373e93093118aaaef0e801bd4/cryptography-50.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:9aa87839c383bdbab6ef865787a1fb877af8dd03464c4400322726feaaadfc6d", size = 5273110, upload-time = "2026-07-31T14:24:14.38Z" }, + { url = "https://files.pythonhosted.org/packages/e5/45/8aae2972c520145377ea3559a605a899bebe227bf070b33cdb445929a9b9/cryptography-50.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:6ba6a53445bd3cfa809ef3ef5f1589aa6ba08784a1d962bf47d0940e871dab1c", size = 4716439, upload-time = "2026-07-31T14:24:16.415Z" }, + { url = "https://files.pythonhosted.org/packages/7b/20/4fe50b619a48c2525cc46e2dbc1ac490708d704be5d467bdaac6dc955682/cryptography-50.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3f5735ffe4996d28b809371756219f5354864902a3b9e7c0b9ee87041209fc9c", size = 4837383, upload-time = "2026-07-31T14:24:18.553Z" }, + { url = "https://files.pythonhosted.org/packages/92/91/3a31366e183343d3703f8995c095f5734676bd6938118047e50fcf279eb4/cryptography-50.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1b4a266766514614f8aa60416e71f2fc6e575d36e7bdc90f644fadb2f4b75b95", size = 4985772, upload-time = "2026-07-31T14:24:20.385Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c6/7a6202a534e32103a285b7834a120869557fe198d51d7cfe59754c8bda9c/cryptography-50.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:910e1d2668e7de9648f2bcee30e180db2a6b15c30f887d7c4c93ddf96e3992e3", size = 4745252, upload-time = "2026-07-31T14:24:26.118Z" }, + { url = "https://files.pythonhosted.org/packages/85/4f/0fa8c2f4428198f15d9ff8d63400e27afbf94ce833f6108da1eb3753f945/cryptography-50.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a91296cb61e8df6f86d0c19cc4068228da256bf59bf86049fbd821084565327f", size = 4728939, upload-time = "2026-07-31T14:24:27.994Z" }, + { url = "https://files.pythonhosted.org/packages/d1/63/54dd723490ba2dc09b299682c10b38db38f159728bcaae8c591b8af2f22d/cryptography-50.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e722f16708d854fe924790e051061f6704a472c3bac347b6fd88033ea8dd0dc5", size = 4748483, upload-time = "2026-07-31T14:24:30.254Z" }, + { url = "https://files.pythonhosted.org/packages/1d/dd/7c77d26285cc7f6991efce64a0f5b4f9383bfa5dd8c5033003eaf7db4cdb/cryptography-50.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:d764dcf130c428ef66786f866dd750f53182bc608813489915e9fc106bb0c82f", size = 5367599, upload-time = "2026-07-31T14:24:32.457Z" }, + { url = "https://files.pythonhosted.org/packages/46/c9/f60aed34c013f317f92817b6c171c2d22a78270fa41109bd4b08af26b194/cryptography-50.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:105110f43a471dbd0060b9c9516cb8a6a79233631a04cc2ba16f28323ac6e025", size = 4762647, upload-time = "2026-07-31T14:24:34.599Z" }, + { url = "https://files.pythonhosted.org/packages/be/f3/f9a0173b139372c3a48ed98154b45cc6b9de17c789d5ab552e621c293609/cryptography-50.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:828743d939e9629bc267b8e2d08d8bb67cd4319c771a33d4b18b22dd8fb7440a", size = 4385197, upload-time = "2026-07-31T14:24:36.647Z" }, + { url = "https://files.pythonhosted.org/packages/d8/36/83bb81f6e569bc38e1e4a7bc80f29b46bb9601920bc455fc8e888f5d5742/cryptography-50.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:2a8183b489dc1f7f80f135780fadc1108f14b31b8a40411c7a5b17425f65f28b", size = 4748095, upload-time = "2026-07-31T14:24:39.493Z" }, + { url = "https://files.pythonhosted.org/packages/6b/16/d3008eff98c764979865834c3d386d4fd041b5f52e7f34fc29ac1a5eb515/cryptography-50.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6e7d61120573a7f2cd94cc095f9e81f6967c61ccdf194285aa143ecec8e0b708", size = 5325948, upload-time = "2026-07-31T14:24:41.556Z" }, + { url = "https://files.pythonhosted.org/packages/9c/f8/d97f9603efda3888187bfdb893f26c41be4735c10631d05d284ee6b047c4/cryptography-50.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:37fdb0d0111f1e2ff07139dfb79f1b49531f8e213c46f1163dd7642979b58c47", size = 4762400, upload-time = "2026-07-31T14:24:43.636Z" }, + { url = "https://files.pythonhosted.org/packages/64/a2/4615c8f7d81a00b1d6e6afe19f694e1543582349fb5f4076f6cb5dc36485/cryptography-50.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87f62a3d3b9888ed0fdde100ec06aa61ca9cd44bad9057d1dff9a516b5f5bb9", size = 4878208, upload-time = "2026-07-31T14:24:45.522Z" }, + { url = "https://files.pythonhosted.org/packages/d2/1a/efcfb02f91407149a0dacffffab791f7e19bf6385f63b3666dc8b5e5c9c8/cryptography-50.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:65c2c3add92b45fd0709db8594536aea39c2a67af0e27ffcf049c498501140b7", size = 5037050, upload-time = "2026-07-31T14:24:47.697Z" }, + { url = "https://files.pythonhosted.org/packages/01/b6/0b9e125e90f3d2dcf599a218a899cda7326a3158cfa258723f0b398b08f6/cryptography-50.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8eb5e1172eb569ea8a872796576e6a67c276351728b6455d5beb01242b027c6a", size = 4692441, upload-time = "2026-07-31T14:24:53.743Z" }, + { url = "https://files.pythonhosted.org/packages/53/c9/a5151588710785a96d7bc4de27d4cd62f263bbbcb203cfe29df537eb6505/cryptography-50.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:910d11e1a385c654bf738bf3e6b8e6ed5de0f5610fcae2be9e5b398d8081d20e", size = 4699810, upload-time = "2026-07-31T14:24:55.746Z" }, + { url = "https://files.pythonhosted.org/packages/c7/1a/15b92b25eb6ce3089cd49377ae990a0f3ad485a510f968aed1f19dbdcdf2/cryptography-50.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:62598a8a57f815db4c6259a4e97d857dab56697e7de8e8ab02352ab74da1995d", size = 4691924, upload-time = "2026-07-31T14:24:58.082Z" }, + { url = "https://files.pythonhosted.org/packages/62/15/219075012ab13e8905f3cd572204f4acb4b111df787104346b9bc0cea789/cryptography-50.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:07479a1cb08219ab719147e742e76090c9c773321959bb94946fffdd397a6437", size = 4699593, upload-time = "2026-07-31T14:24:59.951Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "9.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/01/15bb152d77b21318514a96f43af312635eb2500c96b55398d020c93d86ea/importlib_metadata-9.0.0.tar.gz", hash = "sha256:a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc", size = 56405, upload-time = "2026-03-20T06:42:56.999Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl", hash = "sha256:2d21d1cc5a017bd0559e36150c21c830ab1dc304dedd1b7ea85d20f45ef3edd7", size = 27789, upload-time = "2026-03-20T06:42:55.665Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "jaraco-classes" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777, upload-time = "2024-03-31T07:27:34.792Z" }, +] + +[[package]] +name = "jaraco-context" +version = "6.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "backports-tarfile", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", size = 16801, upload-time = "2026-03-20T22:13:33.922Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl", hash = "sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535", size = 7871, upload-time = "2026-03-20T22:13:32.808Z" }, +] + +[[package]] +name = "jaraco-functools" +version = "4.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/1f/c23395957d41ccf27c4e535c3d334c4051e5395b3752057ba4cbaec35c56/jaraco_functools-4.6.0.tar.gz", hash = "sha256:880c577ec9720b3a052d5bc611fb9f2269b3d87902ef42440df443b88e443280", size = 20837, upload-time = "2026-07-14T01:28:02.544Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/36/ecc85bc96c273dc8a11273ed4782272975e6338d4a3e9228621175edf0e3/jaraco_functools-4.6.0-py3-none-any.whl", hash = "sha256:99e3dc0060c5cbe8fcd1cdb36258e2a65ca40f1566b2033b12abb1bb44dd3c30", size = 11677, upload-time = "2026-07-14T01:28:01.59Z" }, +] + +[[package]] +name = "jeepney" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758, upload-time = "2025-02-27T18:51:01.684Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, +] + +[[package]] +name = "keyring" +version = "25.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.12'" }, + { name = "jaraco-classes" }, + { name = "jaraco-context" }, + { name = "jaraco-functools" }, + { name = "jeepney", marker = "sys_platform == 'linux'" }, + { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, + { name = "secretstorage", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", size = 63516, upload-time = "2025-11-16T16:26:09.482Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" }, +] + +[[package]] +name = "macholib" +version = "1.16.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "altgraph" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/10/2f/97589876ea967487978071c9042518d28b958d87b17dceb7cdc1d881f963/macholib-1.16.4.tar.gz", hash = "sha256:f408c93ab2e995cd2c46e34fe328b130404be143469e41bc366c807448979362", size = 59427, upload-time = "2025-11-22T08:28:38.373Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/d1/a9f36f8ecdf0fb7c9b1e78c8d7af12b8c8754e74851ac7b94a8305540fc7/macholib-1.16.4-py2.py3-none-any.whl", hash = "sha256:da1a3fa8266e30f0ce7e97c6a54eefaae8edd1e5f86f3eb8b95457cae90265ea", size = 38117, upload-time = "2025-11-22T08:28:36.939Z" }, +] + +[[package]] +name = "more-itertools" +version = "11.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/de/1d/f4da6f02cdffe04d6362210b807146a26044c88d839208aec273bb0d9184/more_itertools-11.1.0.tar.gz", hash = "sha256:48e8f4d9e7e5878571ecf6f2b4e57634f93cd474cc8cfbd2376f2d11b396e30d", size = 145772, upload-time = "2026-05-22T14:14:29.909Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl", hash = "sha256:4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192", size = 72226, upload-time = "2026-05-22T14:14:28.824Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pefile" +version = "2024.8.26" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/4f/2750f7f6f025a1507cd3b7218691671eecfd0bbebebe8b39aa0fe1d360b8/pefile-2024.8.26.tar.gz", hash = "sha256:3ff6c5d8b43e8c37bb6e6dd5085658d658a7a0bdcd20b6a07b1fcfc1c4e9d632", size = 76008, upload-time = "2024-08-26T20:58:38.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/16/12b82f791c7f50ddec566873d5bdd245baa1491bac11d15ffb98aecc8f8b/pefile-2024.8.26-py3-none-any.whl", hash = "sha256:76f8b485dcd3b1bb8166f1128d395fa3d87af26360c2358fb75b80019b957c6f", size = 74766, upload-time = "2024-08-26T21:01:02.632Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.11.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/0a/062135c9a98dac804265073cc3afdbec5ae1aa37980bb354f461bafe81b4/platformdirs-4.11.1.tar.gz", hash = "sha256:bb1af68078f25e2f3e111e2d43b8d536df41b73c8a684b40bb018223b66fae27", size = 32396, upload-time = "2026-08-07T23:06:48.516Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/85/9b31b44296cfa3bb56cddb35e6a0f6578bab0b490c0806c0245e32c6110c/platformdirs-4.11.1-py3-none-any.whl", hash = "sha256:2efd27d363e8dd2e661639ffb398865a5e0a46442a11d266bf375a0e0c10e386", size = 23261, upload-time = "2026-08-07T23:06:47.219Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyinstaller" +version = "6.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "altgraph" }, + { name = "macholib", marker = "sys_platform == 'darwin'" }, + { name = "packaging" }, + { name = "pefile", marker = "sys_platform == 'win32'" }, + { name = "pyinstaller-hooks-contrib" }, + { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/03/669d06735cf57d7e2e5dfc3c2e1643554b34c559eff21449c58172ca0335/pyinstaller-6.22.0.tar.gz", hash = "sha256:8b0166fff4583b374bbe7fa044bf03ddc33cab0f792a665807d96048e63f060e", size = 4072247, upload-time = "2026-08-08T13:34:52.418Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/c7/abe1ca65ab55e615961df1b978b997129a8488ab9dc0931dc7664bdc4c99/pyinstaller-6.22.0-py3-none-macosx_10_13_universal2.whl", hash = "sha256:d7c7c5b149f7f9b37585b37e2376f774038b6a5633ba34db0de2698f75391e13", size = 1058495, upload-time = "2026-08-08T13:33:46.963Z" }, + { url = "https://files.pythonhosted.org/packages/17/d0/b7874153bd034fcfe0f47abe1140b49d436e262a3ad18cd52ba86be6358c/pyinstaller-6.22.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:f92f78a9c463b884d57f90c7459c0cb263ccd26a499356bbfac7a5f41fd5b93f", size = 752753, upload-time = "2026-08-08T13:33:51.247Z" }, + { url = "https://files.pythonhosted.org/packages/b9/45/810aee0ad8c137667f2685783cde14c8517357ba08e1c54599ba77547578/pyinstaller-6.22.0-py3-none-manylinux2014_i686.whl", hash = "sha256:f6c750c8ae999cc5520ddbce4263ac3ece96db04ba359ef20acacd81bccc201b", size = 765543, upload-time = "2026-08-08T13:33:55.44Z" }, + { url = "https://files.pythonhosted.org/packages/96/36/24af3e59ca090ae1c0ba9daaeaa10125e99b767df5e3ab06384b516ff1e7/pyinstaller-6.22.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:0a20c37761851100f422ec261f513f46d8e57100ea22886b9ff7a6c346104bd8", size = 764130, upload-time = "2026-08-08T13:33:59.623Z" }, + { url = "https://files.pythonhosted.org/packages/45/17/92cb544e29ad867bcf5a06efd63dcf93af7c662f2121333b99409615b50b/pyinstaller-6.22.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:e6859e80b9c7dccb8a1687c5ed4644a722b370c2aa13e8a9ca5ebf5f9bb842ce", size = 759221, upload-time = "2026-08-08T13:34:03.687Z" }, + { url = "https://files.pythonhosted.org/packages/ea/aa/3733a6f590075c8a6678072480ee22f7b0237f7952b2c1521d5aafa15514/pyinstaller-6.22.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:b07ac9fd1d661ae4d0af6752c3941e4e5576a16cfe7e2d6504a32d57e17d0acc", size = 759087, upload-time = "2026-08-08T13:34:08.012Z" }, + { url = "https://files.pythonhosted.org/packages/f8/b0/300a00798920d5e8e52f71fb0ceb2955a71c24814eaf6c086aeb95944049/pyinstaller-6.22.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:7885de3c830356b0990b27fe164f2b008fb4a18560bac884cf33985f61469f44", size = 758597, upload-time = "2026-08-08T13:34:12.164Z" }, + { url = "https://files.pythonhosted.org/packages/3c/ba/3c5f8cbe3686f8080eadadee10a0da4c7af3eaff72998165d5f5174f5a40/pyinstaller-6.22.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:81dc305c16510c1f9ead6d115b66f381e3d3453ecb96653099c51aa3050420d1", size = 758149, upload-time = "2026-08-08T13:34:16.381Z" }, + { url = "https://files.pythonhosted.org/packages/b6/66/f7de05fa65b141cbd83bf61f56730b3f5249820a4de026e11feadffca3c8/pyinstaller-6.22.0-py3-none-win32.whl", hash = "sha256:6f527c1345d5010682587aebc2f0c1cc34a9b1f200424969c7bfda723cddc074", size = 1341311, upload-time = "2026-08-08T13:34:23.386Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a7/0ea60e966a0da82961ecba80177627fae28fdda5127993281db479ee46fc/pyinstaller-6.22.0-py3-none-win_amd64.whl", hash = "sha256:6e5f3656de100954bf5db25536c43e097e46d482843a96d03a0852bf266e4853", size = 1403046, upload-time = "2026-08-08T13:34:30.352Z" }, + { url = "https://files.pythonhosted.org/packages/47/9a/71fbfdeffc60107c8256436ea62eb39dd35266164f721091242924363747/pyinstaller-6.22.0-py3-none-win_arm64.whl", hash = "sha256:b1233da63926be213cdfbfbb314735bc7762136ed772b1082e1b0a2d7ed896b5", size = 1350592, upload-time = "2026-08-08T13:34:36.532Z" }, +] + +[[package]] +name = "pyinstaller-hooks-contrib" +version = "2026.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/5b/c9fe0db5e83ee1c39b2258fa21d23b15e1a60786b6c5990ee5074ead8bb6/pyinstaller_hooks_contrib-2026.6.tar.gz", hash = "sha256:bef5002c32f4f50bd55b005da12cff64eca8783e7eaf86a06a62410164bab725", size = 173354, upload-time = "2026-06-08T22:37:16.152Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/31/f2d7343d8ed5f7c4678377886f6ce533e6eaaa131b252ce950114c2a7efa/pyinstaller_hooks_contrib-2026.6-py3-none-any.whl", hash = "sha256:fd13b8ac126b35361175edacd41a0d97080b75dd5f4b594ecefefff969509dd3", size = 457159, upload-time = "2026-06-08T22:37:14.722Z" }, +] + +[[package]] +name = "pyside6" +version = "6.11.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyside6-addons" }, + { name = "pyside6-essentials" }, + { name = "shiboken6" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/a6/27ba5947ed48918f7b74b7c43a1e280aac069e36f25adeb4c9adfac835c4/pyside6-6.11.1-cp310-abi3-macosx_13_0_universal2.whl", hash = "sha256:537682c3b7530817203e667c1f5a2f00486b37bf52c52eeab438544c7a0917f6", size = 571921, upload-time = "2026-05-13T09:47:36.402Z" }, + { url = "https://files.pythonhosted.org/packages/d8/de/af89d71410c83b10654d86ff9aff2a4f87c30163658f1cc145242e222526/pyside6-6.11.1-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:b1fc521ba2bb5109425ab8add06bddbdd524abcad06cfa012cc39a22a189feb2", size = 572102, upload-time = "2026-05-13T09:47:38.249Z" }, + { url = "https://files.pythonhosted.org/packages/b6/0e/d583bd3f7bf5046a4497b36f3902cfb64aa29554489a5a25c18e6b4ac0ac/pyside6-6.11.1-cp310-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:75f0005c3eb95c07cfb65522ec50d0815ac007a96482c21dc3cb4b4c04895d84", size = 572098, upload-time = "2026-05-13T09:47:39.44Z" }, + { url = "https://files.pythonhosted.org/packages/57/f2/d9d8ce1373dabb37e5919f63cd18446556079631d3f2eea3ada03c29f6b8/pyside6-6.11.1-cp310-abi3-win_amd64.whl", hash = "sha256:0968877ab1fb4ef3587a284da6fe05e8647ada56a6a3750b6395188e01f4aba6", size = 578377, upload-time = "2026-05-13T09:47:40.76Z" }, + { url = "https://files.pythonhosted.org/packages/96/02/a6057d8bd2bdb1940820fff2d627fdf4013148c9c57adf69fa40d3452ac3/pyside6-6.11.1-cp310-abi3-win_arm64.whl", hash = "sha256:acee467cb5f256cc47ebb9d815a054c1d8416da380c191b247a76d164aa3f805", size = 561765, upload-time = "2026-05-13T09:47:41.9Z" }, +] + +[[package]] +name = "pyside6-addons" +version = "6.11.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyside6-essentials" }, + { name = "shiboken6" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/6b/8bc94aff48b63f788f2d84e5467c12362d68906ba742c0942f46cb04c879/pyside6_addons-6.11.1-cp310-abi3-macosx_13_0_universal2.whl", hash = "sha256:54733c77f789bef5f03c6aff4ad3bec8b2eff021f0cfcbc53d5e6c250ded24f9", size = 331714589, upload-time = "2026-05-13T09:39:12.36Z" }, + { url = "https://files.pythonhosted.org/packages/dd/62/fb1428a523b2a4541e232aab50d9e789e6b4526f37fd9593452a7ea5b6b3/pyside6_addons-6.11.1-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:8e6c65fbd73a512d6f72cda8d8277444a85a34dc99dd1dae9c21d35b8671bb1f", size = 175063224, upload-time = "2026-05-13T09:39:34.185Z" }, + { url = "https://files.pythonhosted.org/packages/ee/9b/2ccd52f66db55c06de65d0501170a1935d04d64d0a230c0d892284a02ce3/pyside6_addons-6.11.1-cp310-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:bf1c6c4e954e5eba3d2a7c661ad4b9689e8f09c7f4a16bdf29713371d11af993", size = 170553429, upload-time = "2026-05-13T09:39:54.424Z" }, + { url = "https://files.pythonhosted.org/packages/9a/bd/8adc4d350b3b363f3dfc8fccdcf5bfed25f7e36c2fff30c64e106f4f1572/pyside6_addons-6.11.1-cp310-abi3-win_amd64.whl", hash = "sha256:0d13c4dfd671b050a48e4f8d8ddc724b7248f9c0437e7fc47fdf316278572923", size = 168816308, upload-time = "2026-05-13T09:40:13.541Z" }, + { url = "https://files.pythonhosted.org/packages/65/b7/9a840d97f0f0f04e372a87e205dd30ee285b4e3b021b188459a917c9dc76/pyside6_addons-6.11.1-cp310-abi3-win_arm64.whl", hash = "sha256:3494f480dee92f415be2f2d989c0b3f4755ac332b28045cbf4ba0f5c5a22ba37", size = 35759347, upload-time = "2026-05-13T09:40:21.199Z" }, +] + +[[package]] +name = "pyside6-essentials" +version = "6.11.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "shiboken6" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/da/10d9197e7370eb4fed8df5fc547b7548dec88e5c5949e2d450db4ae96feb/pyside6_essentials-6.11.1-cp310-abi3-macosx_13_0_universal2.whl", hash = "sha256:228de53c2bc26b07e5021fbe3614fc44ca08e4dab9999af08c2b389d2c239957", size = 110352945, upload-time = "2026-05-13T09:43:08.006Z" }, + { url = "https://files.pythonhosted.org/packages/5c/49/0e1237c4400bec7e335d2c4eeb49bc40d9fd88a9ac44ca9083ce1abdc308/pyside6_essentials-6.11.1-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:e3ef7027b41e4e55fadb56e3b3257dc8ee92154b639fe67fc4c8e05e9d976c60", size = 79908535, upload-time = "2026-05-13T09:43:24.836Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c5/da4c5f23c6540ac5211a1f60177c8dee84b1bf40f2719479587ab8c60731/pyside6_essentials-6.11.1-cp310-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:a039b6da68a3a4b9d243217b2b98d475eed3f617159ef6be925badab53c11b0d", size = 78960051, upload-time = "2026-05-13T09:43:35.423Z" }, + { url = "https://files.pythonhosted.org/packages/64/0e/b663ecc96ca57b5c91b83b6615d6b174380b0faf30338125c26e053d6aa7/pyside6_essentials-6.11.1-cp310-abi3-win_amd64.whl", hash = "sha256:63311bd48e32c584599ab04b9ef7c324082374cd2c9fa533f978fb893bb47e40", size = 77549267, upload-time = "2026-05-13T09:43:44.92Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/eb6723faf5cb7fa581145da1c15f40d641b96e080f0491af2f1859fdeedb/pyside6_essentials-6.11.1-cp310-abi3-win_arm64.whl", hash = "sha256:11253ea52aabecefe9febddbbe78b43a824129e3af1cec98431028fba7fa954f", size = 57964512, upload-time = "2026-05-13T09:43:52.968Z" }, +] + +[[package]] +name = "pytest" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, +] + +[[package]] +name = "pytest-cov" +version = "6.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage", extra = ["toml"] }, + { name = "pluggy" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/4c/f883ab8f0daad69f47efdf95f55a66b51a8b939c430dadce0611508d9e99/pytest_cov-6.3.0.tar.gz", hash = "sha256:35c580e7800f87ce892e687461166e1ac2bcb8fb9e13aea79032518d6e503ff2", size = 70398, upload-time = "2025-09-06T15:40:14.361Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/b4/bb7263e12aade3842b938bc5c6958cae79c5ee18992f9b9349019579da0f/pytest_cov-6.3.0-py3-none-any.whl", hash = "sha256:440db28156d2468cafc0415b4f8e50856a0d11faefa38f30906048fe490f1749", size = 25115, upload-time = "2025-09-06T15:40:12.44Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, +] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471, upload-time = "2024-08-14T10:15:34.626Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" }, +] + +[[package]] +name = "ruff" +version = "0.16.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/73/e1/4508a569211b35599016e84ba65c1a992b7a4004b4b6c4bea02a851cba1b/ruff-0.16.2.tar.gz", hash = "sha256:c3d7828d12e8927a6fc65fe38e2c2541b9e762d360a1786d752cb1b8883b3c9c", size = 4885811, upload-time = "2026-08-07T13:31:01.432Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/57/db19951540f98859c956b50bdb4d31089b4d91e9f15e2968e7d5193806d5/ruff-0.16.2-py3-none-linux_armv6l.whl", hash = "sha256:3c8de4cf2181f01d57946d87d777aa52916976fc09942aed89938fab5e013318", size = 10847925, upload-time = "2026-08-07T13:30:14.468Z" }, + { url = "https://files.pythonhosted.org/packages/13/5a/995fe85a8470d3e391ac0f7fa8054bb454eaf33ee138196d6172ed1079c0/ruff-0.16.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9a48cc05c6fbc811ca81b5d7ba95375affea6582d1b8024e455e41afbbf55344", size = 11072662, upload-time = "2026-08-07T13:30:18.143Z" }, + { url = "https://files.pythonhosted.org/packages/32/53/370d767c61c71a971a4ace36703a7ecd8c393956349a7325d7fab2b56827/ruff-0.16.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a2c0d14fcbb26c91f0f867a6dc9bd71bbc30b1b6151829c884f23faeab2e5700", size = 10566771, upload-time = "2026-08-07T13:30:20.899Z" }, + { url = "https://files.pythonhosted.org/packages/85/d6/9d96948caf5a632be62d62202d5ec914d6856f204fd79eb036e5915e79ea/ruff-0.16.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:335c621622c4650330be50842561c6586ac6971bb8ab5407fe34dcc9efb16bbe", size = 10975825, upload-time = "2026-08-07T13:30:23.517Z" }, + { url = "https://files.pythonhosted.org/packages/3b/92/ea87129b3414acb0b5770563779c51804d37ac67675c7ba35447ddb14773/ruff-0.16.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20e66910f2c37cc753f9ef6580c914a621b80c4fa3549d3e3521e29d0f5bfc3f", size = 10649437, upload-time = "2026-08-07T13:30:26.097Z" }, + { url = "https://files.pythonhosted.org/packages/ac/43/f8f291dcd4af5bb7872b74fdfa41a7cd7c856ca1d4069670971cf1b9f5cb/ruff-0.16.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7e36fbfba65510548156902bcf1350a979a958ce0347ce0f90d73894036b39f", size = 11446761, upload-time = "2026-08-07T13:30:28.752Z" }, + { url = "https://files.pythonhosted.org/packages/71/4a/ef991fb2fcf516ab71f0808adcdd8da5e18c8cde447f4ceaf5f47a5132a5/ruff-0.16.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f0eab35f80df8f134aae5d1630e751901321d317cc8e50dc39e36fa3ed34cd12", size = 12336364, upload-time = "2026-08-07T13:30:31.468Z" }, + { url = "https://files.pythonhosted.org/packages/f3/24/f615e74f307e6ca0e56a482872477b856c70d530aa356abfb6dfe5ca8a80/ruff-0.16.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40ea8c0594feb894e89c8c61ab9c103d38b0ea72dfde6c594107147ca31b1140", size = 11630720, upload-time = "2026-08-07T13:30:34.426Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d3/8ef50149e8412a77f7ab409efdef0e2b23803707a3863da4fc64cb23d459/ruff-0.16.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab3d62dde0b19facdd632008cc4827fc28ada7736c6bd35ab6f1050f0bfed53f", size = 11466130, upload-time = "2026-08-07T13:30:36.958Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a7/a19334985c4dea8c381981fa252cd854c7ee52dc4b1686dc16f4a911c702/ruff-0.16.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:e43e1f5b8388da9eca1b9e88328d47a5cec794633ccf6f7484ac2dd15eee92c0", size = 11523634, upload-time = "2026-08-07T13:30:39.822Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6c/96d192b0e742412ceda08c0a50f9669b253dde9fd6a60ea1a10c9fa79a63/ruff-0.16.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c24788a980581e1d7ea3a0cbe4344c4fbeb0a6a9b1f4713aa46bb104f8294690", size = 10949807, upload-time = "2026-08-07T13:30:42.745Z" }, + { url = "https://files.pythonhosted.org/packages/fa/51/e26599ceca11e79ee255c7df515995561edf87e9ca1893284e44d98f5a86/ruff-0.16.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:81806b08329130005dd4a8a8394a0c9da8c6f4cafb16ba438d2a2ee6a18bedf1", size = 10646891, upload-time = "2026-08-07T13:30:45.522Z" }, + { url = "https://files.pythonhosted.org/packages/68/01/800c4b1f97bc8d7c6029e06b1f20473a3cf1e13c4933d8f3342add83fc55/ruff-0.16.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4ce4e02bad779bef557f541a1b31f20d6abeae1cc05ed1b1ac019d4ffd1044c8", size = 11162063, upload-time = "2026-08-07T13:30:48.131Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d0/1477ea50fc5a0d4b0b71d1d63d50770bdd794d90b43e37a7618e63ec9894/ruff-0.16.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e0422abdf70070255fc4073ce9dfc814cc03db577013761ddd09bc1e4a9a4fbd", size = 11556038, upload-time = "2026-08-07T13:30:50.686Z" }, + { url = "https://files.pythonhosted.org/packages/b8/76/a7776f32048d991e16d4fa8ff91790b877342d3596cc3ed04acdbf1aaedc/ruff-0.16.2-py3-none-win32.whl", hash = "sha256:bf3a63d78fb39f4bf5ac8ae52051c5520505301abe19ba4e204c453b3f09bb0b", size = 10872850, upload-time = "2026-08-07T13:30:53.471Z" }, + { url = "https://files.pythonhosted.org/packages/00/0d/929c800d920e61397d82a01b60bffc68da3052c17d31de59efaad2e4ed75/ruff-0.16.2-py3-none-win_amd64.whl", hash = "sha256:bcabe2f6d0fc7819f1431793005af4e4de7371927d037345bf941252b195b9fa", size = 12023338, upload-time = "2026-08-07T13:30:56.193Z" }, + { url = "https://files.pythonhosted.org/packages/5b/6c/93e26c22c5f78ff87363e07da49c84955affbeb1098bd1936bf3b3f293bf/ruff-0.16.2-py3-none-win_arm64.whl", hash = "sha256:d614e95cedf38a2053fd351c55b103ba30d017d61688fdbfd40ee0412852a99f", size = 11374065, upload-time = "2026-08-07T13:30:58.775Z" }, +] + +[[package]] +name = "secretstorage" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "jeepney" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, +] + +[[package]] +name = "setuptools" +version = "84.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/44/f5da03a8ef95d369145c5bb53050e7877c9f3d312e128605fd9504829143/setuptools-84.0.0.tar.gz", hash = "sha256:f4695c21257f0d9b537ec2692c941d02ee143b7cc1276941349a546573b2ef73", size = 1168449, upload-time = "2026-08-08T18:27:58.365Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/9c/c510029fc6ef33a6275cd2c5d3cecd6613dfd6aa401d57c54f1c18852ccf/setuptools-84.0.0-py3-none-any.whl", hash = "sha256:51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670", size = 818216, upload-time = "2026-08-08T18:27:56.719Z" }, +] + +[[package]] +name = "shiboken6" +version = "6.11.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/f3/f2b63df0251e7cd3172ea28e32ede52739de9566bcefcd0178681538ac81/shiboken6-6.11.1-cp310-abi3-macosx_13_0_universal2.whl", hash = "sha256:1a16867f103ef1c662a5f09dfed03273a9f81688b174555162c58e83650a3f02", size = 476874, upload-time = "2026-05-13T09:47:01.091Z" }, + { url = "https://files.pythonhosted.org/packages/c7/9b/e0355d8897b5c150770f1d95718aad17d432fcc9c035c04f3f58427d4693/shiboken6-6.11.1-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9a8bccfafc8805254cabcfa1edfaf55cd52889f4998c91ad0d9a4433fb1bcdbe", size = 272222, upload-time = "2026-05-13T09:47:02.653Z" }, + { url = "https://files.pythonhosted.org/packages/57/d5/dd4f1defed400be03340f2ede34b61f846776650b4e7ed9ebaf4c71979a2/shiboken6-6.11.1-cp310-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:1bd2f4314414df2d122d9f646e03b731bc6d6b5f77a5f53f99a4fe4e97d84e6f", size = 270350, upload-time = "2026-05-13T09:47:04.02Z" }, + { url = "https://files.pythonhosted.org/packages/52/b5/3f6fb2ee65b534193fb4ef713dd619dc31dadff5d12c16979a7699ad58be/shiboken6-6.11.1-cp310-abi3-win_amd64.whl", hash = "sha256:c2c6863aa80ec18c0f82cea3417837b279cdc60024ac17123461dc9042577df7", size = 1223647, upload-time = "2026-05-13T09:47:05.924Z" }, + { url = "https://files.pythonhosted.org/packages/98/d1/f15ca0e1666faae02c945f48e745ea35f8fcd8243b176109b4e2c4251f47/shiboken6-6.11.1-cp310-abi3-win_arm64.whl", hash = "sha256:7c8d9af17db4495d4fa5b1c393f218311c4855546b9dfa6a0bd21bcd66b55e9d", size = 1784170, upload-time = "2026-05-13T09:47:07.617Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "zhenyang-doctor-workstation" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "httpx" }, + { name = "keyring" }, + { name = "platformdirs" }, + { name = "pyside6" }, + { name = "python-dotenv" }, +] + +[package.optional-dependencies] +build = [ + { name = "pyinstaller" }, +] +dev = [ + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "httpx", specifier = ">=0.27.2,<1" }, + { name = "keyring", specifier = ">=25.5,<26" }, + { name = "platformdirs", specifier = ">=4.3,<5" }, + { name = "pyinstaller", marker = "extra == 'build'", specifier = ">=6.11,<7" }, + { name = "pyside6", specifier = ">=6.8.2,<7" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.3,<9" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=6,<7" }, + { name = "python-dotenv", specifier = ">=1.0.1,<2" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.9,<1" }, +] +provides-extras = ["dev", "build"] + +[[package]] +name = "zipp" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/d8/eab98a517c14134c0b2eb4e2387bc5f457334293ec5d2dd3857ec2966802/zipp-4.1.0.tar.gz", hash = "sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602", size = 26214, upload-time = "2026-05-18T20:08:57.967Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/13/547360d81e6d88d58492968ffda9f9542854f11310ee556fef14260cc886/zipp-4.1.0-py3-none-any.whl", hash = "sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f", size = 10238, upload-time = "2026-05-18T20:08:57.045Z" }, +] diff --git a/app/video_companion/README.md b/app/video_companion/README.md new file mode 100644 index 000000000..90ea31789 --- /dev/null +++ b/app/video_companion/README.md @@ -0,0 +1,35 @@ +# Doctor Video Companion + +这是桌面端专用的最小 Vue 3 / Vite 视频页面。它与 admin 的独立视频组件保持同一条 SDK 主链,直接使用固定版本 `@trtc/calls-uikit-vue@4.4.6`。 + +## 构建 + +```bash +cd video_companion +npm ci +npm run build +``` + +构建产物位于 `video_companion/dist/`。Vite 使用相对资源路径,因此产物既能由 HTTPS 托管,也能由 QtWebEngine 从本地安装目录加载。 + +桌面端当前只在隔离的 QtWebEngine 中加载此页面。页面不会自行向后端领取通话票据,因此在后端提供服务端签发的一次性 handoff 前,系统浏览器模式与自动浏览器降级均被禁用。 + +## 宿主契约 + +页面加载后会暴露: + +```ts +window.doctorCall.start({ + SDKAppID: 1400000000, // 也接受 sdkAppId + userID: 'doctor_42', // 也接受 userId + userSig: '<后端短时票据>', + targetUserId: 'patient_8', // 也接受 patientUserId + diagnosisId: 123, +}) + +await window.doctorCall.hangup() +``` + +`userSig` 必须由业务后端签发。此页面不会生成 UserSig,也不接受或使用 SDKSecretKey。 + +状态、错误与挂断消息优先调用 `window.qtVideoBridge.notify(JSON.stringify(message))`。没有 Qt bridge 时,页面使用 `postMessage` 通知父窗口或 opener;都不可用时只输出不含票据的控制台状态。 diff --git a/app/video_companion/dist/assets/index-BuO_uDya.css b/app/video_companion/dist/assets/index-BuO_uDya.css new file mode 100644 index 000000000..9f3778393 --- /dev/null +++ b/app/video_companion/dist/assets/index-BuO_uDya.css @@ -0,0 +1 @@ +:root{font-family:Inter,PingFang SC,Microsoft YaHei,system-ui,sans-serif;color:#f7f8fa;background:#0b0f14;font-synthesis:none;text-rendering:optimizeLegibility}*{box-sizing:border-box}html,body,#app{width:100%;height:100%;margin:0;overflow:hidden}button,input{font:inherit}.call-stage{position:relative;width:100%;height:100%;min-height:420px;overflow:hidden;background:radial-gradient(circle at 50% 35%,rgba(39,74,83,.22),transparent 38%),#0b0f14}.call-kit,.call-stage :is(.TUICallKit-desktop,.TUICallKit-mobile,#tuicallkit-id){width:100%!important;height:100%!important;max-width:none!important;max-height:none!important}.status-card{position:absolute;inset:50% auto auto 50%;display:grid;grid-template-columns:12px minmax(0,1fr);gap:18px;width:min(520px,calc(100% - 48px));padding:30px 32px;transform:translate(-50%,-50%);border:1px solid rgba(255,255,255,.09);border-radius:20px;background:#131920e6;box-shadow:0 24px 70px #00000052;backdrop-filter:blur(18px)}.eyebrow{margin:0 0 12px;color:#8f9ba8;font-size:12px;font-weight:700;letter-spacing:.16em;text-transform:uppercase}.status-card h1{margin:0;font-size:clamp(22px,3.2vw,34px);font-weight:600;line-height:1.25}.status-hint{margin:14px 0 0;color:#9aa5b1;font-size:14px}.status-dot{width:10px;height:10px;margin-top:5px;border-radius:50%;background:#77818c;box-shadow:0 0 0 5px #77818c1f}.status-dot--starting,.status-dot--live{background:#52c99a;box-shadow:0 0 0 5px #52c99a24}.status-dot--error{background:#f26d6d;box-shadow:0 0 0 5px #f26d6d24}.live-status{position:absolute;z-index:20;top:18px;left:50%;display:flex;align-items:center;gap:10px;padding:9px 14px;transform:translate(-50%);border:1px solid rgba(255,255,255,.1);border-radius:999px;background:#0b0f14c2;color:#e8edf2;font-size:13px;backdrop-filter:blur(14px)}.live-status .status-dot{width:7px;height:7px;margin:0;box-shadow:none} diff --git a/app/video_companion/dist/assets/index-le5ZH3pL.js b/app/video_companion/dist/assets/index-le5ZH3pL.js new file mode 100644 index 000000000..2b06e79e9 --- /dev/null +++ b/app/video_companion/dist/assets/index-le5ZH3pL.js @@ -0,0 +1,532 @@ +(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const g of document.querySelectorAll('link[rel="modulepreload"]'))s(g);new MutationObserver(g=>{for(const B of g)if(B.type==="childList")for(const Q of B.addedNodes)Q.tagName==="LINK"&&Q.rel==="modulepreload"&&s(Q)}).observe(document,{childList:!0,subtree:!0});function r(g){const B={};return g.integrity&&(B.integrity=g.integrity),g.referrerPolicy&&(B.referrerPolicy=g.referrerPolicy),g.crossOrigin==="use-credentials"?B.credentials="include":g.crossOrigin==="anonymous"?B.credentials="omit":B.credentials="same-origin",B}function s(g){if(g.ep)return;g.ep=!0;const B=r(g);fetch(g.href,B)}})();/** +* @vue/shared v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**//*! #__NO_SIDE_EFFECTS__ */function $j(t){const i=Object.create(null);for(const r of t.split(","))i[r]=1;return r=>r in i}const qn={},Cw=[],Lu=()=>{},HtA=()=>!1,nY=t=>t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&(t.charCodeAt(2)>122||t.charCodeAt(2)<97),A3=t=>t.startsWith("onUpdate:"),Sg=Object.assign,e3=(t,i)=>{const r=t.indexOf(i);r>-1&&t.splice(r,1)},VtA=Object.prototype.hasOwnProperty,yn=(t,i)=>VtA.call(t,i),Ro=Array.isArray,Bw=t=>aY(t)==="[object Map]",_8=t=>aY(t)==="[object Set]",xo=t=>typeof t=="function",va=t=>typeof t=="string",sd=t=>typeof t=="symbol",ta=t=>t!==null&&typeof t=="object",b8=t=>(ta(t)||xo(t))&&xo(t.then)&&xo(t.catch),L8=Object.prototype.toString,aY=t=>L8.call(t),qtA=t=>aY(t).slice(8,-1),F8=t=>aY(t)==="[object Object]",t3=t=>va(t)&&t!=="NaN"&&t[0]!=="-"&&""+parseInt(t,10)===t,FG=$j(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),sY=t=>{const i=Object.create(null);return r=>i[r]||(i[r]=t(r))},KtA=/-(\w)/g,mC=sY(t=>t.replace(KtA,(i,r)=>r?r.toUpperCase():"")),jtA=/\B([A-Z])/g,Rp=sY(t=>t.replace(jtA,"-$1").toLowerCase()),gY=sY(t=>t.charAt(0).toUpperCase()+t.slice(1)),CK=sY(t=>t?`on${gY(t)}`:""),Cp=(t,i)=>!Object.is(t,i),BK=(t,...i)=>{for(let r=0;r{Object.defineProperty(t,i,{configurable:!0,enumerable:!1,writable:s,value:r})},WtA=t=>{const i=parseFloat(t);return isNaN(i)?t:i},ztA=t=>{const i=va(t)?Number(t):NaN;return isNaN(i)?t:i};let wz;const IY=()=>wz||(wz=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function zr(t){if(Ro(t)){const i={};for(let r=0;r{if(r){const s=r.split(XtA);s.length>1&&(i[s[0].trim()]=s[1].trim())}}),i}function Qi(t){let i="";if(va(t))i=t;else if(Ro(t))for(let r=0;r!!(t&&t.__v_isRef===!0),Wt=t=>va(t)?t:t==null?"":Ro(t)||ta(t)&&(t.toString===L8||!xo(t.toString))?x8(t)?Wt(t.value):JSON.stringify(t,Y8,2):String(t),Y8=(t,i)=>x8(i)?Y8(t,i.value):Bw(i)?{[`Map(${i.size})`]:[...i.entries()].reduce((r,[s,g],B)=>(r[uK(s,B)+" =>"]=g,r),{})}:_8(i)?{[`Set(${i.size})`]:[...i.values()].map(r=>uK(r))}:sd(i)?uK(i):ta(i)&&!Ro(i)&&!F8(i)?String(i):i,uK=(t,i="")=>{var r;return sd(t)?`Symbol(${(r=t.description)!=null?r:i})`:t};/** +* @vue/reactivity v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let ll;class oiA{constructor(i=!1){this.detached=i,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=ll,!i&&ll&&(this.index=(ll.scopes||(ll.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let i,r;if(this.scopes)for(i=0,r=this.scopes.length;i0)return;if(OG){let i=OG;for(OG=void 0;i;){const r=i.next;i.next=void 0,i.flags&=-9,i=r}}let t;for(;UG;){let i=UG;for(UG=void 0;i;){const r=i.next;if(i.next=void 0,i.flags&=-9,i.flags&1)try{i.trigger()}catch(s){t||(t=s)}i=r}}if(t)throw t}function V8(t){for(let i=t.deps;i;i=i.nextDep)i.version=-1,i.prevActiveLink=i.dep.activeLink,i.dep.activeLink=i}function q8(t){let i,r=t.depsTail,s=r;for(;s;){const g=s.prevDep;s.version===-1?(s===r&&(r=g),r3(s),niA(s)):i=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=g}t.deps=i,t.depsTail=r}function sj(t){for(let i=t.deps;i;i=i.nextDep)if(i.dep.version!==i.version||i.dep.computed&&(K8(i.dep.computed)||i.dep.version!==i.version))return!0;return!!t._dirty}function K8(t){if(t.flags&4&&!(t.flags&16)||(t.flags&=-17,t.globalVersion===ek))return;t.globalVersion=ek;const i=t.dep;if(t.flags|=2,i.version>0&&!t.isSSR&&t.deps&&!sj(t)){t.flags&=-3;return}const r=ea,s=EB;ea=t,EB=!0;try{V8(t);const g=t.fn(t._value);(i.version===0||Cp(g,t._value))&&(t._value=g,i.version++)}catch(g){throw i.version++,g}finally{ea=r,EB=s,q8(t),t.flags&=-3}}function r3(t,i=!1){const{dep:r,prevSub:s,nextSub:g}=t;if(s&&(s.nextSub=g,t.prevSub=void 0),g&&(g.prevSub=s,t.nextSub=void 0),r.subs===t&&(r.subs=s,!s&&r.computed)){r.computed.flags&=-5;for(let B=r.computed.deps;B;B=B.nextDep)r3(B,!0)}!i&&!--r.sc&&r.map&&r.map.delete(r.key)}function niA(t){const{prevDep:i,nextDep:r}=t;i&&(i.nextDep=r,t.prevDep=void 0),r&&(r.prevDep=i,t.nextDep=void 0)}let EB=!0;const j8=[];function Mp(){j8.push(EB),EB=!1}function wp(){const t=j8.pop();EB=t===void 0?!0:t}function Sz(t){const{cleanup:i}=t;if(t.cleanup=void 0,i){const r=ea;ea=void 0;try{i()}finally{ea=r}}}let ek=0;class aiA{constructor(i,r){this.sub=i,this.dep=r,this.version=r.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class n3{constructor(i){this.computed=i,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(i){if(!ea||!EB||ea===this.computed)return;let r=this.activeLink;if(r===void 0||r.sub!==ea)r=this.activeLink=new aiA(ea,this),ea.deps?(r.prevDep=ea.depsTail,ea.depsTail.nextDep=r,ea.depsTail=r):ea.deps=ea.depsTail=r,W8(r);else if(r.version===-1&&(r.version=this.version,r.nextDep)){const s=r.nextDep;s.prevDep=r.prevDep,r.prevDep&&(r.prevDep.nextDep=s),r.prevDep=ea.depsTail,r.nextDep=void 0,ea.depsTail.nextDep=r,ea.depsTail=r,ea.deps===r&&(ea.deps=s)}return r}trigger(i){this.version++,ek++,this.notify(i)}notify(i){i3();try{for(let r=this.subs;r;r=r.prevSub)r.sub.notify()&&r.sub.dep.notify()}finally{o3()}}}function W8(t){if(t.dep.sc++,t.sub.flags&4){const i=t.dep.computed;if(i&&!t.dep.subs){i.flags|=20;for(let s=i.deps;s;s=s.nextDep)W8(s)}const r=t.dep.subs;r!==t&&(t.prevSub=r,r&&(r.nextSub=t)),t.dep.subs=t}}const N2=new WeakMap,tD=Symbol(""),gj=Symbol(""),tk=Symbol("");function GI(t,i,r){if(EB&&ea){let s=N2.get(t);s||N2.set(t,s=new Map);let g=s.get(r);g||(s.set(r,g=new n3),g.map=s,g.key=r),g.track()}}function od(t,i,r,s,g,B){const Q=N2.get(t);if(!Q){ek++;return}const f=m=>{m&&m.trigger()};if(i3(),i==="clear")Q.forEach(f);else{const m=Ro(t),M=m&&t3(r);if(m&&r==="length"){const v=Number(s);Q.forEach((U,AA)=>{(AA==="length"||AA===tk||!sd(AA)&&AA>=v)&&f(U)})}else switch((r!==void 0||Q.has(void 0))&&f(Q.get(r)),M&&f(Q.get(tk)),i){case"add":m?M&&f(Q.get("length")):(f(Q.get(tD)),Bw(t)&&f(Q.get(gj)));break;case"delete":m||(f(Q.get(tD)),Bw(t)&&f(Q.get(gj)));break;case"set":Bw(t)&&f(Q.get(tD));break}}o3()}function siA(t,i){const r=N2.get(t);return r&&r.get(i)}function KM(t){const i=an(t);return i===t?i:(GI(i,"iterate",tk),hC(t)?i:i.map(kI))}function cY(t){return GI(t=an(t),"iterate",tk),t}const giA={__proto__:null,[Symbol.iterator](){return dK(this,Symbol.iterator,kI)},concat(...t){return KM(this).concat(...t.map(i=>Ro(i)?KM(i):i))},entries(){return dK(this,"entries",t=>(t[1]=kI(t[1]),t))},every(t,i){return zQ(this,"every",t,i,void 0,arguments)},filter(t,i){return zQ(this,"filter",t,i,r=>r.map(kI),arguments)},find(t,i){return zQ(this,"find",t,i,kI,arguments)},findIndex(t,i){return zQ(this,"findIndex",t,i,void 0,arguments)},findLast(t,i){return zQ(this,"findLast",t,i,kI,arguments)},findLastIndex(t,i){return zQ(this,"findLastIndex",t,i,void 0,arguments)},forEach(t,i){return zQ(this,"forEach",t,i,void 0,arguments)},includes(...t){return hK(this,"includes",t)},indexOf(...t){return hK(this,"indexOf",t)},join(t){return KM(this).join(t)},lastIndexOf(...t){return hK(this,"lastIndexOf",t)},map(t,i){return zQ(this,"map",t,i,void 0,arguments)},pop(){return cG(this,"pop")},push(...t){return cG(this,"push",t)},reduce(t,...i){return vz(this,"reduce",t,i)},reduceRight(t,...i){return vz(this,"reduceRight",t,i)},shift(){return cG(this,"shift")},some(t,i){return zQ(this,"some",t,i,void 0,arguments)},splice(...t){return cG(this,"splice",t)},toReversed(){return KM(this).toReversed()},toSorted(t){return KM(this).toSorted(t)},toSpliced(...t){return KM(this).toSpliced(...t)},unshift(...t){return cG(this,"unshift",t)},values(){return dK(this,"values",kI)}};function dK(t,i,r){const s=cY(t),g=s[i]();return s!==t&&!hC(t)&&(g._next=g.next,g.next=()=>{const B=g._next();return B.value&&(B.value=r(B.value)),B}),g}const IiA=Array.prototype;function zQ(t,i,r,s,g,B){const Q=cY(t),f=Q!==t&&!hC(t),m=Q[i];if(m!==IiA[i]){const U=m.apply(t,B);return f?kI(U):U}let M=r;Q!==t&&(f?M=function(U,AA){return r.call(this,kI(U),AA,t)}:r.length>2&&(M=function(U,AA){return r.call(this,U,AA,t)}));const v=m.call(Q,M,s);return f&&g?g(v):v}function vz(t,i,r,s){const g=cY(t);let B=r;return g!==t&&(hC(t)?r.length>3&&(B=function(Q,f,m){return r.call(this,Q,f,m,t)}):B=function(Q,f,m){return r.call(this,Q,kI(f),m,t)}),g[i](B,...s)}function hK(t,i,r){const s=an(t);GI(s,"iterate",tk);const g=s[i](...r);return(g===-1||g===!1)&&g3(r[0])?(r[0]=an(r[0]),s[i](...r)):g}function cG(t,i,r=[]){Mp(),i3();const s=an(t)[i].apply(t,r);return o3(),wp(),s}const ciA=$j("__proto__,__v_isRef,__isVue"),z8=new Set(Object.getOwnPropertyNames(Symbol).filter(t=>t!=="arguments"&&t!=="caller").map(t=>Symbol[t]).filter(sd));function EiA(t){sd(t)||(t=String(t));const i=an(this);return GI(i,"has",t),i.hasOwnProperty(t)}class Z8{constructor(i=!1,r=!1){this._isReadonly=i,this._isShallow=r}get(i,r,s){if(r==="__v_skip")return i.__v_skip;const g=this._isReadonly,B=this._isShallow;if(r==="__v_isReactive")return!g;if(r==="__v_isReadonly")return g;if(r==="__v_isShallow")return B;if(r==="__v_raw")return s===(g?B?miA:eZ:B?AZ:$8).get(i)||Object.getPrototypeOf(i)===Object.getPrototypeOf(s)?i:void 0;const Q=Ro(i);if(!g){let m;if(Q&&(m=giA[r]))return m;if(r==="hasOwnProperty")return EiA}const f=Reflect.get(i,r,wg(i)?i:s);return(sd(r)?z8.has(r):ciA(r))||(g||GI(i,"get",r),B)?f:wg(f)?Q&&t3(r)?f:f.value:ta(f)?g?T2(f):Xm(f):f}}class X8 extends Z8{constructor(i=!1){super(!1,i)}set(i,r,s,g){let B=i[r];if(!this._isShallow){const m=CD(B);if(!hC(s)&&!CD(s)&&(B=an(B),s=an(s)),!Ro(i)&&wg(B)&&!wg(s))return m?!1:(B.value=s,!0)}const Q=Ro(i)&&t3(r)?Number(r)t,Wx=t=>Reflect.getPrototypeOf(t);function QiA(t,i,r){return function(...s){const g=this.__v_raw,B=an(g),Q=Bw(B),f=t==="entries"||t===Symbol.iterator&&Q,m=t==="keys"&&Q,M=g[t](...s),v=r?Ij:i?cj:kI;return!i&&GI(B,"iterate",m?gj:tD),{next(){const{value:U,done:AA}=M.next();return AA?{value:U,done:AA}:{value:f?[v(U[0]),v(U[1])]:v(U),done:AA}},[Symbol.iterator](){return this}}}}function zx(t){return function(...i){return t==="delete"?!1:t==="clear"?void 0:this}}function diA(t,i){const r={get(g){const B=this.__v_raw,Q=an(B),f=an(g);t||(Cp(g,f)&&GI(Q,"get",g),GI(Q,"get",f));const{has:m}=Wx(Q),M=i?Ij:t?cj:kI;if(m.call(Q,g))return M(B.get(g));if(m.call(Q,f))return M(B.get(f));B!==Q&&B.get(g)},get size(){const g=this.__v_raw;return!t&&GI(an(g),"iterate",tD),Reflect.get(g,"size",g)},has(g){const B=this.__v_raw,Q=an(B),f=an(g);return t||(Cp(g,f)&&GI(Q,"has",g),GI(Q,"has",f)),g===f?B.has(g):B.has(g)||B.has(f)},forEach(g,B){const Q=this,f=Q.__v_raw,m=an(f),M=i?Ij:t?cj:kI;return!t&&GI(m,"iterate",tD),f.forEach((v,U)=>g.call(B,M(v),M(U),Q))}};return Sg(r,t?{add:zx("add"),set:zx("set"),delete:zx("delete"),clear:zx("clear")}:{add(g){!i&&!hC(g)&&!CD(g)&&(g=an(g));const B=an(this);return Wx(B).has.call(B,g)||(B.add(g),od(B,"add",g,g)),this},set(g,B){!i&&!hC(B)&&!CD(B)&&(B=an(B));const Q=an(this),{has:f,get:m}=Wx(Q);let M=f.call(Q,g);M||(g=an(g),M=f.call(Q,g));const v=m.call(Q,g);return Q.set(g,B),M?Cp(B,v)&&od(Q,"set",g,B):od(Q,"add",g,B),this},delete(g){const B=an(this),{has:Q,get:f}=Wx(B);let m=Q.call(B,g);m||(g=an(g),m=Q.call(B,g)),f&&f.call(B,g);const M=B.delete(g);return m&&od(B,"delete",g,void 0),M},clear(){const g=an(this),B=g.size!==0,Q=g.clear();return B&&od(g,"clear",void 0,void 0),Q}}),["keys","values","entries",Symbol.iterator].forEach(g=>{r[g]=QiA(g,t,i)}),r}function a3(t,i){const r=diA(t,i);return(s,g,B)=>g==="__v_isReactive"?!t:g==="__v_isReadonly"?t:g==="__v_raw"?s:Reflect.get(yn(r,g)&&g in s?r:s,g,B)}const hiA={get:a3(!1,!1)},piA={get:a3(!1,!0)},fiA={get:a3(!0,!1)};const $8=new WeakMap,AZ=new WeakMap,eZ=new WeakMap,miA=new WeakMap;function DiA(t){switch(t){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function yiA(t){return t.__v_skip||!Object.isExtensible(t)?0:DiA(qtA(t))}function Xm(t){return CD(t)?t:s3(t,!1,CiA,hiA,$8)}function RiA(t){return s3(t,!1,uiA,piA,AZ)}function T2(t){return s3(t,!0,BiA,fiA,eZ)}function s3(t,i,r,s,g){if(!ta(t)||t.__v_raw&&!(i&&t.__v_isReactive))return t;const B=g.get(t);if(B)return B;const Q=yiA(t);if(Q===0)return t;const f=new Proxy(t,Q===2?s:r);return g.set(t,f),f}function uw(t){return CD(t)?uw(t.__v_raw):!!(t&&t.__v_isReactive)}function CD(t){return!!(t&&t.__v_isReadonly)}function hC(t){return!!(t&&t.__v_isShallow)}function g3(t){return t?!!t.__v_raw:!1}function an(t){const i=t&&t.__v_raw;return i?an(i):t}function MiA(t){return!yn(t,"__v_skip")&&Object.isExtensible(t)&&U8(t,"__v_skip",!0),t}const kI=t=>ta(t)?Xm(t):t,cj=t=>ta(t)?T2(t):t;function wg(t){return t?t.__v_isRef===!0:!1}function Ne(t){return wiA(t,!1)}function wiA(t,i){return wg(t)?t:new SiA(t,i)}class SiA{constructor(i,r){this.dep=new n3,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=r?i:an(i),this._value=r?i:kI(i),this.__v_isShallow=r}get value(){return this.dep.track(),this._value}set value(i){const r=this._rawValue,s=this.__v_isShallow||hC(i)||CD(i);i=s?i:an(i),Cp(i,r)&&(this._rawValue=i,this._value=s?i:kI(i),this.dep.trigger())}}function W(t){return wg(t)?t.value:t}const viA={get:(t,i,r)=>i==="__v_raw"?t:W(Reflect.get(t,i,r)),set:(t,i,r,s)=>{const g=t[i];return wg(g)&&!wg(r)?(g.value=r,!0):Reflect.set(t,i,r,s)}};function tZ(t){return uw(t)?t:new Proxy(t,viA)}function Mo(t){const i=Ro(t)?new Array(t.length):{};for(const r in t)i[r]=iZ(t,r);return i}class NiA{constructor(i,r,s){this._object=i,this._key=r,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0}get value(){const i=this._object[this._key];return this._value=i===void 0?this._defaultValue:i}set value(i){this._object[this._key]=i}get dep(){return siA(an(this._object),this._key)}}class TiA{constructor(i){this._getter=i,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function pK(t,i,r){return wg(t)?t:xo(t)?new TiA(t):ta(t)&&arguments.length>1?iZ(t,i,r):Ne(t)}function iZ(t,i,r){const s=t[i];return wg(s)?s:new NiA(t,i,r)}class GiA{constructor(i,r,s){this.fn=i,this.setter=r,this._value=void 0,this.dep=new n3(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=ek-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!r,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&ea!==this)return H8(this,!0),!0}get value(){const i=this.dep.track();return K8(this),i&&(i.version=this.dep.version),this._value}set value(i){this.setter&&this.setter(i)}}function kiA(t,i,r=!1){let s,g;return xo(t)?s=t:(s=t.get,g=t.set),new GiA(s,g,r)}const Zx={},G2=new WeakMap;let qm;function _iA(t,i=!1,r=qm){if(r){let s=G2.get(r);s||G2.set(r,s=[]),s.push(t)}}function biA(t,i,r=qn){const{immediate:s,deep:g,once:B,scheduler:Q,augmentJob:f,call:m}=r,M=VA=>g?VA:hC(VA)||g===!1||g===0?rd(VA,1):rd(VA);let v,U,AA,z,sA=!1,eA=!1;if(wg(t)?(U=()=>t.value,sA=hC(t)):uw(t)?(U=()=>M(t),sA=!0):Ro(t)?(eA=!0,sA=t.some(VA=>uw(VA)||hC(VA)),U=()=>t.map(VA=>{if(wg(VA))return VA.value;if(uw(VA))return M(VA);if(xo(VA))return m?m(VA,2):VA()})):xo(t)?i?U=m?()=>m(t,2):t:U=()=>{if(AA){Mp();try{AA()}finally{wp()}}const VA=qm;qm=v;try{return m?m(t,3,[z]):t(z)}finally{qm=VA}}:U=Lu,i&&g){const VA=U,ue=g===!0?1/0:g;U=()=>rd(VA(),ue)}const X=riA(),QA=()=>{v.stop(),X&&X.active&&e3(X.effects,v)};if(B&&i){const VA=i;i=(...ue)=>{VA(...ue),QA()}}let wA=eA?new Array(t.length).fill(Zx):Zx;const HA=VA=>{if(!(!(v.flags&1)||!v.dirty&&!VA))if(i){const ue=v.run();if(g||sA||(eA?ue.some((jA,Ve)=>Cp(jA,wA[Ve])):Cp(ue,wA))){AA&&AA();const jA=qm;qm=v;try{const Ve=[ue,wA===Zx?void 0:eA&&wA[0]===Zx?[]:wA,z];m?m(i,3,Ve):i(...Ve),wA=ue}finally{qm=jA}}}else v.run()};return f&&f(HA),v=new P8(U),v.scheduler=Q?()=>Q(HA,!1):HA,z=VA=>_iA(VA,!1,v),AA=v.onStop=()=>{const VA=G2.get(v);if(VA){if(m)m(VA,4);else for(const ue of VA)ue();G2.delete(v)}},i?s?HA(!0):wA=v.run():Q?Q(HA.bind(null,!0),!0):v.run(),QA.pause=v.pause.bind(v),QA.resume=v.resume.bind(v),QA.stop=QA,QA}function rd(t,i=1/0,r){if(i<=0||!ta(t)||t.__v_skip||(r=r||new Set,r.has(t)))return t;if(r.add(t),i--,wg(t))rd(t.value,i,r);else if(Ro(t))for(let s=0;s{rd(s,i,r)});else if(F8(t)){for(const s in t)rd(t[s],i,r);for(const s of Object.getOwnPropertySymbols(t))Object.prototype.propertyIsEnumerable.call(t,s)&&rd(t[s],i,r)}return t}/** +* @vue/runtime-core v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Qk(t,i,r,s){try{return s?t(...s):t()}catch(g){EY(g,i,r)}}function CB(t,i,r,s){if(xo(t)){const g=Qk(t,i,r,s);return g&&b8(g)&&g.catch(B=>{EY(B,i,r)}),g}if(Ro(t)){const g=[];for(let B=0;B>>1,g=Dc[s],B=ik(g);B=ik(r)?Dc.push(t):Dc.splice(FiA(i),0,t),t.flags|=1,rZ()}}function rZ(){k2||(k2=oZ.then(aZ))}function UiA(t){Ro(t)?Qw.push(...t):ap&&t.id===-1?ap.splice(XM+1,0,t):t.flags&1||(Qw.push(t),t.flags|=1),rZ()}function Nz(t,i,r=vu+1){for(;rik(r)-ik(s));if(Qw.length=0,ap){ap.push(...i);return}for(ap=i,XM=0;XMt.id==null?t.flags&2?-1:1/0:t.id;function aZ(t){try{for(vu=0;vu{s._d&&Hz(-1);const B=_2(i);let Q;try{Q=t(...g)}finally{_2(B),s._d&&Hz(1)}return Q};return s._n=!0,s._c=!0,s._d=!0,s}function aa(t,i){if(Mg===null)return t;const r=hY(Mg),s=t.dirs||(t.dirs=[]);for(let g=0;gt.__isTeleport,xG=t=>t&&(t.disabled||t.disabled===""),Tz=t=>t&&(t.defer||t.defer===""),Gz=t=>typeof SVGElement<"u"&&t instanceof SVGElement,kz=t=>typeof MathMLElement=="function"&&t instanceof MathMLElement,Ej=(t,i)=>{const r=t&&t.to;return va(r)?i?i(r):null:r},IZ={name:"Teleport",__isTeleport:!0,process(t,i,r,s,g,B,Q,f,m,M){const{mc:v,pc:U,pbc:AA,o:{insert:z,querySelector:sA,createText:eA,createComment:X}}=M,QA=xG(i.props);let{shapeFlag:wA,children:HA,dynamicChildren:VA}=i;if(t==null){const ue=i.el=eA(""),jA=i.anchor=eA("");z(ue,r,s),z(jA,r,s);const Ve=(Me,qe)=>{wA&16&&(g&&g.isCE&&(g.ce._teleportTarget=Me),v(HA,Me,qe,g,B,Q,f,m))},Ze=()=>{const Me=i.target=Ej(i.props,sA),qe=cZ(Me,i,eA,z);Me&&(Q!=="svg"&&Gz(Me)?Q="svg":Q!=="mathml"&&kz(Me)&&(Q="mathml"),QA||(Ve(Me,qe),B2(i,!1)))};QA&&(Ve(r,jA),B2(i,!0)),Tz(i.props)?fc(()=>{Ze(),i.el.__isMounted=!0},B):Ze()}else{if(Tz(i.props)&&!t.el.__isMounted){fc(()=>{IZ.process(t,i,r,s,g,B,Q,f,m,M),delete t.el.__isMounted},B);return}i.el=t.el,i.targetStart=t.targetStart;const ue=i.anchor=t.anchor,jA=i.target=t.target,Ve=i.targetAnchor=t.targetAnchor,Ze=xG(t.props),Me=Ze?r:jA,qe=Ze?ue:Ve;if(Q==="svg"||Gz(jA)?Q="svg":(Q==="mathml"||kz(jA))&&(Q="mathml"),VA?(AA(t.dynamicChildren,VA,Me,g,B,Q,f),E3(t,i,!0)):m||U(t,i,Me,qe,g,B,Q,f,!1),QA)Ze?i.props&&t.props&&i.props.to!==t.props.to&&(i.props.to=t.props.to):Xx(i,r,ue,M,1);else if((i.props&&i.props.to)!==(t.props&&t.props.to)){const Et=i.target=Ej(i.props,sA);Et&&Xx(i,Et,null,M,0)}else Ze&&Xx(i,jA,Ve,M,1);B2(i,QA)}},remove(t,i,r,{um:s,o:{remove:g}},B){const{shapeFlag:Q,children:f,anchor:m,targetStart:M,targetAnchor:v,target:U,props:AA}=t;if(U&&(g(M),g(v)),B&&g(m),Q&16){const z=B||!xG(AA);for(let sA=0;sA{t.isMounted=!0}),hZ(()=>{t.isUnmounting=!0}),t}const sC=[Function,Array],EZ={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:sC,onEnter:sC,onAfterEnter:sC,onEnterCancelled:sC,onBeforeLeave:sC,onLeave:sC,onAfterLeave:sC,onLeaveCancelled:sC,onBeforeAppear:sC,onAppear:sC,onAfterAppear:sC,onAppearCancelled:sC},lZ=t=>{const i=t.subTree;return i.component?lZ(i.component):i},PiA={name:"BaseTransition",props:EZ,setup(t,{slots:i}){const r=UoA(),s=YiA();return()=>{const g=i.default&&uZ(i.default(),!0);if(!g||!g.length)return;const B=CZ(g),Q=an(t),{mode:f}=Q;if(s.isLeaving)return fK(B);const m=_z(B);if(!m)return fK(B);let M=lj(m,Q,s,r,U=>M=U);m.type!==yc&&ok(m,M);let v=r.subTree&&_z(r.subTree);if(v&&v.type!==yc&&!Km(m,v)&&lZ(r).type!==yc){let U=lj(v,Q,s,r);if(ok(v,U),f==="out-in"&&m.type!==yc)return s.isLeaving=!0,U.afterLeave=()=>{s.isLeaving=!1,r.job.flags&8||r.update(),delete U.afterLeave,v=void 0},fK(B);f==="in-out"&&m.type!==yc?U.delayLeave=(AA,z,sA)=>{const eA=BZ(s,v);eA[String(v.key)]=v,AA[sp]=()=>{z(),AA[sp]=void 0,delete M.delayedLeave,v=void 0},M.delayedLeave=()=>{sA(),delete M.delayedLeave,v=void 0}}:v=void 0}else v&&(v=void 0);return B}}};function CZ(t){let i=t[0];if(t.length>1){for(const r of t)if(r.type!==yc){i=r;break}}return i}const JiA=PiA;function BZ(t,i){const{leavingVNodes:r}=t;let s=r.get(i.type);return s||(s=Object.create(null),r.set(i.type,s)),s}function lj(t,i,r,s,g){const{appear:B,mode:Q,persisted:f=!1,onBeforeEnter:m,onEnter:M,onAfterEnter:v,onEnterCancelled:U,onBeforeLeave:AA,onLeave:z,onAfterLeave:sA,onLeaveCancelled:eA,onBeforeAppear:X,onAppear:QA,onAfterAppear:wA,onAppearCancelled:HA}=i,VA=String(t.key),ue=BZ(r,t),jA=(Me,qe)=>{Me&&CB(Me,s,9,qe)},Ve=(Me,qe)=>{const Et=qe[1];jA(Me,qe),Ro(Me)?Me.every(Je=>Je.length<=1)&&Et():Me.length<=1&&Et()},Ze={mode:Q,persisted:f,beforeEnter(Me){let qe=m;if(!r.isMounted)if(B)qe=X||m;else return;Me[sp]&&Me[sp](!0);const Et=ue[VA];Et&&Km(t,Et)&&Et.el[sp]&&Et.el[sp](),jA(qe,[Me])},enter(Me){let qe=M,Et=v,Je=U;if(!r.isMounted)if(B)qe=QA||M,Et=wA||v,Je=HA||U;else return;let $e=!1;const Dt=Me[$x]=Zi=>{$e||($e=!0,Zi?jA(Je,[Me]):jA(Et,[Me]),Ze.delayedLeave&&Ze.delayedLeave(),Me[$x]=void 0)};qe?Ve(qe,[Me,Dt]):Dt()},leave(Me,qe){const Et=String(t.key);if(Me[$x]&&Me[$x](!0),r.isUnmounting)return qe();jA(AA,[Me]);let Je=!1;const $e=Me[sp]=Dt=>{Je||(Je=!0,qe(),Dt?jA(eA,[Me]):jA(sA,[Me]),Me[sp]=void 0,ue[Et]===t&&delete ue[Et])};ue[Et]=t,z?Ve(z,[Me,$e]):$e()},clone(Me){const qe=lj(Me,i,r,s,g);return g&&g(qe),qe}};return Ze}function fK(t){if(BY(t))return t=hp(t),t.children=null,t}function _z(t){if(!BY(t))return gZ(t.type)&&t.children?CZ(t.children):t;const{shapeFlag:i,children:r}=t;if(r){if(i&16)return r[0];if(i&32&&xo(r.default))return r.default()}}function ok(t,i){t.shapeFlag&6&&t.component?(t.transition=i,ok(t.component.subTree,i)):t.shapeFlag&128?(t.ssContent.transition=i.clone(t.ssContent),t.ssFallback.transition=i.clone(t.ssFallback)):t.transition=i}function uZ(t,i=!1,r){let s=[],g=0;for(let B=0;B1)for(let B=0;Bb2(sA,i&&(Ro(i)?i[eA]:i),r,s,g));return}if(dw(s)&&!g){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&b2(t,i,r,s.component.subTree);return}const B=s.shapeFlag&4?hY(s.component):s.el,Q=g?null:B,{i:f,r:m}=t,M=i&&i.r,v=f.refs===qn?f.refs={}:f.refs,U=f.setupState,AA=an(U),z=U===qn?()=>!1:sA=>yn(AA,sA);if(M!=null&&M!==m&&(va(M)?(v[M]=null,z(M)&&(U[M]=null)):wg(M)&&(M.value=null)),xo(m))Qk(m,f,12,[Q,v]);else{const sA=va(m),eA=wg(m);if(sA||eA){const X=()=>{if(t.f){const QA=sA?z(m)?U[m]:v[m]:m.value;g?Ro(QA)&&e3(QA,B):Ro(QA)?QA.includes(B)||QA.push(B):sA?(v[m]=[B],z(m)&&(U[m]=v[m])):(m.value=[B],t.k&&(v[t.k]=m.value))}else sA?(v[m]=Q,z(m)&&(U[m]=Q)):eA&&(m.value=Q,t.k&&(v[t.k]=Q))};Q?(X.id=-1,fc(X,r)):X()}}}IY().requestIdleCallback;IY().cancelIdleCallback;const dw=t=>!!t.type.__asyncLoader,BY=t=>t.type.__isKeepAlive;function HiA(t,i){dZ(t,"a",i)}function ViA(t,i){dZ(t,"da",i)}function dZ(t,i,r=oI){const s=t.__wdc||(t.__wdc=()=>{let g=r;for(;g;){if(g.isDeactivated)return;g=g.parent}return t()});if(uY(i,s,r),r){let g=r.parent;for(;g&&g.parent;)BY(g.parent.vnode)&&qiA(s,i,r,g),g=g.parent}}function qiA(t,i,r,s){const g=uY(i,t,s,!0);Ya(()=>{e3(s[i],g)},r)}function uY(t,i,r=oI,s=!1){if(r){const g=r[t]||(r[t]=[]),B=i.__weh||(i.__weh=(...Q)=>{Mp();const f=dk(r),m=CB(i,r,t,Q);return f(),wp(),m});return s?g.unshift(B):g.push(B),B}}const gd=t=>(i,r=oI)=>{(!ak||t==="sp")&&uY(t,(...s)=>i(...s),r)},KiA=gd("bm"),gs=gd("m"),jiA=gd("bu"),WiA=gd("u"),hZ=gd("bum"),Ya=gd("um"),ziA=gd("sp"),ZiA=gd("rtg"),XiA=gd("rtc");function $iA(t,i=oI){uY("ec",t,i)}const AoA="components";function eoA(t,i){return ioA(AoA,t,!0,i)||t}const toA=Symbol.for("v-ndc");function ioA(t,i,r=!0,s=!1){const g=Mg||oI;if(g){const B=g.type;{const f=JoA(B,!1);if(f&&(f===i||f===mC(i)||f===gY(mC(i))))return B}const Q=bz(g[t]||B[t],i)||bz(g.appContext[t],i);return!Q&&s?B:Q}}function bz(t,i){return t&&(t[i]||t[mC(i)]||t[gY(mC(i))])}function DC(t,i,r,s){let g;const B=r,Q=Ro(t);if(Q||va(t)){const f=Q&&uw(t);let m=!1;f&&(m=!hC(t),t=cY(t)),g=new Array(t.length);for(let M=0,v=t.length;Mi(f,m,void 0,B));else{const f=Object.keys(t);g=new Array(f.length);for(let m=0,M=f.length;mnk(i)?!(i.type===yc||i.type===Tn&&!pZ(i.children)):!0)?t:null}const Cj=t=>t?OZ(t)?hY(t):Cj(t.parent):null,YG=Sg(Object.create(null),{$:t=>t,$el:t=>t.vnode.el,$data:t=>t.data,$props:t=>t.props,$attrs:t=>t.attrs,$slots:t=>t.slots,$refs:t=>t.refs,$parent:t=>Cj(t.parent),$root:t=>Cj(t.root),$host:t=>t.ce,$emit:t=>t.emit,$options:t=>mZ(t),$forceUpdate:t=>t.f||(t.f=()=>{I3(t.update)}),$nextTick:t=>t.n||(t.n=lY.bind(t.proxy)),$watch:t=>yoA.bind(t)}),mK=(t,i)=>t!==qn&&!t.__isScriptSetup&&yn(t,i),ooA={get({_:t},i){if(i==="__v_skip")return!0;const{ctx:r,setupState:s,data:g,props:B,accessCache:Q,type:f,appContext:m}=t;let M;if(i[0]!=="$"){const z=Q[i];if(z!==void 0)switch(z){case 1:return s[i];case 2:return g[i];case 4:return r[i];case 3:return B[i]}else{if(mK(s,i))return Q[i]=1,s[i];if(g!==qn&&yn(g,i))return Q[i]=2,g[i];if((M=t.propsOptions[0])&&yn(M,i))return Q[i]=3,B[i];if(r!==qn&&yn(r,i))return Q[i]=4,r[i];Bj&&(Q[i]=0)}}const v=YG[i];let U,AA;if(v)return i==="$attrs"&&GI(t.attrs,"get",""),v(t);if((U=f.__cssModules)&&(U=U[i]))return U;if(r!==qn&&yn(r,i))return Q[i]=4,r[i];if(AA=m.config.globalProperties,yn(AA,i))return AA[i]},set({_:t},i,r){const{data:s,setupState:g,ctx:B}=t;return mK(g,i)?(g[i]=r,!0):s!==qn&&yn(s,i)?(s[i]=r,!0):yn(t.props,i)||i[0]==="$"&&i.slice(1)in t?!1:(B[i]=r,!0)},has({_:{data:t,setupState:i,accessCache:r,ctx:s,appContext:g,propsOptions:B}},Q){let f;return!!r[Q]||t!==qn&&yn(t,Q)||mK(i,Q)||(f=B[0])&&yn(f,Q)||yn(s,Q)||yn(YG,Q)||yn(g.config.globalProperties,Q)},defineProperty(t,i,r){return r.get!=null?t._.accessCache[i]=0:yn(r,"value")&&this.set(t,i,r.value,null),Reflect.defineProperty(t,i,r)}};function Lz(t){return Ro(t)?t.reduce((i,r)=>(i[r]=null,i),{}):t}let Bj=!0;function roA(t){const i=mZ(t),r=t.proxy,s=t.ctx;Bj=!1,i.beforeCreate&&Fz(i.beforeCreate,t,"bc");const{data:g,computed:B,methods:Q,watch:f,provide:m,inject:M,created:v,beforeMount:U,mounted:AA,beforeUpdate:z,updated:sA,activated:eA,deactivated:X,beforeDestroy:QA,beforeUnmount:wA,destroyed:HA,unmounted:VA,render:ue,renderTracked:jA,renderTriggered:Ve,errorCaptured:Ze,serverPrefetch:Me,expose:qe,inheritAttrs:Et,components:Je,directives:$e,filters:Dt}=i;if(M&&noA(M,s,null),Q)for(const qt in Q){const ai=Q[qt];xo(ai)&&(s[qt]=ai.bind(r))}if(g){const qt=g.call(r,r);ta(qt)&&(t.data=Xm(qt))}if(Bj=!0,B)for(const qt in B){const ai=B[qt],Ki=xo(ai)?ai.bind(r,r):xo(ai.get)?ai.get.bind(r,r):Lu,Ur=!xo(ai)&&xo(ai.set)?ai.set.bind(r):Lu,Er=rt({get:Ki,set:Ur});Object.defineProperty(s,qt,{enumerable:!0,configurable:!0,get:()=>Er.value,set:no=>Er.value=no})}if(f)for(const qt in f)fZ(f[qt],s,r,qt);if(m){const qt=xo(m)?m.call(r):m;Reflect.ownKeys(qt).forEach(ai=>{gE(ai,qt[ai])})}v&&Fz(v,t,"c");function bi(qt,ai){Ro(ai)?ai.forEach(Ki=>qt(Ki.bind(r))):ai&&qt(ai.bind(r))}if(bi(KiA,U),bi(gs,AA),bi(jiA,z),bi(WiA,sA),bi(HiA,eA),bi(ViA,X),bi($iA,Ze),bi(XiA,jA),bi(ZiA,Ve),bi(hZ,wA),bi(Ya,VA),bi(ziA,Me),Ro(qe))if(qe.length){const qt=t.exposed||(t.exposed={});qe.forEach(ai=>{Object.defineProperty(qt,ai,{get:()=>r[ai],set:Ki=>r[ai]=Ki})})}else t.exposed||(t.exposed={});ue&&t.render===Lu&&(t.render=ue),Et!=null&&(t.inheritAttrs=Et),Je&&(t.components=Je),$e&&(t.directives=$e),Me&&QZ(t)}function noA(t,i,r=Lu){Ro(t)&&(t=uj(t));for(const s in t){const g=t[s];let B;ta(g)?"default"in g?B=rI(g.from||s,g.default,!0):B=rI(g.from||s):B=rI(g),wg(B)?Object.defineProperty(i,s,{enumerable:!0,configurable:!0,get:()=>B.value,set:Q=>B.value=Q}):i[s]=B}}function Fz(t,i,r){CB(Ro(t)?t.map(s=>s.bind(i.proxy)):t.bind(i.proxy),i,r)}function fZ(t,i,r,s){let g=s.includes(".")?_Z(r,s):()=>r[s];if(va(t)){const B=i[t];xo(B)&&Un(g,B)}else if(xo(t))Un(g,t.bind(r));else if(ta(t))if(Ro(t))t.forEach(B=>fZ(B,i,r,s));else{const B=xo(t.handler)?t.handler.bind(r):i[t.handler];xo(B)&&Un(g,B,t)}}function mZ(t){const i=t.type,{mixins:r,extends:s}=i,{mixins:g,optionsCache:B,config:{optionMergeStrategies:Q}}=t.appContext,f=B.get(i);let m;return f?m=f:!g.length&&!r&&!s?m=i:(m={},g.length&&g.forEach(M=>L2(m,M,Q,!0)),L2(m,i,Q)),ta(i)&&B.set(i,m),m}function L2(t,i,r,s=!1){const{mixins:g,extends:B}=i;B&&L2(t,B,r,!0),g&&g.forEach(Q=>L2(t,Q,r,!0));for(const Q in i)if(!(s&&Q==="expose")){const f=aoA[Q]||r&&r[Q];t[Q]=f?f(t[Q],i[Q]):i[Q]}return t}const aoA={data:Uz,props:Oz,emits:Oz,methods:hG,computed:hG,beforeCreate:dc,created:dc,beforeMount:dc,mounted:dc,beforeUpdate:dc,updated:dc,beforeDestroy:dc,beforeUnmount:dc,destroyed:dc,unmounted:dc,activated:dc,deactivated:dc,errorCaptured:dc,serverPrefetch:dc,components:hG,directives:hG,watch:goA,provide:Uz,inject:soA};function Uz(t,i){return i?t?function(){return Sg(xo(t)?t.call(this,this):t,xo(i)?i.call(this,this):i)}:i:t}function soA(t,i){return hG(uj(t),uj(i))}function uj(t){if(Ro(t)){const i={};for(let r=0;r1)return r&&xo(i)?i.call(s&&s.proxy):i}}const yZ={},RZ=()=>Object.create(yZ),MZ=t=>Object.getPrototypeOf(t)===yZ;function EoA(t,i,r,s=!1){const g={},B=RZ();t.propsDefaults=Object.create(null),wZ(t,i,g,B);for(const Q in t.propsOptions[0])Q in g||(g[Q]=void 0);r?t.props=s?g:RiA(g):t.type.props?t.props=g:t.props=B,t.attrs=B}function loA(t,i,r,s){const{props:g,attrs:B,vnode:{patchFlag:Q}}=t,f=an(g),[m]=t.propsOptions;let M=!1;if((s||Q>0)&&!(Q&16)){if(Q&8){const v=t.vnode.dynamicProps;for(let U=0;U{m=!0;const[AA,z]=SZ(U,i,!0);Sg(Q,AA),z&&f.push(...z)};!r&&i.mixins.length&&i.mixins.forEach(v),t.extends&&v(t.extends),t.mixins&&t.mixins.forEach(v)}if(!B&&!m)return ta(t)&&s.set(t,Cw),Cw;if(Ro(B))for(let v=0;vt[0]==="_"||t==="$stable",c3=t=>Ro(t)?t.map(Gu):[Gu(t)],BoA=(t,i,r)=>{if(i._n)return i;const s=Vt((...g)=>c3(i(...g)),r);return s._c=!1,s},NZ=(t,i,r)=>{const s=t._ctx;for(const g in t){if(vZ(g))continue;const B=t[g];if(xo(B))i[g]=BoA(g,B,s);else if(B!=null){const Q=c3(B);i[g]=()=>Q}}},TZ=(t,i)=>{const r=c3(i);t.slots.default=()=>r},GZ=(t,i,r)=>{for(const s in i)(r||s!=="_")&&(t[s]=i[s])},uoA=(t,i,r)=>{const s=t.slots=RZ();if(t.vnode.shapeFlag&32){const g=i._;g?(GZ(s,i,r),r&&U8(s,"_",g,!0)):NZ(i,s)}else i&&TZ(t,i)},QoA=(t,i,r)=>{const{vnode:s,slots:g}=t;let B=!0,Q=qn;if(s.shapeFlag&32){const f=i._;f?r&&f===1?B=!1:GZ(g,i,r):(B=!i.$stable,NZ(i,g)),Q=i}else i&&(TZ(t,i),Q={default:1});if(B)for(const f in g)!vZ(f)&&Q[f]==null&&delete g[f]},fc=ToA;function doA(t){return hoA(t)}function hoA(t,i){const r=IY();r.__VUE__=!0;const{insert:s,remove:g,patchProp:B,createElement:Q,createText:f,createComment:m,setText:M,setElementText:v,parentNode:U,nextSibling:AA,setScopeId:z=Lu,insertStaticContent:sA}=t,eA=(MA,YA,pe,st=null,Te=null,be=null,yt=void 0,ht=null,ae=!!YA.dynamicChildren)=>{if(MA===YA)return;MA&&!Km(MA,YA)&&(st=Ni(MA),no(MA,Te,be,!0),MA=null),YA.patchFlag===-2&&(ae=!1,YA.dynamicChildren=null);const{type:ye,ref:Xe,shapeFlag:ot}=YA;switch(ye){case dY:X(MA,YA,pe,st);break;case yc:QA(MA,YA,pe,st);break;case yK:MA==null&&wA(YA,pe,st,yt);break;case Tn:Je(MA,YA,pe,st,Te,be,yt,ht,ae);break;default:ot&1?ue(MA,YA,pe,st,Te,be,yt,ht,ae):ot&6?$e(MA,YA,pe,st,Te,be,yt,ht,ae):(ot&64||ot&128)&&ye.process(MA,YA,pe,st,Te,be,yt,ht,ae,Di)}Xe!=null&&Te&&b2(Xe,MA&&MA.ref,be,YA||MA,!YA)},X=(MA,YA,pe,st)=>{if(MA==null)s(YA.el=f(YA.children),pe,st);else{const Te=YA.el=MA.el;YA.children!==MA.children&&M(Te,YA.children)}},QA=(MA,YA,pe,st)=>{MA==null?s(YA.el=m(YA.children||""),pe,st):YA.el=MA.el},wA=(MA,YA,pe,st)=>{[MA.el,MA.anchor]=sA(MA.children,YA,pe,st,MA.el,MA.anchor)},HA=({el:MA,anchor:YA},pe,st)=>{let Te;for(;MA&&MA!==YA;)Te=AA(MA),s(MA,pe,st),MA=Te;s(YA,pe,st)},VA=({el:MA,anchor:YA})=>{let pe;for(;MA&&MA!==YA;)pe=AA(MA),g(MA),MA=pe;g(YA)},ue=(MA,YA,pe,st,Te,be,yt,ht,ae)=>{YA.type==="svg"?yt="svg":YA.type==="math"&&(yt="mathml"),MA==null?jA(YA,pe,st,Te,be,yt,ht,ae):Me(MA,YA,Te,be,yt,ht,ae)},jA=(MA,YA,pe,st,Te,be,yt,ht)=>{let ae,ye;const{props:Xe,shapeFlag:ot,transition:zt,dirs:yi}=MA;if(ae=MA.el=Q(MA.type,be,Xe&&Xe.is,Xe),ot&8?v(ae,MA.children):ot&16&&Ze(MA.children,ae,null,st,Te,DK(MA,be),yt,ht),yi&&Om(MA,null,st,"created"),Ve(ae,MA,MA.scopeId,yt,st),Xe){for(const Ei in Xe)Ei!=="value"&&!FG(Ei)&&B(ae,Ei,null,Xe[Ei],be,st);"value"in Xe&&B(ae,"value",null,Xe.value,be),(ye=Xe.onVnodeBeforeMount)&&Su(ye,st,MA)}yi&&Om(MA,null,st,"beforeMount");const Hi=poA(Te,zt);Hi&&zt.beforeEnter(ae),s(ae,YA,pe),((ye=Xe&&Xe.onVnodeMounted)||Hi||yi)&&fc(()=>{ye&&Su(ye,st,MA),Hi&&zt.enter(ae),yi&&Om(MA,null,st,"mounted")},Te)},Ve=(MA,YA,pe,st,Te)=>{if(pe&&z(MA,pe),st)for(let be=0;be{for(let ye=ae;ye{const ht=YA.el=MA.el;let{patchFlag:ae,dynamicChildren:ye,dirs:Xe}=YA;ae|=MA.patchFlag&16;const ot=MA.props||qn,zt=YA.props||qn;let yi;if(pe&&xm(pe,!1),(yi=zt.onVnodeBeforeUpdate)&&Su(yi,pe,YA,MA),Xe&&Om(YA,MA,pe,"beforeUpdate"),pe&&xm(pe,!0),(ot.innerHTML&&zt.innerHTML==null||ot.textContent&&zt.textContent==null)&&v(ht,""),ye?qe(MA.dynamicChildren,ye,ht,pe,st,DK(YA,Te),be):yt||ai(MA,YA,ht,null,pe,st,DK(YA,Te),be,!1),ae>0){if(ae&16)Et(ht,ot,zt,pe,Te);else if(ae&2&&ot.class!==zt.class&&B(ht,"class",null,zt.class,Te),ae&4&&B(ht,"style",ot.style,zt.style,Te),ae&8){const Hi=YA.dynamicProps;for(let Ei=0;Ei{yi&&Su(yi,pe,YA,MA),Xe&&Om(YA,MA,pe,"updated")},st)},qe=(MA,YA,pe,st,Te,be,yt)=>{for(let ht=0;ht{if(YA!==pe){if(YA!==qn)for(const be in YA)!FG(be)&&!(be in pe)&&B(MA,be,YA[be],null,Te,st);for(const be in pe){if(FG(be))continue;const yt=pe[be],ht=YA[be];yt!==ht&&be!=="value"&&B(MA,be,ht,yt,Te,st)}"value"in pe&&B(MA,"value",YA.value,pe.value,Te)}},Je=(MA,YA,pe,st,Te,be,yt,ht,ae)=>{const ye=YA.el=MA?MA.el:f(""),Xe=YA.anchor=MA?MA.anchor:f("");let{patchFlag:ot,dynamicChildren:zt,slotScopeIds:yi}=YA;yi&&(ht=ht?ht.concat(yi):yi),MA==null?(s(ye,pe,st),s(Xe,pe,st),Ze(YA.children||[],pe,Xe,Te,be,yt,ht,ae)):ot>0&&ot&64&&zt&&MA.dynamicChildren?(qe(MA.dynamicChildren,zt,pe,Te,be,yt,ht),(YA.key!=null||Te&&YA===Te.subTree)&&E3(MA,YA,!0)):ai(MA,YA,pe,Xe,Te,be,yt,ht,ae)},$e=(MA,YA,pe,st,Te,be,yt,ht,ae)=>{YA.slotScopeIds=ht,MA==null?YA.shapeFlag&512?Te.ctx.activate(YA,pe,st,yt,ae):Dt(YA,pe,st,Te,be,yt,ae):Zi(MA,YA,ae)},Dt=(MA,YA,pe,st,Te,be,yt)=>{const ht=MA.component=FoA(MA,st,Te);if(BY(MA)&&(ht.ctx.renderer=Di),OoA(ht,!1,yt),ht.asyncDep){if(Te&&Te.registerDep(ht,bi,yt),!MA.el){const ae=ht.subTree=ze(yc);QA(null,ae,YA,pe)}}else bi(ht,MA,YA,pe,Te,be,yt)},Zi=(MA,YA,pe)=>{const st=YA.component=MA.component;if(voA(MA,YA,pe))if(st.asyncDep&&!st.asyncResolved){qt(st,YA,pe);return}else st.next=YA,st.update();else YA.el=MA.el,st.vnode=YA},bi=(MA,YA,pe,st,Te,be,yt)=>{const ht=()=>{if(MA.isMounted){let{next:ot,bu:zt,u:yi,parent:Hi,vnode:Ei}=MA;{const Nr=kZ(MA);if(Nr){ot&&(ot.el=Ei.el,qt(MA,ot,yt)),Nr.asyncDep.then(()=>{MA.isUnmounted||ht()});return}}let ji=ot,Xo;xm(MA,!1),ot?(ot.el=Ei.el,qt(MA,ot,yt)):ot=Ei,zt&&BK(zt),(Xo=ot.props&&ot.props.onVnodeBeforeUpdate)&&Su(Xo,Hi,ot,Ei),xm(MA,!0);const sr=Pz(MA),Lo=MA.subTree;MA.subTree=sr,eA(Lo,sr,U(Lo.el),Ni(Lo),MA,Te,be),ot.el=sr.el,ji===null&&NoA(MA,sr.el),yi&&fc(yi,Te),(Xo=ot.props&&ot.props.onVnodeUpdated)&&fc(()=>Su(Xo,Hi,ot,Ei),Te)}else{let ot;const{el:zt,props:yi}=YA,{bm:Hi,m:Ei,parent:ji,root:Xo,type:sr}=MA,Lo=dw(YA);xm(MA,!1),Hi&&BK(Hi),!Lo&&(ot=yi&&yi.onVnodeBeforeMount)&&Su(ot,ji,YA),xm(MA,!0);{Xo.ce&&Xo.ce._injectChildStyle(sr);const Nr=MA.subTree=Pz(MA);eA(null,Nr,pe,st,MA,Te,be),YA.el=Nr.el}if(Ei&&fc(Ei,Te),!Lo&&(ot=yi&&yi.onVnodeMounted)){const Nr=YA;fc(()=>Su(ot,ji,Nr),Te)}(YA.shapeFlag&256||ji&&dw(ji.vnode)&&ji.vnode.shapeFlag&256)&&MA.a&&fc(MA.a,Te),MA.isMounted=!0,YA=pe=st=null}};MA.scope.on();const ae=MA.effect=new P8(ht);MA.scope.off();const ye=MA.update=ae.run.bind(ae),Xe=MA.job=ae.runIfDirty.bind(ae);Xe.i=MA,Xe.id=MA.uid,ae.scheduler=()=>I3(Xe),xm(MA,!0),ye()},qt=(MA,YA,pe)=>{YA.component=MA;const st=MA.vnode.props;MA.vnode=YA,MA.next=null,loA(MA,YA.props,st,pe),QoA(MA,YA.children,pe),Mp(),Nz(MA),wp()},ai=(MA,YA,pe,st,Te,be,yt,ht,ae=!1)=>{const ye=MA&&MA.children,Xe=MA?MA.shapeFlag:0,ot=YA.children,{patchFlag:zt,shapeFlag:yi}=YA;if(zt>0){if(zt&128){Ur(ye,ot,pe,st,Te,be,yt,ht,ae);return}else if(zt&256){Ki(ye,ot,pe,st,Te,be,yt,ht,ae);return}}yi&8?(Xe&16&&lr(ye,Te,be),ot!==ye&&v(pe,ot)):Xe&16?yi&16?Ur(ye,ot,pe,st,Te,be,yt,ht,ae):lr(ye,Te,be,!0):(Xe&8&&v(pe,""),yi&16&&Ze(ot,pe,st,Te,be,yt,ht,ae))},Ki=(MA,YA,pe,st,Te,be,yt,ht,ae)=>{MA=MA||Cw,YA=YA||Cw;const ye=MA.length,Xe=YA.length,ot=Math.min(ye,Xe);let zt;for(zt=0;ztXe?lr(MA,Te,be,!0,!1,ot):Ze(YA,pe,st,Te,be,yt,ht,ae,ot)},Ur=(MA,YA,pe,st,Te,be,yt,ht,ae)=>{let ye=0;const Xe=YA.length;let ot=MA.length-1,zt=Xe-1;for(;ye<=ot&&ye<=zt;){const yi=MA[ye],Hi=YA[ye]=ae?gp(YA[ye]):Gu(YA[ye]);if(Km(yi,Hi))eA(yi,Hi,pe,null,Te,be,yt,ht,ae);else break;ye++}for(;ye<=ot&&ye<=zt;){const yi=MA[ot],Hi=YA[zt]=ae?gp(YA[zt]):Gu(YA[zt]);if(Km(yi,Hi))eA(yi,Hi,pe,null,Te,be,yt,ht,ae);else break;ot--,zt--}if(ye>ot){if(ye<=zt){const yi=zt+1,Hi=yizt)for(;ye<=ot;)no(MA[ye],Te,be,!0),ye++;else{const yi=ye,Hi=ye,Ei=new Map;for(ye=Hi;ye<=zt;ye++){const Kr=YA[ye]=ae?gp(YA[ye]):Gu(YA[ye]);Kr.key!=null&&Ei.set(Kr.key,ye)}let ji,Xo=0;const sr=zt-Hi+1;let Lo=!1,Nr=0;const Vo=new Array(sr);for(ye=0;ye=sr){no(Kr,Te,be,!0);continue}let Qn;if(Kr.key!=null)Qn=Ei.get(Kr.key);else for(ji=Hi;ji<=zt;ji++)if(Vo[ji-Hi]===0&&Km(Kr,YA[ji])){Qn=ji;break}Qn===void 0?no(Kr,Te,be,!0):(Vo[Qn-Hi]=ye+1,Qn>=Nr?Nr=Qn:Lo=!0,eA(Kr,YA[Qn],pe,null,Te,be,yt,ht,ae),Xo++)}const et=Lo?foA(Vo):Cw;for(ji=et.length-1,ye=sr-1;ye>=0;ye--){const Kr=Hi+ye,Qn=YA[Kr],ho=Kr+1{const{el:be,type:yt,transition:ht,children:ae,shapeFlag:ye}=MA;if(ye&6){Er(MA.component.subTree,YA,pe,st);return}if(ye&128){MA.suspense.move(YA,pe,st);return}if(ye&64){yt.move(MA,YA,pe,Di);return}if(yt===Tn){s(be,YA,pe);for(let ot=0;otht.enter(be),Te);else{const{leave:ot,delayLeave:zt,afterLeave:yi}=ht,Hi=()=>s(be,YA,pe),Ei=()=>{ot(be,()=>{Hi(),yi&&yi()})};zt?zt(be,Hi,Ei):Ei()}else s(be,YA,pe)},no=(MA,YA,pe,st=!1,Te=!1)=>{const{type:be,props:yt,ref:ht,children:ae,dynamicChildren:ye,shapeFlag:Xe,patchFlag:ot,dirs:zt,cacheIndex:yi}=MA;if(ot===-2&&(Te=!1),ht!=null&&b2(ht,null,pe,MA,!0),yi!=null&&(YA.renderCache[yi]=void 0),Xe&256){YA.ctx.deactivate(MA);return}const Hi=Xe&1&&zt,Ei=!dw(MA);let ji;if(Ei&&(ji=yt&&yt.onVnodeBeforeUnmount)&&Su(ji,YA,MA),Xe&6)yr(MA.component,pe,st);else{if(Xe&128){MA.suspense.unmount(pe,st);return}Hi&&Om(MA,null,YA,"beforeUnmount"),Xe&64?MA.type.remove(MA,YA,pe,Di,st):ye&&!ye.hasOnce&&(be!==Tn||ot>0&&ot&64)?lr(ye,YA,pe,!1,!0):(be===Tn&&ot&384||!Te&&Xe&16)&&lr(ae,YA,pe),st&&Kn(MA)}(Ei&&(ji=yt&&yt.onVnodeUnmounted)||Hi)&&fc(()=>{ji&&Su(ji,YA,MA),Hi&&Om(MA,null,YA,"unmounted")},pe)},Kn=MA=>{const{type:YA,el:pe,anchor:st,transition:Te}=MA;if(YA===Tn){Xi(pe,st);return}if(YA===yK){VA(MA);return}const be=()=>{g(pe),Te&&!Te.persisted&&Te.afterLeave&&Te.afterLeave()};if(MA.shapeFlag&1&&Te&&!Te.persisted){const{leave:yt,delayLeave:ht}=Te,ae=()=>yt(pe,be);ht?ht(MA.el,be,ae):ae()}else be()},Xi=(MA,YA)=>{let pe;for(;MA!==YA;)pe=AA(MA),g(MA),MA=pe;g(YA)},yr=(MA,YA,pe)=>{const{bum:st,scope:Te,job:be,subTree:yt,um:ht,m:ae,a:ye}=MA;Yz(ae),Yz(ye),st&&BK(st),Te.stop(),be&&(be.flags|=8,no(yt,MA,YA,pe)),ht&&fc(ht,YA),fc(()=>{MA.isUnmounted=!0},YA),YA&&YA.pendingBranch&&!YA.isUnmounted&&MA.asyncDep&&!MA.asyncResolved&&MA.suspenseId===YA.pendingId&&(YA.deps--,YA.deps===0&&YA.resolve())},lr=(MA,YA,pe,st=!1,Te=!1,be=0)=>{for(let yt=be;yt{if(MA.shapeFlag&6)return Ni(MA.component.subTree);if(MA.shapeFlag&128)return MA.suspense.next();const YA=AA(MA.anchor||MA.el),pe=YA&&YA[sZ];return pe?AA(pe):YA};let wt=!1;const Ji=(MA,YA,pe)=>{MA==null?YA._vnode&&no(YA._vnode,null,null,!0):eA(YA._vnode||null,MA,YA,null,null,null,pe),YA._vnode=MA,wt||(wt=!0,Nz(),nZ(),wt=!1)},Di={p:eA,um:no,m:Er,r:Kn,mt:Dt,mc:Ze,pc:ai,pbc:qe,n:Ni,o:t};return{render:Ji,hydrate:void 0,createApp:coA(Ji)}}function DK({type:t,props:i},r){return r==="svg"&&t==="foreignObject"||r==="mathml"&&t==="annotation-xml"&&i&&i.encoding&&i.encoding.includes("html")?void 0:r}function xm({effect:t,job:i},r){r?(t.flags|=32,i.flags|=4):(t.flags&=-33,i.flags&=-5)}function poA(t,i){return(!t||t&&!t.pendingBranch)&&i&&!i.persisted}function E3(t,i,r=!1){const s=t.children,g=i.children;if(Ro(s)&&Ro(g))for(let B=0;B>1,t[r[f]]0&&(i[s]=r[B-1]),r[B]=s)}}for(B=r.length,Q=r[B-1];B-- >0;)r[B]=Q,Q=i[Q];return r}function kZ(t){const i=t.subTree.component;if(i)return i.asyncDep&&!i.asyncResolved?i:kZ(i)}function Yz(t){if(t)for(let i=0;irI(moA);function Nw(t,i){return l3(t,null,i)}function Un(t,i,r){return l3(t,i,r)}function l3(t,i,r=qn){const{immediate:s,deep:g,flush:B,once:Q}=r,f=Sg({},r),m=i&&s||!i&&B!=="post";let M;if(ak){if(B==="sync"){const z=DoA();M=z.__watcherHandles||(z.__watcherHandles=[])}else if(!m){const z=()=>{};return z.stop=Lu,z.resume=Lu,z.pause=Lu,z}}const v=oI;f.call=(z,sA,eA)=>CB(z,v,sA,eA);let U=!1;B==="post"?f.scheduler=z=>{fc(z,v&&v.suspense)}:B!=="sync"&&(U=!0,f.scheduler=(z,sA)=>{sA?z():I3(z)}),f.augmentJob=z=>{i&&(z.flags|=4),U&&(z.flags|=2,v&&(z.id=v.uid,z.i=v))};const AA=biA(t,i,f);return ak&&(M?M.push(AA):m&&AA()),AA}function yoA(t,i,r){const s=this.proxy,g=va(t)?t.includes(".")?_Z(s,t):()=>s[t]:t.bind(s,s);let B;xo(i)?B=i:(B=i.handler,r=i);const Q=dk(this),f=l3(g,B.bind(s),r);return Q(),f}function _Z(t,i){const r=i.split(".");return()=>{let s=t;for(let g=0;gi==="modelValue"||i==="model-value"?t.modelModifiers:t[`${i}Modifiers`]||t[`${mC(i)}Modifiers`]||t[`${Rp(i)}Modifiers`];function MoA(t,i,...r){if(t.isUnmounted)return;const s=t.vnode.props||qn;let g=r;const B=i.startsWith("update:"),Q=B&&RoA(s,i.slice(7));Q&&(Q.trim&&(g=r.map(v=>va(v)?v.trim():v)),Q.number&&(g=r.map(WtA)));let f,m=s[f=CK(i)]||s[f=CK(mC(i))];!m&&B&&(m=s[f=CK(Rp(i))]),m&&CB(m,t,6,g);const M=s[f+"Once"];if(M){if(!t.emitted)t.emitted={};else if(t.emitted[f])return;t.emitted[f]=!0,CB(M,t,6,g)}}function bZ(t,i,r=!1){const s=i.emitsCache,g=s.get(t);if(g!==void 0)return g;const B=t.emits;let Q={},f=!1;if(!xo(t)){const m=M=>{const v=bZ(M,i,!0);v&&(f=!0,Sg(Q,v))};!r&&i.mixins.length&&i.mixins.forEach(m),t.extends&&m(t.extends),t.mixins&&t.mixins.forEach(m)}return!B&&!f?(ta(t)&&s.set(t,null),null):(Ro(B)?B.forEach(m=>Q[m]=null):Sg(Q,B),ta(t)&&s.set(t,Q),Q)}function QY(t,i){return!t||!nY(i)?!1:(i=i.slice(2).replace(/Once$/,""),yn(t,i[0].toLowerCase()+i.slice(1))||yn(t,Rp(i))||yn(t,i))}function Pz(t){const{type:i,vnode:r,proxy:s,withProxy:g,propsOptions:[B],slots:Q,attrs:f,emit:m,render:M,renderCache:v,props:U,data:AA,setupState:z,ctx:sA,inheritAttrs:eA}=t,X=_2(t);let QA,wA;try{if(r.shapeFlag&4){const VA=g||s,ue=VA;QA=Gu(M.call(ue,VA,v,U,z,AA,sA)),wA=f}else{const VA=i;QA=Gu(VA.length>1?VA(U,{attrs:f,slots:Q,emit:m}):VA(U,null)),wA=i.props?f:woA(f)}}catch(VA){PG.length=0,EY(VA,t,1),QA=ze(yc)}let HA=QA;if(wA&&eA!==!1){const VA=Object.keys(wA),{shapeFlag:ue}=HA;VA.length&&ue&7&&(B&&VA.some(A3)&&(wA=SoA(wA,B)),HA=hp(HA,wA,!1,!0))}return r.dirs&&(HA=hp(HA,null,!1,!0),HA.dirs=HA.dirs?HA.dirs.concat(r.dirs):r.dirs),r.transition&&ok(HA,r.transition),QA=HA,_2(X),QA}const woA=t=>{let i;for(const r in t)(r==="class"||r==="style"||nY(r))&&((i||(i={}))[r]=t[r]);return i},SoA=(t,i)=>{const r={};for(const s in t)(!A3(s)||!(s.slice(9)in i))&&(r[s]=t[s]);return r};function voA(t,i,r){const{props:s,children:g,component:B}=t,{props:Q,children:f,patchFlag:m}=i,M=B.emitsOptions;if(i.dirs||i.transition)return!0;if(r&&m>=0){if(m&1024)return!0;if(m&16)return s?Jz(s,Q,M):!!Q;if(m&8){const v=i.dynamicProps;for(let U=0;Ut.__isSuspense;function ToA(t,i){i&&i.pendingBranch?Ro(t)?i.effects.push(...t):i.effects.push(t):UiA(t)}const Tn=Symbol.for("v-fgt"),dY=Symbol.for("v-txt"),yc=Symbol.for("v-cmt"),yK=Symbol.for("v-stc"),PG=[];let Cl=null;function qA(t=!1){PG.push(Cl=t?null:[])}function GoA(){PG.pop(),Cl=PG[PG.length-1]||null}let rk=1;function Hz(t,i=!1){rk+=t,t<0&&Cl&&i&&(Cl.hasOnce=!0)}function FZ(t){return t.dynamicChildren=rk>0?Cl||Cw:null,GoA(),rk>0&&Cl&&Cl.push(t),t}function Ue(t,i,r,s,g,B){return FZ(ce(t,i,r,s,g,B,!0))}function _t(t,i,r,s,g){return FZ(ze(t,i,r,s,g,!0))}function nk(t){return t?t.__v_isVNode===!0:!1}function Km(t,i){return t.type===i.type&&t.key===i.key}const UZ=({key:t})=>t??null,u2=({ref:t,ref_key:i,ref_for:r})=>(typeof t=="number"&&(t=""+t),t!=null?va(t)||wg(t)||xo(t)?{i:Mg,r:t,k:i,f:!!r}:t:null);function ce(t,i=null,r=null,s=0,g=null,B=t===Tn?0:1,Q=!1,f=!1){const m={__v_isVNode:!0,__v_skip:!0,type:t,props:i,key:i&&UZ(i),ref:i&&u2(i),scopeId:CY,slotScopeIds:null,children:r,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:B,patchFlag:s,dynamicProps:g,dynamicChildren:null,appContext:null,ctx:Mg};return f?(C3(m,r),B&128&&t.normalize(m)):r&&(m.shapeFlag|=va(r)?8:16),rk>0&&!Q&&Cl&&(m.patchFlag>0||B&6)&&m.patchFlag!==32&&Cl.push(m),m}const ze=koA;function koA(t,i=null,r=null,s=0,g=null,B=!1){if((!t||t===toA)&&(t=yc),nk(t)){const f=hp(t,i,!0);return r&&C3(f,r),rk>0&&!B&&Cl&&(f.shapeFlag&6?Cl[Cl.indexOf(t)]=f:Cl.push(f)),f.patchFlag=-2,f}if(HoA(t)&&(t=t.__vccOpts),i){i=_oA(i);let{class:f,style:m}=i;f&&!va(f)&&(i.class=Qi(f)),ta(m)&&(g3(m)&&!Ro(m)&&(m=Sg({},m)),i.style=zr(m))}const Q=va(t)?1:LZ(t)?128:gZ(t)?64:ta(t)?4:xo(t)?2:0;return ce(t,i,r,s,g,Q,B,!0)}function _oA(t){return t?g3(t)||MZ(t)?Sg({},t):t:null}function hp(t,i,r=!1,s=!1){const{props:g,ref:B,patchFlag:Q,children:f,transition:m}=t,M=i?dj(g||{},i):g,v={__v_isVNode:!0,__v_skip:!0,type:t.type,props:M,key:M&&UZ(M),ref:i&&i.ref?r&&B?Ro(B)?B.concat(u2(i)):[B,u2(i)]:u2(i):B,scopeId:t.scopeId,slotScopeIds:t.slotScopeIds,children:f,target:t.target,targetStart:t.targetStart,targetAnchor:t.targetAnchor,staticCount:t.staticCount,shapeFlag:t.shapeFlag,patchFlag:i&&t.type!==Tn?Q===-1?16:Q|16:Q,dynamicProps:t.dynamicProps,dynamicChildren:t.dynamicChildren,appContext:t.appContext,dirs:t.dirs,transition:m,component:t.component,suspense:t.suspense,ssContent:t.ssContent&&hp(t.ssContent),ssFallback:t.ssFallback&&hp(t.ssFallback),el:t.el,anchor:t.anchor,ctx:t.ctx,ce:t.ce};return m&&s&&ok(v,m.clone(v)),v}function Na(t=" ",i=0){return ze(dY,null,t,i)}function Tt(t="",i=!1){return i?(qA(),_t(yc,null,t)):ze(yc,null,t)}function Gu(t){return t==null||typeof t=="boolean"?ze(yc):Ro(t)?ze(Tn,null,t.slice()):nk(t)?gp(t):ze(dY,null,String(t))}function gp(t){return t.el===null&&t.patchFlag!==-1||t.memo?t:hp(t)}function C3(t,i){let r=0;const{shapeFlag:s}=t;if(i==null)i=null;else if(Ro(i))r=16;else if(typeof i=="object")if(s&65){const g=i.default;g&&(g._c&&(g._d=!1),C3(t,g()),g._c&&(g._d=!0));return}else{r=32;const g=i._;!g&&!MZ(i)?i._ctx=Mg:g===3&&Mg&&(Mg.slots._===1?i._=1:(i._=2,t.patchFlag|=1024))}else xo(i)?(i={default:i,_ctx:Mg},r=32):(i=String(i),s&64?(r=16,i=[Na(i)]):r=8);t.children=i,t.shapeFlag|=r}function dj(...t){const i={};for(let r=0;roI||Mg;let F2,hj;{const t=IY(),i=(r,s)=>{let g;return(g=t[r])||(g=t[r]=[]),g.push(s),B=>{g.length>1?g.forEach(Q=>Q(B)):g[0](B)}};F2=i("__VUE_INSTANCE_SETTERS__",r=>oI=r),hj=i("__VUE_SSR_SETTERS__",r=>ak=r)}const dk=t=>{const i=oI;return F2(t),t.scope.on(),()=>{t.scope.off(),F2(i)}},Vz=()=>{oI&&oI.scope.off(),F2(null)};function OZ(t){return t.vnode.shapeFlag&4}let ak=!1;function OoA(t,i=!1,r=!1){i&&hj(i);const{props:s,children:g}=t.vnode,B=OZ(t);EoA(t,s,B,i),uoA(t,g,r);const Q=B?xoA(t,i):void 0;return i&&hj(!1),Q}function xoA(t,i){const r=t.type;t.accessCache=Object.create(null),t.proxy=new Proxy(t.ctx,ooA);const{setup:s}=r;if(s){Mp();const g=t.setupContext=s.length>1?PoA(t):null,B=dk(t),Q=Qk(s,t,0,[t.props,g]),f=b8(Q);if(wp(),B(),(f||t.sp)&&!dw(t)&&QZ(t),f){if(Q.then(Vz,Vz),i)return Q.then(m=>{qz(t,m)}).catch(m=>{EY(m,t,0)});t.asyncDep=Q}else qz(t,Q)}else xZ(t)}function qz(t,i,r){xo(i)?t.type.__ssrInlineRender?t.ssrRender=i:t.render=i:ta(i)&&(t.setupState=tZ(i)),xZ(t)}function xZ(t,i,r){const s=t.type;t.render||(t.render=s.render||Lu);{const g=dk(t);Mp();try{roA(t)}finally{wp(),g()}}}const YoA={get(t,i){return GI(t,"get",""),t[i]}};function PoA(t){const i=r=>{t.exposed=r||{}};return{attrs:new Proxy(t.attrs,YoA),slots:t.slots,emit:t.emit,expose:i}}function hY(t){return t.exposed?t.exposeProxy||(t.exposeProxy=new Proxy(tZ(MiA(t.exposed)),{get(i,r){if(r in i)return i[r];if(r in YG)return YG[r](t)},has(i,r){return r in i||r in YG}})):t.proxy}function JoA(t,i=!0){return xo(t)?t.displayName||t.name:t.name||i&&t.__name}function HoA(t){return xo(t)&&"__vccOpts"in t}const rt=(t,i)=>kiA(t,i,ak);function VoA(t,i,r){const s=arguments.length;return s===2?ta(i)&&!Ro(i)?nk(i)?ze(t,null,[i]):ze(t,i):ze(t,null,i):(s>3?r=Array.prototype.slice.call(arguments,2):s===3&&nk(r)&&(r=[r]),ze(t,i,r))}const pj="3.5.13";/** +* @vue/runtime-dom v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let fj;const Kz=typeof window<"u"&&window.trustedTypes;if(Kz)try{fj=Kz.createPolicy("vue",{createHTML:t=>t})}catch{}const YZ=fj?t=>fj.createHTML(t):t=>t,qoA="http://www.w3.org/2000/svg",KoA="http://www.w3.org/1998/Math/MathML",ed=typeof document<"u"?document:null,jz=ed&&ed.createElement("template"),joA={insert:(t,i,r)=>{i.insertBefore(t,r||null)},remove:t=>{const i=t.parentNode;i&&i.removeChild(t)},createElement:(t,i,r,s)=>{const g=i==="svg"?ed.createElementNS(qoA,t):i==="mathml"?ed.createElementNS(KoA,t):r?ed.createElement(t,{is:r}):ed.createElement(t);return t==="select"&&s&&s.multiple!=null&&g.setAttribute("multiple",s.multiple),g},createText:t=>ed.createTextNode(t),createComment:t=>ed.createComment(t),setText:(t,i)=>{t.nodeValue=i},setElementText:(t,i)=>{t.textContent=i},parentNode:t=>t.parentNode,nextSibling:t=>t.nextSibling,querySelector:t=>ed.querySelector(t),setScopeId(t,i){t.setAttribute(i,"")},insertStaticContent(t,i,r,s,g,B){const Q=r?r.previousSibling:i.lastChild;if(g&&(g===B||g.nextSibling))for(;i.insertBefore(g.cloneNode(!0),r),!(g===B||!(g=g.nextSibling)););else{jz.innerHTML=YZ(s==="svg"?`${t}`:s==="mathml"?`${t}`:t);const f=jz.content;if(s==="svg"||s==="mathml"){const m=f.firstChild;for(;m.firstChild;)f.appendChild(m.firstChild);f.removeChild(m)}i.insertBefore(f,r)}return[Q?Q.nextSibling:i.firstChild,r?r.previousSibling:i.lastChild]}},tp="transition",EG="animation",sk=Symbol("_vtc"),PZ={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},WoA=Sg({},EZ,PZ),zoA=t=>(t.displayName="Transition",t.props=WoA,t),ZoA=zoA((t,{slots:i})=>VoA(JiA,XoA(t),i)),Ym=(t,i=[])=>{Ro(t)?t.forEach(r=>r(...i)):t&&t(...i)},Wz=t=>t?Ro(t)?t.some(i=>i.length>1):t.length>1:!1;function XoA(t){const i={};for(const Je in t)Je in PZ||(i[Je]=t[Je]);if(t.css===!1)return i;const{name:r="v",type:s,duration:g,enterFromClass:B=`${r}-enter-from`,enterActiveClass:Q=`${r}-enter-active`,enterToClass:f=`${r}-enter-to`,appearFromClass:m=B,appearActiveClass:M=Q,appearToClass:v=f,leaveFromClass:U=`${r}-leave-from`,leaveActiveClass:AA=`${r}-leave-active`,leaveToClass:z=`${r}-leave-to`}=t,sA=$oA(g),eA=sA&&sA[0],X=sA&&sA[1],{onBeforeEnter:QA,onEnter:wA,onEnterCancelled:HA,onLeave:VA,onLeaveCancelled:ue,onBeforeAppear:jA=QA,onAppear:Ve=wA,onAppearCancelled:Ze=HA}=i,Me=(Je,$e,Dt,Zi)=>{Je._enterCancelled=Zi,Pm(Je,$e?v:f),Pm(Je,$e?M:Q),Dt&&Dt()},qe=(Je,$e)=>{Je._isLeaving=!1,Pm(Je,U),Pm(Je,z),Pm(Je,AA),$e&&$e()},Et=Je=>($e,Dt)=>{const Zi=Je?Ve:wA,bi=()=>Me($e,Je,Dt);Ym(Zi,[$e,bi]),zz(()=>{Pm($e,Je?m:B),ZQ($e,Je?v:f),Wz(Zi)||Zz($e,s,eA,bi)})};return Sg(i,{onBeforeEnter(Je){Ym(QA,[Je]),ZQ(Je,B),ZQ(Je,Q)},onBeforeAppear(Je){Ym(jA,[Je]),ZQ(Je,m),ZQ(Je,M)},onEnter:Et(!1),onAppear:Et(!0),onLeave(Je,$e){Je._isLeaving=!0;const Dt=()=>qe(Je,$e);ZQ(Je,U),Je._enterCancelled?(ZQ(Je,AA),A5()):(A5(),ZQ(Je,AA)),zz(()=>{Je._isLeaving&&(Pm(Je,U),ZQ(Je,z),Wz(VA)||Zz(Je,s,X,Dt))}),Ym(VA,[Je,Dt])},onEnterCancelled(Je){Me(Je,!1,void 0,!0),Ym(HA,[Je])},onAppearCancelled(Je){Me(Je,!0,void 0,!0),Ym(Ze,[Je])},onLeaveCancelled(Je){qe(Je),Ym(ue,[Je])}})}function $oA(t){if(t==null)return null;if(ta(t))return[RK(t.enter),RK(t.leave)];{const i=RK(t);return[i,i]}}function RK(t){return ztA(t)}function ZQ(t,i){i.split(/\s+/).forEach(r=>r&&t.classList.add(r)),(t[sk]||(t[sk]=new Set)).add(i)}function Pm(t,i){i.split(/\s+/).forEach(s=>s&&t.classList.remove(s));const r=t[sk];r&&(r.delete(i),r.size||(t[sk]=void 0))}function zz(t){requestAnimationFrame(()=>{requestAnimationFrame(t)})}let ArA=0;function Zz(t,i,r,s){const g=t._endId=++ArA,B=()=>{g===t._endId&&s()};if(r!=null)return setTimeout(B,r);const{type:Q,timeout:f,propCount:m}=erA(t,i);if(!Q)return s();const M=Q+"end";let v=0;const U=()=>{t.removeEventListener(M,AA),B()},AA=z=>{z.target===t&&++v>=m&&U()};setTimeout(()=>{v(r[sA]||"").split(", "),g=s(`${tp}Delay`),B=s(`${tp}Duration`),Q=Xz(g,B),f=s(`${EG}Delay`),m=s(`${EG}Duration`),M=Xz(f,m);let v=null,U=0,AA=0;i===tp?Q>0&&(v=tp,U=Q,AA=B.length):i===EG?M>0&&(v=EG,U=M,AA=m.length):(U=Math.max(Q,M),v=U>0?Q>M?tp:EG:null,AA=v?v===tp?B.length:m.length:0);const z=v===tp&&/\b(transform|all)(,|$)/.test(s(`${tp}Property`).toString());return{type:v,timeout:U,propCount:AA,hasTransform:z}}function Xz(t,i){for(;t.length$z(r)+$z(t[s])))}function $z(t){return t==="auto"?0:Number(t.slice(0,-1).replace(",","."))*1e3}function A5(){return document.body.offsetHeight}function trA(t,i,r){const s=t[sk];s&&(i=(i?[i,...s]:[...s]).join(" ")),i==null?t.removeAttribute("class"):r?t.setAttribute("class",i):t.className=i}const U2=Symbol("_vod"),JZ=Symbol("_vsh"),sa={beforeMount(t,{value:i},{transition:r}){t[U2]=t.style.display==="none"?"":t.style.display,r&&i?r.beforeEnter(t):lG(t,i)},mounted(t,{value:i},{transition:r}){r&&i&&r.enter(t)},updated(t,{value:i,oldValue:r},{transition:s}){!i!=!r&&(s?i?(s.beforeEnter(t),lG(t,!0),s.enter(t)):s.leave(t,()=>{lG(t,!1)}):lG(t,i))},beforeUnmount(t,{value:i}){lG(t,i)}};function lG(t,i){t.style.display=i?t[U2]:"none",t[JZ]=!i}const irA=Symbol(""),orA=/(^|;)\s*display\s*:/;function rrA(t,i,r){const s=t.style,g=va(r);let B=!1;if(r&&!g){if(i)if(va(i))for(const Q of i.split(";")){const f=Q.slice(0,Q.indexOf(":")).trim();r[f]==null&&Q2(s,f,"")}else for(const Q in i)r[Q]==null&&Q2(s,Q,"");for(const Q in r)Q==="display"&&(B=!0),Q2(s,Q,r[Q])}else if(g){if(i!==r){const Q=s[irA];Q&&(r+=";"+Q),s.cssText=r,B=orA.test(r)}}else i&&t.removeAttribute("style");U2 in t&&(t[U2]=B?s.display:"",t[JZ]&&(s.display="none"))}const e5=/\s*!important$/;function Q2(t,i,r){if(Ro(r))r.forEach(s=>Q2(t,i,s));else if(r==null&&(r=""),i.startsWith("--"))t.setProperty(i,r);else{const s=nrA(t,i);e5.test(r)?t.setProperty(Rp(s),r.replace(e5,""),"important"):t[s]=r}}const t5=["Webkit","Moz","ms"],MK={};function nrA(t,i){const r=MK[i];if(r)return r;let s=mC(i);if(s!=="filter"&&s in t)return MK[i]=s;s=gY(s);for(let g=0;gwK||(crA.then(()=>wK=0),wK=Date.now());function lrA(t,i){const r=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=r.attached)return;CB(CrA(s,r.value),i,5,[s])};return r.value=t,r.attached=ErA(),r}function CrA(t,i){if(Ro(i)){const r=t.stopImmediatePropagation;return t.stopImmediatePropagation=()=>{r.call(t),t._stopped=!0},i.map(s=>g=>!g._stopped&&s&&s(g))}else return i}const s5=t=>t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&t.charCodeAt(2)>96&&t.charCodeAt(2)<123,BrA=(t,i,r,s,g,B)=>{const Q=g==="svg";i==="class"?trA(t,s,Q):i==="style"?rrA(t,r,s):nY(i)?A3(i)||grA(t,i,r,s,B):(i[0]==="."?(i=i.slice(1),!0):i[0]==="^"?(i=i.slice(1),!1):urA(t,i,s,Q))?(r5(t,i,s),!t.tagName.includes("-")&&(i==="value"||i==="checked"||i==="selected")&&o5(t,i,s,Q,B,i!=="value")):t._isVueCE&&(/[A-Z]/.test(i)||!va(s))?r5(t,mC(i),s,B,i):(i==="true-value"?t._trueValue=s:i==="false-value"&&(t._falseValue=s),o5(t,i,s,Q))};function urA(t,i,r,s){if(s)return!!(i==="innerHTML"||i==="textContent"||i in t&&s5(i)&&xo(r));if(i==="spellcheck"||i==="draggable"||i==="translate"||i==="form"||i==="list"&&t.tagName==="INPUT"||i==="type"&&t.tagName==="TEXTAREA")return!1;if(i==="width"||i==="height"){const g=t.tagName;if(g==="IMG"||g==="VIDEO"||g==="CANVAS"||g==="SOURCE")return!1}return s5(i)&&va(r)?!1:i in t}const QrA=["ctrl","shift","alt","meta"],drA={stop:t=>t.stopPropagation(),prevent:t=>t.preventDefault(),self:t=>t.target!==t.currentTarget,ctrl:t=>!t.ctrlKey,shift:t=>!t.shiftKey,alt:t=>!t.altKey,meta:t=>!t.metaKey,left:t=>"button"in t&&t.button!==0,middle:t=>"button"in t&&t.button!==1,right:t=>"button"in t&&t.button!==2,exact:(t,i)=>QrA.some(r=>t[`${r}Key`]&&!i.includes(r))},ul=(t,i)=>{const r=t._withMods||(t._withMods={}),s=i.join(".");return r[s]||(r[s]=(g,...B)=>{for(let Q=0;Q{const r=t._withKeys||(t._withKeys={}),s=i.join(".");return r[s]||(r[s]=g=>{if(!("key"in g))return;const B=Rp(g.key);if(i.some(Q=>Q===B||hrA[Q]===B))return t(g)})},frA=Sg({patchProp:BrA},joA);let g5;function HZ(){return g5||(g5=doA(frA))}const iD=(...t)=>{HZ().render(...t)},mrA=(...t)=>{const i=HZ().createApp(...t),{mount:r}=i;return i.mount=s=>{const g=yrA(s);if(!g)return;const B=i._component;!xo(B)&&!B.render&&!B.template&&(B.template=g.innerHTML),g.nodeType===1&&(g.textContent="");const Q=r(g,!1,DrA(g));return g instanceof Element&&(g.removeAttribute("v-cloak"),g.setAttribute("data-v-app","")),Q},i};function DrA(t){if(t instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&t instanceof MathMLElement)return"mathml"}function yrA(t){return va(t)?document.querySelector(t):t}var bI=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function RrA(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}function hk(t){if(t.__esModule)return t;var i=t.default;if(typeof i=="function"){var r=function s(){return this instanceof s?Reflect.construct(i,arguments,this.constructor):i.apply(this,arguments)};r.prototype=i.prototype}else r={};return Object.defineProperty(r,"__esModule",{value:!0}),Object.keys(t).forEach(function(s){var g=Object.getOwnPropertyDescriptor(t,s);Object.defineProperty(r,s,g.get?g:{enumerable:!0,get:function(){return t[s]}})}),r}function MrA(t){throw new Error('Could not dynamically require "'+t+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var pG={exports:{}},d2={exports:{}},wrA=d2.exports,I5;function VZ(){return I5||(I5=1,function(t,i){(function(r,s){t.exports=s()})(wrA,function(){const r=C=>C===void 0,s=C=>typeof C=="string",g=C=>{var E;return(E=Object.prototype.toString.call(C).match(/^\[object (.*)\]$/))===null||E===void 0?void 0:E[1].toLowerCase()},B=C=>typeof Array.isArray=="function"?Array.isArray(C):g(C)==="array",Q=C=>C!==null&&typeof C=="object",f=C=>B(C)||Q(C),m=C=>{if(typeof C!="string")return!1;const E=C[0];return!/[^a-zA-Z0-9]/.test(E)},M=C=>{if(typeof C!="object"||C===null)return!1;const E=Object.getPrototypeOf(C);if(E===null)return!0;let h=E;for(;Object.getPrototypeOf(h)!==null;)h=Object.getPrototypeOf(h);return E===h};function v(C=99999999){return Math.round(Math.random()*C)}const U=(C,E,h,D)=>{if(!f(C)||!f(E))return 0;let N=0;const O=Object.keys(E);let Y;for(let j=0,IA=O.length;j"u"&&typeof uni.requireNativePlugin=="function",Er=Je&&typeof wx.miniapp=="object",no=typeof uni<"u",Kn=Zi&&typeof tt.enterChat=="function",Xi=Je||Dt||Zi||qt||ai||Ur||Ki,yr=typeof window>"u"&&!Xi&&typeof bI<"u"&&bI.NativeScriptGlobals!==void 0,lr=typeof bI<"u"&&(bI.nativeModuleProxy!==void 0||bI.ReactNative!==void 0),Ni=typeof wx<"u"&&typeof wx.getAccountInfoSync=="function"&&!!wx.getAccountInfoSync().plugin,wt=typeof uni<"u"?!Xi:typeof window<"u"&&!Xi&&!lr,Ji=Dt?qq:Zi?tt:qt?swan:ai?my:Je?wx:Ur?uni:Ki?jd:{},Di=wt&&window&&window.navigator&&window.navigator.userAgent||"",ar=/(micromessenger|webbrowser)/i.test(Di),MA=function(){let C="WEB";return ar?C="WEB":Dt?C="QQ_MP":Zi?C="TT_MP":qt?C="BAIDU_MP":ai?C="ALI_MP":Je?C=Er?"DONUT_NATIVE_APP":"WX_MP":Ur?C="UNI_NATIVE_APP":yr?C="NS_NATIVE_APP":lr&&(C="RN_NATIVE_APP"),z[C]}(),YA=/iPad/i.test(Di),pe=/iPhone/i.test(Di)&&!YA,st=/iPod/i.test(Di),Te=pe||YA||st,be=function(){const C=Di.match(/OS (\d+)_/i);return C&&C[1]?C[1]:null}(),yt=/Android/i.test(Di),ht=function(){const C=Di.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i);if(!C)return null;const E=C[1]&&parseFloat(C[1]),h=C[2]&&parseFloat(C[2]);return E&&h?parseFloat(`${C[1]}.${C[2]}`):E||null}(),ae=/Firefox/i.test(Di),ye=/Edge/i.test(Di),Xe=!ye&&/Chrome/i.test(Di),ot=/MSIE/.test(Di)||Di.indexOf("Trident")>-1&&Di.indexOf("rv:11.0")>-1,zt=function(){const C=/MSIE\s(\d+)\.\d/.exec(Di);let E=C&&parseFloat(C[1]);return!E&&/Trident\/7.0/i.test(Di)&&/rv:11.0/.test(Di)&&(E=11),E}(),yi=/Safari/i.test(Di)&&!Xe&&!yt&&!ye,Hi=/Windows/i.test(Di),Ei=/MAC OS X/i.test(Di),ji=wt&&typeof Worker<"u"&&!ot,Xo=yt||Te,sr=function(){if(typeof window>"u"||window.navigator===void 0)return!1;const{standalone:C}=window.navigator;return!(!Te||C||yi)}();function Lo(){let C="unknown";if(Ei&&(C="mac"),Hi&&(C="windows"),Te&&(C="ios"),yt&&(C="android"),Xi)try{const{platform:E}=Ji.getSystemInfoSync();E!==void 0&&(C=E)}catch(E){console.error(E)}return C}const Nr=typeof process<"u"&&process.versions!==void 0&&process.versions.node!==void 0&&typeof window>"u";function Vo(C,E){var h={};for(var D in C)Object.prototype.hasOwnProperty.call(C,D)&&E.indexOf(D)<0&&(h[D]=C[D]);if(C!=null&&typeof Object.getOwnPropertySymbols=="function"){var N=0;for(D=Object.getOwnPropertySymbols(C);N{Ji.request({url:h,data:D,method:E,timeout:N,header:{"content-type":jn},success:j=>O(j.data),fail:()=>Y(new Error(`{"message":"Network error","code":${Kr}}`))})}):Nr?void 0:new Promise((O,Y)=>{const j=new XMLHttpRequest,IA=setTimeout(()=>{j.abort(),Y(new Error(`{"message":"Request timeout","code":${Qn}}`))},N);j.onreadystatechange=function(){if(j.readyState===4)if(clearTimeout(IA),j.status===200||j.status===304)try{O(j.responseText?JSON.parse(j.responseText):null)}catch{O(j.responseText)}else Y(new Error(`{"message":"Network error","code":${Kr}}`))},j.open(E,h,!0),j.setRequestHeader("Content-type",jn),j.send(D||null)})})}function $r(C){if(C==null)return!0;if(typeof C=="boolean")return!1;if(typeof C=="number")return C===0;if(typeof C=="string"||typeof C=="function"||Array.isArray(C))return C.length===0;if(C instanceof Error)return C.message==="";if(M(C)){for(const E in C)if(Object.prototype.hasOwnProperty.call(C,E))return!1;return!0}return(Object.prototype.toString.call(C)==="[object Map]"||Object.prototype.toString.call(C)==="[object Set]"||Object.prototype.toString.call(C)==="[object File]")&&C.size===0}function On(C,E){if(C===null||typeof C!="object")return C;const h=E||new WeakMap;if(h.has(C))return h.get(C);if(C instanceof Date)return new Date(C.getTime());if(C instanceof RegExp)return new RegExp(C.source,C.flags);if(C instanceof Map){const O=new Map;return h.set(C,O),C.forEach((Y,j)=>{O.set(On(j,h),On(Y,h))}),O}if(C instanceof Set){const O=new Set;return h.set(C,O),C.forEach(Y=>{O.add(On(Y,h))}),O}if(Array.isArray(C)){const O=[];return h.set(C,O),C.forEach(Y=>{O.push(On(Y,h))}),O}const D=Object.getPrototypeOf(C),N=Object.create(D);return h.set(C,N),[...Object.getOwnPropertyNames(C),...Object.getOwnPropertySymbols(C)].forEach(O=>{if(O==="__ob__"||O==="__v_skip"||O==="__v_isRef"||O==="__v_isReadonly")return;const Y=Object.getOwnPropertyDescriptor(C,O);Y&&(Y.get||Y.set?Object.defineProperty(N,O,Y):N[O]=On(C[O],h))}),N}function An(C,E,h){const D=new WeakSet,N=(O,Y)=>{if(E&&(Y=E(O,Y)),Y===void 0)return"undefined";if(Y===null)return null;if(Number.isNaN(Y))return"NaN";if(Y===1/0)return"Infinity";if(Y===-1/0)return"-Infinity";if(typeof Y=="function")return`[Function: ${Y.name||"anonymous"}]`;if(typeof Y=="symbol")return Y.toString();if(typeof Y=="bigint")return`${Y.toString()}n`;if(typeof Y=="object"&&Y!==null){if(D.has(Y))return"[Circular]";D.add(Y)}return Y instanceof Date?Y.toISOString():Y instanceof Error?{name:Y.name,message:Y.message}:Y instanceof Map?{dataType:"Map",value:Array.from(Y.entries())}:Y instanceof Set?{dataType:"Set",value:Array.from(Y.values())}:Y};try{return JSON.stringify(C,N,h)}catch(O){return console.error("Failed to stringify:",O),""}}function Tr(){let C,E;return{promise:new Promise((h,D)=>{C=h,E=D}),resolve:C,reject:E}}var ei,Es=Object.freeze({__proto__:null,ANDROID_VERSION:ht,IE_VERSION:zt,IN_ALIPAY_MINI_APP:ai,IN_BAIDU_MINI_APP:qt,IN_BROWSER:wt,IN_DONUT_NATIVE_APP:Er,IN_FEISHU_MINI_APP:Kn,IN_JD_MINI_APP:Ki,IN_MINI_APP:Xi,IN_NODE:Nr,IN_NS_NATIVE_APP:yr,IN_QQ_MINI_APP:Dt,IN_RN_APP:lr,IN_TT_MINI_APP:Zi,IN_TT_MINI_GAME:bi,IN_UNI_APP:no,IN_UNI_NATIVE_APP:Ur,IN_WX_MINI_APP:Je,IN_WX_MINI_APP_DESK:Et,IN_WX_MINI_GAME:$e,IN_WX_MINI_PLUGIN:Ni,IOS_VERSION:be,IS_ANDROID:yt,IS_CHROME:Xe,IS_EDGE:ye,IS_FIREFOX:ae,IS_IE:ot,IS_IOS:Te,IS_IPAD:YA,IS_IPHONE:pe,IS_IPOD:st,IS_MAC:Ei,IS_SAFARI:yi,IS_WECHAT:ar,IS_WIN:Hi,IS_WORKER_AVAILABLE:ji,MINI_APP_NAMESPACE:Ji,USER_AGENT:Di,base16EncodeBinaryString:AA,deepCopyWithMethods:On,deepMerge:U,generatePromise:Tr,getPlatformType:Lo,getType:g,httpRequest:$t,isArray:B,isArrayOrObject:f,isEmpty:$r,isH5:Xo,isIOSWebView:sr,isNumber:C=>C!==null&&(typeof C=="number"&&!Number.isNaN(C-0)||typeof C=="object"&&C.constructor===Number),isObject:Q,isPlainObject:M,isString:s,isUndefined:r,isUniIOSApp:function(){return Ur&&uni.getDeviceInfo().platform.toLocaleLowerCase()==="ios"},isValidRequestKey:m,platform:MA,randomInt:v,randomString:function(){const C="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";let E="";for(let h=32;h>0;--h)E+=C[Math.floor(62*Math.random())];return E},safeStringify:An});class jr{constructor(){this.listeners={}}on(E,h,D){this.listeners[E]||(this.listeners[E]=[]),this.listeners[E].push({fn:h,context:D})}off(E,h,D){var N;h&&(this.listeners[E]=(N=this.listeners[E])===null||N===void 0?void 0:N.filter(O=>{const Y=O.fn===h,j=!D||O.context===D;return!(Y&&j)}))}emit(E,...h){const D=this.listeners[E];D&&D.forEach(N=>{const{fn:O,context:Y}=N;try{O.apply(Y,h)}catch(j){console.warn(`Error in event handler for ${E} error: ${An(j)}`)}})}once(E,h,D){const N=(...O)=>{h.apply(D,O),this.off(E,N)};this.on(E,N)}}(function(C){C.BUSINESS_COMMAND="business_command",C.C2C_REALTIME_MESSAGE="c2c_realtime_message",C.C2C_MESSAGE_MODIFIED="c2c_message_modified",C.C2C_REVOKED_MESSAGE="c2c_message_revoked",C.GROUP_REALTIME_MESSAGE="group_realtime_message",C.GROUP_MESSAGE_MODIFIED="group_message_modified",C.GROUP_MESSAGE_REVOKED="group_message_revoked",C.C2C_MESSAGE_READ_RECEIPT="c2c_message_read_receipt",C.MESSAGE_REACTION_UPDATED="message_reaction_updated",C.MESSAGE_REACTION_UPDATED_SYNC="message_reaction_updated_sync",C.GROUP_AT_TIPS="group_at_tips",C.USER_STATUS_UPDATE="user_status_update",C.FRIEND_LIST_MODIFIED="friend_list_modified",C.PROFILE_MODIFIED="profile_modified",C.CONV_MODIFIED="conversation_modified",C.GROUP_TIPS_NOTIFICATION="group_tips_notification",C.GROUP_MESSAGE_READ_RECEIPT="group_message_read_receipt",C.GROUP_MESSAGE_READ_SYNC="group_message_read_sync",C.GROUP_SYSTEM_NOTIFICATION="group_system_notification",C.C2C_MESSAGE_PEER_READ="c2c_message_peer_read",C.C2C_MESSAGE_READ_SYNC="c2c_message_read_sync",C.C2C_REMIND_TYPE_SYNC="c2c_remind_type_sync",C.FOLLOW_LIST_UPDATED="follow_list_updated",C.MESSAGE_EXTENSIONS_UPDATED="message_extensions_updated",C.ALL_MESSAGE_READ="all_message_read",C.CONVERSATION_MARK_UPDATED="conversation_mark_updated",C.CONVERSATION_GROUP_ADD="conversation_group_add",C.CONVERSATION_GROUP_DELETED="conversation_group_deleted",C.CONVERSATION_GROUP_UPDATED="conversation_group_updated",C.ALL_RECEIVE_MESSAGE_OPTION="all_receive_message_option",C.TOPIC_AT_TIPS="topic_at_tips",C.TOPIC_TIPS_NOTIFICATION="topic_tips_notification",C.TOPIC_SYSTEM_NOTIFICATION="topic_system_notification",C.TOPIC_MESSAGE_READ_SYNC="topic_message_read_sync",C.TOPIC_LATEST_MESSAGE="topic_latest_message",C.GROUP_MESSAGE_PINNED="group_message_pinned"})(ei||(ei={}));const Gr=[16,17];function $o(C){var E;const h=[];return(E=C?.GroupTips)===null||E===void 0||E.forEach(D=>{var N;D.GroupInfo.MillionGroupFlag===2?h.push(ei.TOPIC_TIPS_NOTIFICATION):Gr.includes((N=D?.MsgBody)===null||N===void 0?void 0:N.OpType)?h.push(ei.GROUP_MESSAGE_PINNED):h.push(ei.GROUP_TIPS_NOTIFICATION)}),h}const sn=[{conditions:[{type:"event",value:100}],subType:ei.BUSINESS_COMMAND},{conditions:[{type:"event",value:24}],subType:ei.ALL_RECEIVE_MESSAGE_OPTION},{conditions:[{type:"event",value:26}],subType:ei.TOPIC_LATEST_MESSAGE},{conditions:[{type:"hasKey",value:"C2cMsgArray"}],subType:ei.C2C_REALTIME_MESSAGE},{conditions:[{type:"hasKey",value:"C2cMsgModNotifys"}],subType:ei.C2C_MESSAGE_MODIFIED},{conditions:[{type:"hasKey",value:"ProfileDataMod"}],subType:ei.PROFILE_MODIFIED},{conditions:[{type:"hasKey",value:"UserStatusList"}],subType:ei.USER_STATUS_UPDATE},{conditions:[{type:"hasKey",value:"FriendListMod"}],subType:ei.FRIEND_LIST_MODIFIED},{conditions:[{type:"hasKey",value:"GroupMsgArray"}],subType:ei.GROUP_REALTIME_MESSAGE},{conditions:[{type:"hasKey",value:"GroupMsgModNotifys"}],subType:ei.GROUP_MESSAGE_MODIFIED},{conditions:[{type:"hasKey",value:"C2cNotifyMsgArray"}],subTypeParser:function(C){var E;const h=[];return(E=C?.C2cNotifyMsgArray)===null||E===void 0||E.forEach(D=>{D.WithdrawC2cMsgNotify&&h.push(ei.C2C_REVOKED_MESSAGE),D.C2cReadedReceipt&&h.push(ei.C2C_MESSAGE_PEER_READ),D.ReadC2cMsgNotify&&h.push(ei.C2C_MESSAGE_READ_SYNC),D.MuteNotificationsSync&&h.push(ei.C2C_REMIND_TYPE_SYNC)}),h}},{conditions:[{type:"hasKey",value:"GroupTips"},{type:"event",value:4}],subTypeParser:$o},{conditions:[{type:"hasKey",value:"GroupTips"},{type:"event",value:5}],subTypeParser:function(C){var E;const h=[];return(E=C?.GroupTips)===null||E===void 0||E.forEach(D=>{Array.isArray(D.MsgBody.GroupWithdrawInfoArray)?h.push(ei.GROUP_MESSAGE_REVOKED):Array.isArray(D.MsgBody.GroupMsgReceiptList)?h.push(ei.GROUP_MESSAGE_READ_RECEIPT):Array.isArray(D.MsgBody.GroupReadInfoArray)?D.MsgBody.GroupReadInfoArray[0].TopicId?h.push(ei.TOPIC_MESSAGE_READ_SYNC):h.push(ei.GROUP_MESSAGE_READ_SYNC):D.GroupInfo.MillionGroupFlag===2?h.push(ei.TOPIC_SYSTEM_NOTIFICATION):h.push(ei.GROUP_SYSTEM_NOTIFICATION)}),h}},{conditions:[{type:"hasKey",value:"GroupTips"},{type:"event",value:6}],subTypeParser:$o},{conditions:[{type:"hasKey",value:"GroupTips"},{type:"event",value:12}],subTypeParser:function(C){var E;const h=[];return(E=C?.GroupTips)===null||E===void 0||E.forEach(D=>{const{GroupAtTips:{TopicId:N}}=D;N?h.push(ei.TOPIC_AT_TIPS):h.push(ei.GROUP_AT_TIPS)}),h}},{conditions:[{type:"hasKey",value:"RecentContactMod"}],subTypeParser:function(C){var E;const h=[];return(E=C?.RecentContactMod)===null||E===void 0||E.forEach(D=>{switch(D.PushType){case Me.CONV_MARK_UPDATED:h.push(ei.CONVERSATION_MARK_UPDATED);break;case Me.CONV_GROUP_ADDED:h.push(ei.CONVERSATION_GROUP_ADD);break;case Me.CONV_GROUP_DELETED:h.push(ei.CONVERSATION_GROUP_DELETED);break;case Me.CONV_GROUP_UPDATED:h.push(ei.CONVERSATION_GROUP_UPDATED);break;default:h.push(ei.CONV_MODIFIED)}}),h}},{conditions:[{type:"hasKey",value:"MsgReactionNotifyList"}],subType:ei.MESSAGE_REACTION_UPDATED},{conditions:[{type:"hasKey",value:"MsgReactionNotify"}],subType:ei.MESSAGE_REACTION_UPDATED_SYNC},{conditions:[{type:"hasKey",value:"C2cMsgInfo"}],subType:ei.C2C_MESSAGE_READ_RECEIPT},{conditions:[{type:"hasKey",value:"FollowChangeList"}],subType:ei.FOLLOW_LIST_UPDATED},{conditions:[{type:"hasKey",value:"MsgExtensionNotify"}],subType:ei.MESSAGE_EXTENSIONS_UPDATED},{conditions:[{type:"hasKey",value:"C2CReadAllMsg"}],subType:ei.ALL_MESSAGE_READ}];var dn;function hn(C){var E;const h=Array.isArray((E=C?.body)===null||E===void 0?void 0:E.EventArray)?C.body.EventArray:[],D=[];return h.forEach(N=>{N.Flag=C.body.Flag;const O=sn.find(j=>j.conditions.every(IA=>{switch(IA.type){case"event":return N.Event===IA.value;case"hasKey":return Object.prototype.hasOwnProperty.call(N,IA.value);default:return!1}}));if(!O)return null;let Y=[];typeof O.subTypeParser=="function"?Y=O.subTypeParser(N):O.subType&&(Y=O.subType),Array.isArray(Y)?Y.forEach(j=>{D.push({type:`${dn.SERVER_PUSH_MESSAGE}:${j}`,data:N})}):D.push({type:`${dn.SERVER_PUSH_MESSAGE}:${Y}`,data:N})}),D}(function(C){C.SERVER_PUSH_MESSAGE="im_open_push.msg_push",C.SERVER_PUSH_MESSAGE_MULTIPLE="im_open_push.multi_msg_push_ws",C.ERROR="error"})(dn||(dn={}));const Gi={[dn.SERVER_PUSH_MESSAGE]:hn,[dn.SERVER_PUSH_MESSAGE_MULTIPLE]:hn,[dn.ERROR]:function(C){const{errorCode:E}=C;return[{type:`error:${E}`,data:C}]}},pn=new class{constructor(){this._outerEventEmitter=null,this._innerEventEmitter=null,this._filteredCallbackMap=new Map,this._outerEventEmitter=new jr,this._innerEventEmitter=new jr,this.InnerEventSubType=ei}subscribeInnerEvent(C,E,h,D,N){var O;let Y,j,IA,BA;["string","number"].includes(typeof E)?(IA=`${C}:${E}`,BA=h,j=D,Y=N):(IA=C,BA=E,j=h,Y=typeof D=="function"?D:void 0),Y?this._subscribeWithFilter(IA,BA,j,Y):(O=this._innerEventEmitter)===null||O===void 0||O.on(IA,BA,j)}emitInnerEvent(C,E){var h,D;if((h=this._innerEventEmitter)===null||h===void 0||h.emit(C,E),Object.keys(Gi).includes(C)){const N=(D=Gi[C])===null||D===void 0?void 0:D.call(Gi,E);N?.forEach(O=>{var Y;O&&((Y=this._innerEventEmitter)===null||Y===void 0||Y.emit(O.type,O.data))})}}subscribeOuterEvent(C,E,h){var D;(D=this._outerEventEmitter)===null||D===void 0||D.on(C,E,h)}unSubscribeOuterEvent(C,E,h){var D;(D=this._outerEventEmitter)===null||D===void 0||D.off(C,E,h)}unSubscribeInnerEvent(C,E,h,D){if(["string","number"].includes(typeof E)){const N=h,O=`${C}:${E}`;this._unsubscribeEvent(O,N,D)}else{const N=E;this._unsubscribeEvent(C,N,h)}}emitOuterEvent(C,E){var h;(h=this._outerEventEmitter)===null||h===void 0||h.emit(C,E)}getOuterEventEmitter(){return this._outerEventEmitter}rest(){this._outerEventEmitter=null,this._innerEventEmitter=null}_subscribeWithFilter(C,E,h,D){var N;const O=Y=>{D.call(h,Y)&&E.call(h,Y)};this._filteredCallbackMap.has(C)||this._filteredCallbackMap.set(C,[]),this._filteredCallbackMap.get(C).push({originalCallback:E,filteredCallback:O,filter:D,context:h}),(N=this._innerEventEmitter)===null||N===void 0||N.on(C,O,h)}_unsubscribeEvent(C,E,h){var D,N;const O=this._filteredCallbackMap.get(C);if(O){const Y=O.findIndex(j=>j.originalCallback===E&&j.context===h);if(Y!==-1){const{filteredCallback:j}=O[Y];return(D=this._innerEventEmitter)===null||D===void 0||D.off(C,j,h),O.splice(Y,1),void(O.length===0&&this._filteredCallbackMap.delete(C))}}(N=this._innerEventEmitter)===null||N===void 0||N.off(C,E,h)}};class nI{constructor(){this._socket=null}connectSocket(E){return this._socket=new WebSocket(E),this._socket}send(E){var h,D;try{(h=this._socket)===null||h===void 0||h.send(E)}catch(N){(D=this._onSendFail)===null||D===void 0||D.call(this,N)}}bindSocketHandlers(E){const{onOpen:h,onMessage:D,onClose:N,onError:O,onSendFail:Y}=E;this._socket&&(this._socket.binaryType="arraybuffer",this._socket.onopen=h,this._socket.onmessage=D,this._socket.onclose=N,this._socket.onerror=O,this._onSendFail=Y)}unbindSocketHandlers(){this._socket&&(this._socket.onopen=null,this._socket.onmessage=null,this._socket.onclose=null,this._socket.onerror=null)}disconnect(){this._socket&&(this._socket.close(),this._socket=null)}}class gr{constructor(E){this._onError=E.onError}connectSocket(E){const h=this;return this._socket=Ji.connectSocket({url:E,header:{"content-type":"application/json"},complete:()=>{},fail:D=>h._onError(D)}),this._socket}send(E){var h;(h=this._socket)===null||h===void 0||h.send({data:E,fail:this._onSendFail})}bindSocketHandlers(E){const{onOpen:h,onMessage:D,onClose:N,onError:O,onSendFail:Y}=E;this._socket&&(this._socket.onClose(N),this._socket.onOpen(h),this._socket.onMessage(D),this._socket.onError(O),this._onSendFail=Y)}unbindSocketHandlers(){this._socket&&(this._socket.onClose(()=>{}),this._socket.onOpen(()=>{}),this._socket.onMessage(()=>{}),this._socket.onError(()=>{}))}disconnect(){this._socket&&(this._socket.close(),this._socket=null)}}const gn="CONNECT",Yo="SEND",Tg="DISCONNECT",So="OPEN",ao="MESSAGE",EE="CLOSE",Ta="ERROR",po="SEND_FAIL";class Ja{constructor(){this._worker=null,this._blobUrl=null}connectSocket(E){const h=new Blob([` + let _socket = null; + + self.onmessage = (event) => { + const { type, url, data } = event.data; + + switch (type) { + case 'CONNECT': + connectSocket(url); + break; + case 'SEND': + send(data); + break; + case 'DISCONNECT': + disconnect(); + break; + } + }; + + function connectSocket(url) { + _socket = new WebSocket(url); + _socket.binaryType = 'arraybuffer'; + bindSocketHandlers(); + return _socket; + } + + function send(packet) { + try { + _socket?.send(packet); + } catch (error) { + self.postMessage({ + type: 'SEND_FAIL', + error: { + message: error.message, + name: error.name, + }, + }); + } + } + + function bindSocketHandlers() { + if (_socket) { + _socket.onopen = (event) => { + self.postMessage({ + type: 'OPEN', + data: { + type: event.type, + timeStamp: event.timeStamp, + }, + }); + }; + + _socket.onmessage = (event) => { + self.postMessage({ + type: 'MESSAGE', + data: event.data, + }); + }; + + _socket.onclose = (event) => { + self.postMessage({ + type: 'CLOSE', + data: { + code: event.code, + reason: event.reason, + timeStamp: event.timeStamp, + }, + }); + }; + + _socket.onerror = (error) => { + self.postMessage({ + type: 'ERROR', + data: { + message: error.message, + name: error.name + }, + }); + }; + } + } + + function unbindSocketHandlers() { + if (_socket) { + _socket.onopen = null; + _socket.onmessage = null; + _socket.onclose = null; + _socket.onerror = null; + } + } + + function disconnect() { + if (_socket) { + _socket.close(); + _socket = null; + } + } +`],{type:"application/javascript"});this._worker=new Worker(URL.createObjectURL(h)),this._worker.postMessage({type:gn,url:E})}send(E){var h,D;try{(h=this._worker)===null||h===void 0||h.postMessage({type:Yo,data:E})}catch(N){(D=this._onSendFail)===null||D===void 0||D.call(this,N)}}bindSocketHandlers(E){const{onOpen:h,onMessage:D,onClose:N,onError:O,onSendFail:Y}=E;if(this._worker){const j={[So]:h,[ao]:D,[EE]:N,[Ta]:O,[po]:Y};this._onSendFail=Y,this._worker.onmessage=IA=>{var BA;const{type:mA}=IA?.data||{};typeof j[mA]=="function"&&((BA=j[mA])===null||BA===void 0||BA.call(j,IA?.data))}}}unbindSocketHandlers(){this._worker&&(this._worker.onmessage=null)}disconnect(){this._worker&&(this._worker.postMessage({type:Tg}),this._worker.terminate(),this._worker=null),this._blobUrl&&(URL.revokeObjectURL(this._blobUrl),this._blobUrl=null)}}class Mc{}var Qr,Fo=new class{constructor(){this._store=new Map}get(C){return this._store.get(C)}getStorage(C){return Xi?ai?my.getStorageSync({key:C}).data:Ji.getStorageSync(C):this._canUseLocalStorage()?localStorage.getItem(C):{}}set(C,E){const h=this._store.get(C)||{};E instanceof Map?this._store.set(C,E):this._store.set(C,Object.assign(Object.assign({},h),E))}setStorage(C,E){Xi?ai?my.setStorageSync({key:C,data:JSON.stringify(E)}):Ji.setStorageSync(C,JSON.stringify(E)):this._canUseLocalStorage()&&localStorage.setItem(C,JSON.stringify(E))}clear(C){typeof C=="string"?this._store.set(C,{}):this._store.clear()}clearLocalStorage(C){this._canUseLocalStorage()&&(typeof C=="string"?localStorage.setItem(C,""):localStorage.clear())}reset(){this.clear()}_canUseLocalStorage(){return typeof window<"u"&&navigator&&navigator.cookieEnabled&&localStorage}};class $s{connectSocket(E){return this._socket=Ji.connectSocket({url:E,header:{"content-type":"application/json"},multiple:!0,complete:()=>{}}),this._socket}send(E){var h;(h=this._socket)===null||h===void 0||h.send({data:E,fail:this._onSendFail})}bindSocketHandlers(E){const{onOpen:h,onMessage:D,onClose:N,onError:O,onSendFail:Y}=E;this._socket&&(this._socket.onClose(N),this._socket.onOpen(h),this._socket.onMessage(j=>D(j?.data)),this._socket.onError(()=>O),this._onSendFail=Y)}unbindSocketHandlers(){this._socket&&(this._socket.onClose(()=>{}),this._socket.onOpen(()=>{}),this._socket.onMessage(()=>{}),this._socket.onError(()=>{}))}disconnect(){this._socket&&(this._socket.close(),this._socket=null)}}(function(C){C[C.CONNECTED=0]="CONNECTED",C[C.CONNECTING=1]="CONNECTING",C[C.DISCONNECTED=2]="DISCONNECTED"})(Qr||(Qr={}));class Ha{constructor(E){this._url="",this._readyState=Qr.DISCONNECTED,this._url=E,this._id=v(),this._emitter=new jr,ai?this._socket=new $s:Je||Ur||Zi||Dt||Ki||qt?this._socket=new gr({onError:this._onError.bind(this)}):Nr?this._socket=new Mc:this._canUseWebWorker()?this._socket=new Ja:this._socket=new nI,this.connect()}connect(){this.doOpen(),this._bindSocketHandlers()}doOpen(){[Qr.CONNECTED,Qr.CONNECTING].includes(this._readyState)||(this._readyState=Qr.CONNECTING,this._ws=this._socket.connectSocket(this._url))}send(E){this._readyState!==Qr.CONNECTED?this.reconnect():this._socket.send(E)}reconnect(){[Qr.CONNECTED,Qr.CONNECTING].includes(this._readyState)||(this.disconnect(),this.doOpen())}getId(){return this._id}on(E,h,D){this._emitter.on(E,h,D)}off(E,h,D){this._emitter.off(E,h,D)}isConnected(){return this._readyState===Qr.CONNECTED}disconnect(){this._readyState=Qr.DISCONNECTED,this._unbindSocketHandlers(),this._socket.disconnect()}_onOpen(E){this._readyState===Qr.CONNECTING&&(this._readyState=Qr.CONNECTED,this._emitter.emit("connect",{socketId:this._id,event:E}))}_onMessage(E){this._emitter.emit("message",E)}_onClose(E){this._readyState=Qr.DISCONNECTED,this._emitter.emit("close",{socketId:this._id,event:E})}_onError(E){this._readyState=Qr.DISCONNECTED,this._emitter.emit("error",{socketId:this._id,error:E})}_onSendFail(E){this._readyState=Qr.DISCONNECTED,this._emitter.emit("sendFail",{socketId:this._id,error:E})}_bindSocketHandlers(){this._socket.bindSocketHandlers({onOpen:this._onOpen.bind(this),onMessage:this._onMessage.bind(this),onClose:this._onClose.bind(this),onError:this._onError.bind(this),onSendFail:this._onSendFail.bind(this)})}_unbindSocketHandlers(){this._socket.unbindSocketHandlers()}_canUseWebWorker(){const E=Fo.get("cloudConfig")||{};return(r(E.isWorkerEnabled)||E.isWorkerEnabled==="1")&&ji}}const Gs={[Ve.SINGAPORE]:[[2e7,3e7],[172e7,173e7]],[Ve.KOREA]:[[3e7,4e7],[173e7,174e7]],[Ve.GERMANY]:[[4e7,5e7],[174e7,175e7]],[Ve.IND]:[[5e7,6e7],[175e7,176e7]],[Ve.JPN]:[[6e7,7e7],[176e7,177e7]],[Ve.USA]:[[7e7,8e7],[177e7,178e7]],[Ve.INDONESIA]:[[8e7,9e7],[178e7,179e7]],[Ve.KSA]:[[9e7,1e8],[179e7,18e8]]};function Ga(C){var E;if(!((E=Fo.get("instance"))===null||E===void 0)&&E.oversea)return Ve.OVERSEA;for(const h of Object.keys(Gs))for(const[D,N]of Gs[h])if(C>=D&&C`${_A}=${mA[_A]}`).join("&"));var mA;return h?`${C}/binfo?${BA}&compress=gzip`:`${C}/info?${BA}`}function qo(C){const E=Fo.get("instance"),{sdkAppId:h,testEnv:D,proxyServer:N}=E,O=Ga(h);if(D)return en(Ze.TEST[O].DEFAULT,{isBinary:C});if(!$r(N))return en(N,{isBinary:C});const Y=Ze.PRODUCTION[O],j=wt&&Y.ANYCAST,IA=wt,BA=!!Y.BACKUP_CN;return en({[Rr.INITIAL]:()=>(fo=Rr.DEFAULT,Y.DEFAULT),[Rr.DEFAULT]:()=>(fo=Rr.IPV6,Y.IPV6),[Rr.IPV6]:()=>(fo=Rr.BACKUP,Y.BACKUP),[Rr.BACKUP]:()=>IA?(fo=Rr.BACKUP_WEB_ONLY,function(mA){const _A=Math.floor(10001*Math.random())+1e4;return mA.replace("*",String(_A))}(Y.BACKUP_WEB_ONLY)):BA?(fo=Rr.BACKUP_CN,Y.BACKUP_CN):j?(fo=Rr.ANYCAST,Y.ANYCAST):Y.DEFAULT,[Rr.BACKUP_WEB_ONLY]:()=>BA?(fo=Rr.BACKUP_CN,Y.BACKUP_CN):j?(fo=Rr.ANYCAST,Y.ANYCAST):Y.DEFAULT,[Rr.BACKUP_CN]:()=>(fo=j?Rr.ANYCAST:Rr.DEFAULT,Y[fo]),[Rr.ANYCAST]:()=>(fo=Rr.DEFAULT,Y.ANYCAST="",Y.DEFAULT)}[fo](),{isBinary:C})}var Gg=new class{constructor(){this._timeOffsetWithServer=0}getServerTimeMs(){return Date.now()+this._timeOffsetWithServer}getServerTimeSeconds(){return Math.floor(this.getServerTimeMs()/1e3)}getTimeOffsetWithServer(){return this._timeOffsetWithServer}calculateTimeOffsetWithServer(C,E){const h=Date.now(),D=h-C;this._timeOffsetWithServer=E+D-h}};const kg=16;var fn=new class{constructor(){this._tasks=[],this._timer=null,this._taskMap=new Map}_addTaskToScheduler(C){const{id:E}=C;this.removeTask(E),this._tasks.push(C),this._taskMap.set(E,C),this._sort(),this._scheduleNextTask()}_createTask(C){const{id:E,callback:h,context:D,isOnce:N=!1,intervalMs:O=kg}=C,Y=Math.max(O,kg);return{id:E,nextExecuteTime:Date.now()+Y,intervalMs:O,callback:h,context:D,isOnce:N}}addTask(C){const E=this._createTask(C);this._addTaskToScheduler(E)}addOnceTask(C){const E=this._createTask(Object.assign(Object.assign({},C),{isOnce:!0}));this._addTaskToScheduler(E)}removeTask(C){const E=this._tasks.findIndex(h=>h.id===C);E>-1&&(this._tasks.splice(E,1),this._taskMap.delete(C),this._scheduleNextTask())}updateTaskInterval(C,E){const h=this._taskMap.get(C);h&&(h.intervalMs=E,h.nextExecuteTime=Date.now()+E,this._sort(),this._scheduleNextTask())}clearAllTasks(){this._tasks=[],this._taskMap.clear(),this._timer&&(clearTimeout(this._timer),this._timer=null)}dispose(){this.clearAllTasks()}_sort(){this._tasks.sort((C,E)=>C.nextExecuteTime-E.nextExecuteTime)}_scheduleNextTask(){this._timer&&(clearTimeout(this._timer),this._timer=null);const C=this._tasks[0];if(C){const E=Math.max(0,C.nextExecuteTime-Date.now());this._timer=setTimeout(()=>this._execute(),E)}}_execute(){const C=Date.now();for(;this._tasks.length&&this._tasks[0].nextExecuteTime<=C;){const E=this._tasks[0];try{E.context?E.callback.call(E.context):E.callback(),E.isOnce?this.removeTask(E.id):(E.nextExecuteTime=C+E.intervalMs,this._sort())}catch(h){console.warn(`Task ${E.id} execution failed:`,h),E.isOnce&&this.removeTask(E.id)}}this._scheduleNextTask()}};function ls(C){const E=[];for(let h=0;h=55296&&D<=56319){const N=C.charCodeAt(++h)-56320+(D-55296<<10)+65536;E.push(240|N>>18,128|N>>12&63,128|N>>6&63,128|63&N)}else D<=127?E.push(D):D<=2047?E.push(192|D>>6,128|63&D):E.push(224|D>>12,128|D>>6&63,128|63&D)}return new Uint8Array(E)}function Or(C){const E=Array.isArray(C)?[]:Object.create(null);for(const h in C)Object.prototype.hasOwnProperty.call(C,h)&&m(h)&&C[h]!=null&&(C[h]===null||typeof C[h]!="object"?E[h]=C[h]:E[h]=Or(C[h]));return E}function Po(C,E){if(sA.includes(C))return 0;const h=ls(JSON.stringify(E));let D=4294967295;const{length:N}=h;for(let O=0;O>>=1:D=D>>>1^3988292384}return(4294967295^D)>>>0}function Ba(C){const{servcmd:E,data:h}=C,D=function(O){const Y=Fo.get("login")||{},j=Fo.get("instance")||{};return{servcmd:O,ver:"v4",platform:MA,websdkappid:537048168,websdkversion:"1.7.3",a2:Y.a2Key||void 0,tinyid:Y.tinyID||void 0,status_instid:Y.statusInstanceId||0,sdkappid:j.sdkAppId,contenttype:"json",reqtime:Math.floor(Date.now()/1e3),identifier:Y.a2Key?void 0:Y.userId,usersig:Y.a2Key?void 0:Y.userSig,sdkability:478343027,sdkability_ext:AA(""),cappid:j.applicationID||0,tjgID:"",seq:Va(),cs:0}}(E),N=Or(h);return D.cs=Po(E,N),{head:D,body:N}}function Mr(C){const{servcmd:E,data:h}=C,D=function(O){const Y=Fo.get("login")||{},j=Fo.get("instance")||{};return{servcmd:O,ver:"v4",platform:MA,websdkappid:537048168,websdkversion:"1.7.3",sdkappid:j.sdkAppId,contenttype:"",reqtime:Math.floor(Date.now()/1e3),identifier:"",usersig:"",status_instid:Y.statusInstanceId||0,sdkability:478343027,sdkability_ext:AA(""),cappid:j.applicationID||0,seq:Va(),cs:0}}(E),N=Or(h);return D.cs=Po(E,N),{head:D,body:N}}let Cs=v();function Va(){return Cs=Cs<2415919103?Cs+1:v(),Cs}function P(){var C;const E=Fo.get("login")||{},h=Fo.get("instance")||{};return{sdk_type:30,sdk_app_id:h.sdkAppId,sdk_version:"1.6.18",tiny_id:Number(E.tinyID),user_id:E.userId||((C=Fo.get("webPush"))===null||C===void 0?void 0:C.userId),platform:MA,instance_id:h.instanceId,trace_id:new Date().getTime()}}var F,EA=Object.freeze({__proto__:null,calcBodyCRC:Po,filterProtocolDataInvalidFields:Or,generateCosSpecifiedData:function(C){const{servcmd:E,data:h}=C,D=function(O){const Y=Fo.get("login")||{},j=Fo.get("instance")||{};return{servcmd:O,ver:"v4",platform:MA,websdkappid:537048168,websdkversion:"1.7.3",sdkappid:j.sdkAppId,contenttype:"json",reqtime:Math.floor(Date.now()/1e3),identifier:Y.userId,usersig:Y.userSig,status_instid:Y.statusInstanceId||0,sdkability:478343027,sdkability_ext:AA(""),cappid:j.applicationID||0,seq:Va(),cs:0}}(E),N=Or(h);return D.cs=Po(E,N),{head:D,body:N}},generateProtocolData:Ba,generateSSOLogProtocolData:Mr,generateSequence:Va,getCommonHead:P,getHostSite:Ga,taskScheduler:fn,timeManager:Gg});(function(C){C[C.info=4]="info",C[C.warning=5]="warning",C[C.error=6]="error"})(F||(F={}));const RA={method:"extension",networkType:"network_type",eventType:"event_type",code:"error_code",message:"error_message",moreMessage:"more_message",duplicate:"duplicate",costTime:"cost_time",level:"level",uiPlatform:"ui_platform",timestamp:"timestamp"};class GA{constructor(E){this.level=F.info,this._canSendLog=!0,this._logCreatedAt=Gg.getServerTimeMs(),this.timestamp=0,this.networkType=8,this.code=0,this.moreMessage="",this.method="",this.message="",this.costTime=0,this.duplicate=!1,this.eventType=0,this.uiPlatform=this._getUiPlatform(),this._sdkEdition=this._getSDKEdition();const{method:h,eventType:D=0,message:N="",costTime:O=0,error:Y,uiPlatform:j,moreMessage:IA="",code:BA=0,startTime:mA=0}=E||{};this.eventType=D,this.method=h,this.message=N,this.costTime=O,this.moreMessage=`${IA} startTime:${mA}`,this.code=BA,Y&&this.setError(Y),$r(j)||(this.uiPlatform=j)}setMoreMessage(E){this.moreMessage=`${this.moreMessage} ${E}`}updateLogCreatedAtByTimeOffset(){this._logCreatedAt+=Gg.getTimeOffsetWithServer()}end(E=!1){this._canSendLog&&(this._canSendLog=!1,this.timestamp=Gg.getServerTimeMs(),this._ssoLogModule.pushToLogQueue(this._convertSSOLogDataKeyToServe()),E&&this._ssoLogModule.uploadSSOLogData())}setError(E){var h;return E instanceof Error?this._canSendLog?(!((h=Fo.get("netWorkMonitor"))===null||h===void 0)&&h.isNetworkOnline&&(E.errorCode&&(this.code=E.errorCode),E.errorMessage&&this.setMoreMessage(E.errorMessage)),this.level=F.error,this):this:(console.warn("SSOLogData.setError value not instanceof Error, please check!"),this)}setLogInfo(E){return Object.keys(E).forEach(h=>{Object.keys(RA).includes(h)&&(this[h]=E[h])}),this}setSSOLogModule(E){this._ssoLogModule=E}_convertSSOLogDataKeyToServe(){const E={};return Object.keys(this).forEach(h=>{const D=h;RA[D]&&(E[RA[D]]=this[D])}),E}_getUiPlatform(){var E;const h=(E=Fo.get("instance"))===null||E===void 0?void 0:E.scene;if(typeof h=="string"){const D=Number(h);return isNaN(D)?void 0:D}}_getSDKEdition(){var E;return(E=Fo.get("instance"))===null||E===void 0?void 0:E.sdkEdition}}var WA;(function(C){C.RECONNECTED="reconnected",C.CLOUD_CONFIG_UPDATE="cloud_config_update",C.SOCKET_DISCONNECTED="socket_disconnected"})(WA||(WA={}));var Ce=WA;const ge=20,we=6e4,_e=[4,5,6],Ke="report-logger";var Bt=new class{constructor(){this._sdkAppIdBlackList=[],this._tinyIdWhiteList=[],this._reportLevel=[4,5,6],this._minThreshold=ge,this._maxThreshold=100,this._waitingTime=we,this._lastReportAt=Date.now(),this._ssoLogMap=new Map,this._logLevel=eA.DEBUG,this._throttleConfig={global:{throttleTime:ue,maxCount:jA},single:{throttleTime:HA,maxCount:VA}},this._globalThrottle={count:0,startTime:Date.now()},this._singleThrottleMap=new Map,pn.subscribeInnerEvent(Ce.CLOUD_CONFIG_UPDATE,this._handleCloudConfigUpdate,this),fn.addTask({id:Ke,intervalMs:1e3,callback:this._checkAndReportIfDue,context:this}),this._logQueue=[],this._savePlatFormInfo()}_handleCloudConfigUpdate(C){const{evt_rpt_threshold:E=ge,evt_rpt_waiting:h=we,evt_rpt_level:D=_e,evt_rpt_sdkappid_bl:N="",evt_rpt_tinyid_wl:O="",evt_rpt_global_throttle_time:Y=ue,evt_rpt_global_throttle_count:j=jA,evt_rpt_single_throttle_time:IA=HA,evt_rpt_single_throttle_count:BA=VA}=C||{};this._sdkAppIdBlackList=N.split(",").map(mA=>Number(mA)),this._waitingTime=Number(h),this._minThreshold=E,this._reportLevel=D,this._tinyIdWhiteList=O.split(","),this._throttleConfig={global:{throttleTime:Y,maxCount:j},single:{throttleTime:IA,maxCount:BA}}}createSSOLogData(C){const E=new GA(C);return E.setSSOLogModule(this),this._ssoLogMap.set(C.method,E),E}getSSOLogData(C){return this._ssoLogMap.get(C)||{}}pushToLogQueue(C){C&&(this._logQueue.push(C),this._shouldUploadImmediately()&&this.uploadSSOLogData())}setLogLevel(C){[eA.DEBUG,eA.ERROR,eA.INFO,eA.NONE,eA.WARN].includes(C)&&(this._logLevel=C)}debug(C,E="",h){this._log(eA.DEBUG,C,E,h)}info(C,E="",h){this._log(eA.INFO,C,E,h)}warn(C,E="",h){this._log(eA.WARN,C,E,h)}error(C,E="",h){this._log(eA.ERROR,C,E,h)}_shouldUploadImmediately(){return this._logQueue.length>=this._minThreshold}_isReportDue(){return Date.now()>=this._lastReportAt+this._waitingTime}_checkAndReportIfDue(){this._isReportDue()&&this._logQueue.length>0&&this.uploadSSOLogData()}uploadSSOLogData(){return et(this,void 0,void 0,function*(){if(this._logQueue.length===0)return;const C=this._logQueue.slice();this._logQueue=[];try{const E=this._filterLogs(C);if(E.length===0)return void(this._lastReportAt=Date.now());const h={Header:P(),Event:E};$r(h.Header.user_id)||(yield function(D){const N="imopenstat.tim_web_report_v2",O=Mr({servcmd:N,data:D}),Y=`${O.head.seq}${N}`;return II.sendPacket(O,{requestId:Y})}(h))}catch(E){this._requeueFailedLogs(C),this.debug("uploadSSOLogData",An(E))}finally{this._lastReportAt=Date.now()}})}_requeueFailedLogs(C){this._logQueue=C.concat(this._logQueue);const E=this._logQueue.length-200;E>0&&(this._logQueue.splice(0,E),this.debug("uploadSSOLogData",`log queue overflow, dropped ${E} oldest logs`))}_savePlatFormInfo(){var C,E;if(Je){const h=(E=(C=wx.getAccountInfoSync)===null||C===void 0?void 0:C.call(wx))===null||E===void 0?void 0:E.miniProgram;if(h){const{appId:D,envVersion:N}=h;Fo.set("instance",{appId:D,envVersion:N})}}else wt&&Fo.set("instance",{href:window.location.href})}_filterLogs(C){const{tinyID:E}=Fo.get("login")||{},{sdkAppId:h}=Fo.get("instance")||{};return this._sdkAppIdBlackList.includes(h)&&!this._tinyIdWhiteList.includes(E)?[]:C.filter(D=>this._reportLevel.includes(D.level))}_checkThrottle(C){return!!this._checkGlobalThrottle()||this._checkSingleThrottle(C)}_checkGlobalThrottle(){const C=Date.now();if(C-this._globalThrottle.startTime>=this._throttleConfig.global.throttleTime)this._globalThrottle.count=1,this._globalThrottle.startTime=C;else if(this._globalThrottle.count++,this._globalThrottle.count>this._throttleConfig.global.maxCount)return!0;return!1}_checkSingleThrottle(C){const E=Date.now(),h=this._singleThrottleMap.get(C);return h?E-h.startTime>=this._throttleConfig.single.throttleTime?(h.count=1,h.startTime=E,!1):h.count>=this._throttleConfig.single.maxCount||(h.count++,!1):(this._singleThrottleMap.set(C,{count:1,startTime:E}),!1)}_shouldLog(C){return C>=this._logLevel&&this._logLevel!==eA.NONE}_shouldReport(C){return this._reportLevel.includes(wA[C])}_formatLog(C,E,h,D){const N=new Date,O=`${N.getHours()}:${N.getMinutes()}:${N.getSeconds()}:${N.getMilliseconds()}`,Y=`<${eA[C]}>`;return ot||Xi?[`${X} [${O}] ${Y} [${E}] ${h}`]:["%c%s%c%s","background:#0abf5b; padding:1px; border-radius:3px; color: #fff",X,"",`[${O}] ${Y} [${E}] ${h} params: ${An(D)}`]}_log(C,E,h,D){if(this._shouldLog(C)){const N=this._formatLog(C,E,h,D);QA[C].apply(console,N)}if(this._shouldReport(C)){const N=this._getThrottleKey(E,h,D);this._checkThrottle(N)||this.createSSOLogData(Object.assign(Object.assign({message:h},D),{method:E})).end()}}_getThrottleKey(C,E,h){const D=`${C}${E}${An(Object.assign(Object.assign({},h),{costTime:""}))}`,N=ls(JSON.stringify(D));let O=4294967295;const{length:Y}=N;for(let j=0;j>>=1:O=O>>>1^3988292384}return`${(4294967295^O)>>>0}`}reset(){console.log("SSO_LOG_MODULE.reset"),fn.removeTask(Ke),pn.unSubscribeInnerEvent(Ce.CLOUD_CONFIG_UPDATE,this._handleCloudConfigUpdate,this),this._lastReportAt=0,this.uploadSSOLogData(),this._sdkAppIdBlackList=[],this._tinyIdWhiteList=[],this._minThreshold=ge,this._maxThreshold=100,this._waitingTime=we,this._logQueue=[],this._logLevel=eA.DEBUG,this._globalThrottle={count:0,startTime:Date.now()},this._singleThrottleMap.clear()}};const Rt=15e3,Ye="Channel",nt="channel_schedule_task",ii="channel_reconnect_task",oi="connected",Ko="connecting",Kt="disconnected",ro=1e3,ks="network_status_change",Zr="activity_status_change",In="send_fail",xr="reconnect_failed",sI="socket_error",jo="socket_close";function OI(C){return OI=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(E){return typeof E}:function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},OI(C)}function _g(C){throw new Error('Could not dynamically require "'+C+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var gI,ml={exports:{}},ua=(gI||(gI=1,function(C){C.exports=function E(h,D,N){function O(IA,BA){if(!D[IA]){if(!h[IA]){if(!BA&&_g)return _g(IA);if(Y)return Y(IA,!0);var mA=new Error("Cannot find module '"+IA+"'");throw mA.code="MODULE_NOT_FOUND",mA}var _A=D[IA]={exports:{}};h[IA][0].call(_A.exports,function(xA){return O(h[IA][1][xA]||xA)},_A,_A.exports,E,h,D,N)}return D[IA].exports}for(var Y=_g,j=0;j>>6:(xA<65536?_A[Se++]=224|xA>>>12:(_A[Se++]=240|xA>>>18,_A[Se++]=128|xA>>>12&63),_A[Se++]=128|xA>>>6&63),_A[Se++]=128|63&xA);return _A},D.buf2binstring=function(mA){return BA(mA,mA.length)},D.binstring2buf=function(mA){for(var _A=new N.Buf8(mA.length),xA=0,Qe=_A.length;xA>10&1023,at[Qe++]=56320|1023&Re)}return BA(at,Qe)},D.utf8border=function(mA,_A){var xA;for((_A=_A||mA.length)>mA.length&&(_A=mA.length),xA=_A-1;0<=xA&&(192&mA[xA])==128;)xA--;return xA<0||xA===0?_A:xA+j[mA[xA]]>_A?xA:_A}},{"./common":1}],3:[function(E,h,D){h.exports=function(N,O,Y,j){for(var IA=65535&N,BA=N>>>16&65535,mA=0;Y!==0;){for(Y-=mA=2e3>>1:O>>>1;Y[j]=O}return Y}();h.exports=function(O,Y,j,IA){var BA=N,mA=IA+j;O^=-1;for(var _A=IA;_A>>8^BA[255&(O^Y[_A])];return-1^O}},{}],6:[function(E,h,D){h.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}},{}],7:[function(E,h,D){h.exports=function(N,O){var Y,j,IA,BA,mA,_A,xA,Qe,Re,Se,At,at,jt,Bi,ri,St,eo,to,Yt,si,zo,te,je,dA,ut;Y=N.state,j=N.next_in,dA=N.input,IA=j+(N.avail_in-5),BA=N.next_out,ut=N.output,mA=BA-(O-N.avail_out),_A=BA+(N.avail_out-257),xA=Y.dmax,Qe=Y.wsize,Re=Y.whave,Se=Y.wnext,At=Y.window,at=Y.hold,jt=Y.bits,Bi=Y.lencode,ri=Y.distcode,St=(1<>>=Yt=to>>>24,jt-=Yt,(Yt=to>>>16&255)==0)ut[BA++]=65535&to;else{if(!(16&Yt)){if(!(64&Yt)){to=Bi[(65535&to)+(at&(1<>>=Yt,jt-=Yt),jt<15&&(at+=dA[j++]<>>=Yt=to>>>24,jt-=Yt,!(16&(Yt=to>>>16&255))){if(!(64&Yt)){to=ri[(65535&to)+(at&(1<>>=Yt,jt-=Yt,(Yt=BA-mA)>3,at&=(1<<(jt-=si<<3))-1,N.next_in=j,N.next_out=BA,N.avail_in=j>>24&255)+(te>>>8&65280)+((65280&te)<<8)+((255&te)<<24)}function at(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new N.Buf16(320),this.work=new N.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function jt(te){var je;return te&&te.state?(je=te.state,te.total_in=te.total_out=je.total=0,te.msg="",je.wrap&&(te.adler=1&je.wrap),je.mode=Qe,je.last=0,je.havedict=0,je.dmax=32768,je.head=null,je.hold=0,je.bits=0,je.lencode=je.lendyn=new N.Buf32(Re),je.distcode=je.distdyn=new N.Buf32(Se),je.sane=1,je.back=-1,_A):xA}function Bi(te){var je;return te&&te.state?((je=te.state).wsize=0,je.whave=0,je.wnext=0,jt(te)):xA}function ri(te,je){var dA,ut;return te&&te.state?(ut=te.state,je<0?(dA=0,je=-je):(dA=1+(je>>4),je<48&&(je&=15)),je&&(je<8||15=lt.wsize?(N.arraySet(lt.window,je,dA-lt.wsize,lt.wsize,0),lt.wnext=0,lt.whave=lt.wsize):(ut<(Cr=lt.wsize-lt.wnext)&&(Cr=ut),N.arraySet(lt.window,je,dA-ut,Cr,lt.wnext),(ut-=Cr)?(N.arraySet(lt.window,je,dA-ut,ut,0),lt.wnext=ut,lt.whave=lt.wsize):(lt.wnext+=Cr,lt.wnext===lt.wsize&&(lt.wnext=0),lt.whave>>8&255,dA.check=Y(dA.check,re,2,0),Oe=Fe=0,dA.mode=2;break}if(dA.flags=0,dA.head&&(dA.head.done=!1),!(1&dA.wrap)||(((255&Fe)<<8)+(Fe>>8))%31){te.msg="incorrect header check",dA.mode=30;break}if((15&Fe)!=8){te.msg="unknown compression method",dA.mode=30;break}if(Oe-=4,gA=8+(15&(Fe>>>=4)),dA.wbits===0)dA.wbits=gA;else if(gA>dA.wbits){te.msg="invalid window size",dA.mode=30;break}dA.dmax=1<>8&1),512&dA.flags&&(re[0]=255&Fe,re[1]=Fe>>>8&255,dA.check=Y(dA.check,re,2,0)),Oe=Fe=0,dA.mode=3;case 3:for(;Oe<32;){if(Jt===0)break A;Jt--,Fe+=ut[lt++]<>>8&255,re[2]=Fe>>>16&255,re[3]=Fe>>>24&255,dA.check=Y(dA.check,re,4,0)),Oe=Fe=0,dA.mode=4;case 4:for(;Oe<16;){if(Jt===0)break A;Jt--,Fe+=ut[lt++]<>8),512&dA.flags&&(re[0]=255&Fe,re[1]=Fe>>>8&255,dA.check=Y(dA.check,re,2,0)),Oe=Fe=0,dA.mode=5;case 5:if(1024&dA.flags){for(;Oe<16;){if(Jt===0)break A;Jt--,Fe+=ut[lt++]<>>8&255,dA.check=Y(dA.check,re,2,0)),Oe=Fe=0}else dA.head&&(dA.head.extra=null);dA.mode=6;case 6:if(1024&dA.flags&&(Jt<(ti=dA.length)&&(ti=Jt),ti&&(dA.head&&(gA=dA.head.extra_len-dA.length,dA.head.extra||(dA.head.extra=new Array(dA.head.extra_len)),N.arraySet(dA.head.extra,ut,lt,ti,gA)),512&dA.flags&&(dA.check=Y(dA.check,ut,ti,lt)),Jt-=ti,lt+=ti,dA.length-=ti),dA.length))break A;dA.length=0,dA.mode=7;case 7:if(2048&dA.flags){if(Jt===0)break A;for(ti=0;gA=ut[lt+ti++],dA.head&&gA&&dA.length<65536&&(dA.head.name+=String.fromCharCode(gA)),gA&&ti>9&1,dA.head.done=!0),te.adler=dA.check=0,dA.mode=12;break;case 10:for(;Oe<32;){if(Jt===0)break A;Jt--,Fe+=ut[lt++]<>>=7&Oe,Oe-=7&Oe,dA.mode=27;break}for(;Oe<3;){if(Jt===0)break A;Jt--,Fe+=ut[lt++]<>>=1)){case 0:dA.mode=14;break;case 1:if(si(dA),dA.mode=20,je!==6)break;Fe>>>=2,Oe-=2;break A;case 2:dA.mode=17;break;case 3:te.msg="invalid block type",dA.mode=30}Fe>>>=2,Oe-=2;break;case 14:for(Fe>>>=7&Oe,Oe-=7&Oe;Oe<32;){if(Jt===0)break A;Jt--,Fe+=ut[lt++]<>>16^65535)){te.msg="invalid stored block lengths",dA.mode=30;break}if(dA.length=65535&Fe,Oe=Fe=0,dA.mode=15,je===6)break A;case 15:dA.mode=16;case 16:if(ti=dA.length){if(Jt>>=5,Oe-=5,dA.ndist=1+(31&Fe),Fe>>>=5,Oe-=5,dA.ncode=4+(15&Fe),Fe>>>=4,Oe-=4,286>>=3,Oe-=3}for(;dA.have<19;)dA.lens[LA[dA.have++]]=0;if(dA.lencode=dA.lendyn,dA.lenbits=7,vA={bits:dA.lenbits},pA=IA(0,dA.lens,0,19,dA.lencode,0,dA.work,vA),dA.lenbits=vA.bits,pA){te.msg="invalid code lengths set",dA.mode=30;break}dA.have=0,dA.mode=19;case 19:for(;dA.have>>16&255,Xa=65535&UA,!((Bo=UA>>>24)<=Oe);){if(Jt===0)break A;Jt--,Fe+=ut[lt++]<>>=Bo,Oe-=Bo,dA.lens[dA.have++]=Xa;else{if(Xa===16){for(Ae=Bo+2;Oe>>=Bo,Oe-=Bo,dA.have===0){te.msg="invalid bit length repeat",dA.mode=30;break}gA=dA.lens[dA.have-1],ti=3+(3&Fe),Fe>>>=2,Oe-=2}else if(Xa===17){for(Ae=Bo+3;Oe>>=Bo)),Fe>>>=3,Oe-=3}else{for(Ae=Bo+7;Oe>>=Bo)),Fe>>>=7,Oe-=7}if(dA.have+ti>dA.nlen+dA.ndist){te.msg="invalid bit length repeat",dA.mode=30;break}for(;ti--;)dA.lens[dA.have++]=gA}}if(dA.mode===30)break;if(dA.lens[256]===0){te.msg="invalid code -- missing end-of-block",dA.mode=30;break}if(dA.lenbits=9,vA={bits:dA.lenbits},pA=IA(BA,dA.lens,0,dA.nlen,dA.lencode,0,dA.work,vA),dA.lenbits=vA.bits,pA){te.msg="invalid literal/lengths set",dA.mode=30;break}if(dA.distbits=6,dA.distcode=dA.distdyn,vA={bits:dA.distbits},pA=IA(mA,dA.lens,dA.nlen,dA.ndist,dA.distcode,0,dA.work,vA),dA.distbits=vA.bits,pA){te.msg="invalid distances set",dA.mode=30;break}if(dA.mode=20,je===6)break A;case 20:dA.mode=21;case 21:if(6<=Jt&&258<=mo){te.next_out=Co,te.avail_out=mo,te.next_in=lt,te.avail_in=Jt,dA.hold=Fe,dA.bits=Oe,j(te,Zo),Co=te.next_out,Cr=te.output,mo=te.avail_out,lt=te.next_in,ut=te.input,Jt=te.avail_in,Fe=dA.hold,Oe=dA.bits,dA.mode===12&&(dA.back=-1);break}for(dA.back=0;Da=(UA=dA.lencode[Fe&(1<>>16&255,Xa=65535&UA,!((Bo=UA>>>24)<=Oe);){if(Jt===0)break A;Jt--,Fe+=ut[lt++]<>ia)])>>>16&255,Xa=65535&UA,!(ia+(Bo=UA>>>24)<=Oe);){if(Jt===0)break A;Jt--,Fe+=ut[lt++]<>>=ia,Oe-=ia,dA.back+=ia}if(Fe>>>=Bo,Oe-=Bo,dA.back+=Bo,dA.length=Xa,Da===0){dA.mode=26;break}if(32&Da){dA.back=-1,dA.mode=12;break}if(64&Da){te.msg="invalid literal/length code",dA.mode=30;break}dA.extra=15&Da,dA.mode=22;case 22:if(dA.extra){for(Ae=dA.extra;Oe>>=dA.extra,Oe-=dA.extra,dA.back+=dA.extra}dA.was=dA.length,dA.mode=23;case 23:for(;Da=(UA=dA.distcode[Fe&(1<>>16&255,Xa=65535&UA,!((Bo=UA>>>24)<=Oe);){if(Jt===0)break A;Jt--,Fe+=ut[lt++]<>ia)])>>>16&255,Xa=65535&UA,!(ia+(Bo=UA>>>24)<=Oe);){if(Jt===0)break A;Jt--,Fe+=ut[lt++]<>>=ia,Oe-=ia,dA.back+=ia}if(Fe>>>=Bo,Oe-=Bo,dA.back+=Bo,64&Da){te.msg="invalid distance code",dA.mode=30;break}dA.offset=Xa,dA.extra=15&Da,dA.mode=24;case 24:if(dA.extra){for(Ae=dA.extra;Oe>>=dA.extra,Oe-=dA.extra,dA.back+=dA.extra}if(dA.offset>dA.dmax){te.msg="invalid distance too far back",dA.mode=30;break}dA.mode=25;case 25:if(mo===0)break A;if(ti=Zo-mo,dA.offset>ti){if((ti=dA.offset-ti)>dA.whave&&dA.sane){te.msg="invalid distance too far back",dA.mode=30;break}ti>dA.wnext?(ti-=dA.wnext,_n=dA.wsize-ti):_n=dA.wnext-ti,ti>dA.length&&(ti=dA.length),Eg=dA.window}else Eg=Cr,_n=Co-dA.offset,ti=dA.length;for(moeo?(Yt=_n[Eg+Se[je]],si=Oe[xs+Se[je]]):(Yt=96,si=0),at=1<>Co)+(jt-=at)]=to<<24|Yt<<16|si,jt!==0;);for(at=1<>=1;if(at!==0?(Fe&=at-1,Fe+=at):Fe=0,je++,--Zo[te]==0){if(te===ut)break;te=mA[_A+Se[je]]}if(Cr{const j=new Uint8Array(Y).slice(4);let IA;try{IA=ua.inflate(j,{to:"string"})}catch(BA){console.error("inflate error",BA)}return IA})(C.data):function(Y){const j=new Uint8Array(Y);let IA="",BA=0;const{length:mA}=j;for(;BA0)for(let Re=0;Re{var D;const{uplinkData:N,canResend:O,resolve:Y,reject:j,timeout:IA}=E;if(O){this._pendingRequests.set(h,{resolve:Y,reject:j,timestamp:Date.now(),uplinkData:N,timeout:IA,canResend:O});const BA=this._isBinarySupported?ls(N).buffer:N;(D=this._socketAdapter)===null||D===void 0||D.send(BA)}else this._pendingRequests.delete(h)})}_onConnect(C){const{socketId:E,event:h={}}=C||{};this._connectionId=E,this._connectionEstablishedTime=Date.now();const D=Date.now()-this._connectionStartTime,N=`${Ye}.onConnect cost:${D} ms. socketID:${E} res:${JSON.stringify(h)}`;if(this._ssoLog({method:"onConnect",message:N}),this._checkPendingRequestsAndResend(),this._sendHeartbeatIfReady(),this._isReconnecting){const O=`${Ye}.reconnect success`;this._ssoLog({method:"reconnectSuccess",message:O}),pn.emitInnerEvent(Ce.RECONNECTED),this._isReconnecting=!1}this._resetReconnectDelay(),this._handleConnectStateChange({state:oi,shouldEmitEvent:!0,shouldAttemptReconnect:!1})}_sendAck(C){const E=Ba({servcmd:"openim.ws_msg_push_ack",data:{SessionData:C}});this.sendPacket(E)}_executeScheduledTaskIfReady(){return et(this,void 0,void 0,function*(){this._clearTimeoutRequest(),this._sendHeartbeatIfReady()})}_canSendHeartbeat(){var C;return((C=this._socketAdapter)===null||C===void 0?void 0:C.isConnected())&&Date.now()>=this._nextHeartbeatAt&&!this._isHeartbeatInProgress}_sendHeartbeat(){return et(this,void 0,void 0,function*(){var C;const E=Ba({servcmd:"heartbeat.alive",data:{}});try{const h=`${E.head.seq}${E.head.servcmd}`;yield this.sendPacket(E,{requestId:h,timeout:3e3})}catch(h){const D=(C=Fo.get("netWorkMonitor"))===null||C===void 0?void 0:C.isNetworkOnline,N=`${Ye}.sendHeartbeat failed. isNetWorkOnline:${D} error: ${An(h)}`;this._ssoLog({method:"sendHeartbeatError",message:N}),this._handleConnectStateChange({state:Kt,shouldEmitEvent:!0,shouldAttemptReconnect:!0})}})}_sendHeartbeatIfReady(){return et(this,void 0,void 0,function*(){this._canSendHeartbeat()&&(this._isHeartbeatInProgress=!0,yield this._sendHeartbeat(),this._isHeartbeatInProgress=!1)})}_updateHeartbeatTime(){this._nextHeartbeatAt=Ur?Date.now()+5e3:Date.now()+1e4}_handleNetworkStatusChange(C){const E=`${Ye}.networkStatusChange ${JSON.stringify(C)}`;this._ssoLog({method:"networkStatusChange",message:E});const{isNetworkOnline:h,networkType:D}=C;h&&D!=="none"?this._handleConnectStateChange({state:oi,shouldEmitEvent:!1,shouldAttemptReconnect:!0,reason:ks}):this._handleConnectStateChange({state:Kt,shouldEmitEvent:!1,shouldAttemptReconnect:!0,reason:ks})}isPrivateNetWork(){const C=Fo.get("instance")||{};return C.proxyServer&&!C.fileDownloadProxy}_handleConnectStateChange(C){const{state:E,shouldAttemptReconnect:h,shouldEmitEvent:D,reason:N}=C,O=`${Ye}._handleConnectStateChange currentConnectState: ${this._currentConnectState} shouldAttemptReconnect: ${h} shouldEmitEvent: ${D} reason: ${N}`;this._currentConnectState!==E&&(this._ssoLog({method:"handleConnectStateChange",message:O}),D&&(Bt.info("_handleConnectStateChange",` from ${this._currentConnectState} to ${E}`),pn.emitOuterEvent("netStateChange",{name:"netStateChange",data:{state:E}}),this._currentConnectState=E,E===Kt&&pn.emitInnerEvent(Ce.SOCKET_DISCONNECTED)),h&&(this._resetReconnectDelay(),fn.addTask({id:ii,intervalMs:this._intendedDelay,callback:this._scheduleReconnectWithBackoff,context:this})))}_handleActivityStatusChange(C){var E,h;const D=(h=(E=this._socketAdapter)===null||E===void 0?void 0:E._ws)===null||h===void 0?void 0:h.readyState,N=`${Ye}.activityStatusChange ${JSON.stringify(C)} readyState: ${D}`;Bt.debug("activityStatusChange",N),D===3&&this._handleConnectStateChange({state:Kt,shouldEmitEvent:!0,shouldAttemptReconnect:!0,reason:Zr})}_resetReconnectDelay(){var C;Bt.debug(`${Ye}._resetReconnectDelay`),fn.removeTask(ii);const E=(C=Fo.get("activityMonitor"))===null||C===void 0?void 0:C.isActive;this._intendedDelay=E?ro:1e3}_scheduleReconnectWithBackoff(){var C;const E=(C=Fo.get("activityMonitor"))===null||C===void 0?void 0:C.isActive;this._intendedDelay=E?Math.min(5e3,Math.max(ro,1.5*this._intendedDelay)):Math.min(3e5,Math.max(1e3,1.5*this._intendedDelay));const h=new Date().toTimeString().slice(0,8),D=`${Ye}.scheduleReconnectWithBackoff timeStr: ${h} intendedDelay: ${this._intendedDelay}`;Bt.debug(D),this.reconnect(),fn.updateTaskInterval(ii,this._intendedDelay)}_ssoLog(C){const{method:E,message:h}=C;Bt.info(E,h)}_diagnose(){this.isPrivateNetWork()||(this._lastDiagnoseAt=Date.now(),function(C){et(this,void 0,void 0,function*(){const E=C.split("/")[2];if(!E.startsWith("ws"))return;const h=`https://${E}/v3/netcheck/getconninfo?${C.slice(C.indexOf("info?")+5)}&reqtime=${Date.now()}`;try{yield $t({method:"GET",url:h,data:{}})}catch(D){Bt.warn("diagnoseBySSO",`diagnoseBySSO failed. error:${D.message}`)}})}(this._url),function(C){et(this,void 0,void 0,function*(){const E=`https://boce-cdn.my-imcloud.com/v3/netcheck/getconninfo?${C.slice(C.indexOf("info?")+5)}&reqtime=${Date.now()}`;try{yield $t({method:"GET",url:E,data:{}})}catch(h){Bt.warn(`diagnoseByCDN', 'diagnoseByCDN failed. error:${h.message}`)}})}(this._url),this._beforeSendInterceptors=[])}_clearTimeoutRequest(){for(const[C,E]of this._pendingRequests.entries()){const{reject:h,timestamp:D,timeout:N}=E;Date.now()-D>=N&&(this._pendingRequests.delete(C),Date.now()-this._lastDiagnoseAt>=3e4&&this._diagnose(),h({errorCode:Qn,errorInfo:"NETWORK_TIMEOUT",data:{requestId:C}}))}}_updateIsBinarySupported(){var C;if(!((C=Fo.get("instance"))===null||C===void 0)&&C.devMode)return void(this._isBinarySupported=!1);const E=Lo();if((ai||Je&&E==="windows"||Kn)&&(this._isBinarySupported=!1),Ur){const{uniRuntimeVersion:h=""}=Ji.getSystemInfoSync();(function(D){const N=D.split(".").map(Number),[O=0,Y=0,j=0]=N;return O>2||!(O<2)&&(Y>2||!(Y<2)&&j>=6)})(h)||(this._isBinarySupported=!1)}}_isCompressedData(C){const E=new Uint8Array(C);return E[0]===67&&E[1]===79&&E[2]===77&&E[3]===80}};const ZA={init:function(C){Fo.set("instance",C),II.init()},destroy:function(){II.dispose(),Fo.clear(),fn.dispose()},notificationCenter:pn,channel:II,store:Fo,ssoLog:Bt,utils:Es,common:EA,constants:qe},Ag=C=>typeof C=="function";function cI(C,E,h){const D=h||[];if(!C||!E)return!1;const N=Object.keys(C).filter(Y=>!D.includes(Y)),O=Object.keys(E).filter(Y=>!D.includes(Y));return N.length===O.length&&N.every(Y=>!!E.hasOwnProperty(Y)&&(typeof C[Y]=="object"&&C[Y]!==null?cI(C[Y],E[Y],h):C[Y]===E[Y]))}var Bs;(function(C){C.SDK_READY="sdkStateReady",C.SDK_NOT_READY="sdkStateNotReady",C.SDK_DESTROY="sdkDestroy",C.MESSAGE_RECEIVED="onMessageReceived",C.ROOM_CUSTOM_DATA_RECEIVED="onRoomCustomDataReceived",C.MESSAGE_MODIFIED="onMessageModified",C.MESSAGE_REVOKED="onMessageRevoked",C.MESSAGE_READ_BY_PEER="onMessageReadByPeer",C.MESSAGE_READ_RECEIPT_RECEIVED="onMessageReadReceiptReceived",C.MESSAGE_EXTENSIONS_UPDATED="onMessageExtensionsUpdated",C.MESSAGE_EXTENSIONS_DELETED="onMessageExtensionsDeleted",C.MESSAGE_REACTIONS_UPDATED="onMessageReactionsUpdated",C.CONVERSATION_LIST_UPDATED="onConversationListUpdated",C.TOTAL_UNREAD_MESSAGE_COUNT_UPDATED="onTotalUnreadMessageCountUpdated",C.CONVERSATION_GROUP_LIST_UPDATED="onConversationGroupListUpdated",C.CONVERSATION_IN_GROUP_UPDATED="onConversationInGroupUpdated",C.GROUP_LIST_UPDATED="onGroupListUpdated",C.GROUP_ATTRIBUTES_UPDATED="groupAttributesUpdated",C.GROUP_COUNTER_UPDATED="onGroupCounterUpdated",C.TOPIC_CREATED="onTopicCreated",C.TOPIC_DELETED="onTopicDeleted",C.TOPIC_UPDATED="onTopicUpdated",C.PROFILE_UPDATED="onProfileUpdated",C.USER_STATUS_UPDATED="onUserStatusUpdated",C.BLACKLIST_UPDATED="blacklistUpdated",C.FRIEND_LIST_UPDATED="onFriendListUpdated",C.FRIEND_GROUP_LIST_UPDATED="onFriendGroupListUpdated",C.FRIEND_APPLICATION_LIST_UPDATED="onFriendApplicationListUpdated",C.MY_FOLLOWERS_LIST_UPDATED="onMyFollowersListUpdated",C.MY_FOLLOWING_LIST_UPDATED="onMyFollowingListUpdated",C.MUTUAL_FOLLOWERS_LIST_UPDATED="onMutualFollowersListUpdated",C.KICKED_OUT="kickedOut",C.ERROR="error",C.NET_STATE_CHANGE="netStateChange",C.ALL_RECEIVE_MESSAGE_OPT_UPDATED="onAllReceiveMessageOptUpdated",C.SERVER_CONFIG_UPDATED="onServerConfigUpdated",C.PINNED_GROUP_MESSAGE_UPDATED="onPinnedGroupMessageUpdated",C.WEB_PUSH_MESSAGE_RECEIVED="onWebPushMessageReceived",C.GROUP_ONLINE_MEMBER_COUNT_CHANGED="onGroupOnlineMemberCountChanged",C.RICH_STATUS_CHANGED="onRichStatusChanged"})(Bs||(Bs={}));var eg,kr=Bs;(function(C){C.LOGOUT="logout",C.DESTROY="destroy",C.CLOUD_CONFIG_UPDATE="cloud_config_update",C.PROFILE_UPDATE="profile_updated",C.ERROR="error",C.RECONNECTED="reconnected",C.FORCE_OFFLINE="im_open_status.stat_forceoffline",C.COMMERCIAL_CONFIG_PUSH="im_sdk_config_mgr.push_imsdk_purchase_bitsv2",C.OVERLOAD_PUSH="OverLoadPush.notify2",C.NEW_MESSAGE="new_message",C.MESSAGE_PUSH="im_open_push.msg_push",C.MESSAGE_DELETED="message_deleted",C.MESSAGE_REVOKED="message_revoked",C.MESSAGE_MODIFIED="message_modified",C.SOCKET_DISCONNECTED="socket_disconnected",C.CONVERSATION_UPDATED="conversation_updated",C.TOPIC_MESSAGE_DELETED="topic_message_deleted",C.TOPIC_MESSAGE_REVOKED="topic_message_revoked",C.TOPIC_MESSAGE_MODIFIED="topic_message_modified",C.TOPIC_NEW_MESSAGE="topic_new_message",C.QUALITY_STAT="quality_stat",C.SYNC_CONVERSATION_LIST="sync_conversation_list",C.HISTORY_MESSAGE_FETCHED="history_message_fetched"})(eg||(eg={}));var EI,Gt=eg;(function(C){C.NEW_INVITATION_RECEIVED="newInvitationReceived",C.INVITEE_ACCEPTED="ts_invitee_accepted",C.INVITEE_REJECTED="ts_invitee_rejected",C.INVITATION_CANCELLED="ts_invitation_cancelled",C.INVITATION_TIMEOUT="ts_invitation_timeout",C.INVITATION_MODIFIED="ts_invitation_modified"})(EI||(EI={}));var Dl=EI;const xI=Object.assign({},{KICKED_OUT_MULT_ACCOUNT:"multipleAccount",KICKED_OUT_MULT_DEVICE:"multipleDevice",KICKED_OUT_USERSIG_EXPIRED:"userSigExpired",KICKED_OUT_REST_API:"REST_API_Kick"}),_s={MSG_TEXT:"TIMTextElem",MSG_IMAGE:"TIMImageElem",MSG_AUDIO:"TIMSoundElem",MSG_FILE:"TIMFileElem",MSG_FACE:"TIMFaceElem",MSG_VIDEO:"TIMVideoFileElem",MSG_LOCATION:"TIMLocationElem",MSG_GRP_TIP:"TIMGroupTipElem",MSG_GRP_SYS_NOTICE:"TIMGroupSystemNoticeElem",MSG_CUSTOM:"TIMCustomElem",MSG_MERGER:"TIMRelayElem",MSG_STREAM:"TIMStreamElem"};var tg;(function(C){C.UNSENT="unSend",C.SUCCESS="success",C.FAIL="fail"})(tg||(tg={}));const ka={modify:Gt.MESSAGE_MODIFIED,delete:Gt.MESSAGE_DELETED,revoke:Gt.MESSAGE_REVOKED};var wc;(function(C){C[C.FORWARD=0]="FORWARD",C[C.BACKWARD=1]="BACKWARD"})(wc||(wc={}));const lE=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},_s),{MSG_PRIORITY_HIGH:"High",MSG_PRIORITY_NORMAL:"Normal",MSG_PRIORITY_LOW:"Low",MSG_PRIORITY_LOWEST:"Lowest"}),{RECEIVE_WITH_OFFLINE_PUSH_EXCEPT_AT:"AcceptNotNotifyExceptAt",NOT_RECEIVE_OFFLINE_PUSH_EXCEPT_AT:"AcceptNotNotifyExceptAt",NOT_RECEIVE_MSG_EXCEPT_AT:"NotReceiveMsgExceptAt",MSG_AT_ALL:"__kImSDK_MesssageAtALL__"}),{MSG_REMIND_ACPT_AND_NOTE:"AcceptAndNotify",MSG_REMIND_ACPT_NOT_NOTE:"AcceptNotNotify",MSG_REMIND_DISCARD:"Discard"}),{MessageStatus:tg,Direction:wc}),qa={[ka.modify]:Gt.TOPIC_MESSAGE_MODIFIED,[ka.delete]:Gt.TOPIC_MESSAGE_DELETED,[ka.revoke]:Gt.TOPIC_MESSAGE_REVOKED},CE={GENDER_UNKNOWN:"Gender_Type_Unknown",GENDER_FEMALE:"Gender_Type_Female",GENDER_MALE:"Gender_Type_Male",USER_STATUS_UNKNOWN:0,USER_STATUS_ONLINE:1,USER_STATUS_OFFLINE:2,USER_STATUS_UNLOGINED:3,USER_NOT_FOUND:"@TLS#NOT_FOUND"},yC=Object.assign({},CE),us={CONV_C2C:"C2C",CONV_GROUP:"GROUP",CONV_TOPIC:"TOPIC",CONV_SYSTEM:"@TIM#SYSTEM"},lI=Object.assign(Object.assign(Object.assign(Object.assign({},us),{CONV_AT_ME:1,CONV_AT_ALL:2,CONV_AT_ALL_AT_ME:3}),{CONV_MARK_TYPE_STAR:1,CONV_MARK_TYPE_UNREAD:2,CONV_MARK_TYPE_FOLD:4,CONV_MARK_TYPE_HIDE:8}),{READ_ALL_C2C_MSG:"readAllC2CMessage",READ_ALL_GROUP_MSG:"readAllGroupMessage",READ_ALL_MSG:"readAllMessage"}),ig=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},{SNS_TYPE_NO_RELATION:"CheckResult_Type_NoRelation",SNS_TYPE_A_WITH_B:"CheckResult_Type_AWithB",SNS_TYPE_B_WITH_A:"CheckResult_Type_BWithA",SNS_TYPE_BOTH_WAY:"CheckResult_Type_BothWay"}),{ALLOW_TYPE_ALLOW_ANY:"AllowType_Type_AllowAny",ALLOW_TYPE_NEED_CONFIRM:"AllowType_Type_NeedConfirm",ALLOW_TYPE_DENY_ANY:"AllowType_Type_DenyAny"}),{SNS_ADD_TYPE_SINGLE:"Add_Type_Single",SNS_ADD_TYPE_BOTH:"Add_Type_Both"}),{SNS_DELETE_TYPE_SINGLE:"Delete_Type_Single",SNS_DELETE_TYPE_BOTH:"Delete_Type_Both"}),{SNS_APPLICATION_TYPE_BOTH:"Pendency_Type_Both",SNS_APPLICATION_SENT_TO_ME:"Pendency_Type_ComeIn",SNS_APPLICATION_SENT_BY_ME:"Pendency_Type_SendOut",SNS_APPLICATION_AGREE:"Response_Action_Agree",SNS_APPLICATION_AGREE_AND_ADD:"Response_Action_AgreeAndAdd"}),{SNS_CHECK_TYPE_BOTH:"CheckResult_Type_Both",SNS_CHECK_TYPE_SINGLE:"CheckResult_Type_Single"}),{FORBID_TYPE_NONE:"AdminForbid_Type_None",FORBID_TYPE_SEND_OUT:"AdminForbid_Type_SendOut"}),yl={GRP_WORK:"Private",GRP_PUBLIC:"Public",GRP_MEETING:"ChatRoom",GRP_AVCHATROOM:"AVChatRoom",GRP_COMMUNITY:"Community",GRP_ROOM:"Room",GRP_LIVE:"Live"},_a={COMMUNITY:"@TGS#_",TOPIC:"@TOPIC#_"},Qs={JOINED:1,QUITTED:2,KICKED:3,ADMIN_SET:4,ADMIN_CANCELED:5,GROUP_PROFILE_UPDATED:6,GROUP_MEMBER_PROFILE_UPDATED:7,TOPIC_PROFILE_UPDATED:8},Rl=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},yl),{GRP_MBR_ROLE_OWNER:"Owner",GRP_MBR_ROLE_ADMIN:"Admin",GRP_MBR_ROLE_MEMBER:"Member",GRP_MBR_ROLE_CUSTOM:"Custom"}),{GRP_TIP_MBR_JOIN:1,GRP_TIP_MBR_QUIT:2,GRP_TIP_MBR_KICKED_OUT:3,GRP_TIP_MBR_SET_ADMIN:4,GRP_TIP_MBR_CANCELED_ADMIN:5,GRP_TIP_GRP_PROFILE_UPDATED:6,GRP_TIP_MBR_PROFILE_UPDATED:7,GRP_TIP_BAN_AVCHATROOM_MEMBER:10,GRP_TIP_UNBAN_AVCHATROOM_MEMBER:11}),{JOIN_OPTIONS_FREE_ACCESS:"FreeAccess",JOIN_OPTIONS_NEED_PERMISSION:"NeedPermission",JOIN_OPTIONS_DISABLE_APPLY:"DisableApply",JOIN_STATUS_SUCCESS:"JoinedSuccess",JOIN_STATUS_ALREADY_IN_GROUP:"AlreadyInGroup",JOIN_STATUS_WAIT_APPROVAL:"WaitAdminApproval"}),{INVITE_OPTIONS_DISABLE_INVITE:"DisableInvite",INVITE_OPTIONS_NEED_PERMISSION:"NeedPermission",INVITE_OPTIONS_FREE_ACCESS:"FreeAccess"}),{GRP_PROFILE_OWNER_ID:"ownerID",GRP_PROFILE_CREATE_TIME:"createTime",GRP_PROFILE_LAST_INFO_TIME:"lastInfoTime",GRP_PROFILE_MEMBER_NUM:"memberNum",GRP_PROFILE_MAX_MEMBER_NUM:"maxMemberNum",GRP_PROFILE_JOIN_OPTION:"joinOption",GRP_PROFILE_INVITE_OPTION:"inviteOption",GRP_PROFILE_INTRODUCTION:"introduction",GRP_PROFILE_NOTIFICATION:"notification",GRP_PROFILE_MUTE_ALL_MBRS:"muteAllMembers"}),{GROUP_ID_PREFIX:_a,GROUP_TIPS_OPERATION_TYPE:Qs}),YI={IOS_OFFLINE_PUSH_NO_SOUND:"push.no_sound",IOS_OFFLINE_PUSH_DEFAULT_SOUND:"default"},vo=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},xI),lE),yC),lI),ig),Rl),YI),{NET_STATE_CONNECTING:"connecting",NET_STATE_DISCONNECTED:"disconnected",NET_STATE_CONNECTED:"connected"}),Qa={NO_SDKAPPID:2e3,NO_TINYID:2022,NO_A2KEY:2023,USER_NOT_LOGGED_IN:2024,REPEAT_LOGIN:2025,MSG_SEND_FAIL:2100,MSG_SEND_FAIL_NOT_IN_AV:2101,MSG_SEND_GRP_WITH_TOPIC_FAIL:2115,MSG_INSTANCE_REQUIRED:2105,MSG_INVALID_CONV_TYPE:2106,MSG_REVOKE_FAIL:2110,MSG_DELETE_FAIL:2111,MSG_UNREAD_ALL_FAIL:2112,READ_RECEIPT_MSG_LIST_EMPTY:2114,CANNOT_DELETE_GRP_SYSTEM_NOTICE:2116,NOT_MY_FRIEND:2700,NETWORK_ERROR:2800,NETWORK_TIMEOUT:2801,NO_NETWORK:2805,UNCAUGHT_ERROR:2903,INVALID_OPERATION:2905,SDK_IS_NOT_READY:2999,LOGGING_IN:3e3,LOGIN_FAILED:3001,KICKED_OUT_MULT_DEVICE:3002,KICKED_OUT_MULT_ACCOUNT:3003,KICKED_OUT_USERSIG_EXPIRED:3004,LOGGED_OUT:3005,KICKED_OUT_REST_API:3006,NO_USE:3122,OPTIONS_IS_EMPTY:3153,MSG_A2KEY_EXPIRED:20002,ACCOUNT_A2KEY_EXPIRED:70001,HELLO_ANSWER_KICKED_OUT:1002,OPEN_SERVICE_OVERLOAD_ERROR:60022},BE={BASIC:"1",STANDARD:"2",PROFESSIONAL:"3",NODE:"4"},cn={SYNC_SERVER_INFO_AFTER_RE_ONLINE:"sync-server-info-after-re-online",SYNC_SERVER_INFO_AFTER_LOGIN:"sync-server-info-after-login",RECEIVE_C2C_NEW_MESSAGE:"receive-c2c-new-message",RECEIVE_GROUP_NEW_MESSAGE:"receive-group-new-message",RECEIVE_GROUP_TIPS_NOTIFICATION:"receive-group-tips-notification"},kt={USER_STATUS_UPDATE:"user-status-update",CONVERSATION_RECOVER:"conversation-recover",HISTORY_MESSAGE_RECOVER:"history-message-recover",BLACKLIST_RECOVER:"blacklist-recover",FRIEND_RECOVER:"friend-recover",GROUP_ATTRIBUTE_CACHE_CLEAR:"group-attribute-cache-clear",UNREAD_MESSAGE_RECOVER:"unread-message-recover",HANDLE_NEW_MESSAGE:"handle-new-message",HANDLE_CONVERSATION_PROFILE_UPDATED:"handle-conversation-profile-updated",COMMERCIAL_CONFIG_UPDATE:"commercial-config-update",UNREAD_MESSAGE_SYNC:"unread-message-sync",FRIEND_AND_BLACKLIST_SYNC:"friend-and-blacklist-sync",SIGNALING_MESSAGE_RECOVER:"signaling-message-recover",GROUP_LIST_SYNC:"group-list-sync",CONVERSATION_LIST_SYNC:"conversation-list-sync",USER_PROFILE_SYNC:"user-profile-sync",CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED:"conversation-update-after-unread-sync-finished",CONVERSATION_UPDATE_AFTER_GROUP_LIST_SYNC_FINISHED:"conversation-update-after-group-list-sync-finished",HANDLE_C2C_NEW_MESSAGE:"handle-c2c-new-message",HANDLE_GROUP_NEW_MESSAGE:"handle-group-new-message",CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE:"create-or-update-conversation-by-receive-new-message",HANDLE_GROUP_TIPS_FROM_SYNC_UNREAD:"handle-group-tips-from-sync-unread",HANDLE_C2C_REVOKED_MESSAGE_FROM_SYNC_UNREAD:"handle-c2c-revoked-message-from-sync-unread",GROUP_REVOKED_NOTICE_RECOVER:"group-revoked-notice-recover",CLOUD_CONFIG_SYNC:"cloud-config-sync",UPDATE_GROUP_NEXT_SEQUENCE:"update-group-next-sequence",EMIT_C2C_MESSAGE_EVENT:"emit-c2c-message-event",EMIT_GROUP_MESSAGE_EVENT:"emit-group-message-event",CONVERSATION_GROUP_LIST_SYNC:"conversation-group-list-sync",CONVERSATION_GROUP_UPDATE:"conversation-group-update",UPDATE_TOPIC_AFTER_UNREAD_SYNC_FINISHED:"update-topic-after-unread-sync-finished",UPDATE_TOPIC_BY_RECEIVE_NEW_MESSAGE:"update-topic-by-received-new-message",TOPIC_REQUEST_INFO_RESET:"topic-request-info-reset",QUALITY_REPORT:"quality-report",GROUP_TIPS_RECOVER:"group-tips-recover",HANDLE_GROUP_TIPS_NOTIFICATION:"handle-group-tips-notification",C2C_HISTORY_MESSAGE_RECOVER:"c2c-history-message-recover",FRIEND_APPLICATION_LIST_RECOVER:"friend-application-list-recover",EMIT_GROUP_TIPS_EVENT:"emit-group-tips-event",STREAM_MESSAGE_RECOVER:"stream-message-recover"},Gn={[cn.SYNC_SERVER_INFO_AFTER_RE_ONLINE]:[{stepId:kt.USER_STATUS_UPDATE},{stepId:kt.GROUP_ATTRIBUTE_CACHE_CLEAR},{stepId:kt.UNREAD_MESSAGE_SYNC,dependency:kt.C2C_HISTORY_MESSAGE_RECOVER},{stepId:kt.CONVERSATION_RECOVER},{stepId:kt.HISTORY_MESSAGE_RECOVER,dependency:kt.CONVERSATION_RECOVER},{stepId:kt.BLACKLIST_RECOVER},{stepId:kt.FRIEND_RECOVER},{stepId:kt.FRIEND_APPLICATION_LIST_RECOVER},{stepId:kt.GROUP_REVOKED_NOTICE_RECOVER,dependency:kt.HISTORY_MESSAGE_RECOVER},{stepId:kt.GROUP_TIPS_RECOVER,dependency:kt.HISTORY_MESSAGE_RECOVER},{stepId:kt.TOPIC_REQUEST_INFO_RESET},{stepId:kt.HANDLE_C2C_REVOKED_MESSAGE_FROM_SYNC_UNREAD,dependency:kt.UNREAD_MESSAGE_SYNC},{stepId:kt.HANDLE_GROUP_TIPS_FROM_SYNC_UNREAD,dependency:kt.UNREAD_MESSAGE_SYNC},{stepId:kt.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED,dependency:[kt.UNREAD_MESSAGE_SYNC,kt.CONVERSATION_RECOVER]},{stepId:kt.EMIT_C2C_MESSAGE_EVENT,dependency:[kt.UNREAD_MESSAGE_SYNC,kt.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED],skipIfDependencyMissing:!1},{stepId:kt.C2C_HISTORY_MESSAGE_RECOVER,dependency:kt.CONVERSATION_RECOVER},{stepId:kt.STREAM_MESSAGE_RECOVER}],[cn.SYNC_SERVER_INFO_AFTER_LOGIN]:[{stepId:kt.COMMERCIAL_CONFIG_UPDATE},{stepId:kt.CLOUD_CONFIG_SYNC},{stepId:kt.USER_PROFILE_SYNC},{stepId:kt.UNREAD_MESSAGE_SYNC},{stepId:kt.FRIEND_AND_BLACKLIST_SYNC},{stepId:kt.GROUP_LIST_SYNC},{stepId:kt.CONVERSATION_LIST_SYNC},{stepId:kt.SIGNALING_MESSAGE_RECOVER,dependency:kt.UNREAD_MESSAGE_SYNC},{stepId:kt.UPDATE_TOPIC_AFTER_UNREAD_SYNC_FINISHED,dependency:[kt.UNREAD_MESSAGE_SYNC]},{stepId:kt.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED,dependency:[kt.UNREAD_MESSAGE_SYNC,kt.CONVERSATION_LIST_SYNC]},{stepId:kt.CONVERSATION_UPDATE_AFTER_GROUP_LIST_SYNC_FINISHED,dependency:[kt.GROUP_LIST_SYNC,kt.CONVERSATION_LIST_SYNC]},{stepId:kt.CONVERSATION_GROUP_LIST_SYNC},{stepId:kt.CONVERSATION_GROUP_UPDATE,dependency:[kt.CONVERSATION_LIST_SYNC,kt.CONVERSATION_GROUP_LIST_SYNC]},{stepId:kt.QUALITY_REPORT}],[cn.RECEIVE_C2C_NEW_MESSAGE]:[{stepId:kt.HANDLE_C2C_NEW_MESSAGE},{stepId:kt.UNREAD_MESSAGE_SYNC},{stepId:kt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,dependency:kt.HANDLE_C2C_NEW_MESSAGE},{stepId:kt.EMIT_C2C_MESSAGE_EVENT,dependency:[kt.HANDLE_C2C_NEW_MESSAGE,kt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE],skipIfDependencyMissing:!1},{stepId:kt.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED,dependency:[kt.UNREAD_MESSAGE_SYNC]}],[cn.RECEIVE_GROUP_NEW_MESSAGE]:[{stepId:kt.HANDLE_GROUP_NEW_MESSAGE},{stepId:kt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,dependency:kt.HANDLE_GROUP_NEW_MESSAGE},{stepId:kt.UPDATE_GROUP_NEXT_SEQUENCE,dependency:kt.HANDLE_GROUP_NEW_MESSAGE},{stepId:kt.UPDATE_TOPIC_BY_RECEIVE_NEW_MESSAGE,dependency:kt.HANDLE_GROUP_NEW_MESSAGE},{stepId:kt.EMIT_GROUP_MESSAGE_EVENT,dependency:[kt.HANDLE_GROUP_NEW_MESSAGE,kt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE],skipIfDependencyMissing:!1}],[cn.RECEIVE_GROUP_TIPS_NOTIFICATION]:[{stepId:kt.HANDLE_GROUP_TIPS_NOTIFICATION},{stepId:kt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,dependency:kt.HANDLE_GROUP_TIPS_NOTIFICATION},{stepId:kt.EMIT_GROUP_TIPS_EVENT,dependency:[kt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,kt.HANDLE_GROUP_TIPS_NOTIFICATION],skipIfDependencyMissing:!1}]},PI={MESSAGE_SEND_SUCCESS_RATE:"messageSendSuccessRate"},Sc={TOTAL_COUNT:"sendMessageTotalCount",SUCCESS_COUNT:"sendMessageSuccessCount",FAILED_COUNT:"sendMessageFailedCount",SEND_COST:"sendMessageCost"},tn=["login","getMyProfile","getUserProfile","updateMyProfile","setSelfStatus","getUserStatus","subscribeUserStatus","unsubscribeUserStatus","modifyMessage","deleteGroupMember","dismissGroup","getGroupMemberList","getGroupOnlineMemberCount","joinGroup","markGroupMemberList","quitGroup","searchCloudMessages","searchCloudGroups","searchCloudGroupMembers","searchCloudUsers","getMyFollowingList","getMyFollowersList","getMutualFollowersList","followUser","unfollowUser","getUserFollowInfo","checkFollowType","getFriendProfile","addFriend","deleteFriend","updateFriend","checkFriend","setFriendApplicationRead","createFriendGroup","deleteFriendGroup","addToFriendGroup","removeFromFriendGroup","renameFriendGroup","changeGroupOwner","createGroup","dismissGroup","getGroupList","getGroupOnlineMemberCount","getGroupProfile","searchGroupByID","updateGroupProfile","handleGroupApplication","deleteGroupAttributes","getGroupAttributes","initGroupAttributes","setGroupAttributes","addGroupMember","deleteGroupMember","getGroupMemberList","getGroupMemberProfile","setGroupMemberMuteTime","setGroupMemberNameCard","setGroupMemberRole","deleteMessage","revokeMessage","setMessageExtensions","getMessageExtensions","deleteMessageExtensions","getMessageList","addMessageReaction","removeMessageReaction","clearHistoryMessage","sendMessageReadReceipt","getMessageReadReceiptList","getGroupMessageReadMemberList","createMergerMessage","invite","accept","cancel","reject","modifyInvitation","deleteConversation","pinConversation","setMessageRead","setAllMessageRead","getConversationList","getTotalUnreadMessageCount","renameConversationGroup","deleteConversationGroup","markConversation","setConversationCustomData","deleteConversationsFromGroup","addConversationsToGroup","createConversationGroup"];var Ml=Object.freeze({__proto__:null,ERROR_CODE:Qa,InnerEvent:Gt,NEED_LOG_API:tn,OuterConstant:vo,OuterEvent:kr,PUSH:YI,QUALITY_METRICS:PI,SDK_EDITION:BE,SDK_INFO:{VERSION:"1.7.3",APPID:537048168},SEND_MESSAGE_STAT:Sc,SignalingEvent:Dl,WEB_PUSH_ACCOUNT_TYPE:1,WORKFLOW_DEFINITIONS:Gn,WORKFLOW_NAME:cn,WORKFLOW_STEP:kt}),ba,da,on;(function(C){C[C.USER_INITIATED=0]="USER_INITIATED",C[C.KICKED_OUT=1]="KICKED_OUT"})(ba||(ba={})),function(C){C[C.multipleAccount=1]="multipleAccount",C[C.multipleDevice=2]="multipleDevice",C[C.restApi=3]="restApi"}(da||(da={})),function(C){C[C.multipleDevice=3002]="multipleDevice",C[C.multipleAccount=3003]="multipleAccount",C[C.usersigExpired=70001]="usersigExpired",C[C.restApi=20002]="restApi"}(on||(on={}));const Xr={[da.multipleAccount]:"multipleAccount",[da.multipleDevice]:"multipleDevice",[da.restApi]:"REST_API_Kick",[on.multipleAccount]:"multipleAccount",[on.multipleDevice]:"multipleDevice",[on.restApi]:"REST_API_Kick",[on.usersigExpired]:"userSigExpired"},wl="login_online_presence_task",{ERROR:bs,DESTROY:vc,FORCE_OFFLINE:CI}=Gt,{KICKED_OUT_MULT_ACCOUNT:uE,KICKED_OUT_MULT_DEVICE:RC,KICKED_OUT_REST_API:Nc,ACCOUNT_A2KEY_EXPIRED:Sl,MSG_A2KEY_EXPIRED:JI}=Qa;class bg{init(){const{notificationCenter:E}=ZA;E.subscribeInnerEvent(CI,this._handleForceOfflineFromServerPush,this),E.subscribeInnerEvent(bs,JI,this._handleForceOfflineFromResponse,this,this._isChatLoginEvent),E.subscribeInnerEvent(bs,Sl,this._handleForceOfflineFromResponse,this,this._isChatLoginEvent),E.subscribeInnerEvent(bs,uE,this._handleForceOfflineFromResponse,this),E.subscribeInnerEvent(bs,RC,this._handleForceOfflineFromResponse,this),E.subscribeInnerEvent(bs,Nc,this._handleForceOfflineFromResponse,this),E.subscribeInnerEvent(vc,this._dispose,this)}_handleForceOfflineFromServerPush(E){var h;if(((h=ZA.store.get("login"))===null||h===void 0?void 0:h.isLoggedIn)===!0){const{EventArray:D=[]}=E?.body||{};this._extractKickedOutMessages(D).forEach(N=>{const{KickoutMsgNotify:{KickType:O,NewInstInfo:Y,Instid:j}}=N;this._isCurrentInstanceKickedOut(j)&&this._processKickedOutReasonInfo({kickedOutReasonCode:O,newInstanceInfo:Y})})}}_extractKickedOutMessages(E){return E.reduce((h,D)=>[...h,...D.C2cNotifyMsgArray||[]],[]).filter(h=>{var D;return this._isKickedOut((D=h?.KickoutMsgNotify)===null||D===void 0?void 0:D.KickType)})}_handleForceOfflineFromResponse(E){const{errorCode:h}=E;this._processKickedOutReasonInfo({kickedOutReasonCode:h})}_processKickedOutReasonInfo(E){return et(this,void 0,void 0,function*(){const{kickedOutReasonCode:h}=E,{ssoLog:D,utils:{safeStringify:N}}=ZA;try{this._logKickedOutEvent(E),this._shouldLogoutAfterKickedOut(h)?yield ZA.login.loginAction.logout(ba.KICKED_OUT):ZA.login.loginAction.handleLogoutCompleted()}catch(O){D.debug("_processKickedOutReasonInfo",` fail ${N(O)}`)}finally{ZA.notificationCenter.emitOuterEvent(kr.KICKED_OUT,{data:{type:Xr[h]},name:kr.KICKED_OUT})}})}_logKickedOutEvent(E){const{kickedOutReasonCode:h,newInstanceInfo:D={}}=E,N=`type:${Xr[h]} newInstanceInfo: ${JSON.stringify(D)}`;ZA.ssoLog.warn("kickedOut",N)}_isKickedOut(E){return[da.multipleAccount,da.multipleDevice,da.restApi].includes(E)}_isChatLoginEvent(E){const{requestHead:h}=E||{};return h?.idtype!==1}_shouldLogoutAfterKickedOut(E){return![on.usersigExpired,da.restApi].includes(E)}_isCurrentInstanceKickedOut(E){const{isLoggedIn:h,statusInstanceId:D}=ZA.store.get("login")||{};return h===!0&&E===D}_dispose(){const{notificationCenter:E}=ZA;E.unSubscribeInnerEvent(CI,this._handleForceOfflineFromServerPush,this),E.unSubscribeInnerEvent(bs,Sl,this._handleForceOfflineFromResponse,this),E.unSubscribeInnerEvent(bs,JI,this._handleForceOfflineFromResponse,this),E.unSubscribeInnerEvent(bs,uE,this._handleForceOfflineFromResponse,this),E.unSubscribeInnerEvent(bs,RC,this._handleForceOfflineFromResponse,this),E.unSubscribeInnerEvent(bs,Nc,this._handleForceOfflineFromResponse,this),E.unSubscribeInnerEvent(vc,this._dispose,this)}}function QE(C){return et(this,void 0,void 0,function*(){const E="im_open_status.wslogin",h=ZA.common.generateProtocolData({servcmd:E,data:{State:"Online",is_web_uniapp:0,InstType:0,CustomInfo:C}}),D=`${h.head.seq}${E}`,N=yield ZA.channel.sendPacket(h,{timeout:9e4,requestId:D});if(N){const{HelloInterval:O,InstId:Y,TinyId:j,TimeStamp:IA,CustomStatus:BA,PurchaseBits:mA,A2Key:_A,RichMsgAuthKey:xA,ErrorCode:Qe,ErrorInfo:Re,ActionStatus:Se}=N;return{helloInterval:O,instanceID:Y,tinyID:j,timeStamp:IA,customStatus:BA,purchaseBits:mA,a2Key:_A,authKey:xA,errorCode:Qe,errorInfo:Re,actionStatus:Se}}})}function vl(){const{store:C}=ZA;return Ga(C.get("instance").sdkAppId)!==Ve.CHINA}function Tc(C){var E;try{const h=Fo.getStorage("errorMessage");if(!C||!h)return"";const D=((E=JSON.parse(h))===null||E===void 0?void 0:E.errorMessage)||{},{code:N,replacement1:O="",replacement2:Y=""}=C;if(!N)return"";const j=vl()?`${N}_en`:`${N}_cn`;let IA=D[D[j]?j:N]||"";return IA&&(O&&(IA=IA.replace("$replacement1",O)),Y&&(IA=IA.replace("$replacement2",Y))),IA}catch(h){return console.warn("Error parsing stored error messages:",h),""}}class lo extends Error{constructor(E={}){E.code=E.code||E.errorCode;let{functionName:h="Unknown",code:D,message:N="",data:O="",moreMessage:Y="",errorMessage:j=""}=E;j=(D?Tc(E):"")||j||N;let IA=D?`${h} failed. error: {"message": ${j}, "code": ${D}}`:`${h} failed. error: {"message": ${j}}`;IA=`${IA} ${Y}`,super(),this.code=D,this.errorCode=D,this.errorMessage=j,this.message=IA,this.data=O}}function ds(C,E){var h;if(C&&((h=ZA.store.get("login"))===null||h===void 0?void 0:h.isLoggedIn)!==!0)throw new lo({code:Qa.USER_NOT_LOGGED_IN,functionName:E})}function QB(C,E,h){if(Array.isArray(C))for(let D=0;D{return BA===(mA=D,Object.prototype.toString.call(mA).match(/^\[object (.*)\]$/)[1].toLowerCase());var mA})){for(let mA=0;mA{const{interceptor:N,context:O}=D;N.apply(O,[h])})}(C)}function mn(C,E){kc.push({interceptor:C,context:E})}function Lg(C){const{params:E,auth:h}=C;E&&typeof E=="object"&&Object.assign(dB,E),h&&typeof h=="object"&&Object.assign(MC,h)}function dE(C){return ZA.store.get("commercialConfig").get(C)}class Ir{constructor(){this._handlers=new Map,this._activeWorkflows=new Map,this._stepStartTimes=new Map,this._logHandlers={start:(E,h)=>{const D=Date.now();h?(this._stepStartTimes.set(`${E}-${h}`,D),ZA.ssoLog.debug("_executeWorkflowStep",`[Workflow ${E}] Step ${h} started at ${new Date(D).toISOString()}`)):(this._workflowStartTimes.set(E,D),ZA.ssoLog.debug("_executeWorkflowStep",`[Workflow ${E}] started at ${new Date(D).toISOString()}`))},success:(E,h)=>{const D=Date.now();if(h){const N=this._stepStartTimes.get(`${E}-${h}`),O=N?D-N:0;this._stepStartTimes.delete(`${E}-${h}`),ZA.ssoLog.debug("_executeWorkflowStep",`[Workflow ${E}] Step ${h} completed successfully at ${new Date(D).toISOString()} (${O}ms)`)}else{const N=this._workflowStartTimes.get(E),O=N?D-N:0;this._workflowStartTimes.delete(E),ZA.ssoLog.debug("_executeWorkflowStep",`[Workflow ${E}] completed successfully at ${new Date(D).toISOString()} (${O}ms)`)}},error:(E,h,D)=>{const{ssoLog:N,utils:{safeStringify:O}}=ZA,Y=Date.now();if(h){const j=this._stepStartTimes.get(`${E}-${h}`),IA=j?Y-j:0;this._stepStartTimes.delete(`${E}-${h}`),N.error("_executeWorkflowStep",`[Workflow ${E}] Step ${h} failed at ${new Date(Y).toISOString()} (${IA}ms) ${O(D)}`,{error:D})}else{const j=this._workflowStartTimes.get(E),IA=j?Y-j:0;this._workflowStartTimes.delete(E),N.error("_executeWorkflowStep",`[Workflow ${E}] failed at ${new Date(Y).toISOString()} (${IA}ms) ${O(D)}`,{error:D})}}}}static getInstance(){return Ir._instance||(Ir._instance=new Ir),Ir._instance}static setInstance(E){Ir._instance=E}init(){this._initializeWorkflows()}registerWorkflowStep(E,h,D,N){if(!this._handlers.has(E))return void ZA.ssoLog.debug("registerWorkflowStep",`Workflow '${E}' not defined in core`);if(!Gn[E].find(Y=>Y.stepId===h))return void ZA.ssoLog.debug("registerWorkflowStep",`Step '${h}' not defined in workflow '${E}'`);const O=this._handlers.get(E);O.has(h)||O.set(h,N?D.bind(N):D)}executeWorkflow(E,h){return et(this,void 0,void 0,function*(){if(!this._validateWorkflow(E))return;ZA.ssoLog.debug("executeWorkflow",`[Workflow ${E}] Started execution at ${new Date().toISOString()}`);const D=Gn[E],N={},O={cancelled:!1};this._activeWorkflows.set(E,{cancelToken:O});try{const Y=new Map;D.forEach(IA=>{Y.set(IA.stepId,IA)});const j={workflowName:E,pendingSteps:new Set(D.map(IA=>IA.stepId)),completedSteps:new Set,runningSteps:new Set,stepMap:Y,stepResults:N,data:h,cancelToken:O};yield new Promise((IA,BA)=>{const mA=()=>{if(O.cancelled)return void IA();this._getExecutableSteps({pendingSteps:j.pendingSteps,completedSteps:j.completedSteps,stepMap:j.stepMap,workflowName:E}).filter(_A=>!j.runningSteps.has(_A)).forEach(_A=>{j.completedSteps.has(_A)||j.runningSteps.has(_A)||this._executeWorkflowStep(_A,j,{onComplete:()=>{if(j.pendingSteps.size===0)return void IA();this._getExecutableSteps({pendingSteps:j.pendingSteps,completedSteps:j.completedSteps,stepMap:j.stepMap,workflowName:E}).filter(xA=>!j.runningSteps.has(xA)).length===0&&j.runningSteps.size===0&&(ZA.ssoLog.debug("executeWorkflow",`Workflow ${E} completed with some steps skipped due to dependency failures`),IA())},onError:BA,onStepComplete:mA})})};mA()}),ZA.ssoLog.debug("executeWorkflow",`[Workflow ${E}] Completed execution at ${new Date().toISOString()}`)}catch(Y){ZA.ssoLog.error("executeWorkflow",`[Workflow ${E}] Failed execution at ${new Date().toISOString()}`,{error:Y})}finally{this._activeWorkflows.delete(E)}})}_executeWorkflowStep(E,h,D){return et(this,void 0,void 0,function*(){const{workflowName:N,runningSteps:O,stepMap:Y,stepResults:j,data:IA}=h;O.add(E),this._logWorkflowExecution(N,E,"start");try{const BA=Y.get(E);let mA=null;BA?.dependency&&(s(BA.dependency)?mA=j[BA.dependency]:Array.isArray(BA.dependency)&&(mA={},BA.dependency.forEach(xA=>{mA[xA]=j[xA]})));const _A=this._handlers.get(N).get(E);if(_A){const xA=yield Promise.resolve(_A({data:IA,result:mA}));j[E]=xA,this._logWorkflowExecution(N,E,"success")}h.completedSteps.add(E)}catch(BA){const mA=`[Workflow].${N}.${E}`,{errorCode:_A,errorInfo:xA=`${mA} failed`}=BA||{},Qe=new lo({functionName:mA,code:_A,message:xA});ZA.ssoLog.error(mA,xA,{error:Qe}),this._logWorkflowExecution(N,E,"error",BA),D.onError(BA)}finally{O.delete(E),h.pendingSteps.delete(E),D.onStepComplete(),D.onComplete()}})}reset(){this._cancelAllWorkflows()}destroy(){this.reset(),this._handlers.clear()}_initializeWorkflows(){Object.keys(Gn).forEach(E=>{this._handlers.has(E)||this._handlers.set(E,new Map)})}_cancelWorkFlow(E){const h=this._activeWorkflows.get(E);if(!h)return;const{cancelToken:D}=h;D.cancelled=!0,this._activeWorkflows.delete(E)}_cancelAllWorkflows(){Object.keys(Gn).forEach(E=>{this._cancelWorkFlow(E)})}_validateWorkflow(E){return Gn[E]?!!this._handlers.get(E):!1}_getExecutableSteps(E){const{pendingSteps:h,completedSteps:D,stepMap:N,workflowName:O}=E;return Array.from(h).filter(Y=>{const j=N.get(Y)||{},{dependency:IA,skipIfDependencyMissing:BA=!0}=j;if(!IA)return!0;if(s(IA))return this._isStepRegistered({workflowName:O,stepId:IA})?D.has(IA):!BA;if(B(IA)){if(IA.filter(mA=>!this._isStepRegistered({workflowName:O,stepId:mA})).length>0&&BA)return!1;for(const mA of IA)if(!D.has(mA))return!1;return!0}return!1})}_isStepRegistered(E){var h;const{workflowName:D,stepId:N}=E;return(h=this._handlers.get(D))===null||h===void 0?void 0:h.has(N)}_logWorkflowExecution(E,h,D,N){this._logHandlers[D](E,h)}}const og=new Map,Ka=({type:C,groupID:E})=>C===vo.GRP_COMMUNITY||`${E}`.startsWith(_a.COMMUNITY)&&!`${E}`.includes(_a.TOPIC),ca=(C="")=>{const E=C.startsWith("GROUP")?C.replace("GROUP",""):C;return E.startsWith(_a.COMMUNITY)&&`${E}`.includes(_a.TOPIC)},hE="openim",wC="million_group_open_http_svc";function Ls(C){return et(this,void 0,void 0,function*(){const{servcmd:E,data:h}=function(O){const{data:Y}=O;return _c(Y)||SC(Y)}(C)?function(O){let{servcmd:Y,data:j}=O;return SC(j)?function(IA){const{servcmd:BA,data:mA}=IA;let{GroupId:_A=""}=mA;const xA=_A;return[_A]=xA.split(_a.TOPIC),{servcmd:rg(BA),data:Object.assign(Object.assign({},mA),{GroupId:_A,TopicId:xA})}}(O):(_c(j)&&(Y=rg(Y)),{servcmd:Y,data:j})}(C):C,D=ZA.common.generateProtocolData({servcmd:E,data:h}),N=`${D.head.seq}${E}`;return ZA.channel.sendPacket(D,{requestId:N,timeout:C.timeout})})}function _c(C){const{Type:E,GroupId:h,GroupIdList:D=[]}=C,N=h||D[0]||"";return Ka({type:E,groupID:N})}function SC(C){const{GroupId:E=""}=C;return ca(E)}function rg(C){if(C.includes(hE))return C;const E=C.split(".")[1];return`${wC}.${E}`}function Wr(){var C;return(C=ZA.store.get("login"))===null||C===void 0?void 0:C.userId}const ng=C=>B(C)||Q(C),hs=(C,E,h,D)=>{if(!ng(C)||!ng(E))return 0;let N=0;const O=Object.keys(E);let Y;for(let j=0,IA=O.length;j{if(r(E))return"";if(C===vo.MSG_TEXT)return E.text||"";const h=Nl[C];return h?pB(h):""},VI=[{cmd:"ws_get_user_status",interval:5,count:20},{cmd:"ws_status_subscribe",interval:5,count:20},{cmd:"ws_status_unsubscribe",interval:5,count:20},{cmd:"get_group_self_member_info",interval:5,count:20},{cmd:"modify_group_base_info",interval:1,count:8},{cmd:"get_pendency",interval:1,count:15},{cmd:"set_group_attr",interval:5,count:10},{cmd:"modify_group_attr",interval:5,count:10},{cmd:"delete_group_attr",interval:5,count:10},{cmd:"clear_group_attr",interval:5,count:10},{cmd:"get_group_attr",interval:5,count:20},{cmd:"update_group_counter",interval:5,count:20},{cmd:"get_group_counter",interval:5,count:20},{cmd:"get_topic",interval:1,count:10},{cmd:"read_all_unread_msg",interval:1,count:1},{cmd:"query",interval:5,count:20}],BI="im_sdk_config_mgr.fetch_config",pE="im_sdk_config_mgr.push_configv2",Lc="cloud-config",uI=2996,Fg=new class{init(C){this.core=C}};function ja(C){return et(this,void 0,void 0,function*(){const{sdkAppId:E}=Fg.core.store.get("instance")||{},h=Fg.core.helper.generateProtocolData({servcmd:BI,data:{uint32_sdkappid:E,uint64_version:C}}),D=`${h.head.seq}${BI}`;return Fg.core.channel.sendPacket(h,{requestId:D})})}var Fs=new class{constructor(){this._core=null,this._expirationTime=0,this._version=0,this._isFetching=!1,this._cmdFrequencyLimitMap=new Map,this._methodCallFrequencyMap=new Map}install(C){this._core=C;const{notificationCenter:E,InnerEvent:h,helper:D,constants:{WORKFLOW_NAME:N,WORKFLOW_STEP:O},channel:Y}=C;E.subscribeInnerEvent(pE,this._handlePushedConfig,this),D.registerWorkflowStep(N.SYNC_SERVER_INFO_AFTER_LOGIN,O.CLOUD_CONFIG_SYNC,this._handleLoginSuccess,this),E.subscribeInnerEvent(h.LOGOUT,this._reset,this),E.subscribeInnerEvent(h.DESTROY,this._dispose,this),D.registerExperimentalAPI("getServerConfig",this),this._updateCmdFreqLimitMap(VI),Y.registerBeforeSendInterceptor(this.checkMethodCallOverLimit,this)}getServerConfig(C){return et(this,void 0,void 0,function*(){var E;const h={code:0,data:""};return C&&(h.data=((E=this._core.store.get("cloudConfig"))===null||E===void 0?void 0:E[C])||""),h})}checkMethodCallOverLimit(C){if(!this._cmdFrequencyLimitMap.has(C))return;if(!this._methodCallFrequencyMap.has(C))return void this._methodCallFrequencyMap.set(C,{startTime:Date.now(),methodCallCounter:1});const{count:E,interval:h}=this._cmdFrequencyLimitMap.get(C);let{startTime:D,methodCallCounter:N}=this._methodCallFrequencyMap.get(C);if(Date.now()-D>1e3*h)this._methodCallFrequencyMap.set(C,{startTime:Date.now(),methodCallCounter:1});else if(N+=1,this._methodCallFrequencyMap.set(C,{startTime:D,methodCallCounter:N}),N>E)throw new this._core.helper.ChatError({code:uI,replacement1:C})}_handlePushedConfig(C){return et(this,void 0,void 0,function*(){const{ssoLog:E,utils:{safeStringify:h}}=this._core;E.info("_handlePushedConfig",h(C)),yield this._updateCloudConfig(C)})}_handleLoginSuccess(){return et(this,void 0,void 0,function*(){const{ssoLog:C,utils:{safeStringify:E}}=this._core;try{if(this._canFetch()){const h=yield ja(this._version);C.info("_fetchCloudConfigIfLogin",E(h)),yield this._updateCloudConfig(h)}this._core.helper.taskScheduler.addTask({id:Lc,intervalMs:1e3,callback:this._fetchCloudConfigIfReady,context:this})}catch(h){C.debug("_fetchCloudConfigIfLogin",E(h))}})}_fetchCloudConfigIfReady(){return et(this,void 0,void 0,function*(){const{ssoLog:C,utils:{safeStringify:E}}=this._core;if(this._canFetch())try{const h=yield ja(this._version);C.info("_fetchCloudConfigIfReady",E(h)),yield this._updateCloudConfig(h)}catch(h){C.error("_fetchCloudConfigIfReady",E(h))}})}_updateCloudConfig(C){return et(this,void 0,void 0,function*(){const E=this._parseCloudConfig(C);E&&(this._core.store.set("cloudConfig",E),yield this._parseCmdFreqLimit(),this._core.notificationCenter.emitInnerEvent(this._core.InnerEvent.CLOUD_CONFIG_UPDATE,E),this._core.notificationCenter.emitOuterEvent(this._core.OuterEvent.SERVER_CONFIG_UPDATED,{name:this._core.OuterEvent.SERVER_CONFIG_UPDATED,data:{config:E}}))})}_canFetch(){const{isLoggedIn:C}=this._core.store.get("login")||{};return C&&!this._isFetching&&Date.now()>=this._expirationTime}_parseCloudConfig(C){const{int32_error_code:E,str_error_message:h,str_json_config:D,uint32_expired_time:N,uint32_sdkappid:O,uint64_version:Y}=C;let j=null;if(E===0){if(this._version!==Y)try{j=JSON.parse(D),this._version=Y}catch{}this._expirationTime=Date.now()+1e3*N}else this._expirationTime=E===void 0?Date.now()+36e5:Date.now()+12e4;return j}_parseCmdFreqLimit(){return et(this,void 0,void 0,function*(){var C;let E=(C=yield this.getServerConfig("cmd_frequency_limit"))===null||C===void 0?void 0:C.data;const{isEmpty:h}=this._core.utils;if(!h(E))try{E=JSON.parse(E),this._updateCmdFreqLimitMap(E)}catch(D){console.warn(D)}})}_updateCmdFreqLimitMap(C){C.forEach(E=>{this._cmdFrequencyLimitMap.set(E.cmd,{interval:E.interval,count:E.count})})}_reset(){this._core.helper.taskScheduler.removeTask(Lc),this._core.store.clear("cloudConfig"),this._updateCmdFreqLimitMap(VI),this._methodCallFrequencyMap.clear(),this._expirationTime=0,this._version=0,this._isFetching=!1}_dispose(){const{notificationCenter:C,InnerEvent:E}=this._core;C.unSubscribeInnerEvent(pE,this._handlePushedConfig,this),C.unSubscribeInnerEvent(E.LOGOUT,this._reset,this),C.unSubscribeInnerEvent(E.DESTROY,this._dispose,this),this._reset()}};class No{constructor(E=0,h=0){this.high=E,this.low=h}equal(E){return E!==null&&this.low===E.low&&this.high===E.high}toString(){const E=Number(this.high).toString(16);let h=Number(this.low).toString(16);if(h.length<8){let D=8-h.length;for(;D;)h=`0${h}`,D--}return E+h}}const Fc={SEARCH_GRP_SNS:new No(0,Math.pow(2,1)).toString(),AV_HISTORY_MSG:new No(0,Math.pow(2,2)).toString(),GRP_COMMUNITY:new No(0,Math.pow(2,3)).toString(),MSG_TO_SPECIFIED_GRP_MBR:new No(0,Math.pow(2,4)).toString(),AV_MBR_LIST:new No(0,Math.pow(2,6)).toString(),USER_STATUS:new No(0,Math.pow(2,7)).toString(),CONV_MARK:new No(0,Math.pow(2,9)).toString(),CONV_GROUP:new No(0,Math.pow(2,10)).toString(),AV_BAN_MBR:new No(0,Math.pow(2,11)).toString(),MSG_EXT:new No(0,Math.pow(2,13)).toString(),GRP_COUNTER:new No(0,Math.pow(2,15)).toString(),PLUGIN_TRANSLATE:new No(Math.pow(2,6)).toString(),PLUGIN_VOICE_TO_TEXT:new No(Math.pow(2,7)).toString(),PLUGIN_CS:new No(Math.pow(2,8)).toString(),PLUGIN_PUSH:new No(Math.pow(2,9)).toString(),PLUGIN_BOT:new No(Math.pow(2,10)).toString(),MSG_REACTION:new No(Math.pow(2,16)).toString(),FOLLOW:new No(Math.pow(2,20)).toString()},Ug="CommercialConfig",vC="commercial-config";var fE=new class{constructor(){this._core=null,this._expirationTime=0,this._isFetching=!1,this._featureMap=new Map,this._methodKeyMap=new Map,this._purchaseBits="0"}install(C){this._core=C;const{helper:E,notificationCenter:h,constants:{WORKFLOW_NAME:D,WORKFLOW_STEP:N,InnerEvent:O}}=C;h.subscribeInnerEvent(O.COMMERCIAL_CONFIG_PUSH,this._handlePushedConfig,this),h.subscribeInnerEvent(O.LOGOUT,this._handleLogout,this),h.subscribeInnerEvent(O.DESTROY,this._dispose,this),E.registerWorkflowStep(D.SYNC_SERVER_INFO_AFTER_LOGIN,N.COMMERCIAL_CONFIG_UPDATE,this._syncCommercialConfig,this),C.helper.registerExperimentalAPI("isCommercialAbilityEnabled",this),C.helper.registerExperimentalAPI("queryCommercialAbility",this)}isCommercialAbilityEnabled(C){return et(this,void 0,void 0,function*(){const E=parseInt(C,10).toString(2),{length:h}=E;let D,N=!0;for(let O=h-1,Y=0;O>=0;O--,Y++)if(E.charAt(O)==="1"&&(D=Y<32?new No(0,2**Y).toString():new No(2**(Y-32),0).toString(),!this._featureMap.get(D))){N=!1;break}return this._core.ssoLog.debug("isFeatureEnabled",`${Ug}.isFeatureEnabled decimalNumber:${C} key:${D} ret:${N}`),{code:0,data:{enabled:N}}})}queryCommercialAbility(){return this._purchaseBits}_fetchAndParseCommercialConfig(){return et(this,void 0,void 0,function*(){var C;const{ssoLog:E,utils:{safeStringify:h},common:{buildAndSendPacket:D}}=this._core;try{this._isFetching=!0;const N=yield D({servcmd:"im_sdk_config_mgr.fetch_imsdk_purchase_bitsv2",data:{uint32_sdkappid:(C=this._core.store.get("instance"))===null||C===void 0?void 0:C.sdkAppId}});N&&(this._parseCommercialConfig(N),this._core.store.set("commercialConfig",this._methodKeyMap))}catch(N){E.error("_fetchAndParseCommercialConfig",h(N))}finally{this._isFetching=!1}})}_syncCommercialConfig(C){return et(this,void 0,void 0,function*(){const{purchaseBits:E}=C?.data||{};E&&(this._parsePurchaseBits(E),this._core.store.set("commercialConfig",this._methodKeyMap)),this._canFetch()&&(yield this._fetchAndParseCommercialConfig()),this._core.helper.taskScheduler.addTask({id:vC,intervalMs:1e3,callback:this._fetchCommercialConfigIfReady,context:this})})}_canFetch(){var C;const E=(C=this._core.store.get("login"))===null||C===void 0?void 0:C.isLoggedIn,h=Date.now()>=this._expirationTime;return E&&!this._isFetching&&h}_handlePushedConfig(C){C?.body&&(this._parseCommercialConfig(C.body),this._core.store.set("commercialConfig",this._methodKeyMap))}_fetchCommercialConfigIfReady(){return et(this,void 0,void 0,function*(){this._canFetch()&&(yield this._fetchAndParseCommercialConfig())})}_parseCommercialConfig(C){const{ssoLog:E}=this._core;if(typeof C!="object")return;const{int32_error_code:h,str_error_message:D,str_purchase_bits:N,uint32_expired_time:O}=C;h===0?(this._parsePurchaseBits(N),this._expirationTime=Date.now()+1e3*O):h===void 0?(E.warn("_parseCommercialConfig",`${Ug}._parseCommercialConfig failed. Invalid message format:`,C),this._expirationTime=Date.now()+36e5):(E.warn("_parseCommercialConfig",`${Ug}._parseCommercialConfig errorCode:${h} errorMessage:${D}`),this._expirationTime=Date.now()+12e4)}_isValidPurchaseBits(C){return C&&typeof C=="string"&&C.length>=1&&C.length<=64&&/[01]{1,64}/.test(C)}_parsePurchaseBits(C){const{ssoLog:E,utils:{safeStringify:h}}=this._core;if(this._isValidPurchaseBits(C)){this._purchaseBits=C,this._featureMap.clear(),this._methodKeyMap.clear();let D=null;for(let N=C.length-1,O=0;N>=0;N--,O++)if(D=O<32?new No(0,2**O).toString():new No(2**(O-32),0).toString(),C[N]==="1"){this._featureMap.set(D,!0);const Y=this._getKeyByValue(Fc,D);Y&&this._methodKeyMap.set(Y,!0)}else{this._featureMap.set(D,!1);const Y=this._getKeyByValue(Fc,D);Y&&this._methodKeyMap.set(Y,!1)}}else E.warn("_parsePurchaseBits",`${Ug}.parsePurchaseBits invalid purchases:${h(C)}`)}_getKeyByValue(C,E){const h=Object.entries(C).find(([D,N])=>N===E);return h?h[0]:void 0}_handleLogout(){this._reset()}_dispose(){this._reset(),this._core.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.COMMERCIAL_CONFIG_PUSH,this._handlePushedConfig,this),this._core.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.LOGOUT,this._reset,this),this._core.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.DESTROY,this._dispose,this)}_reset(){this._core.helper.taskScheduler.removeTask(vC),this._core.store.set("commercialConfig",{}),this._expirationTime=0,this._isFetching=!1,this._featureMap.clear(),this._purchaseBits="0"}},Tl=new class{constructor(){this._core=null,this._serverOverloadInfoMap=new Map}install(C){this._core=C;const{notificationCenter:E,InnerEvent:h,channel:D}=this._core;E.subscribeInnerEvent(h.OVERLOAD_PUSH,this._handleOverLoadPush,this),E.subscribeInnerEvent(h.LOGOUT,this._reset,this),E.subscribeInnerEvent(h.DESTROY,this._dispose,this),D.registerBeforeSendInterceptor(this.checkServerOverload,this)}checkServerOverload(C){if(!this._serverOverloadInfoMap.has(C))return;const{overloadStartTimestamp:E,delaySeconds:h}=this._serverOverloadInfoMap.get(C);if(Date.now()-E<=1e3*h)throw new this._core.helper.ChatError({functionName:C,message:"service is busy, please try again later"});this._serverOverloadInfoMap.delete(C)}_handleOverLoadPush(C){const{OverLoadServCmd:E,DelaySecs:h}=C;this._serverOverloadInfoMap.set(E,{overloadStartTimestamp:Date.now(),delaySeconds:h})}_reset(){this._serverOverloadInfoMap.clear()}_dispose(){this._reset();const{notificationCenter:C,InnerEvent:E}=this._core;C.unSubscribeInnerEvent(E.OVERLOAD_PUSH,this._handleOverLoadPush,this),C.unSubscribeInnerEvent(E.LOGOUT,this._reset,this),C.unSubscribeInnerEvent(E.DESTROY,this._dispose,this)}},Ou=new class{constructor(){this.name="ConfigCenter"}install(C){Fg.init(C),Fs.install(C),fE.install(C),Tl.install(C)}},fB=new class{constructor(){this.name="ErrorMessage",this._core=null}install(C){return et(this,void 0,void 0,function*(){if(this._core=C,this._canFetch()){const E=yield this._fetchErrorMessage();if(!E)return;const h=this._parseResponse(E);this._saveErrorMessage(h)}})}_canFetch(){const C=this._core.store.getStorage("errorMessage");return!C||this._isExpired(C)}_saveErrorMessage(C){this._core.store.setStorage("errorMessage",{errorMessage:C,errorMessageSavedTime:new Date().getTime()})}_fetchErrorMessage(){return et(this,void 0,void 0,function*(){try{return yield this._core.helper.httpRequest({method:"GET",url:"https://web.sdk.qcloud.com/im/download/error-message/v3/0.0.6/tim-error-message.txt"})}catch(C){console.error(C)}})}_isExpired(C){if(!C)return!0;const{errorMessageSavedTime:E}=C;return E&&new Date().getTime()-E>=6048e5}_parseResponse(C){if(typeof C=="string"){const E=C.split(`; +`),h={},D=new RegExp(/'/g);for(let N=0;N{var Bi,ri,St;const eo=function(to,Yt){const{From_Account:si,From_AccountHeadurl:zo,From_AccountNick:te,IsNeedReadReceipt:je,MsgBody:dA,MsgClientTime:ut,MsgRandom:Cr,MsgSeq:lt,MsgTimeStamp:Co,SendMsgControl:Jt,SupportMessageExtension:mo,To_Account:Fe,TinyId:Oe,MsgCheckResult:xs,CloudCustomData:Zo,IsPeerRead:ti,MsgFlagBits:_n,MsgVersion:Eg,EventArray:Bo}=to;return{from:si,avatar:zo,nick:te,needReadReceipt:je===1,readReceiptSentByPeer:ti,clientTime:ut,messageFlagBits:_n,random:Cr,sequence:lt,time:Co,messageControlInfo:Jt,isSupportExtension:mo,to:Fe,tinyID:Oe,checkResult:xs,cloudCustomData:Zo,messageVersion:Eg,eventArray:Bo,elements:Yt.message.messageHelper.parseServerPushMessageElement(dA)}}(jt,Se);if(!((St=(ri=(Bi=jt?.EventArray)===null||Bi===void 0?void 0:Bi[0])===null||ri===void 0?void 0:ri.hasOwnProperty)===null||St===void 0)&&St.call(ri,"C2cNotifyMsgArray"))at.push(...function(to){var Yt;const si=[];return(Yt=to.EventArray)===null||Yt===void 0||Yt.forEach(zo=>{var te,je;const{C2cNotifyMsgArray:dA}=zo,ut=(je=(te=dA?.[0])===null||te===void 0?void 0:te.WithdrawC2cMsgNotify)===null||je===void 0?void 0:je.C2cWithdrawInfoArray;Array.isArray(ut)&&si.push(...ut)}),si}(jt));else{const to=Se.message.messageFactory.createMessage(Object.assign(Object.assign({},eo),{conversationType:"C2C",flow:"in"})),{elements:Yt}=eo;to.setElement(Yt),At.push(to)}}),{unreadMessageList:At,revokedMessageList:at}}(IA.MsgList,E);return{syncFlag:IA?.SyncFlag,unreadMessageList:xA,revokedMessageList:Qe,unreadCountList:BA,overflowUnreadCountList:mA,cookie:IA?.Cookie,groupTipList:_A}}catch(IA){console.warn(IA)}})}var Og,QI;(function(C){C[C.START_SYNC=0]="START_SYNC",C[C.SYNCING=1]="SYNCING",C[C.SYNC_COMPLETE=2]="SYNC_COMPLETE"})(Og||(Og={})),function(C){C[C.LOGIN_SUCCESS=0]="LOGIN_SUCCESS",C[C.NEW_MESSAGE_RECEIVED=1]="NEW_MESSAGE_RECEIVED"}(QI||(QI={}));var pi=new class{constructor(){this.name="UnreadMessageSynchronizer",this._unreadDBMessageMap=new Map,this._cookie="",this._localConversationIDListBeforeDisconnect=[]}install(C){this._core=C;const{constants:E}=C;C.helper.registerWorkflowStep(E.WORKFLOW_NAME.SYNC_SERVER_INFO_AFTER_RE_ONLINE,E.WORKFLOW_STEP.UNREAD_MESSAGE_SYNC,this._syncUnreadDBMessageAfterReOnline,this),C.helper.registerWorkflowStep(E.WORKFLOW_NAME.RECEIVE_C2C_NEW_MESSAGE,E.WORKFLOW_STEP.UNREAD_MESSAGE_SYNC,this._syncUnreadDBMessageAfterNewMessageReceived,this),C.helper.registerWorkflowStep(E.WORKFLOW_NAME.SYNC_SERVER_INFO_AFTER_LOGIN,E.WORKFLOW_STEP.UNREAD_MESSAGE_SYNC,this._syncUnreadDBMessageAfterLogin,this),C.notificationCenter.subscribeInnerEvent(C.InnerEvent.SOCKET_DISCONNECTED,this._handleDisconnect,this),C.notificationCenter.subscribeInnerEvent(C.InnerEvent.LOGOUT,this._reset,this),C.notificationCenter.subscribeInnerEvent(C.InnerEvent.DESTROY,this._dispose,this)}_syncUnreadMessage(C){return et(this,void 0,void 0,function*(){const{isAfterReOnline:E=!1,isAfterNewMessageReceived:h=!1,isAfterLogin:D=!1}=C||{};let N=Og.START_SYNC;const O=[],Y=[],j=[],IA=[];for(;this._canContinueSync({cookie:this._cookie,syncFlag:N});){const BA=yield this._fetchUnreadDBMessage({cookie:this._cookie,syncFlag:N,syncTriggerEvent:h?QI.NEW_MESSAGE_RECEIVED:QI.LOGIN_SUCCESS});if(!BA)break;const{unreadMessageList:mA=[],revokedMessageList:_A=[],overflowUnreadCountList:xA,unreadCountList:Qe,groupTipList:Re}=BA;if(this._cookie=BA?.cookie||"",N=BA?.syncFlag,this._parseAndSaveUnreadMessageList(mA),j.push(..._A),this._updateConversationUnreadOptions({unreadCountList:Qe,overflowUnreadCountList:xA,conversationUpdateFieldList:O}),Array.isArray(Re)&&Y.push(...Re),E){const{messages:Se}=this._handleNewMessageList(mA);IA.push(...Se)}}return E?{conversationUpdateFieldList:O,revokedMessageList:j,unreadMessageMap:this._unreadDBMessageMap,groupTipList:Y,messages:IA,isUnreadC2CMessage:!0}:{conversationUpdateFieldList:O,isInstantMessage:!D,isUnreadC2CMessage:!0,revokedMessageList:j,unreadMessageMap:this._unreadDBMessageMap,groupTipList:Y}})}_syncUnreadDBMessageAfterLogin(){return et(this,void 0,void 0,function*(){return this._cookie="",this._syncUnreadMessage({isAfterLogin:!0})})}_syncUnreadDBMessageAfterNewMessageReceived(C){return et(this,void 0,void 0,function*(){if(C.data.Flag===1)return this._syncUnreadMessage({isAfterNewMessageReceived:!0})})}_updateConversationUnreadOptions(C){const{unreadCountList:E,overflowUnreadCountList:h,conversationUpdateFieldList:D}=C,{constants:{OuterConstant:{CONV_C2C:N,CONV_SYSTEM:O}}}=this._core;E?.forEach(Y=>{const{From_Account:j,UnreadCount:IA}=Y;if(j!==O){const BA=D.find(({conversationID:mA})=>mA===`${N}${j}`);BA?BA.unreadCount=IA:D.push({conversationID:`${N}${j}`,unreadCount:IA,type:N})}}),h?.forEach(Y=>{const{From_Account:j,LastMsgTime:IA}=Y;j!==O&&(D.find(({conversationID:BA})=>BA===`${N}${j}`)||D.push({conversationID:`${N}${j}`,type:N,lastMsgTime:IA}))})}_syncUnreadDBMessageAfterReOnline(){return et(this,void 0,void 0,function*(){return this._syncUnreadMessage({isAfterReOnline:!0})})}_updateMessageProfile(C){var E;const{messageDataHandler:h}=this._core.message||{},D=(E=this._core.store.get("login"))===null||E===void 0?void 0:E.userId,{from:N,nick:O,avatar:Y,conversationID:j=""}=C;if(N!==D){const IA=h.getLatestMsgSentByPeer(j);if(IA){const{nick:BA,avatar:mA}=IA;O&&Y?O===BA&&Y===mA||h.updateNickAndAvatarOfSentMessage({conversationID:j,latestNick:O,latestAvatar:Y,isSentByMe:!1}):(C.nick=BA,C.avatar=mA)}}else{const IA=h.getLatestMsgSentByMe(j);!IA||O===IA.nick&&Y===IA.avatar||h.updateNickAndAvatarOfSentMessage({conversationID:j,latestNick:O,latestAvatar:Y,isSentByMe:!0})}}_handleNewMessageList(C){const{messageDataHandler:E}=this._core.message||{},h=new Map,D=[];return C.forEach(N=>{this._updateMessageProfile(N);let O=N.isModified===1;if(E.isMessageSentByCurrentInstance(N)?N.isModified=O:O=!1,N.isOnlineMessage())N._onlineOnlyFlag=!0,E.isMessageSentByCurrentInstance(N)||D.push(N);else if(this._shouldStoreUnreadMessage(N)){if(E.storeConversationMessage(N)){const{conversationID:Y,conversationType:j,conversationSubType:IA,flow:BA,_isExcludedFromUnreadCount:mA,_isExcludedFromLastMessage:_A}=N,xA=_A?"":N;h.has(Y)?(h.get(Y).lastMessage=xA,BA==="in"&&(mA||h.get(Y).unreadCount++)):h.set(Y,{conversationID:Y,type:j,subType:IA,unreadCount:mA||BA!=="in"?0:1,lastMessage:xA})}E.isMessageSentByCurrentInstance(N)&&!O||D.push(N)}}),{messages:D,conversationOptions:h}}_shouldStoreUnreadMessage(C){var E;const{conversationID:h}=C,{message:D,appStore:N,utils:{isEmpty:O}}=this._core||{},Y=Array.from(((E=N.conversationStore.getConversationMap())===null||E===void 0?void 0:E.keys())||[]),j=this._getLocalLastMessageTime(h);return!D.messageDataHandler.isInMessageList(C)&&Y.includes(h)&&this._localConversationIDListBeforeDisconnect.includes(h)&&!O(j)}_fetchUnreadDBMessage(C){return et(this,void 0,void 0,function*(){const{ssoLog:E,utils:{safeStringify:h}}=this._core;try{E.debug("_fetchUnreadDBMessage",`unread-message-synchronizer._fetchUnreadDBMessage options:${h(C)}`);const N=yield xu(C,this._core);if(!N)return null;const{syncFlag:O,unreadMessageList:Y,revokedMessageList:j,cookie:IA,unreadCountList:BA,overflowUnreadCountList:mA,groupTipList:_A}=N;return this._parseAndSaveUnreadMessageList(Y),{syncFlag:O,cookie:IA,unreadMessageList:Y,revokedMessageList:j,unreadCountList:BA,overflowUnreadCountList:mA,groupTipList:_A}}catch(D){console.log(D)}})}_canContinueSync({cookie:C,syncFlag:E}){var h;return E===Og.START_SYNC||E===Og.SYNCING&&!(!((h=this._core)===null||h===void 0)&&h.helper.isEmpty(C))}_parseAndSaveUnreadMessageList(C){C.forEach(E=>{const{ID:h}=E;this._unreadDBMessageMap.set(h,E)})}_handleDisconnect(){var C;const{appStore:E}=this._core;this._localConversationIDListBeforeDisconnect=Array.from(((C=E.conversationStore.getConversationMap())===null||C===void 0?void 0:C.keys())||[])}_getLocalLastMessageTime(C){const{message:E}=this._core,h=E.messageDataHandler.getLocalMessageList(C),D=h[h.length-1];return D?.time}_reset(){this._cookie="",this._unreadDBMessageMap.clear()}_dispose(){var C,E;(C=this._core)===null||C===void 0||C.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.LOGOUT,this._reset,this),(E=this._core)===null||E===void 0||E.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.DESTROY,this._dispose,this),this._reset()}},mB=new class{init(C){var E;this._core=C,this._visibilityChangeHandler=this._handleVisibilityChange.bind(this),C.notificationCenter.subscribeInnerEvent(C.InnerEvent.DESTROY,this._dispose,this),document?.addEventListener("visibilitychange",this._visibilityChangeHandler),(E=this._core)===null||E===void 0||E.store.set("activityMonitor",{isActive:!0})}_handleVisibilityChange(){var C,E;const h=document?.visibilityState==="visible";(C=this._core)===null||C===void 0||C.store.set("activityMonitor",{isActive:h}),(E=this._core)===null||E===void 0||E.notificationCenter.emitInnerEvent("activityStatusChange",{isActive:h})}_reset(){var C;(C=this._core)===null||C===void 0||C.store.clear("activityMonitor")}_dispose(){document?.removeEventListener("visibilitychange",this._visibilityChangeHandler);const{notificationCenter:C,InnerEvent:E}=this._core;C.unSubscribeInnerEvent(E.DESTROY,this._dispose,this),this._reset()}},Gl=new class{init(C){var E;this._core=C,this._bindAppActivityEvent(),C.notificationCenter.subscribeInnerEvent(C.InnerEvent.DESTROY,this._dispose,this),(E=this._core)===null||E===void 0||E.store.set("activityMonitor",{isActive:!0})}_bindAppActivityEvent(){var C,E,h,D,N;const{MINI_APP_NAMESPACE:O,IN_TT_MINI_GAME:Y,IN_WX_MINI_GAME:j}=((C=this._core)===null||C===void 0?void 0:C.utils)||{};Y||j?((E=O?.onShow)===null||E===void 0||E.call(O,()=>{var IA,BA;(IA=this._core)===null||IA===void 0||IA.store.set("activityMonitor",{isActive:!0}),(BA=this._core)===null||BA===void 0||BA.notificationCenter.emitInnerEvent("activityStatusChange",{isActive:!0})}),(h=O?.onHide)===null||h===void 0||h.call(O,()=>{var IA,BA;(IA=this._core)===null||IA===void 0||IA.store.set("activityMonitor",{isActive:!1}),(BA=this._core)===null||BA===void 0||BA.notificationCenter.emitInnerEvent("activityStatusChange",{isActive:!1})})):((D=O?.onAppShow)===null||D===void 0||D.call(O,()=>{var IA,BA;(IA=this._core)===null||IA===void 0||IA.store.set("activityMonitor",{isActive:!0}),(BA=this._core)===null||BA===void 0||BA.notificationCenter.emitInnerEvent("activityStatusChange",{isActive:!0})}),(N=O?.onAppHide)===null||N===void 0||N.call(O,()=>{var IA,BA;(IA=this._core)===null||IA===void 0||IA.store.set("activityMonitor",{isActive:!1}),(BA=this._core)===null||BA===void 0||BA.notificationCenter.emitInnerEvent("activityStatusChange",{isActive:!1})}))}_reset(){var C;(C=this._core)===null||C===void 0||C.store.clear("activityMonitor")}_dispose(){const{notificationCenter:C,InnerEvent:E}=this._core;C.unSubscribeInnerEvent(E.DESTROY,this._dispose,this),this._reset()}},kl=new class{init(C){const{IN_MINI_APP:E,IN_WX_MINI_PLUGIN:h}=C.helper;h||(E?Gl.init(C):mB.init(C))}};const NC="none",_l="online";var xg=new class{init(C){this._core=C,this._activateNetworkMonitoring(),C.notificationCenter.subscribeInnerEvent(C.InnerEvent.DESTROY,this._dispose,this)}_activateNetworkMonitoring(){return et(this,void 0,void 0,function*(){navigator.onLine?this._onOnline():this._onOffline(),this._onOnlineCallback=this._onOnline.bind(this),this._onOfflineCallback=this._onOffline.bind(this),window.addEventListener("online",this._onOnlineCallback),window.addEventListener("offline",this._onOfflineCallback)})}_deactivateNetworkMonitoring(){this._onOnlineCallback!==null&&(window.removeEventListener("online",this._onOnlineCallback),this._onOnlineCallback=null),this._onOfflineCallback!==null&&(window.removeEventListener("offline",this._onOfflineCallback),this._onOfflineCallback=null)}_onNetworkStatusChange(C){var E,h;const{isConnected:D,networkType:N}=C;(E=this._core)===null||E===void 0||E.store.set("netWorkMonitor",{isNetworkOnline:D,networkType:N}),(h=this._core)===null||h===void 0||h.notificationCenter.emitInnerEvent("networkStatusChange",{isNetworkOnline:D,networkType:N})}_onOnline(){this._onNetworkStatusChange({isConnected:!0,networkType:_l})}_onOffline(){this._onNetworkStatusChange({isConnected:!1,networkType:NC})}_reset(){var C;this._deactivateNetworkMonitoring(),(C=this._core)===null||C===void 0||C.store.clear("netWorkMonitor")}_dispose(){var C,E;(C=this._core)===null||C===void 0||C.notificationCenter.unSubscribeInnerEvent((E=this._core)===null||E===void 0?void 0:E.InnerEvent.DESTROY,this._dispose,this),this._reset()}},qI=new class{init(C){this._core=C,this._activateNetworkMonitoring(),C.notificationCenter.subscribeInnerEvent(C.InnerEvent.DESTROY,this._dispose,this)}_activateNetworkMonitoring(){return et(this,void 0,void 0,function*(){try{const{utils:{MINI_APP_NAMESPACE:C}}=this._core;this._mpNetworkStatusCallback=this._onNetworkStatusChange.bind(this),C.onNetworkStatusChange(this._onNetworkStatusChange.bind(this))}catch(C){console.error(C)}})}_deactivateNetworkMonitoring(){if(this._mpNetworkStatusCallback!==null){const{utils:{MINI_APP_NAMESPACE:C}}=this._core;C.offNetworkStatusChange&&C.offNetworkStatusChange(this._mpNetworkStatusCallback),this._mpNetworkStatusCallback=null}}_onNetworkStatusChange(C){var E,h;const{isConnected:D,networkType:N}=C;(E=this._core)===null||E===void 0||E.store.set("netWorkMonitor",{isNetworkOnline:D,networkType:N}),(h=this._core)===null||h===void 0||h.notificationCenter.emitInnerEvent("networkStatusChange",{isNetworkOnline:D,networkType:N})}_reset(){var C;this._deactivateNetworkMonitoring(),(C=this._core)===null||C===void 0||C.store.clear("netWorkMonitor")}_dispose(){var C,E;(C=this._core)===null||C===void 0||C.notificationCenter.unSubscribeInnerEvent((E=this._core)===null||E===void 0?void 0:E.InnerEvent.DESTROY,this._dispose,this),this._reset()}},mE=new class{init(C){const{IN_MINI_APP:E}=C.utils;E?qI.init(C):xg.init(C)}},DE=new class{constructor(){this.name="SystemStateMonitor"}install(C){kl.init(C),mE.init(C)}};const DB=new Set(["tui_room_svr.*","callkit_records_svr.*","room_engine_srv.*","room_engine_http_srv.*","room_engine_mic.*","live_engine_srv.*","live_engine_http_srv.*","live_engine_pk.*","trtc_ai_service.*","call_engine_srv.*"]),Rn="tui_room_svr.*";var ps=new class{constructor(){this.name="BusinessCommandTransfer",this._transferredCommands=DB}install(C){this._core=C;const{notificationCenter:E,InnerEvent:h,helper:D}=C;E.subscribeInnerEvent(h.CLOUD_CONFIG_UPDATE,this._onCloudConfigUpdate,this),E.subscribeInnerEvent(h.LOGOUT,this._reset,this),E.subscribeInnerEvent(h.DESTROY,this._dispose,this),E.subscribeInnerEvent("im_open_push.msg_push",E.InnerEventSubType.BUSINESS_COMMAND,this._onServerPushBusinessCommand,this),D.registerExperimentalAPI("sendTRTCCustomData",this,"transferBusinessCommand"),D.registerExperimentalAPI("sendRoomCustomData",this,"transferBusinessCommand")}transferBusinessCommand(C){return et(this,void 0,void 0,function*(){const E="transferBusinessCommand";try{const{serviceCommand:h=Rn}=C||{};if(!this._isValidTransferredCommand(h))throw new this._core.helper.ChatError({code:2995,functionName:E});return{code:0,data:(yield function(N,O){return et(this,void 0,void 0,function*(){const{helper:Y,channel:j}=O,{serviceCommand:IA=Rn,data:BA}=N||{};let mA={};try{mA=typeof BA=="string"?JSON.parse(BA):BA}catch(Qe){console.warn(Qe)}const _A=Y.generateProtocolData({servcmd:IA,data:mA}),xA=`${_A.head.seq}${IA}`;return j.sendPacket(_A,{requestId:xA,shouldRejectOnError:!1})})}(C,this._core))||{}}}catch(h){throw console.warn(h),new this._core.helper.ChatError({code:h?.errorCode,message:h?.errorInfo,data:{},functionName:E})}})}_onCloudConfigUpdate(C={}){try{if(typeof C.rtc_cmd!="string")return;const E=JSON.parse(C.rtc_cmd);Array.isArray(E)&&(this._transferredCommands=new Set([...this._transferredCommands,...E]))}catch(E){console.log(E)}}_isValidTransferredCommand(C=""){const E=`${C?.split(".")[0]}.*`;return this._transferredCommands.has(E)}_onServerPushBusinessCommand(C){const{OuterEvent:E,notificationCenter:h}=this._core,{MsgContent:D}=C||{},{ROOM_CUSTOM_DATA_RECEIVED:N}=E;h.emitOuterEvent(N,{name:N,data:D})}_reset(){this._transferredCommands=DB}_dispose(){const{notificationCenter:C,InnerEvent:E}=this._core;this._reset(),C.unSubscribeInnerEvent(E.CLOUD_CONFIG_UPDATE,this._onCloudConfigUpdate,this),C.unSubscribeInnerEvent(E.LOGOUT,this._reset,this),C.unSubscribeInnerEvent(E.DESTROY,this._dispose,this),C.unSubscribeInnerEvent("im_open_push.msg_push",C.InnerEventSubType.BUSINESS_COMMAND,this._onServerPushBusinessCommand,this)}};const ag=new class{init(C){this.core=C}};function yB(C){return et(this,void 0,void 0,function*(){var E;const{message:h,user:D,appStore:N,constants:{OuterConstant:O}}=ag.core,Y=N.conversationStore.getConversationMap();if(Y.has(C)){const IA=(E=Y.get(C))===null||E===void 0?void 0:E.userProfile;if(IA&&C.startsWith(O.CONV_C2C)){const{avatar:BA,nick:mA}=IA;ag.core.message.messageDataHandler.updateNickAndAvatarOfSentMessage({conversationID:C,latestAvatar:BA,latestNick:mA,isSentByMe:!1})}}const{data:j}=(yield D.userProfile.getMyProfile())||{};if(j){const{avatar:IA,nick:BA}=j;h.messageDataHandler.updateNickAndAvatarOfSentMessage({conversationID:C,latestAvatar:IA,latestNick:BA,isSentByMe:!0})}})}function KI(C){return et(this,void 0,void 0,function*(){const E=C.map(h=>h.revoker);try{const h=yield function(D){return et(this,void 0,void 0,function*(){var N,O;const Y=yield(N=ag.core.user.userProfile)===null||N===void 0?void 0:N.getUserProfile({userIDList:D});return Y?.data?(O=Y.data)===null||O===void 0?void 0:O.reduce((j,{userID:IA,nick:BA,avatar:mA})=>(j[IA]={nick:BA||"",avatar:mA||""},j),{}):null})}(E);h&&C.forEach(D=>{const{revoker:N}=D;h[N]&&(D.revokerInfo.nick=h[N].nick||"",D.revokerInfo.avatar=h[N].avatar||"",D.revokerInfo.userID=N)})}catch(h){console.debug(h)}})}const RB=1,Wn=2,yE=20,wr=2500,MB=1,Yg=300;function TC(C){return et(this,void 0,void 0,function*(){var E,h;const{appStore:D,utils:{isEmpty:N},common:{getCurrentUserID:O},notificationCenter:Y,OuterEvent:j,OuterConstant:{CONV_C2C:IA}}=ag.core,{messageList:BA,conversationID:mA}=C,_A=D.conversationStore.getConversationMap();let xA=(E=_A.get(mA))===null||E===void 0?void 0:E.peerReadTime;if(!xA){const Re=mA.replace(IA,""),Se=yield function(At){return et(this,void 0,void 0,function*(){const at={To_Account:At};return ag.core.common.buildAndSendPacket({servcmd:"openim.get_peer_read_time",data:at})})}([Re]);if(Se){const{ReadTime:At}=Se;xA=At?.[0],_A.has(mA)&&(_A.get(mA).peerReadTime=xA)}}if(_A.has(mA)){const Re=(h=_A.get(mA))===null||h===void 0?void 0:h.lastMessage;N(Re)||Re.fromAccount===O()&&Re.lastTime<=xA&&!Re.isPeerRead&&(Re.isPeerRead=!0,D.conversationStore.updateConversation(mA,{lastMessage:Re}))}const Qe=[];BA.forEach(Re=>{Re.time<=xA&&!Re.isPeerRead&&Re.flow==="out"&&(Re.isPeerRead=!0,Qe.push(Re))}),Qe.length>0&&Y.emitOuterEvent(j.MESSAGE_READ_BY_PEER,{name:j.MESSAGE_READ_BY_PEER,data:Qe})})}var jI=new class{init(C){this._core=C,C.helper.registerApi({apiName:"getMessageList",context:this}),C.helper.registerApi({apiName:"getMessageListHopping",context:this}),C.helper.registerApi({apiName:"clearHistoryMessage",context:this})}getMessageList(C){return et(this,void 0,void 0,function*(){try{const{message:E,OuterConstant:{Direction:h,CONV_C2C:D,CONV_GROUP:N},InnerEvent:{HISTORY_MESSAGE_FETCHED:O},notificationCenter:Y}=this._core,{conversationID:j,nextReqMessageID:IA}=C,BA=yE;if(j==="@TIM#SYSTEM")return{code:0,data:{messageList:[],isCompleted:!1,nextMessageSeq:""}};const mA=this._getAvailableLocalMessagesCount({conversationID:j,nextReqMessageID:IA});if(this._needFetchHistoryMessageList({conversationID:j,availableLocalMessagesCount:mA,targetCount:BA})){let _A=null;if(j.startsWith(N)?_A=yield E.messageHistory.getGroupRoamingMessagesByAnchor({conversationID:j,sequence:Number(IA),count:BA,direction:h.FORWARD,shouldMarkCompleted:!0}):j.startsWith(D)&&(_A=yield E.messageHistory.getC2CRoamingMessagesByAnchor({conversationID:j,messageID:IA,count:BA,direction:h.FORWARD,shouldMarkCompleted:!0})),_A){const{nextReqMessageIDFromServer:xA,hasNoMoreHistoryMessage:Qe,messageList:Re}=_A,Se=E.messageDataHandler.prependLocalMessageList({messageList:Re,conversationID:j});(function(ri){const{appStore:St,message:eo,OuterConstant:to}=ag.core,Yt=St.conversationStore.getConversation(ri),si=eo.messageDataHandler.getLocalMessageList(ri);if(!Yt||si.length===0||ri===to.CONV_SYSTEM)return;const zo=[];for(let je=0;jedA.isRevoked).length;te=zo.length-Yt.unreadCount-je}else te=zo.length-Yt.unreadCount;for(let je=0;jeri.isRevoked);yield KI(at),Y.emitInnerEvent(O,Se);const jt={nextReqMessageID:Qe?"":String(xA),messageList:At,isCompleted:Qe},Bi=At.map(ri=>ri.sequence);return{code:0,data:jt,successLog:{message:`conversationID: ${j} nextReqMessageID: ${IA} availableLocalMessagesCount: ${mA} sequenceList: ${JSON.stringify(Bi)}`}}}return{code:0,data:{messageList:[],isCompleted:!1,nextReqMessageID:""}}}return{code:0,data:yield this._getMessageListFromMemory({conversationID:j,nextReqMessageID:IA,count:BA}),successLog:{message:`conversationID: ${j} nextReqMessageID: ${IA} availableLocalMessagesCount: ${mA}}`}}}catch(E){const{code:h,message:D}=E||{};throw new this._core.helper.ChatError({code:h,message:D,moreMessage:`options: ${this._core.utils.safeStringify(C)}`})}})}getMessageListHopping(C){return et(this,void 0,void 0,function*(){var E,h;const{OuterConstant:{Direction:D,CONV_C2C:N,CONV_GROUP:O},utils:{safeStringify:Y}}=this._core,{conversationID:j,sequence:IA,time:BA,direction:mA=D.FORWARD}=C,{utils:{isEmpty:_A},message:xA,notificationCenter:Qe,InnerEvent:{HISTORY_MESSAGE_FETCHED:Re}}=this._core;if(![D.BACKWARD,D.FORWARD].includes(mA))throw new this._core.helper.ChatError({message:"direction must be 0 or 1",moreMessage:`options: ${Y(C)}`});let{count:Se=yE}=C;Se=Se>yE?yE:Se;let At=null;if(j.startsWith(O)){if(At=yield xA.messageHistory.getGroupRoamingMessagesByAnchor({conversationID:j,sequence:IA,count:Se,direction:mA}),At){const{nextReqMessageIDFromServer:at,hasNoMoreHistoryMessage:jt,messageList:Bi,invisibleSequenceList:ri}=At;if(this._core.message.messageDataHandler.storeSparseMessageList(Bi),Qe.emitInnerEvent(Re,Bi),mA===D.FORWARD){const St=jt&&at<1;return{code:0,data:{messageList:Bi,isCompleted:St,nextMessageSeq:St?"":at}}}if(mA===D.BACKWARD){if(_A(Bi)&&_A(ri))return{code:0,data:{messageList:[],isCompleted:!0,nextMessageSeq:""}};const St=((E=Bi?.[Bi.length-1])===null||E===void 0?void 0:E.sequence)||0,eo=((h=ri?.[ri.length-1])===null||h===void 0?void 0:h.sequence)||0;return{code:0,data:{messageList:Bi.filter(to=>to.sequence>=IA),isCompleted:!jt,nextMessageSeq:jt?Math.max(St,eo)+1:""}}}return{code:0,data:At}}}else if(j.startsWith(N)&&(At=yield xA.messageHistory.getC2CRoamingMessagesByAnchor({conversationID:j,count:Se+1,time:BA,direction:mA}),At)){const{messageList:at,lastMessageTime:jt,hasNoMoreHistoryMessage:Bi}=At;return Qe.emitInnerEvent(Re,at),Bi||(mA===D.FORWARD?at.shift():at.pop()),xA.messageDataHandler.storeSparseMessageList(at),yield TC({messageList:at,conversationID:j}),{code:0,data:{messageList:at,isCompleted:Bi,nextMessageTime:Bi?"":jt}}}})}clearHistoryMessage(C){return et(this,void 0,void 0,function*(){var E;const{appStore:h,common:{ChatError:D,getCurrentUserID:N},OuterConstant:{CONV_C2C:O,CONV_GROUP:Y},apiMap:j,message:IA}=this._core,BA=h.conversationStore.getConversation(C);if(!BA)throw new D({code:wr});const mA={fromAccount:N()},{type:_A}=BA;_A===O?(mA.type=RB,mA.toAccount=C.replace(O,"")):_A===Y&&(mA.type=Wn,mA.toGroupID=C.replace(Y,""));try{return yield(E=j?.setMessageRead)===null||E===void 0?void 0:E.call(j,{conversationID:C}),(yield function(Qe){return et(this,void 0,void 0,function*(){const{fromAccount:Re,type:Se,toAccount:At,toGroupID:at}=Qe,jt={From_Account:Re,Type:Se,To_Account:At,ToGroupid:at};return ag.core.common.buildAndSendPacket({servcmd:"recentcontact.clear_msg",data:jt})})}(mA))&&(IA.messageDataHandler.deleteConversationMessageList(C),IA.messageHistory.completedHistoryConversations.delete(C),IA.messageHistory.clearHistoryMessageListFetchAnchors(C),this._updateConversationLastMessage(C)),{code:0,data:{conversationID:C},successLog:{message:`convID:${C}`}}}catch(xA){const{errorCode:Qe}=xA;throw new this._core.helper.ChatError({functionName:"clearHistoryMessage",code:Qe,moreMessage:`convID:${C}`})}})}_updateConversationLastMessage(C){const{appStore:E}=this._core;E.conversationStore.updateConversation(C,{lastMessage:this._generateLastMessage()},{needSort:!0})}_getAvailableLocalMessagesCount({conversationID:C,nextReqMessageID:E}){const{OuterConstant:{CONV_C2C:h,CONV_GROUP:D}}=this._core,N=this._core.message.messageDataHandler.getLocalMessageList(C),{length:O}=N;if(!E)return O;let Y=-1;return C?.startsWith(h)?Y=N.findIndex(j=>j.ID===E):C?.startsWith(D)&&(Y=N.findIndex(j=>E.includes("-")?j.ID===E:String(j.sequence)===E)),Y===-1?0:Y}_needFetchHistoryMessageList({conversationID:C,availableLocalMessagesCount:E,targetCount:h}){const{message:D}=this._core;return EE.startsWith(N)?xA.ID===h:String(xA.sequence)===h),mA=_A>D?_A-D:0,IA=_A):mA=j>D?j-D:0,BA.messageList=Y.slice(mA,_A),BA.isCompleted=IA<=D&&O.messageHistory.completedHistoryConversations.has(E),BA.isCompleted?BA.nextReqMessageID="":BA.nextReqMessageID=this._generateNextReqMessageID({conversationID:E,targetIndex:mA}),E.startsWith(N)&&(yield yB(E),yield TC({messageList:BA.messageList,conversationID:E})),BA})}_generateNextReqMessageID({conversationID:C,targetIndex:E}){const h=this._core.message.messageDataHandler.getLocalMessageList(C);return C.startsWith("C2C")?h[E].ID:String(h[E].sequence)}_generateLastMessage(){return{lastTime:0,lastSequence:0,fromAccount:"",messageForShow:"",payload:null,type:"",isRevoked:!1,cloudCustomData:"",onlineOnlyFlag:!1,nick:"",nameCard:"",version:0,isPeerRead:!1,revoker:null}}},ha=new class{constructor(){this._lastMessageSequenceMapOnDisconnect=new Map,this._lastMessageTimeMapOnDisconnect=new Map}init(C){this._core=C;const{common:{workflowManager:E},constants:{WORKFLOW_NAME:h,WORKFLOW_STEP:D,InnerEvent:N}}=C;E.registerWorkflowStep(h.SYNC_SERVER_INFO_AFTER_RE_ONLINE,D.HISTORY_MESSAGE_RECOVER,this._syncGroupOfflineMessage,this),E.registerWorkflowStep(h.SYNC_SERVER_INFO_AFTER_RE_ONLINE,D.C2C_HISTORY_MESSAGE_RECOVER,this._syncC2COfflineMessage,this),C.notificationCenter.subscribeInnerEvent(N.SOCKET_DISCONNECTED,this._updateLastMessageSequenceMapOnDisconnect,this)}_syncGroupOfflineMessage(C){const{conversationList:E}=C?.result||{},{OuterConstant:h,utils:{isArray:D}}=this._core;if(D(E)){const N=E.filter(O=>O.type===h.CONV_GROUP&&O.groupProfile.type!==h.GRP_AVCHATROOM);return this._recoverGroupHistoryMessage(N)}}_recoverGroupHistoryMessage(C){return et(this,void 0,void 0,function*(){const{OuterConstant:E}=this._core,h=[],D=[];return yield Promise.all(C?.map(N=>et(this,void 0,void 0,function*(){const{groupProfile:{groupID:O}={},lastMessage:{lastSequence:Y}={}}=N,j=`${E.CONV_GROUP}${O}`;let IA=this._getLocalLastMessageSequence(j);this._shouldRecoverHistory({localLastMessageSequence:IA,serverLastMessageSequence:Y})&&(yield this._recoverGroupHistoryForConversation({conversationID:j,localLastMessageSequence:IA,serverLastMessageSequence:Y,groupTipList:D})),h.push(j.replace(E.CONV_GROUP,""))}))),{recoverRevokeNoticeGroupIDList:h,groupTipList:D}})}_recoverGroupHistoryForConversation(C){return et(this,arguments,void 0,function*({conversationID:E,localLastMessageSequence:h,serverLastMessageSequence:D,groupTipList:N}){try{const{utils:{isArray:O,isObject:Y,isEmpty:j},OuterEvent:IA,OuterConstant:BA,notificationCenter:mA,message:_A,appStore:xA,common:{getMessagePreviewText:Qe,buildLastMessage:Re}}=this._core,Se=D-h,At=Math.min(20,Se),at={},jt=yield _A.messageHistory.getGroupRoamingMessagesByAnchor({conversationID:E,sequence:h+At,direction:BA.Direction.FORWARD,count:At}),{nextReqMessageIDFromServer:Bi,hasNoMoreHistoryMessage:ri,messageList:St,serverGroupTipList:eo}=jt;O(eo)&&N.push(...eo);const to=ri&&Bi<0,Yt=[];if(O(St)&&(St.forEach(si=>{_A.messageReceiver.groupMessageReceiver.updateMessageProfile(si),si.from===BA.CONV_SYSTEM&&(si.isSystemMessage=!1),_A.messageDataHandler.storeConversationMessage(si)&&!j(si.payload)&&(Yt.push(si),si._isExcludedFromLastMessage||(at.lastMessage=Re(si)))}),Yt.length>0&&mA.emitOuterEvent(IA.MESSAGE_RECEIVED,{name:IA.MESSAGE_RECEIVED,data:Yt})),!to&&St.length>0){const si=St[St.length-1].sequence;yield this._recoverGroupHistoryForConversation({conversationID:E,localLastMessageSequence:si,serverLastMessageSequence:D,groupTipList:N})}Y(at.lastMessage)&&(at.lastMessage.messageForShow=Qe(at.lastMessage.type,at.lastMessage.payload),xA.conversationStore.updateConversation(E,at))}catch(O){this._core.ssoLog.error("_recoverGroupHistoryForConversation",`Recovery failed for conversation:${E}`,{error:O})}})}_updateLastMessageSequenceMapOnDisconnect(){const{message:C}=this._core,E=C.messageDataHandler.getContinuousMessagesByConversation();for(const[h,D]of E){const N=Array.from(D.values());if(N?.length>0){const O=N[N.length-1];h.startsWith("C2C")?this._lastMessageTimeMapOnDisconnect.set(h,O.time):h.startsWith("GROUP")&&this._lastMessageSequenceMapOnDisconnect.set(h,O.sequence)}}}_getLocalLastMessageSequence(C){const{message:E}=this._core;if(this._lastMessageSequenceMapOnDisconnect.has(C))return this._lastMessageSequenceMapOnDisconnect.get(C);const h=E.messageDataHandler.getLocalMessageList(C),D=h[h.length-1];return D?.sequence}_shouldRecoverHistory(C){const{localLastMessageSequence:E,serverLastMessageSequence:h}=C;if(typeof E!="number"||typeof h!="number")return!1;const D=h-E;return h!==0&&E>0&&D>=MB&&D{O.type===h.CONV_C2C&&N.push(O)}),this._recoverC2CHistoryMessage(N)}}_recoverC2CHistoryMessage(C){return et(this,void 0,void 0,function*(){yield Promise.all(C?.map(E=>et(this,void 0,void 0,function*(){const{conversationID:h,lastMessage:{lastTime:D}={}}=E,N=this._getLocalLastMessageTime(h);this._shouldRecoverC2CHistory({localLastMessageTime:N,serverLastMessageTime:D})&&(yield this._recoverHistoryForC2CConversation({conversationID:h,localLastMessageTime:N,serverLastMessageTime:D}))})))})}_shouldRecoverC2CHistory(C){const{localLastMessageTime:E,serverLastMessageTime:h}=C,D=h-E;return E>0&&D>=1&&D<=600}_recoverHistoryForC2CConversation(C){return et(this,void 0,void 0,function*(){var E;const{conversationID:h,localLastMessageTime:D,serverLastMessageTime:N}=C,{utils:{isArray:O,isObject:Y,isEmpty:j,safeStringify:IA},OuterEvent:BA,OuterConstant:mA,notificationCenter:_A,message:xA,appStore:Qe,common:{getMessagePreviewText:Re,buildLastMessage:Se}}=this._core;try{const At={},at=yield xA.messageHistory.getC2CRoamingMessagesByAnchor({conversationID:h,direction:mA.Direction.BACKWARD,time:D,count:20});if(j(at))return;const{hasNoMoreHistoryMessage:jt,messageList:Bi}=at,ri=[];O(Bi)&&(Bi.forEach(eo=>{xA.messageDataHandler.storeConversationMessage(eo)&&!j(eo.payload)&&(ri.push(eo),eo._isExcludedFromLastMessage||(At.lastMessage=Se(eo)))}),ri.length>0&&_A.emitOuterEvent(BA.MESSAGE_RECEIVED,{name:BA.MESSAGE_RECEIVED,data:ri}));const St=(E=Bi[Bi.length-1])===null||E===void 0?void 0:E.time;!jt&&St>N&&(yield this._recoverHistoryForC2CConversation({conversationID:h,localLastMessageTime:St,serverLastMessageTime:N})),Y(At.lastMessage)&&(At.lastMessage.messageForShow=Re(At.lastMessage.type,At.lastMessage.payload),Qe.conversationStore.updateConversation(h,At))}catch(At){this._core.ssoLog.error("_recoverHistoryForC2CConversation",`Recovery failed for conversation:${h} error: ${IA(At)}`)}})}_getLocalLastMessageTime(C){const{message:E}=this._core;if(this._lastMessageTimeMapOnDisconnect.has(C))return this._lastMessageTimeMapOnDisconnect.get(C);const h=E.messageDataHandler.getLocalMessageList(C),D=h[h.length-1];return D?.time}reset(){this._lastMessageSequenceMapOnDisconnect.clear(),this._lastMessageTimeMapOnDisconnect.clear()}dispose(){this.reset()}},wB=new class{constructor(){this.name="HistoryMessage"}install(C){this._core=C,ag.init(C),jI.init(C),ha.init(C),C.notificationCenter.subscribeInnerEvent(C.InnerEvent.LOGOUT,this._reset,this),C.notificationCenter.subscribeInnerEvent(C.InnerEvent.DESTROY,this.dispose,this)}dispose(){const{notificationCenter:C,InnerEvent:E}=this._core;C.unSubscribeInnerEvent(E.LOGOUT,this._reset,this),C.unSubscribeInnerEvent(E.DESTROY,this.dispose,this),ha.dispose()}_reset(){ha.reset()}},pa=new class{init(C){this.core=C}},sg=new class{constructor(){this._reportedAtomicStoreIDs=new Set}init(C){const{helper:{registerExperimentalAPI:E}}=C;this._core=C,E("reportModalView",this),E("reportTUIFeatureUsage",this),E("reportRoomEngineEvent",this)}reportModalView(C){const{ssoLog:E,utils:{safeStringify:h,isString:D}}=this._core;try{if(!D(C))throw new Error("reportModalView data is not a string");E.createSSOLogData({method:"reportModalView",message:C,eventType:30}).end(!0)}catch(N){E.debug(`reportModalView Report failed: ${h(N)}`)}}reportTUIFeatureUsage(C){const{ssoLog:E,utils:{safeStringify:h,isEmpty:D}}=this._core,{atomicStoreID:N}=C;try{D(N)||this._reportedAtomicStoreIDs.has(N)||(this._core.ssoLog.info("reportTUIFeatureUsage",`atomicStoreID: ${C.atomicStoreID}`,{method:"reportTUIFeatureUsage",eventType:31,code:N}),this._reportedAtomicStoreIDs.add(N))}catch(O){E.debug(`reportTUIFeatureUsage Report failed: ${h(O)}`)}}reportRoomEngineEvent(C){const{utils:{safeStringify:E},ssoLog:h}=this._core;try{h.debug(`reportRoomEngineEvent Report: ${E(C)}`);const{eventId:D,eventCode:N,eventResult:O,eventMessage:Y,moreMessage:j,extensionMessage:IA}=C;h.createSSOLogData({method:IA,code:D,message:Y,eventType:30,costTime:N,uiPlatform:O,moreMessage:j}).end(!0)}catch(D){h.debug(`reportRoomEngineEvent Report failed: ${E(D)}`)}}reset(){this._reportedAtomicStoreIDs.clear()}dispose(){this.reset()}},GC=new class{constructor(){this.name="DataReport"}install(C){this._core=C;const{notificationCenter:E,InnerEvent:{LOGOUT:h,DESTROY:D}}=C;pa.init(C),sg.init(C),E.subscribeInnerEvent(h,this._reset,this),E.subscribeInnerEvent(D,this._dispose,this)}_reset(){sg.reset()}_dispose(){const{notificationCenter:C,InnerEvent:{LOGOUT:E,DESTROY:h}}=this._core;C.unSubscribeInnerEvent(E,this._reset,this),C.unSubscribeInnerEvent(h,this._dispose,this),sg.dispose()}};let bl=BE.STANDARD,Mn=[];bl=BE.BASIC,Mn=[fB,Ou,pi,DE,ps,wB,GC];function WI(C,E){const{operationType:h,memberInfoList:D,operatorInfo:N}=C||{};let O={};if($r(D)?$r(N)||(O=N):h!==Qs.JOINED&&h!==Qs.KICKED&&h!==Qs.ADMIN_SET&&h!==Qs.ADMIN_CANCELED||(O=Object.assign({},D[0])),!$r(O)){const{nick:Y="",avatar:j=""}=O;E.nick=Y,E.avatar=j}}const RE=C=>({lastTime:C?.time||C?.lastTime||0,lastSequence:C?.sequence||C?.lastSequence||0,fromAccount:C?.from||C?.fromAccount||"",messageForShow:bc(C?.type,C?.payload),payload:C?.payload||null,type:C?.type||"",isRevoked:C?.isRevoked||!1,cloudCustomData:C?.cloudCustomData||"",onlineOnlyFlag:C?._onlineOnlyFlag||!1,nick:C?.nick||"",nameCard:C?.nameCard||"",version:C?.version||0,isPeerRead:C?.isPeerRead||!1,revoker:C?.revoker||null});var dI=Object.freeze({__proto__:null,ChatError:lo,WorkflowManager:Ir,buildAndSendPacket:Ls,buildLastMessage:RE,get builtInPlugins(){return Mn},checkBusinessCapabilityBits:dE,deepMerge:hs,getCurrentUserID:Wr,getErrorMessage:Tc,getMessagePreviewText:bc,isC2CConv:C=>s(C)&&C.slice(0,3)===us.CONV_C2C,isCommunity:Ka,isGroupConv:C=>s(C)&&C.slice(0,5)===us.CONV_GROUP,isInternational:vl,isTopic:ca,isUnlimitedAVChatRoom:function(){var C;return!!(!((C=ZA.store.get("instance"))===null||C===void 0)&&C.unlimitedAVChatRoom)},liteChatInstanceMap:og,registerInterceptor:mn,registerValidateConfig:Lg,requireAuth:ds,get sdkEdition(){return bl},setGroupTipsUserInfo:WI,t:pB,updateGroupAtInfo:(C,E)=>{const{CONV_AT_ME:h,CONV_AT_ALL:D,CONV_AT_ALL_AT_ME:N}=vo;if(function(j,IA){const{CONV_AT_ME:BA,CONV_AT_ALL:mA,CONV_AT_ALL_AT_ME:_A}=vo,{groupID:xA,sequence:Qe}=j;let Re=!1;return Ka({groupID:xA})&&IA.forEach(Se=>{Se.messageSequence===Qe&&(Se.atTypeArray.includes(BA)&&j.groupAtType.includes(mA)&&(Se.atTypeArray=[_A]),Se.atTypeArray.includes(mA)&&j.groupAtType.includes(BA)&&(Se.atTypeArray=[_A],Se.__random=j.__random,Se.__sequence=j.__sequence),Re=!0)}),Re}(C,E))return;let O=[...C.groupAtType];O.includes(h)&&O.includes(D)&&(O=[N]);const Y={from:C.from,groupID:C.groupID,topicID:C.topicID,messageSequence:C.sequence,atTypeArray:O,__random:C.__random,__sequence:C.__sequence};E.push(Y)},validateAndExecute:HI,validateParameters:QB});class fs{constructor(){this._builtInPlugins=new Set,this._externalPlugins=new Set}static getInstance(){return fs._instance||(fs._instance=new fs),fs._instance}static setInstance(E){fs._instance=E}installBuiltInPlugin(E){E&&this._installPlugin(E,this._builtInPlugins)}installExternalPlugin(E){E&&this._installPlugin(E,this._externalPlugins)}clear(){this._builtInPlugins=new Set,this._externalPlugins=new Set}_installPlugin(E,h){let D=[];D=B(E)?E:[E];const N=D.findIndex(Y=>Y?.name==="AVChatRoom"),O=N>-1?D.splice(N,1):[];D.forEach(Y=>{this._isPluginInstalled(Y.name)||(Y&&Ag(Y.install)?(h.add(Y.name),Ag(Y.getInstalledSubPlugins)?(O?.forEach(j=>h.add(j?.name)),Y.install(Wo.getInstance().exposeApiForPlugin(),O)):Y.install(Wo.getInstance().exposeApiForPlugin()),Ag(Y.handleLoginSuccess)&&this._isLoggedIn()&&Y.handleLoginSuccess()):Ag(Y)?(h.add(Y.name),Y(Wo.getInstance().exposeApiForPlugin()),Ag(Y.handleLoginSuccess)&&this._isLoggedIn()&&Y.handleLoginSuccess()):console.warn('A plugin must either be a function or an object with an "install" function.'))})}_isPluginInstalled(E){return this._builtInPlugins.has(E)||this._externalPlugins.has(E)}_isLoggedIn(){var E;return((E=ZA.store.get("login"))===null||E===void 0?void 0:E.isLoggedIn)===!0}}var Uc=new class{constructor(){this._conversationMap=new Map}getConversationMap(){return this._conversationMap}getConversation(C){return this._conversationMap.get(C)}updateConversation(C,E,h){const{emit:D=!0,needSort:N=!1}=h||{},O=this._conversationMap.get(C);O&&!$r(E)&&(Object.keys(E).forEach(Y=>{O[Y]=E[Y]}),D&&ZA.notificationCenter.emitInnerEvent(Gt.CONVERSATION_UPDATED,{needSort:N}))}deleteConversation(C){this._conversationMap.has(C)&&(this._conversationMap.delete(C),ZA.notificationCenter.emitInnerEvent(Gt.CONVERSATION_UPDATED))}},ms=new class{constructor(){this._groupMap=new Map}getGroupMap(){return this._groupMap}getGroup(C){return this._groupMap.get(C)}updateGroup(C,E){const h=this._groupMap.get(C);h&&!$r(E)&&Object.keys(E).forEach(D=>{h[D]=E[D]})}},zI=new class{constructor(){this._messagesByConversation=new Map}updateMessage(C,E,h){var D;const{operation:N,updateUnreadCount:O=!0}=h,Y=Vo(h,["operation","updateUnreadCount"]),j=[];for(const IA of E){const BA=(D=this._messagesByConversation.get(C))===null||D===void 0?void 0:D.get(IA);if(!BA)return!1;Object.keys(Y).forEach(mA=>{BA[mA]=Y[mA]}),j.push(BA)}return this._emitMessageStoreOperationEvent(N,{conversationID:C,messageList:j,updateUnreadCount:O}),j}getMessagesByConversation(C){var E;return[...((E=this._messagesByConversation.get(C))===null||E===void 0?void 0:E.values())||[]]}getMessages(){return this._messagesByConversation}_emitMessageStoreOperationEvent(C,E){const{conversationID:h}=E;ca(h)?ZA.notificationCenter.emitInnerEvent(qa[C],E):ZA.notificationCenter.emitInnerEvent(C,E)}},xn=new class{constructor(){this.userProfileMap=new Map,this.friendMap=new Map}getUserProfileMap(){return this.userProfileMap}getFriendMap(){return this.friendMap}getUserProfile(C){return this.userProfileMap.get(C)}getFriend(C){return this.friendMap.get(C)}},Yu=Object.freeze({__proto__:null,conversationStore:Uc,groupStore:ms,messageStore:zI,userStore:xn});class Wo{static getInstance(){return Wo._instance||(Wo._instance=new Wo),Wo._instance}static setInstance(E){Wo._instance=E}constructor(){this._experimentalApiMap={statTUIKeyFeatures:this.statKeyFeatureUsage.bind(this),setApplicationID:this.setApplicationID.bind(this)},this._apiHandlersMap={},this._apiMap={on:ZA.notificationCenter.subscribeOuterEvent.bind(ZA.notificationCenter),off:ZA.notificationCenter.unSubscribeOuterEvent.bind(ZA.notificationCenter),destroy:this.destroy.bind(this),callExperimentalAPI:this.callExperimentalAPI.bind(this),use:fs.getInstance().installExternalPlugin.bind(fs.getInstance()),registerPlugin:this.registerPlugin.bind(this),setLogLevel:this.setLogLevel.bind(this)}}registerPlugin(E){ZA.ssoLog.debug("registerPlugin",E)}statKeyFeatureUsage(E){ZA.ssoLog.debug("statTUIKeyFeatures",E)}setLogLevel(E){ZA.ssoLog.debug("setLogLevel",E),ZA.ssoLog.setLogLevel(E)}setApplicationID(E){ZA.store.set("instance",{applicationID:E})}getApiMap(){return this._apiMap}setApiMap(E){this._apiMap=E}registerApi(E){const{common:{timeManager:h},utils:{safeStringify:D}}=ZA,{apiName:N,context:O,methodName:Y=N,matcher:j}=E;this._apiHandlersMap[N]||(this._apiHandlersMap[N]=[]),this._apiHandlersMap[N].push({context:O,methodName:Y,matcher:j}),this._apiMap[N]&&this._apiHandlersMap[N].length!==1||(this._apiMap[N]=(...IA)=>{const BA=h.getServerTimeMs();let mA=0;N==="login"&&(mA=4),tn.includes(N)&&ZA.ssoLog.debug(N,`${N} start params: ${D(IA)}`),HI(Y,IA);const _A=this._apiHandlersMap[N];for(const xA of _A)if(!xA.matcher||xA.matcher(IA))try{const Qe=xA.context[xA.methodName].bind(xA.context)(...IA);return this._isPromiseLike(Qe)?this._handleAsyncResult(Qe,N,mA,BA):(this._reportApiSuccessLog({result:Qe,apiName:N,eventType:mA,startTime:BA}),Qe)}catch(Qe){throw ZA.ssoLog.error(N,`${N} fail ${Qe?.message||Qe?.errorMessage})`,{error:Qe,costTime:h.getServerTimeMs()-BA,eventType:mA,method:N}),Qe}})}registerExperimentalAPI(E,h,D){const N=D||E;this._experimentalApiMap[E]=h[N].bind(h)}destroy(){return et(this,void 0,void 0,function*(){var E,h;try{!((E=ZA.store.get("login"))===null||E===void 0)&&E.isLogin&&(yield this._apiMap.logout()),ZA.notificationCenter.emitInnerEvent(Gt.DESTROY)}catch(D){console.debug("destroy error: ",D)}finally{ZA.notificationCenter.emitOuterEvent(kr.SDK_DESTROY,{SDKAppID:(h=ZA.store.get("instance"))===null||h===void 0?void 0:h.sdkAppId}),og.clear(),fs.getInstance().clear(),Ir.getInstance().destroy(),ZA.destroy()}})}exposeApiForClient(){return this._apiMap}exposeApiForPlugin(){return Object.assign(Object.assign({InnerEvent:Gt,InnerEventSubType:ZA.notificationCenter.InnerEventSubType,OuterEvent:kr,OuterConstant:vo,SignalingEvent:Dl,helper:Object.assign(Object.assign(Object.assign({},ZA.utils),ZA.common),{registerApi:this.registerApi.bind(this),registerExperimentalAPI:this.registerExperimentalAPI.bind(this),registerInterceptor:mn,registerValidateConfig:Lg,checkBusinessCapabilityBits:dE,registerWorkflowStep:Ir.getInstance().registerWorkflowStep.bind(Ir.getInstance()),ChatError:lo}),apiMap:this._apiMap},ZA),{constants:Object.assign(Object.assign({},Ml),ZA.constants),common:Object.assign(Object.assign(Object.assign({},dI),ZA.common),{workflowManager:Ir.getInstance()}),utils:ZA.utils,appStore:Yu})}callExperimentalAPI(E,h){return ZA.ssoLog.debug(`callExperimentalAPI.${E} start params: ${ZA.utils.safeStringify(h)}`),this._experimentalApiMap[E]?this._experimentalApiMap[E](h):(ZA.ssoLog.error("callExperimentalAPI",`callExperimentalAPI.${E} not found, params: ${ZA.utils.safeStringify(h)}`),Promise.reject(new lo({code:Qa.INVALID_OPERATION})))}_isPromiseLike(E){return E!==null&&typeof E=="object"&&typeof E.then=="function"}_handleAsyncResult(E,h,D,N){return E.then(O=>(this._reportApiSuccessLog({result:O,apiName:h,eventType:D,startTime:N}),O)).catch(O=>{throw ZA.ssoLog.error(h,`${h} fail ${O?.message||O?.errorMessage})`,{error:O,costTime:ZA.common.timeManager.getServerTimeMs()-N,eventType:D,method:h,startTime:N}),O})}_reportApiSuccessLog(E){let{result:h,apiName:D,startTime:N,eventType:O}=E;const{timeManager:Y}=ZA.common,{successLog:{message:j,moreMessage:IA}={message:"",moreMessage:""}}=h||{},BA=Y.getServerTimeMs();D==="login"&&(N+=Y.getTimeOffsetWithServer()),tn.includes(D)&&ZA.ssoLog.info(D,`${D} success ${j} ${IA}`,{costTime:BA-N,eventType:O,message:j,moreMessage:IA,startTime:N}),h?.successLog&&delete h.successLog}}class Oc{constructor(){this._latestLoginAt=0,this._latestSendOnlinePresenceRequestTime=0,this._helloInterval=120,this._customLoginInfo=""}init(){const{notificationCenter:E,store:h}=ZA;h.set("login",{isReady:!1}),Wo.getInstance().registerApi({apiName:"login",context:this}),Wo.getInstance().registerApi({apiName:"logout",context:this}),Wo.getInstance().registerApi({apiName:"getLoginUser",context:this}),Wo.getInstance().registerApi({apiName:"isReady",context:this}),Wo.getInstance().registerApi({apiName:"getServerTime",context:this}),Wo.getInstance().registerExperimentalAPI("setCustomLoginInfo",this),E.subscribeInnerEvent(Gt.RECONNECTED,this._reLogin,this),ZA.notificationCenter.subscribeInnerEvent(Gt.DESTROY,this._dispose,this)}login(E){return et(this,void 0,void 0,function*(){var h;const{sdkEdition:D}=ZA.store.get("instance")||{};try{if(this._isLoginIn())return this._createRepeatLoginResponse();if(this._isLoginFrequencyExceeded())throw new lo({functionName:"login",code:Qa.REPEAT_LOGIN});const N=yield this._performLogin(E);this._validateAfterLogin(N),this._handleLoginSuccess(N),yield this._ensureAsyncComplete(),this._updateAndEmitSDKReady(),this._latestLoginAt=0;const O=(h=ZA.channel.getSocketAdapter())===null||h===void 0?void 0:h.getId(),{appId:Y,href:j}=ZA.store.get("instance")||{},{instanceID:IA,customStatus:BA}=N||{};return{code:0,data:N,successLog:{message:D,moreMessage:`socketID:${O} instanceID:${IA} customStatus:${BA} href: ${j} appId: ${Y}`}}}catch(N){const{errorCode:O}=N;O!==Qa.REPEAT_LOGIN&&(this._latestLoginAt=0);const Y=new lo({functionName:"login",code:O});throw console.error(Y),Y}})}_reLogin(){return et(this,void 0,void 0,function*(){var E;try{if(!this._isLoginIn())return;const h=yield QE(this._customLoginInfo);if(h){const{instanceID:D,customStatus:N}=h;ZA.store.set("login",{statusInstanceId:D}),Ir.getInstance().executeWorkflow(cn.SYNC_SERVER_INFO_AFTER_RE_ONLINE,{customStatus:N,statusType:CE.USER_STATUS_ONLINE});const O=(E=ZA.channel.getSocketAdapter())===null||E===void 0?void 0:E.getId();ZA.ssoLog.info("reLogin",`socketId:${O} instanceId:${D}`)}}catch(h){console.warn(h)}})}logout(){return et(this,arguments,void 0,function*(E=ba.USER_INITIATED){const{ssoLog:h}=ZA;h.debug("logout",`logout start logoutReason: ${E}`);try{yield this._performLogout(E),h.info("logout","logout success"),ZA.ssoLog.uploadSSOLogData()}catch(D){const{errorCode:N}=D;throw new lo({functionName:"logout",code:N})}finally{this.handleLogoutCompleted()}return{code:0,data:{}}})}getLoginUser(){return this._isLoginIn()?Wr():""}isReady(){var E;return(E=ZA.store.get("login"))===null||E===void 0?void 0:E.isReady}setCustomLoginInfo(E=""){this._customLoginInfo=E}handleLogoutCompleted(){this._updateAndEmitSDKNotReady(),this._reset(),Ir.getInstance().reset(),ZA.notificationCenter.emitInnerEvent("logout")}getServerTime(){const{timeManager:E}=ZA.common;return E.getServerTimeMs()}_updateAndEmitSDKReady(){ZA.store.set("login",{isReady:!0}),setTimeout(()=>{ZA.notificationCenter.emitOuterEvent(kr.SDK_READY,{name:kr.SDK_READY})},1)}_updateAndEmitSDKNotReady(){ZA.store.set("login",{isReady:!1}),ZA.notificationCenter.emitOuterEvent(kr.SDK_NOT_READY,{name:kr.SDK_NOT_READY})}_validateAfterLogin(E){const h="login";if(!E)throw new lo({functionName:h,message:"login response is empty"});const{tinyID:D,a2Key:N}=E||{};if(!D)throw new lo({functionName:h,code:Qa.NO_TINYID});if(!N)throw new lo({functionName:h,code:Qa.NO_A2KEY})}_createRepeatLoginResponse(){var E;return{code:0,data:{actionStatus:"OK",errorCode:0,errorInfo:Tc({code:"RepeatLogin",replacement1:(E=ZA.store.get("login"))===null||E===void 0?void 0:E.userId}),repeatLogin:!0}}}_performLogin(E){return et(this,void 0,void 0,function*(){const{userID:h,userSig:D}=E;return ZA.store.set("login",{userId:h,userSig:D}),this._latestLoginAt=Date.now(),QE(this._customLoginInfo)})}_ensureAsyncComplete(){return et(this,void 0,void 0,function*(){yield new Promise(E=>{setTimeout(()=>E(null),1)})})}_handleLoginSuccess(E){const{timeManager:h}=ZA.common,{helloInterval:D,timeStamp:N,customStatus:O,purchaseBits:Y}=E,j=1e3*N;h.calculateTimeOffsetWithServer(this._latestLoginAt,j),this._helloInterval=D||120,this._updateLoginStore(E),ZA.user.userStatus.setCustomStatus(O),Ir.getInstance().executeWorkflow(cn.SYNC_SERVER_INFO_AFTER_LOGIN,{purchaseBits:Y}),ZA.common.taskScheduler.addTask({id:wl,intervalMs:1e3*this._helloInterval,callback:this._sendOnlinePresenceRequest,context:this})}_performLogout(E){return function(h){return et(this,void 0,void 0,function*(){const{logoutReason:D}=h,N="im_open_status.wslogout",O=ZA.common.generateProtocolData({servcmd:N,data:{wslogout_type:D,isWebUniapp:0}}),Y=`${O.head.seq}${N}`;return yield ZA.channel.sendPacket(O,{requestId:Y})})}({logoutReason:E})}_updateLoginStore(E){const{a2Key:h,tinyID:D,instanceID:N,authKey:O}=E;ZA.store.set("login",{a2Key:h,tinyID:D,statusInstanceId:N,authKey:O,isLoggedIn:!0})}_sendOnlinePresenceRequest(){return et(this,void 0,void 0,function*(){this._latestSendOnlinePresenceRequestTime=Date.now();try{yield function(){const E="im_open_status.wshello",h=ZA.common.generateProtocolData({servcmd:E,data:{isWebUniapp:0}}),D=`${h.head.seq}${E}`;return ZA.channel.sendPacket(h,{requestId:D})}()}catch(E){ZA.ssoLog.warn("_sendOnlinePresenceRequest",` error:${E.message}`)}})}_isLoginIn(){var E;return((E=ZA.store.get("login"))===null||E===void 0?void 0:E.isLoggedIn)===!0}_isLoginFrequencyExceeded(){return Date.now()-this._latestLoginAt<=15e3}_reset(){ZA.common.taskScheduler.removeTask(wl),this._helloInterval=120,this._latestSendOnlinePresenceRequestTime=0,this._latestLoginAt=0,this._customLoginInfo="",ZA.store.clear("login"),ZA.store.set("login",{isReady:!1}),ZA.store.set("instance",{applicationID:0})}_dispose(){this._reset();const{notificationCenter:E}=ZA;E.unSubscribeInnerEvent(Gt.RECONNECTED,this._reLogin,this),E.unSubscribeInnerEvent(Gt.DESTROY,this._dispose,this)}}const ME={login:{userID:{required:!0,rules:["string"],allowEmpty:!1},userSig:{required:!0,rules:["string"],allowEmpty:!1}}},Pg={logout:!0};class gg{constructor(){this.loginAction=new Oc,this.kickedOutHandler=new bg,this.loginAction.init(),this.kickedOutHandler.init(),Lg({auth:Pg,params:ME})}}var En,Ds,Wa;(function(C){C.CONV_C2C="C2C",C.CONV_GROUP="GROUP",C.CONV_TOPIC="TOPIC",C.CONV_SYSTEM="@TIM#SYSTEM"})(En||(En={})),function(C){C.MSG_PRIORITY_HIGH="High",C.MSG_PRIORITY_NORMAL="Normal",C.MSG_PRIORITY_LOW="Low",C.MSG_PRIORITY_LOWEST="Lowest"}(Ds||(Ds={})),function(C){C.MSG_TEXT="TIMTextElem",C.MSG_CUSTOM="TIMCustomElem",C.MSG_LOCATION="TIMLocationElem",C.MSG_FACE="TIMFaceElem",C.MSG_IMAGE="TIMImageElem",C.MSG_AUDIO="TIMSoundElem",C.MSG_FILE="TIMFileElem",C.MSG_VIDEO="TIMVideoFileElem",C.MSG_GRP_TIP="TIMGroupTipElem",C.MSG_GRP_SYS_NOTICE="TIMGroupSystemNoticeElem",C.MSG_MERGER="TIMRelayElem"}(Wa||(Wa={}));const Ll={1:Ds.MSG_PRIORITY_HIGH,2:Ds.MSG_PRIORITY_NORMAL,3:Ds.MSG_PRIORITY_LOW,4:Ds.MSG_PRIORITY_LOWEST},SB=0,Pu=1;var li;(function(C){C.IN="in",C.OUT="out"})(li||(li={}));const wE=2,hI={};function vB(C){if(!C)return 0;if(hI[C]===void 0){const E=new Date,h=`3${E.getHours()}`.slice(-2),D=`0${E.getMinutes()}`.slice(-2),N=`0${E.getSeconds()}`.slice(-2);hI[C]=parseInt([h,D,N,"0001"].join(""),10),console.log(`autoIncrementIndex start index:${hI[C]}`)}else hI[C]+=1;return hI[C]}class NB{constructor(E){this.ID="",this.random=0,this.sequence=0,this.nameCard="",this.isRead=!1,this.isPeerRead=!1,this.isDeleted=!1,this.isResend=!1,this.hasRiskContent=!1,this._onlineOnlyFlag=!1,this.atUserList=[],this._groupAtInfoList=[],this.isBroadcastMessage=!1,this.priority=Ds.MSG_PRIORITY_NORMAL,this._relayFlag=!1;const{clientTime:h=ZA.common.timeManager.getServerTimeSeconds()||0,senderTinyID:D,currentUser:N,needReadReceipt:O,isSupportExtension:Y,customModerationConfigurationId:j,to:IA,from:BA,nick:mA="",avatar:_A="",time:xA,messageControlInfo:Qe,tinyID:Re,cloudCustomData:Se="",messageLifeTime:At,messageVersion:at=0,conversationType:jt,sequence:Bi,checkResult:ri=0,isPlaceMessage:St=0,messageFlagBits:eo,receiverList:to,isSystemMessage:Yt=!1,status:si=tg.SUCCESS,revokeReason:zo="",conversationSubType:te,clientSequence:je,protocol:dA="JSON",revokerInfo:ut={userID:"",nick:"",avatar:""},readReceiptInfo:Cr={readCount:void 0,unreadCount:void 0,isPeerRead:void 0,timestamp:0},random:lt,groupProfile:Co,atUserList:Jt,flow:mo,isRead:Fe=!1,priority:Oe=Ds.MSG_PRIORITY_NORMAL,onlineOnlyFlag:xs=!1,nameCard:Zo="",quoteInfo:ti}=E;var _n;this.clientTime=h,this.senderTinyID=D||Re,this.needReadReceipt=O===!0||O===1,this.isSupportExtension=Y===!0||Y===1,this._cmConfigID=j,this.to=IA,this.nick=mA,this.avatar=_A,this.protocol=dA,this.random=lt===void 0?(_n=_n||99999999,Math.round(Math.random()*_n)):lt,this.time=xA||Math.ceil(Date.now()/1e3),this._isExcludedFromLastMessage=!!Qe?.excludedFromLastMessage,this._isExcludedFromUnreadCount=!!Qe?.excludedFromUnreadCount,this.isModified=!!at,this.cloudCustomData=Se,this.messageLifeTime=At,this.from=BA||null,this.sequence=Bi||0,this.conversationType=jt||En.CONV_C2C,this.hasRiskContent=ri>1,this.version=at,this.isPlaceMessage=St,this.isRevoked=St===2||eo===8,this.isSystemMessage=Yt,this.readReceiptInfo=Cr,this.revokeReason=zo,this.revokerInfo=ut,this._receiverList=to,this.conversationSubType=te,this.revoker=ut?.revoker||"",this.clientSequence=je||Bi||0,this.status=si,this.atUserList=Jt||[],this.flow=mo,this.isRead=Fe,this.priority=Oe,this._onlineOnlyFlag=xs,this.nameCard=Zo,this.quoteInfo=ti,this.reInitialize(N),this._initC2CReadReceiptInfo(E),this._extractGroupInfo(Co)}getElements(){return this._elements}isOnlineMessage(){return this.messageLifeTime===0}setElement(E){Array.isArray(E)?this._elements=E:this._elements=[E],this._updatePayloadAndType()}transformElementsToServerFormat(){return this._elements?Array.isArray(this._elements)?this._elements.map(E=>E.transformToServerFormat()):this._elements.transformToServerFormat():null}setRelayFlag(E){this._relayFlag=E}validateBeforeSend(){var E,h,D;return this._relayFlag?{isValid:!0}:((E=this._elements)===null||E===void 0?void 0:E.length)>0?(D=(h=this._elements[0])===null||h===void 0?void 0:h.validateBeforeSend)===null||D===void 0?void 0:D.call(h):{isValid:!1}}_updatePayloadAndType(){this._elements[0]&&(this.payload=this._elements[0].content,this.type=this._elements[0].type)}_initC2CReadReceiptInfo(E){const{readReceiptSentByPeer:h,timestamp:D=0}=E;this.conversationType===En.CONV_C2C&&this.needReadReceipt===!0&&(this.readReceiptInfo.isPeerRead=h===1,this.readReceiptInfo.timestamp=D)}_extractGroupInfo(E){if(!E)return;const{From_AccountNick:h,From_AccountHeadurl:D,MsgFrom_AccountExtraInfo:N,GroupType:O}=E,{NameCard:Y}=N||{};typeof h=="string"&&(this.nick=h),typeof D=="string"&&(this.avatar=D),typeof Y=="string"&&(this.nameCard=Y),this.conversationSubType=O}reInitialize(E){E===this.from&&(this.isRead=!0),this._initSequence(E),this._concatConversationID(E),this.generateMessageID()}_concatConversationID(E){let h="";const D=this.conversationType;D!==En.CONV_SYSTEM?(h=D===En.CONV_C2C?E===this.from?this.to:this.from:this.to,this.conversationID=h?`${D}${h}`:null):this.conversationID=En.CONV_SYSTEM}_initSequence(E){this.clientSequence===0&&E&&(this.clientSequence=vB(E)),this.sequence===0&&this.conversationType===En.CONV_C2C&&(this.sequence=this.clientSequence)}generateMessageID(){this.from===En.CONV_SYSTEM&&(this.senderTinyID="144115198244471703"),this.ID=`${this.senderTinyID}-${this.clientTime}-${this.random}`}setIsRead(E){this.isRead=E}}class pI{static parseServerPushElement(E){const{MsgContent:h={}}=E,{Data:D,Ext:N,Desc:O}=h;return new pI({data:D,description:O,extension:N})}constructor(E){this.type=Wa.MSG_CUSTOM;const{data:h="",description:D="",extension:N=""}=E;this.content={data:h,description:D,extension:N}}transformToServerFormat(E){const{isMergerMessage:h=!1}=E||{},D=h?this.payload:this.content,{data:N,description:O,extension:Y}=D;return{MsgType:this.type,MsgContent:{Data:N,Ext:Y,Desc:O}}}validateBeforeSend(){const{isEmpty:E}=ZA.utils,h=[this.content.data,this.content.description,this.content.extension].some(D=>!E(D));return{isValid:h,error:h?null:{message:"content can not be empty"}}}}class SE{static parseServerPushElement(E){const{MsgContent:h={Text:""}}=E,{Text:D}=h;return new SE({text:D})}constructor(E){this.type=_s.MSG_TEXT,this.content={text:E.text||""}}validateBeforeSend(){var E,h;return((h=(E=this.content)===null||E===void 0?void 0:E.text)===null||h===void 0?void 0:h.length)>0?{isValid:!0}:{isValid:!1,error:{message:"content can not be empty"}}}transformToServerFormat(E){const{isMergerMessage:h=!1}=E||{},D=h?this.payload:this.content,{text:N}=D;return{MsgType:this.type,MsgContent:{Text:N}}}}var ZI=new class{constructor(){this._elementClassMap={[Wa.MSG_CUSTOM]:pI,[Wa.MSG_TEXT]:SE}}init(){Wo.getInstance().registerApi({apiName:"createCustomMessage",context:this}),Wo.getInstance().registerApi({apiName:"createTextMessage",context:this})}registerElementClass(C,E){var h;(h=E).prototype!==void 0&&"constructor"in h.prototype&&(this._elementClassMap[C]=E)}getElementClass(C){return this._elementClassMap[C]}createMessage(C){const{from:E,flow:h=li.OUT}=C,{userId:D}=ZA.store.get("login")||{};this._isSendByCurrentInstance({from:E,flow:h,currentUser:D})?this._updateWithSenderInfo(C):this._isMultiEndpointSyncMessage({from:E,flow:h,currentUser:D})&&(C.flow=li.OUT);const N=Object.assign(Object.assign({},C),{currentUser:D});return new NB(N)}createCustomMessage(C){const E=Wr(),h=this.createMessage(Object.assign(Object.assign({},C),{from:E})),D=this._elementClassMap[Wa.MSG_CUSTOM];if(!h)return null;if(D){const N=new D(C.payload);h.setElement(N)}return h}createTextMessage(C){var E;if(!C)return null;const h=typeof C.payload=="string"?C.payload:((E=C?.payload)===null||E===void 0?void 0:E.text)||"",D=new SE({text:h}),N=Wr(),O=ZA.message.messageFactory.createMessage(Object.assign(Object.assign({},C),{from:N}));return O.setElement(D),O}_updateWithSenderInfo(C){var E,h;const{nick:D,avatar:N,conversationType:O,to:Y}=C,{userId:j,tinyID:IA}=ZA.store.get("login")||{},BA=xn.getUserProfile(j);return C.nick=D||BA?.nick||"",C.avatar=N||BA?.avatar||"",C.tinyID=C.tinyID||IA||"",C.from=j,C.status=tg.UNSENT,C.flow=li.OUT,O===us.CONV_GROUP&&(C.nameCard=(h=(E=ms.getGroup(Y))===null||E===void 0?void 0:E.selfInfo)===null||h===void 0?void 0:h.nameCard),C}_isMultiEndpointSyncMessage(C){const{from:E,flow:h,currentUser:D}=C;return E===D&&h===li.IN}_isSendByCurrentInstance(C){const{from:E,flow:h,currentUser:D}=C;return E===D&&h===li.OUT}};const xc={PushFlag:0,Title:"",Desc:"",Ext:"",ApnsInfo:{Sound:"",BadgeMode:0,IsVoipPush:void 0,Image:"",InterruptionLevel:"active",ContentAvailable:0},AndroidInfo:{Sound:"",XiaoMiChannelID:"",OPPOChannelID:"",GoogleChannelID:"",VIVOClassification:1,VIVOCategory:"",HuaWeiCategory:"",OPPOCategory:"",HuaWeiImage:"",HonorImage:"",GoogleImage:"",HonorImportance:"",MeizuNotifyType:void 0}},TB={HonorImportance:{range:["LOW","NORMAL"],defaultValue:void 0},MeizuNotifyType:{range:[0,1],defaultValue:void 0}},Yc={enableIOSBackgroundNotification:{range:[!0,!1],defaultValue:!1},interruptionLevel:{range:["passive","active","time-sensitive","critical"],defaultValue:"active"}};function XI(C,E){return Object.keys(E).forEach(h=>{const{range:D,defaultValue:N}=E[h];C[h]=D.includes(C[h])?C[h]:N}),C}function Us(C){const E=C.lastIndexOf(".");return E===-1?C:C.slice(0,E)}function fI(C){const{androidInfo:E={},androidOPPOChannelID:h=""}=C,D=E.OPPOChannelID||h,N=XI(E,TB),{sound:O="",FCMChannelID:Y=""}=N,j=Vo(N,["sound","FCMChannelID"]);return Object.assign(Object.assign({},j),{Sound:Us(O),OPPOChannelID:D,GoogleChannelID:Y})}function kC(C){const{apnsInfo:E={},ignoreIOSBadge:h=!1,disableVoipPush:D}=C,N=XI(E,Yc),{ignoreIOSBadge:O,disableVoipPush:Y,enableIOSBackgroundNotification:j}=N,IA=Vo(N,["ignoreIOSBadge","disableVoipPush","enableIOSBackgroundNotification"]),BA=O===!0||h===!0?1:0;let mA;return r(D)||(mA=D===!1?1:0),r(Y)||(mA=Y===!1?1:0),Object.assign(Object.assign({},IA),{BadgeMode:BA,IsVoipPush:mA,ContentAvailable:j?1:0})}function Fl(C){return ZA.utils.isPlainObject(C)?{PushFlag:C.disablePush===!0?1:0,Title:C.title||"",Desc:C.description||"",Ext:C.extension||"",ApnsInfo:kC(C),AndroidInfo:fI(C)}:xc}function Pc(C){const{From_AccountHeadurl:E,From_AccountNick:h,IsNeedReadReceipt:D,IsPeerRead:N,IsSyncMsg:O,MsgBody:Y,MsgClientTime:j,MsgLifeTime:IA,MsgRandom:BA,MsgSeq:mA,MsgTimeStamp:_A,SendMsgControl:xA,SupportMessageExtension:Qe,TinyId:Re,MsgCheckResult:Se,CloudCustomData:At,MsgVersion:at,MsgFlagBits:jt,RevokerInfo:Bi,InnerSdkCustomData:ri}=C;let St,{From_Account:eo,To_Account:to}=C;if(O===1){const Yt=to;to=eo,eo=Yt}if(Bi){const{Reason:Yt,Revoker_Account:si,Revoker_FromUin:zo}=Bi;St={reason:Yt,revoker:si,revokerFromUin:zo,userID:si}}return{from:eo,avatar:E,nick:h,needReadReceipt:D===1,isSyncMessage:O,clientTime:j,messageLifeTime:IA,random:BA,sequence:mA,time:_A,messageControlInfo:{excludedFromLastMessage:xA?.NoLastMsg===1,excludedFromUnreadCount:xA?.NoUnread===1},isSupportExtension:Qe,to,tinyID:Re,checkResult:Se,cloudCustomData:At,revokerInfo:St,messageVersion:at,messageFlagBits:jt,readReceiptSentByPeer:N,elements:za(Y),onlineOnlyFlag:IA===0,quoteInfo:Ol(ri)}}function vE(C){const{From_Account:E,MsgBody:h,MsgClientTime:D,MsgRandom:N,MsgSeq:O,MsgTimeStamp:Y,To_Account:j,MsgVersion:IA,CloudCustomData:BA,MsgCheckResult:mA}=C;return{from:E,clientTime:D,random:N,sequence:O,time:Y,to:j,elements:za(h),messageVersion:IA,cloudCustomData:BA,checkResult:mA}}function di(C){const{ClientSeq:E,From_Account:h,GroupInfo:D,MsgBody:N,MsgClientTime:O,MsgRandom:Y,MsgSeq:j,MsgTimeStamp:IA,SendMsgControl:BA,SupportMessageExtension:mA,TinyId:_A,CloudCustomData:xA,MsgVersion:Qe,MsgCheckResult:Re,NeedReadReceipt:Se,IsPlaceMsg:At,RevokerInfo:at,GroupAtInfo:jt,OnlineOnlyFlag:Bi,InnerSdkCustomData:ri}=C;let St,eo=Ds.MSG_PRIORITY_NORMAL;if(Object.keys(Ll).includes(String(C.MsgPriority))&&(eo=Ll[C.MsgPriority]),at){const{Reason:Yt,Revoker_Account:si,Revoker_FromUin:zo}=at;St={reason:Yt,revoker:si,revokerFromUin:zo,userID:si}}const to=function(Yt){const si=[];return Array.isArray(Yt)&&Yt.forEach(zo=>{zo.GroupAtAllFlag===SB?si.push(zo.GroupAt_Account):zo.GroupAtAllFlag===Pu&&si.push(vo.MSG_AT_ALL)}),si}(jt);return{clientSequence:E,from:h,groupProfile:D,clientTime:O,priority:eo,random:Y,sequence:j,time:IA,messageControlInfo:{excludedFromLastMessage:BA?.NoLastMsg===1,excludedFromUnreadCount:BA?.NoUnread===1},isSupportExtension:mA,tinyID:_A,cloudCustomData:xA,messageVersion:Qe,checkResult:Re,needReadReceipt:Se,isPlaceMessage:At,revokerInfo:St,atUserList:to,elements:za(N),to:Ul(C),onlineOnlyFlag:Bi===1,quoteInfo:Ol(ri)}}function Ul(C){const{utils:{isEmpty:E},constants:{IS_TOPIC_MESSAGE:h}}=ZA,{ToGroupId:D,GroupInfo:{MillionGroupFlag:N=0,TopicId:O}={}}=C;return N!==h||E(O)?D:O}function za(C){if(!C)return null;if(Array.isArray(C))return C.map(h=>{const D=ZA.message.messageFactory.getElementClass(h.MsgType);return D?.parseServerPushElement(h)});const E=ZA.message.messageFactory.getElementClass(C.MsgType);return E?.parseServerPushElement(C)}function NE(C){const{From_Account:E,MsgBody:h,MsgClientTime:D,MsgRandom:N,MsgSeq:O,MsgTimeStamp:Y,GroupId:j,TopicId:IA,MsgVersion:BA,CloudCustomData:mA,MsgCheckResult:_A}=C;return{from:E,clientTime:D,random:N,sequence:O,time:Y,groupID:j,topicID:IA,elements:za(h),messageVersion:BA,cloudCustomData:mA,checkResult:_A}}function Ol(C){const{utils:{isString:E,safeStringify:h},ssoLog:D}=ZA;if(!E(C))return null;try{const{messageID:N,messageTime:O,messageSequence:Y}=JSON.parse(C).businessQuote;return{msgID:N,messageTime:O,messageSequence:Y}}catch(N){return D.debug("_parseServerQuoteInfo",h(N)),null}}function Jg({conversationUpdateFields:C,message:E}){const{conversationID:h,conversationType:D,conversationSubType:N,flow:O,_isExcludedFromUnreadCount:Y,_isExcludedFromLastMessage:j}=E,IA=j?"":RE(E),BA=!Y&&O===li.IN;C.has(h)?(C.get(h).lastMessage=IA,BA&&C.get(h).unreadCount++):C.set(h,{conversationID:h,type:D,subType:N,unreadCount:BA?1:0,lastMessage:IA})}function TE(C){return C.filter(E=>{const h=!$r(E?._elements),D=E?.isPlaceMessage===1;return h||ZA.ssoLog.error("emptyMessageBody",`from:${E.from} to:${E.to} sequence:${E.sequence}`),h&&!D})}function Hg(C){const{messageDataHandler:E}=ZA.message;return!E.isInMessageList(C)&&!E.isMessageSentByCurrentInstance(C)}var Vg=Object.freeze({__proto__:null,autoIncrementIndex:vB,createAndroidPushInfo:fI,createApnsPushInfo:kC,createOfflinePushInfo:Fl,filterValidMessages:TE,getAndroidSoundName:Us,parseServerGroupMessage:di,parseServerPushC2CModifyMessage:vE,parseServerPushGroupModifyMessage:NE,parseServerPushMessage:Pc,parseServerPushMessageElement:za,shouldStoreMessage:Hg,updateConversationFields:Jg});const{isPlainObject:fa}=ZA.utils;function xl(C,E={}){const{onlineUserOnly:h,messageControlInfo:D}=E;let{offlinePushInfo:N}=E;C.conversationType===En.CONV_C2C&&h===!0&&(N?N.disablePush=!0:N={disablePush:!0});let O="";typeof C.cloudCustomData=="string"&&C.cloudCustomData.length>0&&(O=C.cloudCustomData);const Y=[];if(D&&fa(D)){const{excludedFromUnreadCount:j,excludedFromLastMessage:IA,excludedFromContentModeration:BA}=D;j===!0&&Y.push("NoUnread"),IA===!0&&Y.push("NoLastMsg"),BA===!0&&Y.push("NoMsgCheck")}return{onlineUserOnly:h,cloudCustomData:O,messageControlInfo:Y,offlinePushInfo:N}}function zn(C){const{webhookInfo:{disableCloudMessagePreHook:E=!1,disableCloudMessagePostHook:h=!1}={}}=C||{};if(!E&&!h)return;const D=[];return E&&D.push("ForbidBeforeSendMsgCallback"),h&&D.push("ForbidAfterSendMsgCallback"),D}function dr(C,E){return et(this,void 0,void 0,function*(){const h=C.conversationType===En.CONV_GROUP?function(N,O){var Y;const j=xl(N,O),{onlineUserOnly:IA,cloudCustomData:BA,messageControlInfo:mA,offlinePushInfo:_A}=j,xA=JSON.parse(JSON.stringify(N.transformElementsToServerFormat()));let Qe;return B(N._receiverList)&&N._receiverList.length>0&&(Qe=N._receiverList,N._receiverList.length>50&&(Qe=N._receiverList.slice(0,50),console.warn("ReceiverListLimit"))),{servcmd:"group_open_http_svc.send_group_msg",data:{From_Account:(Y=ZA.store.get("login"))===null||Y===void 0?void 0:Y.userId,GroupId:N.to,MsgBody:xA,CloudCustomData:BA,Random:N.random,MsgPriority:N.priority,ClientSeq:N.clientSequence,GroupAtInfo:N._groupAtInfoList,OnlineOnlyFlag:IA?1:0,MsgClientTime:N.clientTime,OfflinePushInfo:Fl(_A),SendMsgControl:IA?void 0:mA,NeedReadReceipt:N.needReadReceipt===!0?1:0,To_Account:Qe,SupportMessageExtension:N.isSupportExtension===!0?1:0,IsRelayMsg:N._relayFlag===!0?1:0,CustomModerationConfigID:N._cmConfigID,ForbidCallbackControl:zn(O),InnerSdkCustomData:GB(N)}}}(C,E):function(N,O){var Y;const j=xl(N,O),{onlineUserOnly:IA,cloudCustomData:BA,messageControlInfo:mA,offlinePushInfo:_A}=j,xA=IA===!0?0:void 0,Qe=JSON.parse(JSON.stringify(N.transformElementsToServerFormat()));return{servcmd:"openim.sendmsg",data:{From_Account:(Y=ZA.store.get("login"))===null||Y===void 0?void 0:Y.userId,To_Account:N.to,MsgBody:Qe,CloudCustomData:BA,MsgSeq:N.sequence,MsgRandom:N.random,MsgLifeTime:xA,From_AccountNick:N.nick,From_AccountHeadurl:N.avatar,SendMsgControl:xA!==0?mA:void 0,MsgClientTime:N.clientTime,IsNeedReadReceipt:N.needReadReceipt===!0?1:0,SupportMessageExtension:N.isSupportExtension===!0?1:0,IsRelayMsg:N._relayFlag===!0?1:0,CustomModerationConfigID:N._cmConfigID,OfflinePushInfo:Fl(_A),ForbidCallbackControl:zn(O),InnerSdkCustomData:GB(N)}}}(C,E),D=yield Ls(h);return D?{time:D.MsgTime,messageDropReason:D.MsgDropReason,sequence:D.MsgSeq}:null})}function Yn(C){return et(this,void 0,void 0,function*(){const{from:E,to:h,version:D=0,sequence:N,random:O,time:Y,type:j,cloudCustomData:IA}=C,BA={From_Account:E,To_Account:h,MsgVersion:D,MsgSeq:N,MsgRandom:O,MsgTime:Y,MsgType:j,MsgBody:C.transformElementsToServerFormat(),CloudCustomData:IA},mA=yield Ls({servcmd:"openim.modify_c2c_msg",data:BA});if(mA){const{MsgBody:_A,MsgVersion:xA,CloudCustomData:Qe}=mA;return{elements:za(_A),messageVersion:xA,cloudCustomData:Qe}}})}function qg(C){return et(this,void 0,void 0,function*(){const{to:E,version:h=0,sequence:D,cloudCustomData:N}=C,O={GroupId:E,MsgVersion:h,MsgSeq:D,MsgBody:C.transformElementsToServerFormat(),CloudCustomData:N},Y=yield Ls({servcmd:"openim.modify_group_msg",data:O});if(Y){const{MsgBody:j,MsgVersion:IA,CloudCustomData:BA}=Y;return{elements:za(j),messageVersion:IA,cloudCustomData:BA}}})}function GE(C){return et(this,void 0,void 0,function*(){const{groupID:E,count:h,messageSequence:D,messageSequenceList:N,getType:O}=C,Y={GroupId:E,ReqMsgNumber:h,WithRecalledMsg:1,Version:1,GetType:O};return D&&(Y.ReqMsgSeq=D),B(N)&&N.length>0&&(Y.ReqMsgSeqList=N),yield Ls({servcmd:"group_open_http_svc.group_msg_get",data:Y})})}function $I(C){return et(this,void 0,void 0,function*(){const{peerAccount:E,count:h,lastMessageTime:D,messageKey:N,direction:O}=C;return Ls({servcmd:"openim.getroammsg",data:{Peer_Account:E,MaxCnt:h,WithRecalledMsg:1,LastMsgTime:D,MsgKey:N,GetDirection:O}})})}function GB(C){if(ZA.utils.isObject(C.quoteInfo)){const{msgID:E,messageSequence:h,messageTime:D}=C.quoteInfo;return JSON.stringify({businessQuote:{messageID:E,messageSequence:h,messageTime:D}})}}var Ig=Object.freeze({__proto__:null,createMessagePackOptions:xl,generateForbidCallbackControl:zn,getC2CRoamingMessagesByAnchor:$I,getGroupRoamingMessagesByAnchor:GE,getRoamingMessages:function(C){return et(this,void 0,void 0,function*(){const{peerAccount:E,count:h,lastMessageTime:D,messageKey:N}=C;return(yield Ls({servcmd:"openim.getroammsg",data:{Peer_Account:E,MaxCnt:h||15,LastMsgTime:D||0,MsgKey:N,GetDirection:0,WithRecalledMsg:1}}))||[]})},modifyC2CMessage:Yn,modifyGroupMessage:qg,sendMessage:dr});const{isPlainObject:kE}=ZA.utils,{MSG_AUDIO:kB,MSG_FILE:_E,MSG_IMAGE:Ju,MSG_VIDEO:bE,MSG_MERGER:Jc}=vo;class LE{constructor(){this._sendProtocolMap=new Map}init(){Wo.getInstance().registerApi({apiName:"sendMessage",context:this,matcher:E=>![kB,_E,Ju,bE,Jc].includes(E[0].type)})}registerSendProtocol(E,h,D){this._sendProtocolMap.set(E,h.bind(D))}sendMessage(E,h){return et(this,void 0,void 0,function*(){const{TOTAL_COUNT:D,SEND_COST:N,SUCCESS_COUNT:O,FAILED_COUNT:Y}=Sc;if(!(E instanceof NB))throw new lo({code:Qa.MSG_INSTANCE_REQUIRED});const j=E.validateBeforeSend();if(!j.isValid){const{code:mA,message:_A=""}=j.error||{};throw new lo({code:mA,message:_A})}this._reportMessageSendQuality({name:D,message:E});let IA=!1;const{messageDataHandler:BA}=ZA.message||{};try{const{messageControlInfo:mA}=h||{};let _A=null;BA.addRandomOfSentMessage(E.random);const xA=Date.now(),Qe=this._getSendProtocol(E);if(E.conversationType===En.CONV_C2C?(IA=h?.onlineUserOnly===!0,_A=yield Qe(E,h)):E.conversationType===En.CONV_GROUP&&(yield this._validateBeforeSendGroupMessage(E),_A=yield Qe(E,h)),_A){const{messageDropReason:Re,sequence:Se,time:At}=_A;if(this._updateNickAndAvatarOfSentMessageByMe(E),Re&&this._logRateLimitInfo(E,Se,Re),this._reportMessageSendQuality({name:O,message:E}),this._reportMessageSendQuality({name:N,message:E,startTs:xA}),E.isResend===!0){const at=BA.findMessage(E.ID);at&&(ZA.ssoLog.debug("sendMessage",`sendMessage resend ok. ID:${at.ID}`),BA.deleteConversationMessage(at))}return E.status=tg.SUCCESS,E.time=At,E.conversationType===En.CONV_GROUP&&(E.sequence=Se),IA?E._onlineOnlyFlag=!0:(BA.storeConversationMessage(E),this._applySentMessageControlInfo(E,mA),this._emitOnlineMessageSent(E)),E.type===_s.MSG_STREAM?{code:0,data:{message:E,streamMessageID:_A.streamMessageID}}:{code:0,data:{message:E}}}}catch(mA){E.status=tg.FAIL,BA.removeRandomOfSentMessage(E.random);let{errorCode:_A}=mA||{},xA=mA?.errorInfo||mA?.message||"";throw this._hasRiskContent(_A)&&(E.hasRiskContent=!0),IA||this._isRejectedByRestApi(_A)||BA.storeConversationMessage(E),this._reportMessageSendQuality({name:Y,message:E,error:mA}),new lo({code:_A,message:xA,data:{message:E},moreMessage:`type:${E.type} from:${E.from} to:${E.to}`})}})}_hasRiskContent(E){return E===80001||E===80004}_isRejectedByRestApi(E){return E>=10100&&E<=10200||E>=120001&&E<=13e4}_emitOnlineMessageSent(E){const h=E._isExcludedFromLastMessage?"":E,{conversationID:D,conversationType:N}=E,O=ca(D)?Gt.TOPIC_NEW_MESSAGE:Gt.NEW_MESSAGE;ZA.notificationCenter.emitInnerEvent(O,{result:{conversationUpdateFieldList:[{conversationID:D,type:N,message:E,lastMessage:h,unreadCount:0}]}})}_applySentMessageControlInfo(E,h){h&&kE(h)&&(h.excludedFromLastMessage===!0&&(E._isExcludedFromLastMessage=!0),h.excludedFromUnreadCount===!0&&(E._isExcludedFromUnreadCount=!0))}_logRateLimitInfo(E,h,D){const N=`from:${E.from} to:${E.to} sequence:${h} messageDropReason:${D}`;ZA.ssoLog.warn("messageDropReason",N)}_updateNickAndAvatarOfSentMessageByMe(E){const{messageDataHandler:h}=ZA.message||{};let D=!1;const{conversationID:N}=E,O=h.getLatestMsgSentByMe(N);if(O){const{nick:Y,avatar:j}=O;Y===E.nick&&j===E.avatar||(D=!0),D&&h.updateNickAndAvatarOfSentMessage({conversationID:N,latestNick:E.nick,latestAvatar:E.avatar,isSentByMe:!0})}}_validateBeforeSendGroupMessage(E){return et(this,void 0,void 0,function*(){var h,D,N;const{to:O,from:Y}=E;let j=O,IA=ms.getGroup(j);if(Ka({groupID:j})&&IA?.isSupportTopic)throw new lo({code:Qa.MSG_SEND_GRP_WITH_TOPIC_FAIL});if(ca(O)&&([j]=O.split(_a.TOPIC),IA=ms.getGroup(j)),!IA&&typeof((h=Wo.getInstance().getApiMap())===null||h===void 0?void 0:h.getGroupProfile)=="function"){const BA=yield Wo.getInstance().getApiMap().getGroupProfile({groupID:j});if(((N=(D=BA?.data)===null||D===void 0?void 0:D.group)===null||N===void 0?void 0:N.type)===vo.GRP_AVCHATROOM){const mA=Tc({code:Qa.MSG_SEND_FAIL_NOT_IN_AV,replacement1:Y,replacement2:j});throw new lo({code:Qa.MSG_SEND_FAIL_NOT_IN_AV,message:mA})}}return!0})}_reportMessageSendQuality(E){ZA.notificationCenter.emitInnerEvent(Gt.QUALITY_STAT,{label:PI.MESSAGE_SEND_SUCCESS_RATE,data:E})}_getSendProtocol(E){return this._sendProtocolMap.get(E.type)||dr}}var _B=new class{constructor(){this._sparseMessagesByConversation=new Map,this._latestMessageSentByPeerMap=new Map,this._latestMessageSentByMeMap=new Map,this._randomOfSentMessageList=new Set}init(){ZA.notificationCenter.subscribeInnerEvent(Gt.LOGOUT,this._reset,this),ZA.notificationCenter.subscribeInnerEvent(Gt.DESTROY,this._dispose,this)}get _messagesByConversation(){return zI.getMessages()}storeConversationMessage(C,E=!1){if(Nr)return!0;const{conversationID:h}=C;if(!h||(this._messagesByConversation.has(h)||this._messagesByConversation.set(h,new Map),this._shouldSkipStoreMessage(C,E)))return!1;const D=this._getUniqueIdOfMessage(C);return this._messagesByConversation.get(h).set(D,C),this._updateLatestMessageMap(C),!0}_updateLatestMessageMap(C){const{conversationID:E}=C;C.flow==="out"?this._setLatestMsgSentByMe(E,C):E.startsWith("C2C")&&this._setLatestMsgSentByPeer(E,C)}_shouldSkipStoreMessage(C,E){const h=this._getUniqueIdOfMessage(C),D=this._messagesByConversation.get(C.conversationID);if(D?.has(h)){const N=D?.get(h);if(!E||N?.isModified===!0)return!0}return!1}deleteConversationMessage(C){var E;const{conversationID:h=""}=C,D=this._getUniqueIdOfMessage(C);this._messagesByConversation.has(h)&&((E=this._messagesByConversation.get(h))===null||E===void 0||E.delete(D))}modifyConversationMessage(C,E){var h;if(!this._messagesByConversation.has(C)&&!this._sparseMessagesByConversation.has(C))return{isUpdated:!1,message:null};const D=this._getUniqueIdOfMessage(E),N=this._getMessageFromLocalMessage(C,D);if(N){const{messageVersion:O,elements:Y,cloudCustomData:j,checkResult:IA=0}=E,BA=IA>1;if(ZA.ssoLog.debug("modifyConversationMessage",`conversationToMessageMap modifyConversationMessage localVersion:${N.version} remoteVersion:${O}`),N.versionN.ID===C)||null,E)break;if(!E){const D=Array.from(this._sparseMessagesByConversation.values());for(const N of D)if(E=N.get(C)||null,E)break}return E}deleteConversationMessageList(C){this._messagesByConversation.has(C)&&(this._messagesByConversation.delete(C),this._latestMessageSentByMeMap.delete(C),this._latestMessageSentByPeerMap.delete(C)),this._sparseMessagesByConversation.has(C)&&this._sparseMessagesByConversation.delete(C)}revokeMessage({conversationID:C,sequence:E,random:h,revoker:D}){const N=this._messagesByConversation.get(C);let O=null;if(N){const Y=Array.from(N.values());if(O=this._findMessageBySequenceAndRandom({messageList:Y,random:h,sequence:E}),O){const j=this._getUniqueIdOfMessage(O);return zI.updateMessage(C,[j],{isRevoked:!0,revoker:D,operation:ka.revoke}),O}}if(this._sparseMessagesByConversation.has(C)){const Y=Array.from(this._sparseMessagesByConversation.get(C).values());if(O=this._findMessageBySequenceAndRandom({messageList:Y,random:h,sequence:E}),O)return O.isRevoked=!0,O.revoker=D,O}}_findMessageBySequenceAndRandom({messageList:C,sequence:E,random:h}){for(let D=0;D0){const Y=new Map([...N,...O.entries()]);this._messagesByConversation.set(h,Y),this._updateLatestMessageSentByMe(h),this._updateLatestMessageSentByPeer(h)}return D}storeSparseMessageList(C){if(C.length===0)return;const{conversationID:E}=C[0],h=C.length;this._sparseMessagesByConversation.has(E)||this._sparseMessagesByConversation.set(E,new Map);const D=this._sparseMessagesByConversation.get(E);for(let N=0;N=0;D--)if(h[D].flow==="out"){this._setLatestMsgSentByMe(C,h[D]);break}}}_updateLatestMessageSentByPeer(C){var E;const h=Array.from(((E=this._messagesByConversation.get(C))===null||E===void 0?void 0:E.values())||[]);if(h.length!==0&&C.startsWith("C2C")){for(let D=h.length-1;D>=0;D--)if(h[D].flow==="in"){this._setLatestMsgSentByPeer(C,h[D]);break}}}_getUniqueIdOfMessage(C){const{from:E,to:h,random:D,sequence:N,time:O}=C;return`${E}-${h}-${D}-${N}-${O}`}_setLatestMsgSentByPeer(C,E){this._latestMessageSentByPeerMap.set(C,E)}_setLatestMsgSentByMe(C,E){this._latestMessageSentByMeMap.set(C,E)}getLatestMsgSentByPeer(C){return this._latestMessageSentByPeerMap.get(C)}getLatestMsgSentByMe(C){return this._latestMessageSentByMeMap.get(C)}addRandomOfSentMessage(C){this._randomOfSentMessageList.add(C)}removeRandomOfSentMessage(C){this._randomOfSentMessageList.delete(C)}updateNickAndAvatarOfSentMessage(C){const{conversationID:E="",latestAvatar:h,latestNick:D,isSentByMe:N=!0}=C,O=this._messagesByConversation.get(E);if(!O)return;const Y=Array.from(O.values()),j=N?"out":"in";Y.forEach(IA=>{const{nick:BA,avatar:mA,flow:_A}=IA;_A===j&&(BA!==D&&(IA.nick=D),mA!==h&&(IA.avatar=h))})}isInMessageList(C){var E;const{conversationID:h}=C;if(!h||!this._messagesByConversation.has(h))return!1;const D=this._getUniqueIdOfMessage(C);return(E=this._messagesByConversation.get(h))===null||E===void 0?void 0:E.has(D)}isMessageSentByCurrentInstance(C){const{random:E}=C;return this._randomOfSentMessageList.has(E)}getContinuousMessagesByConversation(){return this._messagesByConversation}getLocalMessageList(C){const E=this._messagesByConversation.get(C);return E?[...E.values()]:[]}getSparseMessageList(C){const E=this._sparseMessagesByConversation.get(C);return E?[...E.values()]:[]}_reset(){this._messagesByConversation.clear(),this._latestMessageSentByPeerMap.clear(),this._latestMessageSentByMeMap.clear(),this._randomOfSentMessageList.clear()}_dispose(){this._reset(),ZA.notificationCenter.unSubscribeInnerEvent(Gt.LOGOUT,this._reset,this),ZA.notificationCenter.unSubscribeInnerEvent(Gt.DESTROY,this._dispose,this)}};function Zn(C,E){const h=Uc.getConversation(C);if(h?.lastMessage){const{lastMessage:D}=h,{lastTime:N,lastSequence:O,version:Y}=D,{time:j,sequence:IA,messageVersion:BA,elements:mA,cloudCustomData:_A}=E;N===j&&O===IA&&Y!==BA&&(D.type=mA[0].type,D.payload=mA[0].content,D.messageForShow=bc(D.type,D.payload),D.cloudCustomData=_A,D.version=BA,Uc.updateConversation(C,{lastMessage:D}))}}class Os{init(){Wo.getInstance().registerApi({apiName:"modifyMessage",context:this})}modifyMessage(E){return et(this,void 0,void 0,function*(){const{to:h,payload:D,sequence:N,conversationType:O,random:Y,time:j,from:IA,type:BA}=E;if(this._canModifyMessageElement(BA)){const mA=E?._elements||[];mA.length>=1&&(mA[0].type=BA,mA[0].content=D)}try{let mA=null,_A=null;if(O===En.CONV_C2C?mA=yield Yn(E):O===En.CONV_GROUP&&(mA=yield qg(E)),mA){let xA=`${O}${h}`;return h===Wr()&&O===En.CONV_C2C&&(xA=`${O}${IA}`),_A={conversationType:O,from:IA,to:h,time:j,random:Y,sequence:N,elements:mA?.elements,cloudCustomData:mA?.cloudCustomData,messageVersion:mA?.messageVersion,conversationID:xA},this._handleModifyMessageSuccess(_A),{code:0,data:{message:E},successLog:{message:`to:${h}`}}}}catch(mA){const{errorCode:_A}=mA||{};throw new lo({functionName:"modifyMessage",code:_A,moreMessage:`to:${h}`})}})}_handleModifyMessageSuccess(E){const{conversationID:h}=E,{isUpdated:D,message:N}=ZA.message.messageDataHandler.modifyConversationMessage(h,E);D===!0&&ZA.notificationCenter.emitOuterEvent(kr.MESSAGE_MODIFIED,{name:kr.MESSAGE_MODIFIED,data:[N]}),ZA.notificationCenter.emitInnerEvent(Gt.MESSAGE_MODIFIED,{conversationID:h,message:N}),Zn(h,E)}_canModifyMessageElement(E){return[Wa.MSG_TEXT,Wa.MSG_CUSTOM,Wa.MSG_LOCATION,Wa.MSG_FACE].includes(E)}}class Za{init(){const{notificationCenter:E}=ZA,{InnerEventSubType:h}=E;Ir.getInstance().registerWorkflowStep(cn.RECEIVE_C2C_NEW_MESSAGE,kt.HANDLE_C2C_NEW_MESSAGE,this._handleC2CMessagePush,this),Ir.getInstance().registerWorkflowStep(cn.RECEIVE_C2C_NEW_MESSAGE,kt.EMIT_C2C_MESSAGE_EVENT,this._emitMessageEventsAfterReceiveNewMessage,this),Ir.getInstance().registerWorkflowStep(cn.SYNC_SERVER_INFO_AFTER_RE_ONLINE,kt.EMIT_C2C_MESSAGE_EVENT,this._emitMessageEventsAfterSyncUnreadMessage,this),E.subscribeInnerEvent(Gt.MESSAGE_PUSH,h.C2C_REALTIME_MESSAGE,this._executeReceiverNewMessageWorkFlow,this),E.subscribeInnerEvent(Gt.MESSAGE_PUSH,h.C2C_MESSAGE_MODIFIED,this._handleC2CMessageModify,this),E.subscribeInnerEvent(Gt.DESTROY,this._dispose,this)}_executeReceiverNewMessageWorkFlow(E){Ir.getInstance().executeWorkflow(cn.RECEIVE_C2C_NEW_MESSAGE,E)}_handleC2CMessagePush(E){const h=E.data||{},{messageDataHandler:D}=ZA.message||{},N=[],O=new Map;return h.C2cMsgArray.forEach(Y=>{const j=this._generateC2CMessage(Y);this._updateMessageProfile(j);let IA=j.isModified===1;D.isMessageSentByCurrentInstance(j)?j.isModified=IA:IA=!1,j._onlineOnlyFlag?D.isMessageSentByCurrentInstance(j)||N.push(j):Hg(j)&&(D.storeConversationMessage(j)&&Jg({conversationUpdateFields:O,message:j}),D.isMessageSentByCurrentInstance(j)&&!IA||N.push(j))}),{conversationUpdateFieldList:[...O.values()],messages:N}}_emitMessageEventsAfterReceiveNewMessage(E){var h;const{messages:D=[]}=((h=E.result)===null||h===void 0?void 0:h[kt.HANDLE_C2C_NEW_MESSAGE])||{};this._emitMessageEvents(D)}_emitMessageEventsAfterSyncUnreadMessage(E){var h;const{messages:D=[]}=((h=E.result)===null||h===void 0?void 0:h[kt.UNREAD_MESSAGE_SYNC])||{};this._emitMessageEvents(D)}_emitMessageEvents(E){const h=E?.filter(N=>N?.isModified===!0)||[];h.length>0&&ZA.notificationCenter.emitOuterEvent("onMessageModified",{name:"onMessageModified",data:h});const D=E?.filter(N=>!N?.isModified);D.length>0&&ZA.notificationCenter.emitOuterEvent("onMessageReceived",{name:"onMessageReceived",data:D})}_generateC2CMessage(E){const h=En.CONV_C2C,D=Pc(E),N=ZA.message.messageFactory.createMessage(Object.assign(Object.assign({},D),{conversationType:h,flow:li.IN})),{elements:O}=D;return N.setElement(O),N}_updateMessageProfile(E){var h;const{messageDataHandler:D}=ZA.message||{},N=(h=ZA.store.get("login"))===null||h===void 0?void 0:h.userId,{from:O,nick:Y,avatar:j,conversationID:IA=""}=E;if(O!==N){const BA=D.getLatestMsgSentByPeer(IA);if(BA){const{nick:mA,avatar:_A}=BA;r(Y)||r(j)?(E.nick=s(mA)?mA:E.nick,E.avatar=s(_A)?_A:E.avatar):Y===mA&&j===_A||(D.updateNickAndAvatarOfSentMessage({conversationID:IA,latestNick:Y,latestAvatar:j,isSentByMe:!1}),this._updateConversationUserProfile({conversationID:IA,nick:Y,avatar:j}))}}else{const BA=D.getLatestMsgSentByMe(IA);!BA||Y===BA.nick&&j===BA.avatar||D.updateNickAndAvatarOfSentMessage({conversationID:IA,latestNick:Y,latestAvatar:j,isSentByMe:!0})}}_updateConversationUserProfile(E){const{conversationID:h,nick:D,avatar:N}=E,O=Uc.getConversation(h),{userProfile:Y={}}=O||{};Y.avatar===N&&Y.nick===D||Uc.updateConversation(h,{userProfile:Object.assign(Object.assign({},Y),{nick:D,avatar:N})})}_updateMessageListDueToModify(E){const{conversationID:h}=E,{isUpdated:D,message:N}=ZA.message.messageDataHandler.modifyConversationMessage(h,E);D===!0&&ZA.notificationCenter.emitOuterEvent("onMessageModified",{name:"onMessageModified",data:[N]}),ZA.notificationCenter.emitInnerEvent("ModifyMessageSuccess",E),Zn(h,E)}_handleC2CMessageModify(E){E.C2cMsgModNotifys.forEach(h=>{var D;const N=En.CONV_C2C;let O=vE(h);const{to:Y,from:j}=O;let IA=`${N}${Y}`;Y===((D=ZA.store.get("login"))===null||D===void 0?void 0:D.userId)&&(IA=`${N}${j}`),O=Object.assign({conversationType:N,conversationID:IA},O),this._updateMessageListDueToModify(O)})}_dispose(){const{notificationCenter:E}=ZA,{InnerEventSubType:h}=E;ZA.notificationCenter.unSubscribeInnerEvent(Gt.MESSAGE_PUSH,h.C2C_REALTIME_MESSAGE,this._handleC2CMessagePush,this),ZA.notificationCenter.unSubscribeInnerEvent(Gt.MESSAGE_PUSH,h.C2C_MESSAGE_MODIFIED,this._handleC2CMessageModify,this),ZA.notificationCenter.unSubscribeInnerEvent(Gt.DESTROY,this._dispose,this)}}class FE{init(){const{notificationCenter:E}=ZA,{InnerEventSubType:h}=E;Ir.getInstance().registerWorkflowStep(cn.RECEIVE_GROUP_NEW_MESSAGE,kt.HANDLE_GROUP_NEW_MESSAGE,this._handleGroupMessagePush,this),Ir.getInstance().registerWorkflowStep(cn.RECEIVE_GROUP_NEW_MESSAGE,kt.EMIT_GROUP_MESSAGE_EVENT,this._emitMessageEvents,this),E.subscribeInnerEvent(Gt.MESSAGE_PUSH,h.GROUP_REALTIME_MESSAGE,this._executeReceiverNewMessageWorkFlow,this),E.subscribeInnerEvent(Gt.MESSAGE_PUSH,h.GROUP_MESSAGE_MODIFIED,this._handleGroupMessageModify,this),E.subscribeInnerEvent(Gt.DESTROY,this._dispose,this)}_executeReceiverNewMessageWorkFlow(E){this._canExecuteReceiverNewMessageWorkFlow(E)&&Ir.getInstance().executeWorkflow(cn.RECEIVE_GROUP_NEW_MESSAGE,E)}_handleGroupMessagePush(E){const h=E.data||{},{messageDataHandler:D}=ZA.message,N=[],O=new Map,Y=h?.GroupMsgArray;return Y?.forEach(j=>{if(j.GroupInfo.NotVisible===1)return;const IA=this._generateGroupMessage(j);this.updateMessageProfile(IA);let BA=IA.isModified===1;D.isMessageSentByCurrentInstance(IA)?IA.isModified=BA:BA=!1,IA._onlineOnlyFlag?D.isMessageSentByCurrentInstance(IA)||N.push(IA):Hg(IA)&&D.storeConversationMessage(IA)&&(N.push(IA),Jg({conversationUpdateFields:O,message:IA}))}),{conversationUpdateFieldList:[...O.values()],messages:N}}_emitMessageEvents(E){var h;const{messages:D}=((h=E.result)===null||h===void 0?void 0:h[kt.HANDLE_GROUP_NEW_MESSAGE])||{},N=D?.filter(Y=>Y?.isModified===!0)||[];N.length>0&&ZA.notificationCenter.emitOuterEvent("onMessageModified",{name:"onMessageModified",data:N});const O=D?.filter(Y=>!Y?.isModified)||[];O.length>0&&ZA.notificationCenter.emitOuterEvent("onMessageReceived",{name:"onMessageReceived",data:O})}_generateGroupMessage(E){const h=En.CONV_GROUP,D=di(E),N=ZA.message.messageFactory.createMessage(Object.assign(Object.assign({},D),{conversationType:h,flow:li.IN})),{elements:O}=D;return N.setElement(O),N}updateMessageProfile(E){var h;const{messageDataHandler:D}=ZA.message||{},N=(h=ZA.store.get("login"))===null||h===void 0?void 0:h.userId,{from:O,nick:Y,avatar:j,conversationID:IA="",_elements:BA}=E;if(O===N){const mA=D.getLatestMsgSentByMe(IA);!mA||Y===mA.nick&&j===mA.avatar||D.updateNickAndAvatarOfSentMessage({conversationID:IA,latestNick:Y,latestAvatar:j,isSentByMe:!0})}else if(O===vo.CONV_SYSTEM){const{operationType:mA,memberInfoList:_A,operatorInfo:xA}=BA;let Qe={};if($r(_A)?$r(xA)||(Qe=xA):[Qs.JOINED,Qs.KICKED,Qs.ADMIN_SET,Qs.ADMIN_CANCELED].includes(mA)&&(Qe=Object.assign({},_A[0])),!$r(Qe)){const{nick:Re="",avatar:Se=""}=Qe;E.nick=Re,E.avatar=Se}}}_updateMessageListDueToModify(E){const{conversationID:h}=E,{isUpdated:D,message:N}=ZA.message.messageDataHandler.modifyConversationMessage(h,E);D===!0&&ZA.notificationCenter.emitOuterEvent("onMessageModified",{name:"onMessageModified",data:[N]}),Zn(h,E)}_handleGroupMessageModify(E){E.GroupMsgModNotifys.forEach(h=>{const D=En.CONV_GROUP;let N=NE(h);const{topicID:O,groupID:Y}=N,j=O||Y,IA=`${D}${j}`;N=Object.assign({conversationType:D,conversationID:IA,to:j},N),this._updateMessageListDueToModify(N)})}_dispose(){const{notificationCenter:E}=ZA,{InnerEventSubType:{GROUP_REALTIME_MESSAGE:h,GROUP_MESSAGE_MODIFIED:D}}=E;E.unSubscribeInnerEvent(Gt.MESSAGE_PUSH,h,this._handleGroupMessagePush,this),E.unSubscribeInnerEvent(Gt.MESSAGE_PUSH,D,this._handleGroupMessageModify,this),E.unSubscribeInnerEvent(Gt.DESTROY,this._dispose,this)}_canExecuteReceiverNewMessageWorkFlow(E){var h,D;const{GroupId:N,GroupType:O}=((D=(h=E?.GroupMsgArray)===null||h===void 0?void 0:h[0])===null||D===void 0?void 0:D.GroupInfo)||{},Y=O===yl.GRP_AVCHATROOM;return!(!ms.getGroup(N)&&Y)}}var Yl=new class{constructor(){this.c2cMessageReceiver=new Za,this.groupMessageReceiver=new FE}init(){this.c2cMessageReceiver.init(),this.groupMessageReceiver.init()}};const UE={createCustomMessage:{to:{required:!0,rules:["string"],allowEmpty:!1},conversationType:{required:!0,rules:["string"],allowEmpty:!1},payload:{required:!0,rules:["object"],allowEmpty:!1},cloudCustomData:{required:!1,rules:["string"],allowEmpty:!1},priority:{required:!1,rules:["string"],allowEmpty:!1},customModerationConfigurationID:{required:!1,rules:["string"],allowEmpty:!1}},sendMessage:[{key:"message",required:!0,rules:["object"],allowEmpty:!1},{key:"options",required:!1,rules:["object"],allowEmpty:!1}],createTextMessage:{to:{required:!0,rules:["string"],allowEmpty:!1},conversationType:{required:!0,rules:["string"],allowEmpty:!1,customValidator:C=>!(!C.startsWith("C2C")&&!C.startsWith("GROUP"))||"conversationType is invalid."},payload:{required:!0,rules:["object"],allowEmpty:!1,customValidator:C=>function(E){var h;return typeof E?.text!="string"||typeof E.text=="string"&&((h=E?.text)===null||h===void 0?void 0:h.length)===0?"payload.text must be a string":!0}(C)}}},OE={createCustomMessage:!0,sendMessage:!0,modifyMessage:!0};var Ac=new class{constructor(){this._historyMessageListFetchAnchors=new Map,this.completedHistoryConversations=new Set}getGroupRoamingMessagesByAnchor(C){return et(this,void 0,void 0,function*(){try{const{conversationID:E,count:h,direction:D,sequence:N,messageSequenceList:O,shouldMarkCompleted:Y=!1,getType:j}=C,IA=E.replace(us.CONV_GROUP,""),BA=[];let mA=N;if(D===wc.BACKWARD){if(typeof N!="number")return{messageList:[],hasNoMoreHistoryMessage:!1,nextReqMessageIDFromServer:""};mA=N+h-1}const _A=yield GE({groupID:IA,count:h,messageSequence:mA,messageSequenceList:O,getType:j});if(_A){const{RspMsgList:xA=[],NextReqMsgSeq:Qe=0,IsFinished:Re,InvisibleMsgSeq:Se}=_A,At=`groupID:${IA} sequence:${N} reqSeq:${mA} direction:${D} complete:${Re} nextSequence:${Qe} remoteMsgCount:${xA.length} invisibleSequenceList:${Se}`,at=[];for(let ri=0;ri=N),jt&&Y&&this.completedHistoryConversations.add(E);const Bi=TE(at);return ZA.ssoLog.info("getGroupRoamingMessagesByAnchor",At),{messageList:Bi,invisibleSequenceList:Se,nextReqMessageIDFromServer:Qe,hasNoMoreHistoryMessage:jt,serverGroupTipList:BA}}}catch(E){const{errorCode:h,errorInfo:D}=E||{};throw new lo({code:h,message:D})}})}clearHistoryMessageListFetchAnchors(C){this._historyMessageListFetchAnchors.delete(C)}isHistoryMessageFetchCompleted(C){return this.completedHistoryConversations.has(C)}_parseMessage(C){var E;const h=us.CONV_GROUP;C.Event===4&&(C.MsgBody.MsgType=vo.MSG_GRP_TIP);const D=di(C),N=ZI.createMessage(Object.assign(Object.assign({},D),{conversationType:h,flow:"in"}));return WI(((E=D.elements)===null||E===void 0?void 0:E.content)||{},N),N.setElement(D.elements),N}getC2CRoamingMessagesByAnchor(C){return et(this,void 0,void 0,function*(){var E;try{const{conversationID:h,count:D,messageID:N,time:O,direction:Y,shouldMarkCompleted:j=!1}=C;let IA=O,BA="";if(!O){const xA=N?ZA.message.messageDataHandler.findMessage(N):null;if(IA=xA?.time||0,N&&this._historyMessageListFetchAnchors.has(h)){const Qe=this._historyMessageListFetchAnchors.get(h);IA=Qe.lastMessageTime,BA=Qe.messageKey}}const mA=h.replace(us.CONV_C2C,""),_A=yield $I({count:D,lastMessageTime:IA,messageKey:BA,peerAccount:mA,direction:Y});if(_A){const{MsgList:xA=[],Complete:Qe,MsgKey:Re,LastMsgTime:Se}=_A;this._historyMessageListFetchAnchors.set(h,{messageKey:Re,lastMessageTime:Se});const At=[];for(let ri=0;ri{const{tag:N,value:O}=D;N&&N.indexOf(ys)>-1?h.profileCustomField.push({key:N,value:O}):Hc.has(N)&&(h[Hc.get(N)]=O)}),Object.assign(Object.assign({},Rs),h)}parseProfileItem(C=[]){const E=[];return C.forEach(h=>{E.push({tag:h.Tag,value:h.Value})}),E}parseProfileList(C=[]){const E=[];return C.forEach(h=>{E.push({tag:h.Tag,value:h.ValueBytes})}),E}convertParamsToProfile(C){const E=[];return Object.keys(C).forEach(h=>{h!==ln&&E.push({tag:kn[h.toUpperCase()],value:C[h]})}),C.profileCustomField&&B(C.profileCustomField)&&C.profileCustomField.forEach(h=>{E.push({tag:h.key,value:h.value})}),E}normalizeProfileFields(C){const E={},h=[];return C.forEach(D=>{const{tag:N,value:O}=D;if(N&&N.indexOf(ys)>-1&&h.push({key:N,value:O}),Hc.has(N)&&O!==void 0){const Y=Hc.get(N);E[Y]=O}}),h.length>0&&(E.profileCustomField=h),E}};const{generateProtocolData:Vc}=ZA.common;function Pl(C){return et(this,void 0,void 0,function*(){const E="profile.portrait_get_all",h={From_Account:Wr(),UserItem:[]};C.forEach(Y=>{h.UserItem.push({CustomSequence:0,StandardSequence:0,To_Account:Y})});const D=Vc({servcmd:E,data:h}),N=`${D.head.seq}${E}`,O=yield ZA.channel.sendPacket(D,{requestId:N});if(O)return function(Y){const{ActionStatus:j,ErrorCode:IA,ErrorDisplay:BA,ErrorInfo:mA,UserProfileItem:_A}=Y,xA=[];return _A.map(Qe=>{const{To_Account:Re,CustomSequence:Se,ResultCode:At,ResultInfo:at,StandardSequence:jt,ProfileItem:Bi}=Qe,ri=Ms.parseProfileItem(Bi);xA.push({userId:Re,customSequence:Se,resultCode:At,resultInfo:at,standardSequence:jt,profileItem:ri})}),{actionStatus:j,errorCode:IA,errorDisplay:BA,errorInfo:mA,userProfile:xA}}(O)})}function ma(C){return xn.getFriendMap().has(C)}const{isEmpty:tc}=ZA.utils;class bB{constructor(){this._strangerProfileMap=new Map}init(){Wo.getInstance().registerApi({apiName:"getMyProfile",context:this}),Wo.getInstance().registerApi({apiName:"getUserProfile",context:this}),Wo.getInstance().registerApi({apiName:"updateMyProfile",context:this}),this.createProfile=Ms.createProfile.bind(Ms);const{notificationCenter:E}=ZA;Ir.getInstance().registerWorkflowStep(cn.SYNC_SERVER_INFO_AFTER_LOGIN,kt.USER_PROFILE_SYNC,this.getMyProfileCacheThenServer,this),E.subscribeInnerEvent(Gt.MESSAGE_PUSH,E.InnerEventSubType.PROFILE_MODIFIED,this._onProfileDataModify,this),E.subscribeInnerEvent(Gt.LOGOUT,this._reset,this),E.subscribeInnerEvent(Gt.DESTROY,this._dispose,this)}getMyProfile(){return et(this,void 0,void 0,function*(){try{const E=Wr(),h=yield Pl([E]);if(h){const D=this._handleProfileFormResponse(h)[0];return xn.getUserProfileMap().set(E,D),{code:0,data:D}}}catch(E){const{errorCode:h,errorInfo:D}=E;throw new lo({functionName:"getMyProfile",code:h,message:D})}})}getUserProfile(E){return et(this,void 0,void 0,function*(){try{let{userIDList:h}=E;const{userIdListToRequest:D,profileFromCache:N}=this._filterRequestAndCacheUsers(h);if(D.length===0)return{code:0,data:N,successLog:{message:`userIDList.length:${h.length}`}};D.length>cg&&(ZA.ssoLog.warn("getUserProfile","userIdListToRequest.length > 1000"),D.length=cg);const{data:O,error:Y}=yield this._batchFetchUserProfiles(D),j=D.length,IA=O.length,BA=j-IA;if(N.length===0&&j===BA&&!tc(Y))throw Y;if(B(O))return O.forEach(_A=>{ma(_A.userID)?xn.getUserProfileMap().set(_A.userID,_A):this._strangerProfileMap.set(_A.userID,_A)}),{code:0,data:O.concat(N),successLog:{message:`getUserProfile query:${j} success:${IA} fail:${BA} from cache:${N.length}`}}}catch(h){throw new lo(h)}})}getMyProfileCacheThenServer(){return et(this,void 0,void 0,function*(){const E=Wr(),h=xn.getUserProfileMap().has(E);return h?{code:0,data:h}:this.getMyProfile()})}updateMyProfile(E){return et(this,void 0,void 0,function*(){const h=Wr(),D={};for(const O in E)E[O]!==void 0&&(D[O]=E[O]);const N=Ms.convertParamsToProfile(D);try{yield function(BA){return et(this,void 0,void 0,function*(){const mA="profile.portrait_set",_A=Vc({servcmd:mA,data:BA}),xA=`${_A.head.seq}${mA}`,Qe=yield ZA.channel.sendPacket(_A,{requestId:xA});if(Qe){const{ActionStatus:Re,ErrorCode:Se,ErrorDisplay:At,ErrorInfo:at}=Qe;return{actionStatus:Re,errorCode:Se,errorDisplay:At,errorInfo:at}}})}({From_Account:h,ProfileItem:N});const Y=xn.getUserProfile(h);let j;j=Y?Object.assign(Object.assign({},Y),D):Ms.createProfile(h,N);const IA=!cI(Y,j,["lastUpdatedTime"]);return j.lastUpdatedTime=Date.now(),xn.getUserProfileMap().set(h,j),IA&&this._emitProfileUpdated(j),{code:0,data:j,successLog:{message:`profileArray: ${ZA.utils.safeStringify(N)}`}}}catch(O){const{errorCode:Y,errorInfo:j}=O;throw new lo({functionName:"updateMyProfile",code:Y,message:j,moreMessage:`params: ${ZA.utils.safeStringify(E)}`})}})}updateMyNickAndAvatar(E){return et(this,void 0,void 0,function*(){const h=Wr(),D=Date.now(),N=xn.getUserProfile(h);let O={};O=N?Object.assign(N,E):Ms.createProfile(h,E),O.lastUpdatedTime=D,xn.getUserProfileMap().set(h,O)})}_onProfileDataModify(E){const h=function(O){const{Profile_Account:Y,PushType:j,ProfileList:IA}=O;return{userId:Y,pushType:j,profileList:Ms.parseProfileList(IA)}}(E.ProfileDataMod[0]);if(tc(h))return;const{isProfileUpdated:D,profile:N}=this._handleProfileModified(h);D&&this._emitProfileUpdated(N)}_emitProfileUpdated(E){ZA.notificationCenter.emitInnerEvent(Gt.PROFILE_UPDATE,{name:Gt.PROFILE_UPDATE,data:[E]}),ZA.notificationCenter.emitOuterEvent(kr.PROFILE_UPDATED,{name:kr.PROFILE_UPDATED,data:[E]}),Uc.updateConversation(`C2C${E?.userID}`,{userProfile:E})}_dispose(){const{notificationCenter:E}=ZA;E.unSubscribeInnerEvent(Gt.LOGOUT,this._reset,this),E.unSubscribeInnerEvent(Gt.MESSAGE_PUSH,E.InnerEventSubType.PROFILE_MODIFIED,this._onProfileDataModify,this),E.unSubscribeInnerEvent(Gt.DESTROY,this._dispose,this),this._reset()}_handleProfileModified(E){const{userId:h,profileList:D}=E,N=xn.getUserProfile(h);if(!(Wr()===h||ma(h)&&N))return{isProfileUpdated:!1,profile:null};const O=Ms.normalizeProfileFields(D),Y=Object.keys(O).some(mA=>mA===ln?this._isCustomFieldChanged(N.profileCustomField,O.profileCustomField):N[mA]!==O[mA]);if(!Y)return{isProfileUpdated:!1,profile:N};const j=Date.now(),IA=Object.prototype.hasOwnProperty.call(O,ln)?this._mergeProfileCustomField(N.profileCustomField,O.profileCustomField):N.profileCustomField,BA=Object.assign(Object.assign(Object.assign({},N),O),{profileCustomField:IA,lastUpdatedTime:j});return xn.getUserProfileMap().set(h,BA),{isProfileUpdated:Y,profile:BA}}_filterRequestAndCacheUsers(E){const h=[],D=[];return E.forEach(N=>{const O=xn.getUserProfileMap().has(N);ma(N)&&O?D.push(xn.getUserProfile(N)):this._isStrangerAndProfileValid(N)?D.push(this._strangerProfileMap.get(N)):h.push(N)}),{userIdListToRequest:h,profileFromCache:D}}_handleProfileFormResponse(E){const{userProfile:h}=E;if(!Array.isArray(h))return[];const D=h.filter(O=>O.userId!=="@TLS#NOT_FOUND"&&O.userId!==""&&!tc(O.profileItem)),N=Date.now();return D.map(O=>{const Y=Ms.createProfile(O.userId,O.profileItem);return Y.lastUpdatedTime=N,Y})}_isStrangerAndProfileValid(E){var h;if(!ma(E)){const{lastUpdatedTime:D=0}=this._strangerProfileMap.get(E)||{},N=((h=ZA.store.get("cloudConfig"))===null||h===void 0?void 0:h.stranger_profile_expiration_time)||6e5;return Date.now()-D<=N}return!1}_chunkUserIDList(E,h){return Array.from({length:Math.ceil(E.length/h)},(D,N)=>E.slice(N*h,(N+1)*h))}_batchFetchUserProfiles(E){return et(this,void 0,void 0,function*(){const h=[],D=[];let N={};return this._chunkUserIDList(E,100).forEach(O=>{h.push(Pl(O))}),(yield Promise.allSettled(h)).forEach(O=>{if(O.status==="fulfilled"){const Y=O.value,j=this._handleProfileFormResponse(Y);B(j)&&D.push(...j)}else if(O.status==="rejected"){const{code:Y,message:j}=O.reason||{};N={errorCode:Y,message:j}}}),{data:D,error:N}})}_isCustomFieldChanged(E=[],h=[]){if(!B(h)||h.length===0)return!1;if(!B(E)||E.length===0)return!0;const D=new Map(E.map(N=>[N.key,N.value]));return h.some(N=>D.get(N.key)!==N.value)}_mergeProfileCustomField(E=[],h=[]){const D=B(E)?E.map(N=>Object.assign({},N)):[];return B(h)&&h.length!==0&&h.forEach(({key:N,value:O})=>{const Y=D.find(j=>j.key===N);Y?Y.value=O:D.push({key:N,value:O})}),D}_reset(){xn.getUserProfileMap().clear(),this._strangerProfileMap.clear()}}const Jl=new Map,Hl=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"];for(let C=0,E=Hl.length;C>(-2*O&6)):0)N="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(N);try{return decodeURIComponent(escape(h))}catch(D){return console.warn(D),""}}const{isEmpty:xE}=ZA.utils,{generateProtocolData:Ci}=ZA.common;function Vl(C){return et(this,void 0,void 0,function*(){const E="im_open_status.ws_get_user_status",h=Ci({servcmd:E,data:{To_Account:C}}),D=`${h.head.seq}${E}`,N=yield ZA.channel.sendPacket(h,{requestId:D});if(N)return function(O){const{ErrorCode:Y,ErrorInfo:j,ErrorList:IA=[],UserStatusList:BA=[]}=O,mA=BA.map(xA=>{const{To_Account:Qe,Status:Re,CustomStatus:Se,Detail:At=[]}=xA;return{userID:Qe,statusType:Re,customStatus:qc(Se),onlineDevices:YE(At)}}),_A=IA.map(xA=>{const{To_Account:Qe,Invalid_Account:Re,ErrorCode:Se,ErrorInfo:At}=xA;return{userID:xE(Re)?Qe:Re,code:Se,message:At}});return{errorCode:Y,errorInfo:j,successUserList:mA,failureUserList:_A}}(N)})}function YE(C){const E=[];return C?.forEach(h=>{const{Platform:D,Status:N}=h;N==="Online"&&E.push(D)}),E}class LB{constructor(){this._customStatus=""}init(){const{notificationCenter:E}=ZA;Wo.getInstance().registerApi({apiName:"getUserStatus",context:this}),Wo.getInstance().registerApi({apiName:"setSelfStatus",context:this}),Wo.getInstance().registerApi({apiName:"subscribeUserStatus",context:this}),Wo.getInstance().registerApi({apiName:"unsubscribeUserStatus",context:this}),Ir.getInstance().registerWorkflowStep(cn.SYNC_SERVER_INFO_AFTER_RE_ONLINE,kt.USER_STATUS_UPDATE,this._onReOnline,this),E.subscribeInnerEvent(Gt.MESSAGE_PUSH,E.InnerEventSubType.USER_STATUS_UPDATE,this._onUserStatusUpdate,this),E.subscribeInnerEvent(Gt.LOGOUT,this._reset,this),E.subscribeInnerEvent(Gt.DESTROY,this._dispose,this)}setSelfStatus(E){return et(this,void 0,void 0,function*(){const h=Wr(),{customStatus:D}=E;try{return yield function(N){return et(this,void 0,void 0,function*(){const O="im_open_status.ws_set_custom_status",Y=Ci({servcmd:O,data:{CustomStatus:N}}),j=`${Y.head.seq}${O}`,IA=yield ZA.channel.sendPacket(Y,{requestId:j});if(IA){const{ErrorCode:BA,ErrorInfo:mA}=IA;return{errorCode:BA,errorInfo:mA}}})}(D),this._customStatus=D,{code:0,data:{userID:h,statusType:Kg,customStatus:D},successLog:{message:`customStatus: ${D}`}}}catch(N){const{errorCode:O,errorInfo:Y}=N;throw new lo({functionName:"setSelfStatus",code:O,message:Y})}})}getUserStatus(E){return et(this,void 0,void 0,function*(){const{userIDList:h=[]}=E;if(this._isOnlyMeInArray(h))return this._getMyStatus();const D=yield this._getUserStatus(h);return Object.assign(Object.assign({},D),{successLog:{message:`userIDList length: ${h.length}`}})})}setCustomStatus(E){const h=qc(E);this._customStatus=h}subscribeUserStatus(E){return et(this,void 0,void 0,function*(){try{const{userIDList:h=[]}=E;this._checkBusinessCapabilityBits("subscribeUserStatus");const D=this._getMaxUserCount("subscribe"),N=this._sliceUserIDList(h,D),O=yield function(j){return et(this,void 0,void 0,function*(){const{channel:IA}=ZA,BA="im_open_status.ws_status_subscribe",mA=Ci({servcmd:BA,data:{To_Account:j}}),_A=`${mA.head.seq}${BA}`;return yield IA.sendPacket(mA,{requestId:_A})})}(N),Y=this._parseResponse(O);return{code:0,data:{failureUserList:Y},successLog:{message:`userID length:${h.length} failCount: ${Y.length}`}}}catch(h){const{errorCode:D}=h;throw new lo({functionName:"subscribeUserStatus",code:D})}})}unsubscribeUserStatus(E){return et(this,void 0,void 0,function*(){try{this._checkBusinessCapabilityBits("unsubscribeUserStatus");const{userIDList:h=[]}=E,D=this._getMaxUserCount("unsubscribe"),N=this._sliceUserIDList(h,D),O=yield function(j){return et(this,void 0,void 0,function*(){const{channel:IA}=ZA,BA="im_open_status.ws_status_unsubscribe";let mA={};mA=j.length===0?{UnsubscribeAll:1}:{To_Account:j};const _A=Ci({servcmd:BA,data:mA}),xA=`${_A.head.seq}${BA}`;return yield IA.sendPacket(_A,{requestId:xA})})}(N),Y=this._parseResponse(O);return{code:0,data:{failureUserList:Y},successLog:{message:`userID length:${h.length} failCount: ${Y.length}`}}}catch(h){const{errorCode:D}=h;throw new lo({functionName:"unsubscribeUserStatus",code:D})}})}_onUserStatusUpdate(E){const{UserStatusList:h=[]}=E||{},D=h.map(N=>{const{To_Account:O,Status:Y,CustomStatus:j,Platform:IA}=N,BA={userID:O,statusType:Y,customStatus:qc(j)};return IA&&(BA.onlineDevices=IA),BA});this._emitUserStatusUpdatedEvent(D)}_onReOnline(E){const h=qc(E.data.customStatus);if(this._customStatus===h)return;this._customStatus=h;const D={userID:Wr(),statusType:Kg,customStatus:h};this._emitUserStatusUpdatedEvent(D)}_emitUserStatusUpdatedEvent(E){ZA.notificationCenter.emitOuterEvent(kr.USER_STATUS_UPDATED,{name:kr.USER_STATUS_UPDATED,data:E})}_sliceUserIDList(E,h){return E.slice(0,h)}_parseResponse(E){const{ErrorList:h=[]}=E;return h.map(D=>{const{To_Account:N,Invalid_Account:O,ErrorCode:Y,ErrorInfo:j}=D;return{userID:ZA.utils.isEmpty(O)?N:O,code:Y,message:j}})}_checkBusinessCapabilityBits(E){if(!ZA.store.get("commercialConfig").get(wn))throw new lo({functionName:E,code:Qa.NO_USE,replacement1:E})}_getMaxUserCount(E){const h=ZA.store.get("cloudConfig")||{},D={query:{key:"status_query_count",default:500},subscribe:{key:"status_sub_count",default:100},unsubscribe:{key:"status_unsub_count",default:100}},{key:N,default:O}=D[E],Y=h[N]||O;return parseInt(Y,10)}_getMyStatus(){return{code:0,data:{successUserList:[{userID:Wr(),statusType:Kg,customStatus:this._customStatus}],failureUserList:[]}}}_getUserStatus(E){return et(this,void 0,void 0,function*(){try{this._checkBusinessCapabilityBits("getUserStatus");const h=this._getMaxUserCount("query"),D=this._sliceUserIDList(E,h),N=yield Vl(D),{successUserList:O,failureUserList:Y}=N||{};return{code:0,data:{successUserList:O,failureUserList:Y}}}catch(h){const{errorCode:D}=h;throw new lo({functionName:"getUserStatus",code:D})}})}_isOnlyMeInArray(E){const h=Wr();return E.length===1&&E.indexOf(h)>-1}_dispose(){const{notificationCenter:E}=ZA;E.unSubscribeInnerEvent(Gt.MESSAGE_PUSH,E.InnerEventSubType.USER_STATUS_UPDATE,this._onUserStatusUpdate,this),E.unSubscribeInnerEvent(Gt.DESTROY,this._dispose,this),E.unSubscribeInnerEvent(Gt.LOGOUT,this._reset,this),this._reset()}_reset(){this._customStatus=""}}const L={getUserProfile:{userIDList:{required:!0,rules:["array"],allowEmpty:!1}},updateMyProfile:{nick:{required:!1,rules:["string"],allowEmpty:!0},avatar:{required:!1,rules:["string"],allowEmpty:!0},gender:{required:!1,rules:["string"],allowEmpty:!0},selfSignature:{required:!1,rules:["string"],allowEmpty:!0},allowType:{required:!1,rules:["string"],allowEmpty:!0},birthday:{required:!1,rules:["number"],allowEmpty:!1},language:{required:!1,rules:["string"],allowEmpty:!0},messageSettings:{required:!1,rules:["string"],allowEmpty:!0},adminForbidType:{required:!1,rules:["string"],allowEmpty:!0},level:{required:!1,rules:["number"],allowEmpty:!1},role:{required:!1,rules:["number"],allowEmpty:!0},profileCustomField:{required:!1,rules:["array"],allowEmpty:!0,customValidator:function(C){for(const E of C){if(typeof E!="object")return"Each item in profileCustomField must be an object";if(typeof E?.key!="string")return"Each item.key in profileCustomField must be a string";if(!E?.key.startsWith(ys))return'Each item.key in profileCustomField must start with "Tag_Profile_Custom"'}return!0}}},setSelfStatus:{customStatus:{required:!0,rules:["string"],allowEmpty:!0}},getUserStatus:{userIDList:{required:!0,rules:["array"],allowEmpty:!1}},subscribeUserStatus:{userIDList:{required:!0,rules:["array"],allowEmpty:!1}},unsubscribeUserStatus:{userIDList:{required:!1,rules:["array"],allowEmpty:!0}}},w={getMyProfile:!0,getUserProfile:!0,updateMyProfile:!0,setSelfStatus:!0,getUserStatus:!0,subscribeUserStatus:!0,unsubscribeUserStatus:!0};class q{constructor(){this.userProfile=new bB,this.userStatus=new LB,this.userProfile.init(),this.userStatus.init(),Lg({auth:w,params:L})}}function y(C){const E=[];if(!s(C))return E;const h=C.length;if(h===0)return E;for(let D=h-1;D>=0;D--)C[D]==="1"&&E.push(2**(h-D-1));return E}var T,V,$;(function(C){C.NOT_START="notStart",C.PENDING="pending",C.RESOLVED="resolved",C.REJECTED="rejected"})(T||(T={})),function(C){C[C.C2C=1]="C2C",C[C.GROUP=2]="GROUP"}(V||(V={})),function(C){C[C.C2C=8]="C2C",C[C.GROUP=2]="GROUP"}($||($={}));class CA{constructor(){this._name="SyncConversationHandler",this._pagingStatus=T.NOT_START,this._pagingTimeStamp=0,this._pagingStartIndex=0,this._pagingPinnedTimeStamp=0,this._pagingPinnedStartIndex=0}init(){const{notificationCenter:E}=ZA;Ir.getInstance().registerWorkflowStep(cn.SYNC_SERVER_INFO_AFTER_RE_ONLINE,kt.CONVERSATION_RECOVER,this._syncConversationList,this),Ir.getInstance().registerWorkflowStep(cn.SYNC_SERVER_INFO_AFTER_LOGIN,kt.CONVERSATION_LIST_SYNC,this._syncConversationListAfterLogin,this),E.subscribeInnerEvent(Gt.LOGOUT,this._reset,this),E.subscribeInnerEvent(Gt.DESTROY,this._dispose,this),ZA.ssoLog.debug(`${this._name}.init`)}isSyncCompleted(){return this._pagingStatus===T.RESOLVED}_syncConversationListAfterLogin(){return et(this,void 0,void 0,function*(){return this._pagingStatus=T.NOT_START,this._pagingTimeStamp=0,this._pagingStartIndex=0,this._pagingPinnedTimeStamp=0,this._pagingPinnedStartIndex=0,this._syncConversationList()})}_syncConversationList(){return et(this,void 0,void 0,function*(){const{ssoLog:E,utils:{safeStringify:h}}=ZA;E.debug("_syncConversationList","start");try{const D=yield this._pagingGetConversationList(!0);this._pagingStatus=T.RESOLVED;const{conversationList:N=[]}=D||{};return E.info("_syncConversationList",`success count:${N.length}`),D}catch(D){const N=new lo(D);E.error("_syncConversationList",`fail ${h(D)}`,{error:N})}})}_pagingGetConversationList(E){return et(this,void 0,void 0,function*(){try{const h=[];this._pagingStatus=T.PENDING;const D=yield function(_A){return et(this,void 0,void 0,function*(){const{fromAccount:xA,pagingTimeStamp:Qe,pagingStartIndex:Re,pagingPinnedTimeStamp:Se,pagingPinnedStartIndex:At}=_A;return Ls({servcmd:"recentcontact.page_get",data:{AssistFlags:31,MsgAssistFlags:15,OrderType:1,From_Account:xA,StartIndex:Re,TimeStamp:Qe,TopStartIndex:At,TopTimeStamp:Se}})})}({fromAccount:Wr(),pagingTimeStamp:E?this._pagingTimeStamp:0,pagingStartIndex:E?this._pagingStartIndex:0,pagingPinnedTimeStamp:E?this._pagingPinnedTimeStamp:0,pagingPinnedStartIndex:E?this._pagingPinnedStartIndex:0}),{CompleteFlag:N,SessionItem:O=[],TimeStamp:Y,StartIndex:j,TopTimeStamp:IA,TopStartIndex:BA}=D||{};let mA=[];if(N===1&&(this._pagingStatus=T.RESOLVED),O.length>0&&(mA=this._getConversationOptions(O),h.push(...mA)),ZA.notificationCenter.emitInnerEvent(Gt.SYNC_CONVERSATION_LIST,{conversationUpdateFieldList:mA}),this._pagingTimeStamp=Y,this._pagingStartIndex=j,this._pagingPinnedTimeStamp=IA,this._pagingPinnedStartIndex=BA,N!==1){const{conversationList:_A}=yield this._pagingGetConversationList(E);h.push(..._A)}return{conversationList:h}}catch(h){throw h}})}_getConversationOptions(E){const{utils:{isUndefined:h}}=ZA,D=this._convertConversationKey(E);return this._filterValidConversations(D).map(N=>(h(N.lastMsg)&&(N.lastMsg={elements:[]}),N.type===V.C2C?this._assembleC2COption(N):this._assembleGroupOption(N)))}_filterValidConversations(E){return E.filter(({type:h,userID:D})=>h===V.C2C&&!function(N){let O;return N.startsWith(vo.CONV_C2C)&&(O=N.replace(vo.CONV_C2C,"")),O==="@TLS#ERROR"||O==="@TLS#NOT_FOUND"}(D)||h===2)}_assembleC2COption(E){var h,D,N,O,Y,j,IA,BA;const mA=this._createUserprofile(E);return{conversationID:`${vo.CONV_C2C}${E.userID}`,type:vo.CONV_C2C,lastMessage:{lastTime:E.time,lastSequence:E.sequence,fromAccount:E.lastC2CMsgFromAccount,type:!((h=E.lastMsg)===null||h===void 0)&&h.elements[0]?(D=E.lastMsg)===null||D===void 0?void 0:D.elements[0].type:null,payload:!((N=E.lastMsg)===null||N===void 0)&&N.elements[0]?this._amendLayersOverLimitProp(E.lastMsg.elements[0].content):null,cloudCustomData:((j=(Y=(O=E.lastMsg)===null||O===void 0?void 0:O.elements)===null||Y===void 0?void 0:Y[0])===null||j===void 0?void 0:j.cloudCustomData)||"",isRevoked:E.lastMessageFlag===$.C2C,onlineOnlyFlag:!1,nick:"",nameCard:"",version:0,isPeerRead:this._computeIsPeerRead(E),revoker:((BA=(IA=E.lastMsg)===null||IA===void 0?void 0:IA.revokerInfo)===null||BA===void 0?void 0:BA.revoker)||null},unreadCount:0,userProfile:mA,peerReadTime:E.peerReadTime,isPinned:E.isPinned===1,customData:E.customMark||"",markList:y(E.standardMark),conversationGroupList:[],remark:E.friendRemark||"",messageRemindType:this._transMsgRemindType(E.messageRemindType)}}_createUserprofile(E){var h;const{userID:D,nick:N,peerAvatar:O}=E,Y=[{tag:"Tag_Profile_IM_Nick",value:N},{tag:"Tag_Profile_IM_Image",value:O}];return(h=ZA.user.userProfile)===null||h===void 0?void 0:h.createProfile(D,Y)}_computeIsPeerRead(E){const h=Wr(),{lastC2CMsgFromAccount:D,time:N,c2cPeerReadTime:O}=E;return D===h&&N<=O}_assembleGroupOption(E){var h,D,N,O,Y;return{conversationID:`${vo.CONV_GROUP}${E.groupID}`,type:vo.CONV_GROUP,lastMessage:Object.assign(Object.assign({lastTime:E.time,lastSequence:E.sequence,fromAccount:E.msgGroupFromAccount},this._patchTypeAndPayload(E)),{cloudCustomData:((N=(D=(h=E.lastMsg)===null||h===void 0?void 0:h.elements)===null||D===void 0?void 0:D[0])===null||N===void 0?void 0:N.cloudCustomData)||"",isRevoked:E.lastMessageFlag===$.GROUP,onlineOnlyFlag:!1,nick:E.msgGroupFromNickName||"",nameCard:E.msgGroupFromCardName||"",revoker:((Y=(O=E.lastMsg)===null||O===void 0?void 0:O.revokerInfo)===null||Y===void 0?void 0:Y.revoker)||null}),groupProfile:{groupID:E.groupID,name:E.groupNick,avatar:E.groupImage,type:E.groupType,nextMessageSeq:E.nextMessageSeq},unreadCount:this._computeGroupUnreadCount(E),peerReadTime:0,isPinned:E.isPinned===1,version:0,customData:E.customMark||"",markList:y(E.standardMark),conversationGroupList:[],messageRemindType:this._transMsgRemindType(E.messageRemindType),subType:E.groupType}}_convertConversationKey(E){return E.map(h=>({type:h.Type,userID:h.To_Account,nick:h.C2cNick,peerAvatar:h.C2cImage,time:h.MsgTimeStamp,sequence:h.MsgSeq,lastC2CMsgFromAccount:h.LastC2cMsgFrom_Account,lastMsg:this._convertLastMsgKey(h.LastMsg),lastMessageFlag:h.LastMsgFlags,c2cPeerReadTime:h.C2cPeerReadTime,peerReadTime:h.C2cPeerReadTime,friendRemark:h.C2cRemark,isPinned:h.TopFlags,standardMark:h.StandardMark,customMark:h.CustomMark,messageRemindType:h.MsgRecvOption,groupID:h.ToAccount,groupNick:h.GroupNick,groupImage:h.GroupImage,groupType:h.GroupType,nextMessageSeq:h.GroupNextMsgSeq,msgGroupFromAccount:h.MsgGroupFrom_Account,msgGroupFromNickName:h.MsgGroupFromNickName,msgGroupFromCardName:h.MsgGroupFromCardName,unreadCount:h.UnreadMsgCount,noUnreadCount:h.GroupIgnoredUnreadSeqCount}))}_convertLastMsgKey(E){var h,D,N;const{utils:{isEmpty:O}}=ZA;if(O(E))return null;let Y="",j=null;if(!O(E.GroupTips)){const{From_Account:IA,GroupName:BA}=((h=E.GroupTips)===null||h===void 0?void 0:h.GroupInfo)||{};Y=vo.MSG_GRP_TIP,j=Object.assign(Object.assign({},this._parseContent(Y,E.GroupTips.MsgBody)),{groupProfile:{from:IA,groupName:BA}})}return E.MsgBody&&(Y=(D=E.MsgBody[0])===null||D===void 0?void 0:D.MsgType,j=this._parseContent(Y,E.MsgBody[0])),{event:E.Event,elements:[{type:Y,content:j,cloudCustomData:E.CloudCustomData}],revokerInfo:{revoker:(N=E.RevokerInfo)===null||N===void 0?void 0:N.Revoker_Account}}}_parseContent(E,h){var D;if(!h)return h;const N=ZA.message.messageFactory.getElementClass(E);return N?(D=N.parseServerPushElement(h))===null||D===void 0?void 0:D.content:h}_amendLayersOverLimitProp(E){const{LayersOverLimit:h}=E;return Vo(E,["LayersOverLimit"]).layersOverLimit=h===1,E}_transMsgRemindType(E){let h="";return E===0?h=vo.MSG_REMIND_ACPT_AND_NOTE:E===1?h=vo.MSG_REMIND_DISCARD:E===2?h=vo.MSG_REMIND_ACPT_NOT_NOTE:E===3&&(h=vo.NOT_RECEIVE_OFFLINE_PUSH_EXCEPT_AT),h}_patchTypeAndPayload(E){var h;const{utils:{isUndefined:D}}=ZA,{event:N,elements:O=[]}=E.lastMsg||{};return D(N)?{type:O[0]?O[0].type:null,payload:O[0]?this._amendLayersOverLimitProp(O[0].content):null}:{type:vo.MSG_GRP_TIP,payload:((h=O?.[0])===null||h===void 0?void 0:h.content)||{}}}_computeGroupUnreadCount(E){const{unreadCount:h=0,noUnreadCount:D=0}=E,N=h-D;return N>0?N:0}_reset(){this._pagingStatus=T.NOT_START,this._pagingTimeStamp=0,this._pagingStartIndex=0,this._pagingPinnedTimeStamp=0,this._pagingPinnedStartIndex=0}_dispose(){this._reset();const{notificationCenter:E}=ZA;E.unSubscribeInnerEvent(Gt.LOGOUT,this._reset,this),E.unSubscribeInnerEvent(Gt.DESTROY,this._dispose,this)}}class NA{constructor(){this.syncConversationHandler=new CA,this.syncConversationHandler.init()}}console.log(`TencentCloudLiteChat.VERSION:${Ia}`);var KA={create:function(C){var E,h;const{SDKAppID:D,testEnv:N=!1,devMode:O=!1,unlimitedAVChatRoom:Y=!1,scene:j="",oversea:IA=!1,instance:BA,disableIndependentDomain:mA=!1,proxyServer:_A=""}=C;let xA=D;if(!function(Re){if(typeof Re=="number")return!0;const Se=Number(Re);return!Number.isNaN(Se)}(xA))return console.error("Create SDK instance failed. Failed to parse the SDKAppID, please check the arguments"),null;if(xA=Number(xA),og.has(xA))return og.get(xA);let Qe=null;if(BA)Qe=BA,Qe._workflowManager&&Ir.setInstance(Qe._workflowManager),Qe._pluginManager&&Qe._pluginManager.installBuiltInPlugin(Mn),BA.isReady()&&((h=(E=Ir.getInstance()).executeWorkflow)===null||h===void 0||h.call(E,cn.SYNC_SERVER_INFO_AFTER_LOGIN));else{const Re=function(){function ri(){return(65536*(1+Math.random())|0).toString(16).substring(1)}return`${ri()+ri()}${ri()}${ri()}${ri()}${ri()}${ri()}${ri()}`}();ZA.init({sdkAppId:xA,instanceId:Re,testEnv:N,devMode:O,unlimitedAVChatRoom:Y,disableIndependentDomain:mA,scene:j,oversea:IA,sdkEdition:bl,version:Ia,proxyServer:_A}),Ir.getInstance().init(),ZA.message=new ec,ZA.user=new q,ZA.login=new gg,ZA.conversation=new NA,fs.getInstance().installBuiltInPlugin(Mn),Qe=Wo.getInstance().exposeApiForClient(),Qe._workflowManager=Ir.getInstance(),Qe._pluginManager=fs.getInstance();const{utils:{IS_WORKER_AVAILABLE:Se,USER_AGENT:At,getPlatformType:at,isIOSWebView:jt}}=ZA,Bi=`instanceID:${Re} SDKAppID:${D} platform:${MA} host:${at()} isIOSWebView:${jt} workerAvailable:${Se} UserAgent:${At}`;ZA.ssoLog.info("sdkConstruct",Bi)}return og.set(xA,Qe),Qe},TSignaling:Dl,EVENT:kr,VERSION:Ia,TYPES:vo};return KA})}(d2)),d2.exports}var fG={exports:{}},h2={exports:{}},SrA=h2.exports,c5;function vrA(){return c5||(c5=1,function(t,i){(function(r,s){t.exports=s()})(SrA,function(){function r(A,e){return e.forEach(function(o){o&&typeof o!="string"&&!Array.isArray(o)&&Object.keys(o).forEach(function(n){if(n!=="default"&&!(n in A)){var a=Object.getOwnPropertyDescriptor(o,n);Object.defineProperty(A,n,a.get?a:{enumerable:!0,get:function(){return o[n]}})}})}),Object.freeze(A)}var s=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof bI<"u"?bI:typeof self<"u"?self:{};function g(A){return A&&A.__esModule&&Object.prototype.hasOwnProperty.call(A,"default")?A.default:A}var B=function(A){return A&&A.Math===Math&&A},Q=B(typeof globalThis=="object"&&globalThis)||B(typeof window=="object"&&window)||B(typeof self=="object"&&self)||B(typeof s=="object"&&s)||B(typeof s=="object"&&s)||function(){return this}()||Function("return this")(),f={},m=function(A){try{return!!A()}catch{return!0}},M=!m(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!==7}),v=!m(function(){var A=function(){}.bind();return typeof A!="function"||A.hasOwnProperty("prototype")}),U=v,AA=Function.prototype.call,z=U?AA.bind(AA):function(){return AA.apply(AA,arguments)},sA={},eA={}.propertyIsEnumerable,X=Object.getOwnPropertyDescriptor,QA=X&&!eA.call({1:2},1);sA.f=QA?function(A){var e=X(this,A);return!!e&&e.enumerable}:eA;var wA,HA,VA=function(A,e){return{enumerable:!(1&A),configurable:!(2&A),writable:!(4&A),value:e}},ue=v,jA=Function.prototype,Ve=jA.call,Ze=ue&&jA.bind.bind(Ve,Ve),Me=ue?Ze:function(A){return function(){return Ve.apply(A,arguments)}},qe=Me,Et=qe({}.toString),Je=qe("".slice),$e=function(A){return Je(Et(A),8,-1)},Dt=m,Zi=$e,bi=Object,qt=Me("".split),ai=Dt(function(){return!bi("z").propertyIsEnumerable(0)})?function(A){return Zi(A)==="String"?qt(A,""):bi(A)}:bi,Ki=function(A){return A==null},Ur=Ki,Er=TypeError,no=function(A){if(Ur(A))throw new Er("Can't call method on "+A);return A},Kn=ai,Xi=no,yr=function(A){return Kn(Xi(A))},lr=typeof document=="object"&&document.all,Ni=lr===void 0&&lr!==void 0?function(A){return typeof A=="function"||A===lr}:function(A){return typeof A=="function"},wt=Ni,Ji=function(A){return typeof A=="object"?A!==null:wt(A)},Di=Q,ar=Ni,MA=function(A,e){return arguments.length<2?(o=Di[A],ar(o)?o:void 0):Di[A]&&Di[A][e];var o},YA=Me({}.isPrototypeOf),pe=Q.navigator,st=pe&&pe.userAgent,Te=st?String(st):"",be=Q,yt=Te,ht=be.process,ae=be.Deno,ye=ht&&ht.versions||ae&&ae.version,Xe=ye&&ye.v8;Xe&&(HA=(wA=Xe.split("."))[0]>0&&wA[0]<4?1:+(wA[0]+wA[1])),!HA&&yt&&(!(wA=yt.match(/Edge\/(\d+)/))||wA[1]>=74)&&(wA=yt.match(/Chrome\/(\d+)/))&&(HA=+wA[1]);var ot=HA,zt=ot,yi=m,Hi=Q.String,Ei=!!Object.getOwnPropertySymbols&&!yi(function(){var A=Symbol("symbol detection");return!Hi(A)||!(Object(A)instanceof Symbol)||!Symbol.sham&&zt&&zt<41}),ji=Ei&&!Symbol.sham&&typeof Symbol.iterator=="symbol",Xo=MA,sr=Ni,Lo=YA,Nr=Object,Vo=ji?function(A){return typeof A=="symbol"}:function(A){var e=Xo("Symbol");return sr(e)&&Lo(e.prototype,Nr(A))},et=String,Kr=function(A){try{return et(A)}catch{return"Object"}},Qn=Ni,ho=Kr,jn=TypeError,$t=function(A){if(Qn(A))return A;throw new jn(ho(A)+" is not a function")},$r=$t,On=Ki,An=function(A,e){var o=A[e];return On(o)?void 0:$r(o)},Tr=z,ei=Ni,Es=Ji,jr=TypeError,Gr={exports:{}},$o=Q,sn=Object.defineProperty,dn=function(A,e){try{sn($o,A,{value:e,configurable:!0,writable:!0})}catch{$o[A]=e}return e},hn=Q,Gi=dn,pn="__core-js_shared__",nI=Gr.exports=hn[pn]||Gi(pn,{});(nI.versions||(nI.versions=[])).push({version:"3.47.0",mode:"global",copyright:"© 2014-2025 Denis Pushkarev (zloirock.ru), 2025 CoreJS Company (core-js.io)",license:"https://github.com/zloirock/core-js/blob/v3.47.0/LICENSE",source:"https://github.com/zloirock/core-js"});var gr=Gr.exports,gn=gr,Yo=function(A,e){return gn[A]||(gn[A]=e||{})},Tg=no,So=Object,ao=function(A){return So(Tg(A))},EE=ao,Ta=Me({}.hasOwnProperty),po=Object.hasOwn||function(A,e){return Ta(EE(A),e)},Ja=Me,Mc=0,Qr=Math.random(),Fo=Ja(1.1.toString),$s=function(A){return"Symbol("+(A===void 0?"":A)+")_"+Fo(++Mc+Qr,36)},Ha=Yo,Gs=po,Ga=$s,Rr=Ei,Ia=ji,fo=Q.Symbol,aI=Ha("wks"),en=Ia?fo.for||fo:fo&&fo.withoutSetter||Ga,qo=function(A){return Gs(aI,A)||(aI[A]=Rr&&Gs(fo,A)?fo[A]:en("Symbol."+A)),aI[A]},Gg=z,kg=Ji,fn=Vo,ls=An,Or=function(A,e){var o,n;if(e==="string"&&ei(o=A.toString)&&!Es(n=Tr(o,A))||ei(o=A.valueOf)&&!Es(n=Tr(o,A))||e!=="string"&&ei(o=A.toString)&&!Es(n=Tr(o,A)))return n;throw new jr("Can't convert object to primitive value")},Po=TypeError,Ba=qo("toPrimitive"),Mr=function(A,e){if(!kg(A)||fn(A))return A;var o,n=ls(A,Ba);if(n){if(e===void 0&&(e="default"),o=Gg(n,A,e),!kg(o)||fn(o))return o;throw new Po("Can't convert object to primitive value")}return e===void 0&&(e="number"),Or(A,e)},Cs=Mr,Va=Vo,P=function(A){var e=Cs(A,"string");return Va(e)?e:e+""},F=Ji,EA=Q.document,RA=F(EA)&&F(EA.createElement),GA=function(A){return RA?EA.createElement(A):{}},WA=GA,Ce=!M&&!m(function(){return Object.defineProperty(WA("div"),"a",{get:function(){return 7}}).a!==7}),ge=M,we=z,_e=sA,Ke=VA,Bt=yr,Rt=P,Ye=po,nt=Ce,ii=Object.getOwnPropertyDescriptor;f.f=ge?ii:function(A,e){if(A=Bt(A),e=Rt(e),nt)try{return ii(A,e)}catch{}if(Ye(A,e))return Ke(!we(_e.f,A,e),A[e])};var oi={},Ko=M&&m(function(){return Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype!==42}),Kt=Ji,ro=String,ks=TypeError,Zr=function(A){if(Kt(A))return A;throw new ks(ro(A)+" is not an object")},In=M,xr=Ce,sI=Ko,jo=Zr,OI=P,_g=TypeError,gI=Object.defineProperty,ml=Object.getOwnPropertyDescriptor,ua="enumerable",II="configurable",ZA="writable";oi.f=In?sI?function(A,e,o){if(jo(A),e=OI(e),jo(o),typeof A=="function"&&e==="prototype"&&"value"in o&&ZA in o&&!o[ZA]){var n=ml(A,e);n&&n[ZA]&&(A[e]=o.value,o={configurable:II in o?o[II]:n[II],enumerable:ua in o?o[ua]:n[ua],writable:!1})}return gI(A,e,o)}:gI:function(A,e,o){if(jo(A),e=OI(e),jo(o),xr)try{return gI(A,e,o)}catch{}if("get"in o||"set"in o)throw new _g("Accessors not supported");return"value"in o&&(A[e]=o.value),A};var Ag=oi,cI=VA,Bs=M?function(A,e,o){return Ag.f(A,e,cI(1,o))}:function(A,e,o){return A[e]=o,A},eg={exports:{}},kr=M,EI=po,Gt=Function.prototype,Dl=kr&&Object.getOwnPropertyDescriptor,xI=EI(Gt,"name"),_s={PROPER:xI&&function(){}.name==="something",CONFIGURABLE:xI&&(!kr||kr&&Dl(Gt,"name").configurable)},tg=Ni,ka=gr,wc=Me(Function.toString);tg(ka.inspectSource)||(ka.inspectSource=function(A){return wc(A)});var lE,qa,CE,yC=ka.inspectSource,us=Ni,lI=Q.WeakMap,ig=us(lI)&&/native code/.test(String(lI)),yl=$s,_a=Yo("keys"),Qs=function(A){return _a[A]||(_a[A]=yl(A))},Rl={},YI=ig,vo=Q,Qa=Ji,BE=Bs,cn=po,kt=gr,Gn=Qs,PI=Rl,Sc="Object already initialized",tn=vo.TypeError,Ml=vo.WeakMap;if(YI||kt.state){var ba=kt.state||(kt.state=new Ml);ba.get=ba.get,ba.has=ba.has,ba.set=ba.set,lE=function(A,e){if(ba.has(A))throw new tn(Sc);return e.facade=A,ba.set(A,e),e},qa=function(A){return ba.get(A)||{}},CE=function(A){return ba.has(A)}}else{var da=Gn("state");PI[da]=!0,lE=function(A,e){if(cn(A,da))throw new tn(Sc);return e.facade=A,BE(A,da,e),e},qa=function(A){return cn(A,da)?A[da]:{}},CE=function(A){return cn(A,da)}}var on={set:lE,get:qa,has:CE,enforce:function(A){return CE(A)?qa(A):lE(A,{})},getterFor:function(A){return function(e){var o;if(!Qa(e)||(o=qa(e)).type!==A)throw new tn("Incompatible receiver, "+A+" required");return o}}},Xr=Me,wl=m,bs=Ni,vc=po,CI=M,uE=_s.CONFIGURABLE,RC=yC,Nc=on.enforce,Sl=on.get,JI=String,bg=Object.defineProperty,QE=Xr("".slice),vl=Xr("".replace),Tc=Xr([].join),lo=CI&&!wl(function(){return bg(function(){},"length",{value:8}).length!==8}),ds=String(String).split("String"),QB=eg.exports=function(A,e,o){QE(JI(e),0,7)==="Symbol("&&(e="["+vl(JI(e),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),o&&o.getter&&(e="get "+e),o&&o.setter&&(e="set "+e),(!vc(A,"name")||uE&&A.name!==e)&&(CI?bg(A,"name",{value:e,configurable:!0}):A.name=e),lo&&o&&vc(o,"arity")&&A.length!==o.arity&&bg(A,"length",{value:o.arity});try{o&&vc(o,"constructor")&&o.constructor?CI&&bg(A,"prototype",{writable:!1}):A.prototype&&(A.prototype=void 0)}catch{}var n=Nc(A);return vc(n,"source")||(n.source=Tc(ds,typeof e=="string"?e:"")),A};Function.prototype.toString=QB(function(){return bs(this)&&Sl(this).source||RC(this)},"toString");var Gc=eg.exports,kc=Ni,MC=oi,dB=Gc,HI=dn,mn=function(A,e,o,n){n||(n={});var a=n.enumerable,I=n.name!==void 0?n.name:e;if(kc(o)&&dB(o,I,n),n.global)a?A[e]=o:HI(e,o);else{try{n.unsafe?A[e]&&(a=!0):delete A[e]}catch{}a?A[e]=o:MC.f(A,e,{value:o,enumerable:!1,configurable:!n.nonConfigurable,writable:!n.nonWritable})}return A},Lg={},dE=Math.ceil,Ir=Math.floor,og=Math.trunc||function(A){var e=+A;return(e>0?Ir:dE)(e)},Ka=og,ca=function(A){var e=+A;return e!=e||e===0?0:Ka(e)},hE=ca,wC=Math.max,Ls=Math.min,_c=function(A,e){var o=hE(A);return o<0?wC(o+e,0):Ls(o,e)},SC=ca,rg=Math.min,Wr=function(A){var e=SC(A);return e>0?rg(e,9007199254740991):0},ng=Wr,hs=function(A){return ng(A.length)},hB=yr,pB=_c,Nl=hs,bc=function(A){return function(e,o,n){var a=hB(e),I=Nl(a);if(I===0)return!A&&-1;var c,u=pB(n,I);if(A&&o!=o){for(;I>u;)if((c=a[u++])!=c)return!0}else for(;I>u;u++)if((A||u in a)&&a[u]===o)return A||u||0;return!A&&-1}},VI={includes:bc(!0),indexOf:bc(!1)},BI=po,pE=yr,Lc=VI.indexOf,uI=Rl,Fg=Me([].push),ja=function(A,e){var o,n=pE(A),a=0,I=[];for(o in n)!BI(uI,o)&&BI(n,o)&&Fg(I,o);for(;e.length>a;)BI(n,o=e[a++])&&(~Lc(I,o)||Fg(I,o));return I},Fs=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],No=ja,Fc=Fs.concat("length","prototype");Lg.f=Object.getOwnPropertyNames||function(A){return No(A,Fc)};var Ug={};Ug.f=Object.getOwnPropertySymbols;var vC=MA,fE=Lg,Tl=Ug,Ou=Zr,fB=Me([].concat),xu=vC("Reflect","ownKeys")||function(A){var e=fE.f(Ou(A)),o=Tl.f;return o?fB(e,o(A)):e},Og=po,QI=xu,pi=f,mB=oi,Gl=function(A,e,o){for(var n=QI(e),a=mB.f,I=pi.f,c=0;cc;)xc.f(A,o=a[c++],n[o]);return A};var Us,fI=MA("document","documentElement"),kC=Zr,Fl=hI,Pc=Fs,vE=Rl,di=fI,Ul=GA,za="prototype",NE="script",Ol=Qs("IE_PROTO"),Jg=function(){},TE=function(A){return"<"+NE+">"+A+""},Hg=function(A){A.write(TE("")),A.close();var e=A.parentWindow.Object;return A=null,e},Vg=function(){try{Us=new ActiveXObject("htmlfile")}catch{}Vg=typeof document<"u"?document.domain&&Us?Hg(Us):function(){var e,o=Ul("iframe"),n="java"+NE+":";return o.style.display="none",di.appendChild(o),o.src=String(n),(e=o.contentWindow.document).open(),e.write(TE("document.F=Object")),e.close(),e.F}():Hg(Us);for(var A=Pc.length;A--;)delete Vg[za][Pc[A]];return Vg()};vE[Ol]=!0;var fa=Object.create||function(A,e){var o;return A!==null?(Jg[za]=kC(A),o=new Jg,Jg[za]=null,o[Ol]=A):o=Vg(),e===void 0?o:Fl.f(o,e)},xl=qo,zn=fa,dr=oi.f,Yn=xl("unscopables"),qg=Array.prototype;qg[Yn]===void 0&&dr(qg,Yn,{configurable:!0,value:zn(null)});var GE=function(A){qg[Yn][A]=!0},$I=VI.includes,GB=GE;wr({target:"Array",proto:!0,forced:m(function(){return!Array(1).includes()})},{includes:function(A){return $I(this,A,arguments.length>1?arguments[1]:void 0)}}),GB("includes");var Ig,kE,kB,_E={},Ju=!m(function(){function A(){}return A.prototype.constructor=null,Object.getPrototypeOf(new A)!==A.prototype}),bE=po,Jc=Ni,LE=ao,_B=Ju,Zn=Qs("IE_PROTO"),Os=Object,Za=Os.prototype,FE=_B?Os.getPrototypeOf:function(A){var e=LE(A);if(bE(e,Zn))return e[Zn];var o=e.constructor;return Jc(o)&&e instanceof o?o.prototype:e instanceof Os?Za:null},Yl=m,UE=Ni,OE=Ji,Ac=FE,ec=mn,Xn=qo("iterator"),kn=!1;[].keys&&("next"in(kB=[].keys())?(kE=Ac(Ac(kB)))!==Object.prototype&&(Ig=kE):kn=!0);var ys=!OE(Ig)||Yl(function(){var A={};return Ig[Xn].call(A)!==A});ys&&(Ig={}),UE(Ig[Xn])||ec(Ig,Xn,function(){return this});var ln={IteratorPrototype:Ig,BUGGY_SAFARI_ITERATORS:kn},wn=oi.f,Kg=po,cg=qo("toStringTag"),Rs=function(A,e,o){A&&!o&&(A=A.prototype),A&&!Kg(A,cg)&&wn(A,cg,{configurable:!0,value:e})},Hc=ln.IteratorPrototype,Ms=fa,Vc=VA,Pl=Rs,ma=_E,tc=function(){return this},bB=function(A,e,o,n){var a=e+" Iterator";return A.prototype=Ms(Hc,{next:Vc(+!n,o)}),Pl(A,a,!1),ma[a]=tc,A},Jl=Me,Hl=$t,qc=Ji,xE=function(A){return qc(A)||A===null},Ci=String,Vl=TypeError,YE=function(A,e,o){try{return Jl(Hl(Object.getOwnPropertyDescriptor(A,e)[o]))}catch{}},LB=Ji,L=no,w=function(A){if(xE(A))return A;throw new Vl("Can't set "+Ci(A)+" as a prototype")},q=Object.setPrototypeOf||("__proto__"in{}?function(){var A,e=!1,o={};try{(A=YE(Object.prototype,"__proto__","set"))(o,[]),e=o instanceof Array}catch{}return function(n,a){return L(n),w(a),LB(n)&&(e?A(n,a):n.__proto__=a),n}}():void 0),y=wr,T=z,V=Ni,$=bB,CA=FE,NA=q,KA=Rs,C=Bs,E=mn,h=_E,D=_s.PROPER,N=_s.CONFIGURABLE,O=ln.IteratorPrototype,Y=ln.BUGGY_SAFARI_ITERATORS,j=qo("iterator"),IA="keys",BA="values",mA="entries",_A=function(){return this},xA=function(A,e,o,n,a,I,c){$(o,e,n);var u,d,R,k=function(Ie){if(Ie===a&&TA)return TA;if(!Y&&Ie&&Ie in iA)return iA[Ie];switch(Ie){case IA:case BA:case mA:return function(){return new o(this,Ie)}}return function(){return new o(this)}},_=e+" Iterator",Z=!1,iA=A.prototype,cA=iA[j]||iA["@@iterator"]||a&&iA[a],TA=!Y&&cA||k(a),JA=e==="Array"&&iA.entries||cA;if(JA&&(u=CA(JA.call(new A)))!==Object.prototype&&u.next&&(CA(u)!==O&&(NA?NA(u,O):V(u[j])||E(u,j,_A)),KA(u,_,!0)),D&&a===BA&&cA&&cA.name!==BA&&(N?C(iA,"name",BA):(Z=!0,TA=function(){return T(cA,this)})),a)if(d={values:k(BA),keys:I?TA:k(IA),entries:k(mA)},c)for(R in d)(Y||Z||!(R in iA))&&E(iA,R,d[R]);else y({target:e,proto:!0,forced:Y||Z},d);return iA[j]!==TA&&E(iA,j,TA,{name:a}),h[e]=TA,d},Qe=function(A,e){return{value:A,done:e}},Re=yr,Se=GE,At=_E,at=on,jt=oi.f,Bi=xA,ri=Qe,St=M,eo="Array Iterator",to=at.set,Yt=at.getterFor(eo),si=Bi(Array,"Array",function(A,e){to(this,{type:eo,target:Re(A),index:0,kind:e})},function(){var A=Yt(this),e=A.target,o=A.index++;if(!e||o>=e.length)return A.target=null,ri(void 0,!0);switch(A.kind){case"keys":return ri(o,!1);case"values":return ri(e[o],!1)}return ri([o,e[o]],!1)},"values"),zo=At.Arguments=At.Array;if(Se("keys"),Se("values"),Se("entries"),St&&zo.name!=="values")try{jt(zo,"name",{value:"values"})}catch{}var te=$t,je=ao,dA=ai,ut=hs,Cr=TypeError,lt="Reduce of empty array with no initial value",Co=function(A){return function(e,o,n,a){var I=je(e),c=dA(I),u=ut(I);if(te(o),u===0&&n<2)throw new Cr(lt);var d=A?u-1:0,R=A?-1:1;if(n<2)for(;;){if(d in c){a=c[d],d+=R;break}if(d+=R,A?d<0:u<=d)throw new Cr(lt)}for(;A?d>=0:u>d;d+=R)d in c&&(a=o(a,c[d],d,I));return a}},Jt={left:Co(!1),right:Co(!0)},mo=m,Fe=function(A,e){var o=[][A];return!!o&&mo(function(){o.call(null,e||function(){return 1},1)})},Oe=Q,xs=Te,Zo=$e,ti=function(A){return xs.slice(0,A.length)===A},_n=ti("Bun/")?"BUN":ti("Cloudflare-Workers")?"CLOUDFLARE":ti("Deno/")?"DENO":ti("Node.js/")?"NODE":Oe.Bun&&typeof Bun.version=="string"?"BUN":Oe.Deno&&typeof Deno.version=="object"?"DENO":Zo(Oe.process)==="process"?"NODE":Oe.window&&Oe.document?"BROWSER":"REST",Eg=_n==="NODE",Bo=Jt.left;wr({target:"Array",proto:!0,forced:!Eg&&ot>79&&ot<83||!Fe("reduce")},{reduce:function(A){var e=arguments.length;return Bo(this,A,e,e>1?arguments[1]:void 0)}});var Da=Jt.right;wr({target:"Array",proto:!0,forced:!Eg&&ot>79&&ot<83||!Fe("reduceRight")},{reduceRight:function(A){return Da(this,A,arguments.length,arguments.length>1?arguments[1]:void 0)}});var Xa=$e,ia=Array.isArray||function(A){return Xa(A)==="Array"},b=wr,rA=ia,gA=Me([].reverse),pA=[1,2];b({target:"Array",proto:!0,forced:String(pA)===String(pA.reverse())},{reverse:function(){return rA(this)&&(this.length=this.length),gA(this)}});var vA=Kr,Ae=TypeError,UA=Me([].slice),re=UA,LA=Math.floor,se=function(A,e){var o=A.length;if(o<8)for(var n,a,I=1;I0;)A[a]=A[--a];a!==I++&&(A[a]=n)}else for(var c=LA(o/2),u=se(re(A,0,c),e),d=se(re(A,c),e),R=u.length,k=d.length,_=0,Z=0;_3)){if(fD)return!0;if(Qt)return Qt<603;var A,e,o,n,a="";for(A=65;A<76;A++){switch(e=String.fromCharCode(A),A){case 66:case 69:case 70:case 72:o=3;break;case 68:case 71:o=4;break;default:o=2}for(n=0;n<47;n++)Ti.push({k:e+n,v:o})}for(Ti.sort(function(I,c){return c.v-I.v}),n=0;n$a(d)?1:-1}}(A)),o=$i(a),n=0;no||d!=d?1/0*c:c*d},Lk=Math.fround||function(A){return bk(A,11920928955078125e-23,34028234663852886e22,11754943508222875e-54)},LY=Array,FY=Math.abs,bC=Math.pow,UY=Math.floor,Fk=Math.log,OY=Math.LN2,Lw={pack:function(A,e,o){var n,a,I,c=LY(o),u=8*o-e-1,d=(1<>1,k=e===23?bC(2,-24)-bC(2,-77):0,_=A<0||A===0&&1/A<0?1:0,Z=0;for((A=FY(A))!=A||A===1/0?(a=A!=A?1:0,n=d):(n=UY(Fk(A)/OY),A*(I=bC(2,-n))<1&&(n--,I*=2),(A+=n+R>=1?k/I:k*bC(2,1-R))*I>=2&&(n++,I/=2),n+R>=d?(a=0,n=d):n+R>=1?(a=(A*I-1)*bC(2,e),n+=R):(a=A*bC(2,R-1)*bC(2,e),n=0));e>=8;)c[Z++]=255&a,a/=256,e-=8;for(n=n<0;)c[Z++]=255&n,n/=256,u-=8;return c[Z-1]|=128*_,c},unpack:function(A,e){var o,n=A.length,a=8*n-e-1,I=(1<>1,u=a-7,d=n-1,R=A[d--],k=127&R;for(R>>=7;u>0;)k=256*k+A[d--],u-=8;for(o=k&(1<<-u)-1,k>>=-u,u+=e;u>0;)o=256*o+A[d--],u-=8;if(k===0)k=1-c;else{if(k===I)return o?NaN:R?-1/0:1/0;o+=bC(2,e),k-=c}return(R?-1:1)*o*bC(2,k-e)}},xY=ao,Uk=_c,YY=hs,Ok=function(A){for(var e=xY(this),o=YY(e),n=arguments.length,a=Uk(n>1?arguments[1]:void 0,o),I=n>2?arguments[2]:void 0,c=I===void 0?o:Uk(I,o);c>a;)e[a++]=A;return e},PY=Ni,JY=Ji,Fw=q,Uw=function(A,e,o){var n,a;return Fw&&PY(n=e.constructor)&&n!==o&&JY(a=n.prototype)&&a!==o.prototype&&Fw(A,a),A},Sp=Q,RD=Me,MD=M,FB=Cn,HY=Bs,VY=dI,wD=JE,Ow=m,Hu=oc,qY=ca,KY=Wr,SD=mD,xk=Lk,xw=Lw,Yk=FE,Pk=q,jY=Ok,WY=UA,zY=Uw,Jk=Gl,Hk=Rs,vD=on,Vu=_s.PROPER,Yw=_s.CONFIGURABLE,qu="ArrayBuffer",Ku="DataView",ld="prototype",Pw="Wrong index",Jw=vD.getterFor(qu),vp=vD.getterFor(Ku),Vk=vD.set,HE=Sp[qu],VE=HE,Cd=VE&&VE[ld],qE=Sp[Ku],UB=qE&&qE[ld],LC=Object.prototype,ND=Sp.Array,Bd=Sp.RangeError,ZY=RD(jY),XY=RD([].reverse),TD=xw.pack,GD=xw.unpack,qk=function(A){return[255&A]},Kk=function(A){return[255&A,A>>8&255]},Hw=function(A){return[255&A,A>>8&255,A>>16&255,A>>24&255]},Vw=function(A){return A[3]<<24|A[2]<<16|A[1]<<8|A[0]},qw=function(A){return TD(xk(A),23,4)},jk=function(A){return TD(A,52,8)},Np=function(A,e,o){VY(A[ld],e,{configurable:!0,get:function(){return o(this)[e]}})},FC=function(A,e,o,n){var a=vp(A),I=SD(o),c=!!n;if(I+e>a.byteLength)throw new Bd(Pw);var u=a.bytes,d=I+a.byteOffset,R=WY(u,d,d+e);return c?R:XY(R)},OB=function(A,e,o,n,a,I){var c=vp(A),u=SD(o),d=n(+a),R=!!I;if(u+e>c.byteLength)throw new Bd(Pw);for(var k=c.bytes,_=u+c.byteOffset,Z=0;Z>24)},setUint8:function(A,e){Kw(this,A,e<<24>>24)}},{unsafe:!0})}else Cd=(VE=function(A){Hu(this,Cd);var e=SD(A);Vk(this,{type:qu,bytes:ZY(ND(e),0),byteLength:e}),MD||(this.byteLength=e,this.detached=!1)})[ld],UB=(qE=function(A,e,o){Hu(this,UB),Hu(A,Cd);var n=Jw(A),a=n.byteLength,I=qY(e);if(I<0||I>a)throw new Bd("Wrong offset");if(I+(o=o===void 0?a-I:KY(o))>a)throw new Bd("Wrong length");Vk(this,{type:Ku,buffer:A,byteLength:o,byteOffset:I,bytes:n.bytes}),MD||(this.buffer=A,this.byteLength=o,this.byteOffset=I)})[ld],MD&&(Np(VE,"byteLength",Jw),Np(qE,"buffer",vp),Np(qE,"byteLength",vp),Np(qE,"byteOffset",vp)),wD(UB,{getInt8:function(A){return FC(this,1,A)[0]<<24>>24},getUint8:function(A){return FC(this,1,A)[0]},getInt16:function(A){var e=FC(this,2,A,arguments.length>1&&arguments[1]);return(e[1]<<8|e[0])<<16>>16},getUint16:function(A){var e=FC(this,2,A,arguments.length>1&&arguments[1]);return e[1]<<8|e[0]},getInt32:function(A){return Vw(FC(this,4,A,arguments.length>1&&arguments[1]))},getUint32:function(A){return Vw(FC(this,4,A,arguments.length>1&&arguments[1]))>>>0},getFloat32:function(A){return GD(FC(this,4,A,arguments.length>1&&arguments[1]),23)},getFloat64:function(A){return GD(FC(this,8,A,arguments.length>1&&arguments[1]),52)},setInt8:function(A,e){OB(this,1,A,qk,e)},setUint8:function(A,e){OB(this,1,A,qk,e)},setInt16:function(A,e){OB(this,2,A,Kk,e,arguments.length>2&&arguments[2])},setUint16:function(A,e){OB(this,2,A,Kk,e,arguments.length>2&&arguments[2])},setInt32:function(A,e){OB(this,4,A,Hw,e,arguments.length>2&&arguments[2])},setUint32:function(A,e){OB(this,4,A,Hw,e,arguments.length>2&&arguments[2])},setFloat32:function(A,e){OB(this,4,A,qw,e,arguments.length>2&&arguments[2])},setFloat64:function(A,e){OB(this,8,A,jk,e,arguments.length>2&&arguments[2])}});Hk(VE,qu),Hk(qE,Ku);var kD={ArrayBuffer:VE,DataView:qE},$Y=MA,AP=dI,_D=M,zk=qo("species"),bD=function(A){var e=$Y(A);_D&&e&&!e[zk]&&AP(e,zk,{configurable:!0,get:function(){return this}})},eP=bD,jw="ArrayBuffer",Zk=kD[jw];wr({global:!0,constructor:!0,forced:Q[jw]!==Zk},{ArrayBuffer:Zk}),eP(jw);var tP=$e,UC=Me,jl=function(A){if(tP(A)==="Function")return UC(A)},Xk=wr,ud=jl,iP=m,$k=Zr,A_=_c,oP=Wr,Ww=kD.ArrayBuffer,zw=kD.DataView,e_=zw.prototype,Zw=ud(Ww.prototype.slice),rP=ud(e_.getUint8),nP=ud(e_.setUint8);Xk({target:"ArrayBuffer",proto:!0,unsafe:!0,forced:iP(function(){return!new Ww(2).slice(1,void 0).byteLength})},{slice:function(A,e){if(Zw&&e===void 0)return Zw($k(this),A);for(var o=$k(this).byteLength,n=A_(A,o),a=A_(e===void 0?o:e,o),I=new Ww(oP(a-n)),c=new zw(this),u=new zw(I),d=0;nI;I++)if((u=Ie(A[I]))&&_S(vd,u))return u;return new Yp(!1)}n=e1(A,a)}for(d=Z?A.next:n.next;!(R=ZP(d,n)).done;){try{u=Ie(R.value)}catch(XA){ib(n,"throw",XA)}if(typeof u=="object"&&u&&_S(vd,u))return u}return new Yp(!1)},LS=qo("iterator"),FS=!1;try{var o1=0,US={next:function(){return{done:!!o1++}},return:function(){FS=!0}};US[LS]=function(){return this},Array.from(US,function(){throw 2})}catch{}var Nd=function(A,e){try{if(!e&&!FS)return!1}catch{return!1}var o=!1;try{var n={};n[LS]=function(){return{next:function(){return{done:o=!0}}}},A(n)}catch{}return o},Td=Lp,OS=Zu.CONSTRUCTOR||!Nd(function(A){Td.all(A).then(void 0,function(){})}),xS=z,Pp=$t,r1=Dd,n1=dS,ey=bS;wr({target:"Promise",stat:!0,forced:OS},{all:function(A){var e=this,o=r1.f(e),n=o.resolve,a=o.reject,I=n1(function(){var c=Pp(e.resolve),u=[],d=0,R=1;ey(A,function(k){var _=d++,Z=!1;R++,xS(c,e,k).then(function(iA){Z||(Z=!0,u[_]=iA,--R||n(u))},a)}),--R||n(u)});return I.error&&a(I.value),o.promise}});var YS=wr,PS=Zu.CONSTRUCTOR,JS=Lp,a1=MA,s1=Ni,ob=mn,Gd=JS&&JS.prototype;if(YS({target:"Promise",proto:!0,forced:PS,real:!0},{catch:function(A){return this.then(void 0,A)}}),s1(JS)){var rb=a1("Promise").prototype.catch;Gd.catch!==rb&&ob(Gd,"catch",rb,{unsafe:!0})}var g1=z,Jp=$t,I1=Dd,c1=dS,E1=bS;wr({target:"Promise",stat:!0,forced:OS},{race:function(A){var e=this,o=I1.f(e),n=o.reject,a=c1(function(){var I=Jp(e.resolve);E1(A,function(c){g1(I,e,c).then(o.resolve,n)})});return a.error&&n(a.value),o.promise}});var nb=Dd;wr({target:"Promise",stat:!0,forced:Zu.CONSTRUCTOR},{reject:function(A){var e=nb.f(this);return(0,e.reject)(A),e.promise}});var ab=Zr,l1=Ji,C1=Dd,sb=function(A,e){if(ab(A),l1(e)&&e.constructor===A)return e;var o=C1.f(A);return(0,o.resolve)(e),o.promise},B1=wr,gb=Zu.CONSTRUCTOR,Ib=sb;MA("Promise"),B1({target:"Promise",stat:!0,forced:gb},{resolve:function(A){return Ib(this,A)}});var nc=wr,ty=Lp,u1=m,HS=MA,cb=Ni,Eb=g_,VS=sb,Q1=mn,iy=ty&&ty.prototype;if(nc({target:"Promise",proto:!0,real:!0,forced:!!ty&&u1(function(){iy.finally.call({then:function(){}},function(){})})},{finally:function(A){var e=Eb(this,HS("Promise")),o=cb(A);return this.then(o?function(n){return VS(e,A()).then(function(){return n})}:A,o?function(n){return VS(e,A()).then(function(){throw n})}:A)}}),cb(ty)){var lb=HS("Promise").prototype.finally;iy.finally!==lb&&Q1(iy,"finally",lb,{unsafe:!0})}var d1=Ji,h1=$e,qS=qo("match"),KS=function(A){var e;return d1(A)&&((e=A[qS])!==void 0?!!e:h1(A)==="RegExp")},p1=m,oy=Q.RegExp,f1=!p1(function(){var A=!0;try{oy(".","d")}catch{A=!1}var e={},o="",n=A?"dgimsy":"gimsy",a=function(u,d){Object.defineProperty(e,u,{get:function(){return o+=d,!0}})},I={dotAll:"s",global:"g",ignoreCase:"i",multiline:"m",sticky:"y"};for(var c in A&&(I.hasIndices="d"),I)a(c,I[c]);return Object.getOwnPropertyDescriptor(oy.prototype,"flags").get.call(e)!==n||o!==n}),Cb=Zr,Bb=function(){var A=Cb(this),e="";return A.hasIndices&&(e+="d"),A.global&&(e+="g"),A.ignoreCase&&(e+="i"),A.multiline&&(e+="m"),A.dotAll&&(e+="s"),A.unicode&&(e+="u"),A.unicodeSets&&(e+="v"),A.sticky&&(e+="y"),e},jS=z,Hp=po,ub=YA,ry={correct:f1},WS=Bb,Qb=RegExp.prototype,ny=ry.correct?function(A){return A.flags}:function(A){return ry.correct||!ub(Qb,A)||Hp(A,"flags")?A.flags:jS(WS,A)},ay=m,sy=Q.RegExp,zS=ay(function(){var A=sy("a","y");return A.lastIndex=2,A.exec("abcd")!==null}),m1=zS||ay(function(){return!sy("a","y").sticky}),db=zS||ay(function(){var A=sy("^r","gy");return A.lastIndex=2,A.exec("str")!==null}),tQ={BROKEN_CARET:db,MISSED_STICKY:m1,UNSUPPORTED_Y:zS},ZS=oi.f,XS=m,$S=Q.RegExp,A0=XS(function(){var A=$S(".","s");return!(A.dotAll&&A.test(` +`)&&A.flags==="s")}),hb=m,D1=Q.RegExp,pb=hb(function(){var A=D1("(?b)","g");return A.exec("b").groups.a!=="b"||"b".replace(A,"$c")!=="bc"}),kd=M,e0=Q,_d=Me,t0=Rn,y1=Uw,R1=Bs,M1=fa,w1=Lg.f,gy=YA,fb=KS,i0=Mn,mb=ny,Vp=tQ,o0=function(A,e,o){o in A||ZS(A,o,{configurable:!0,get:function(){return e[o]},set:function(n){e[o]=n}})},Iy=mn,cy=m,S1=po,r0=on.enforce,Ey=bD,Db=A0,bd=pb,v1=qo("match"),YB=e0.RegExp,Ld=YB.prototype,N1=e0.SyntaxError,yb=_d(Ld.exec),Fd=_d("".charAt),Rb=_d("".replace),n0=_d("".indexOf),a0=_d("".slice),T1=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,ac=/a/g,PB=/a/g,Mb=new YB(ac)!==ac,wb=Vp.MISSED_STICKY,G1=Vp.UNSUPPORTED_Y,s0=kd&&(!Mb||wb||Db||bd||cy(function(){return PB[v1]=!1,YB(ac)!==ac||YB(PB)===PB||String(YB(ac,"i"))!=="/a/i"}));if(t0("RegExp",s0)){for(var JB=function(A,e){var o,n,a,I,c,u,d=gy(Ld,this),R=fb(A),k=e===void 0,_=[],Z=A;if(!d&&R&&k&&A.constructor===JB)return A;if((R||gy(Ld,A))&&(A=A.source,k&&(e=mb(Z))),A=A===void 0?"":i0(A),e=e===void 0?"":i0(e),Z=A,Db&&"dotAll"in ac&&(n=!!e&&n0(e,"s")>-1)&&(e=Rb(e,/s/g,"")),o=e,wb&&"sticky"in ac&&(a=!!e&&n0(e,"y")>-1)&&G1&&(e=Rb(e,/y/g,"")),bd&&(I=function(iA){for(var cA,TA=iA.length,JA=0,Ie="",XA=[],Ft=M1(null),ie=!1,ke=!1,Nt=0,Ut="";JA<=TA;JA++){if((cA=Fd(iA,JA))==="\\")cA+=Fd(iA,++JA);else if(cA==="]")ie=!1;else if(!ie)switch(!0){case cA==="[":ie=!0;break;case cA==="(":if(Ie+=cA,a0(iA,JA+1,JA+3)==="?:")continue;yb(T1,a0(iA,JA+1))&&(JA+=2,ke=!0),Nt++;continue;case(cA===">"&&ke):if(Ut===""||S1(Ft,Ut))throw new N1("Invalid capture group name");Ft[Ut]=!0,XA[XA.length]=[Ut,Nt],ke=!1,Ut="";continue}ke?Ut+=cA:Ie+=cA}return[Ie,XA]}(A),A=I[0],_=I[1]),c=y1(YB(A,e),d?this:Ld,JB),(n||a||_.length)&&(u=r0(c),n&&(u.dotAll=!0,u.raw=JB(function(iA){for(var cA,TA=iA.length,JA=0,Ie="",XA=!1;JA<=TA;JA++)(cA=Fd(iA,JA))!=="\\"?XA||cA!=="."?(cA==="["?XA=!0:cA==="]"&&(XA=!1),Ie+=cA):Ie+="[\\s\\S]":Ie+=cA+Fd(iA,++JA);return Ie}(A),o)),a&&(u.sticky=!0),_.length&&(u.groups=_)),A!==Z)try{R1(c,"source",Z===""?"(?:)":Z)}catch{}return c},g0=w1(YB),I0=0;g0.length>I0;)o0(JB,YB,g0[I0++]);Ld.constructor=JB,JB.prototype=Ld,Iy(e0,"RegExp",JB,{constructor:!0})}Ey("RegExp");var Ud=z,iQ=Me,HB=Mn,k1=Bb,Od=tQ,Sb=fa,vb=on.get,_1=A0,b1=pb,L1=Yo("native-string-replace",String.prototype.replace),oQ=RegExp.prototype.exec,c0=oQ,F1=iQ("".charAt),U1=iQ("".indexOf),Nb=iQ("".replace),qp=iQ("".slice),E0=function(){var A=/a/,e=/b*/g;return Ud(oQ,A,"a"),Ud(oQ,e,"a"),A.lastIndex!==0||e.lastIndex!==0}(),Tb=Od.BROKEN_CARET,l0=/()??/.exec("")[1]!==void 0;(E0||l0||Tb||_1||b1)&&(c0=function(A){var e,o,n,a,I,c,u,d=this,R=vb(d),k=HB(A),_=R.raw;if(_)return _.lastIndex=d.lastIndex,e=Ud(c0,_,k),d.lastIndex=_.lastIndex,e;var Z=R.groups,iA=Tb&&d.sticky,cA=Ud(k1,d),TA=d.source,JA=0,Ie=k;if(iA&&(cA=Nb(cA,"y",""),U1(cA,"g")===-1&&(cA+="g"),Ie=qp(k,d.lastIndex),d.lastIndex>0&&(!d.multiline||d.multiline&&F1(k,d.lastIndex-1)!==` +`)&&(TA="(?: "+TA+")",Ie=" "+Ie,JA++),o=new RegExp("^(?:"+TA+")",cA)),l0&&(o=new RegExp("^"+TA+"$(?!\\s)",cA)),E0&&(n=d.lastIndex),a=Ud(oQ,iA?o:d,Ie),iA?a?(a.input=qp(a.input,JA),a[0]=qp(a[0],JA),a.index=d.lastIndex,d.lastIndex+=a[0].length):d.lastIndex=0:E0&&a&&(d.lastIndex=d.global?a.index+a[0].length:n),l0&&a&&a.length>1&&Ud(L1,a[0],o,function(){for(I=1;I0;(n>>>=1)&&(e+=e))1&n&&(o+=e);return o},xd=no,Yd=_b(x1),uy=_b("".slice),bb=Math.ceil,C0=function(A){return function(e,o,n){var a,I,c=By(xd(e)),u=O1(o),d=c.length,R=n===void 0?" ":By(n);return u<=d||R===""?c:((I=Yd(R,bb((a=u-d)/R.length))).length>a&&(I=uy(I,0,a)),A?c+I:I+c)}},B0={start:C0(!1)},u0=/Version\/10(?:\.\d+){1,2}(?: [\w./]+)?(?: Mobile\/\w+)? Safari\//.test(Te),Y1=B0.start;wr({target:"String",proto:!0,forced:u0},{padStart:function(A){return Y1(this,A,arguments.length>1?arguments[1]:void 0)}});var Lb=z,Q0=mn,Fb=Kp,d0=m,h0=qo,P1=h0("species"),Ub=RegExp.prototype,Qy=Me,J1=ca,Pd=Mn,Jd=no,p0=Qy("".charAt),Ob=Qy("".charCodeAt),H1=Qy("".slice),xb=function(A){return function(e,o){var n,a,I=Pd(Jd(e)),c=J1(o),u=I.length;return c<0||c>=u?A?"":void 0:(n=Ob(I,c))<55296||n>56319||c+1===u||(a=Ob(I,c+1))<56320||a>57343?A?p0(I,c):n:A?H1(I,c,c+2):a-56320+(n-55296<<10)+65536}},dy={codeAt:xb(!1),charAt:xb(!0)},V1=dy.charAt,hy=Me,q1=ao,K1=Math.floor,f0=hy("".charAt),m0=hy("".replace),D0=hy("".slice),j1=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,W1=/\$([$&'`]|\d{1,2})/g,Yb=function(A,e,o,n,a,I){var c=o+A.length,u=n.length,d=W1;return a!==void 0&&(a=q1(a),d=j1),m0(I,d,function(R,k){var _;switch(f0(k,0)){case"$":return"$";case"&":return A;case"`":return D0(e,0,o);case"'":return D0(e,c);case"<":_=a[D0(k,1,-1)];break;default:var Z=+k;if(Z===0)return R;if(Z>u){var iA=K1(Z/10);return iA===0?R:iA<=u?n[iA-1]===void 0?f0(k,1):n[iA-1]+f0(k,1):R}_=n[Z-1]}return _===void 0?"":_})},Pb=z,z1=Zr,Jb=Ni,Z1=$e,Hb=Kp,X1=TypeError,$1=OC,Vb=z,py=Me,AJ=function(A,e,o,n){var a=h0(A),I=!d0(function(){var R={};return R[a]=function(){return 7},""[A](R)!==7}),c=I&&!d0(function(){var R=!1,k=/a/,_;return k.exec=function(){return R=!0,null},k[a](""),!R});if(!I||!c||o){var u=/./[a],d=e(a,""[A],function(R,k,_,Z,iA){var cA=k.exec;return cA===Fb||cA===Ub.exec?I&&!iA?{done:!0,value:Lb(u,k,_,Z)}:{done:!0,value:Lb(R,_,k,Z)}:{done:!1}});Q0(String.prototype,A,d[0]),Q0(Ub,a,d[1])}},eJ=m,tJ=Zr,qb=Ni,iJ=Ji,oJ=ca,Kb=Wr,rQ=Mn,fy=no,jb=function(A,e,o){return e+(o?V1(A,e).length:1)},Dy=An,Wb=Yb,zb=ny,rJ=function(A,e){var o=A.exec;if(Jb(o)){var n=Pb(o,A,e);return n!==null&&z1(n),n}if(Z1(A)==="RegExp")return Pb(Hb,A,e);throw new X1("RegExp#exec called on incompatible receiver")},yy=qo("replace"),y0=Math.max,nJ=Math.min,Zb=py([].concat),R0=py([].push),Ry=py("".indexOf),Xb=py("".slice),aJ=function(A){return A===void 0?A:String(A)},sJ="a".replace(/./,"$0")==="$0",$b=!!/./[yy]&&/./[yy]("a","$0")==="",gJ=!eJ(function(){var A=/./;return A.exec=function(){var e=[];return e.groups={a:"7"},e},"".replace(A,"$")!=="7"});AJ("replace",function(A,e,o){var n=$b?"$":"$0";return[function(a,I){var c=fy(this),u=iJ(a)?Dy(a,yy):void 0;return u?Vb(u,a,c,I):Vb(e,rQ(c),a,I)},function(a,I){var c=tJ(this),u=rQ(a);if(typeof I=="string"&&Ry(I,n)===-1&&Ry(I,"$<")===-1){var d=o(e,c,u,I);if(d.done)return d.value}var R=qb(I);R||(I=rQ(I));var k,_=rQ(zb(c)),Z=Ry(_,"g")!==-1;Z&&(k=Ry(_,"u")!==-1,c.lastIndex=0);for(var iA,cA=[];(iA=rJ(c,u))!==null&&(R0(cA,iA),Z);)rQ(iA[0])===""&&(c.lastIndex=jb(u,Kb(c.lastIndex),k));for(var TA="",JA=0,Ie=0;Ie=JA&&(TA+=Xb(u,JA,ie)+XA,JA=ie+Ft.length)}return TA+Xb(u,JA)}]},!gJ||!sJ||$b);var My=` +\v\f\r                 \u2028\u2029\uFEFF`,IJ=no,cJ=Mn,M0=My,w0=Me("".replace),AL=RegExp("^["+M0+"]+"),EJ=RegExp("(^|[^"+M0+"])["+M0+"]+$"),lJ=function(A){return function(e){var o=cJ(IJ(e));return 1&A&&(o=w0(o,AL,"")),2&A&&(o=w0(o,EJ,"$1")),o}},CJ={trim:lJ(3)},BJ=_s.PROPER,uJ=m,eL=My,QJ=CJ.trim;wr({target:"String",proto:!0,forced:function(A){return uJ(function(){return!!eL[A]()||"​…᠎"[A]()!=="​…᠎"||BJ&&eL[A].name!==A})}("trim")},{trim:function(){return QJ(this)}});var mI,Hd,wy,S0={exports:{}},dJ=Cn,v0=M,Wg=Q,tL=Ni,iL=Ji,Vd=po,Sy=sg,N0=Kr,T0=Bs,G0=mn,oL=dI,hJ=YA,k0=FE,nQ=q,pJ=qo,fJ=$s,_0=on.enforce,PC=Wg.Int8Array,qd=PC&&PC.prototype,rL=Wg.Uint8ClampedArray,nL=rL&&rL.prototype,Wl=PC&&k0(PC),jE=qd&&k0(qd),mJ=Object.prototype,b0=Wg.TypeError,aL=pJ("toStringTag"),L0=fJ("TYPED_ARRAY_TAG"),jp="TypedArrayConstructor",WE=dJ&&!!nQ&&Sy(Wg.opera)!=="Opera",sL=!1,VB={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},gL={BigInt64Array:8,BigUint64Array:8},vy=function(A){if(!iL(A))return!1;var e=Sy(A);return Vd(VB,e)||Vd(gL,e)};for(mI in VB)(wy=(Hd=Wg[mI])&&Hd.prototype)?_0(wy)[jp]=Hd:WE=!1;for(mI in gL)(wy=(Hd=Wg[mI])&&Hd.prototype)&&(_0(wy)[jp]=Hd);if((!WE||!tL(Wl)||Wl===Function.prototype)&&(Wl=function(){throw new b0("Incorrect invocation")},WE))for(mI in VB)Wg[mI]&&nQ(Wg[mI],Wl);if((!WE||!jE||jE===mJ)&&(jE=Wl.prototype,WE))for(mI in VB)Wg[mI]&&nQ(Wg[mI].prototype,jE);if(WE&&k0(nL)!==jE&&nQ(nL,jE),v0&&!Vd(jE,aL))for(mI in sL=!0,oL(jE,aL,{configurable:!0,get:function(){return iL(this)?this[L0]:void 0}}),VB)Wg[mI]&&T0(Wg[mI],L0,mI);var zE={NATIVE_ARRAY_BUFFER_VIEWS:WE,TYPED_ARRAY_TAG:sL&&L0,aTypedArray:function(A){if(vy(A))return A;throw new b0("Target is not a typed array")},aTypedArrayConstructor:function(A){if(tL(A)&&(!nQ||hJ(Wl,A)))return A;throw new b0(N0(A)+" is not a typed array constructor")},exportTypedArrayMethod:function(A,e,o,n){if(v0){if(o)for(var a in VB){var I=Wg[a];if(I&&Vd(I.prototype,A))try{delete I.prototype[A]}catch{try{I.prototype[A]=e}catch{}}}jE[A]&&!o||G0(jE,A,o?e:WE&&qd[A]||e,n)}},exportTypedArrayStaticMethod:function(A,e,o){var n,a;if(v0){if(nQ){if(o){for(n in VB)if((a=Wg[n])&&Vd(a,A))try{delete a[A]}catch{}}if(Wl[A]&&!o)return;try{return G0(Wl,A,o?e:WE&&Wl[A]||e)}catch{}}for(n in VB)!(a=Wg[n])||a[A]&&!o||G0(a,A,e)}},isTypedArray:vy,TypedArray:Wl,TypedArrayPrototype:jE},F0=Q,Wp=m,Ny=Nd,DJ=zE.NATIVE_ARRAY_BUFFER_VIEWS,IL=F0.ArrayBuffer,aQ=F0.Int8Array,cL=!DJ||!Wp(function(){aQ(1)})||!Wp(function(){new aQ(-1)})||!Ny(function(A){new aQ,new aQ(null),new aQ(1.5),new aQ(A)},!0)||Wp(function(){return new aQ(new IL(2),1,void 0).length!==1}),yJ=Ji,RJ=Math.floor,EL=Number.isInteger||function(A){return!yJ(A)&&isFinite(A)&&RJ(A)===A},MJ=ca,wJ=RangeError,Ty=function(A){var e=MJ(A);if(e<0)throw new wJ("The argument can't be less than 0");return e},SJ=RangeError,lL=function(A,e){var o=Ty(A);if(o%e)throw new SJ("Wrong offset");return o},vJ=Math.round,CL=sg,NJ=Mr,TJ=TypeError,Gy=function(A){var e=NJ(A,"number");if(typeof e=="number")throw new TJ("Can't convert number to bigint");return BigInt(e)},BL=jc,uL=z,GJ=a_,kJ=ao,QL=hs,dL=eQ,_J=xp,hL=GS,pL=function(A){var e=CL(A);return e==="BigInt64Array"||e==="BigUint64Array"},bJ=zE.aTypedArrayConstructor,LJ=Gy,ky=function(A){var e,o,n,a,I,c,u,d,R=GJ(this),k=kJ(A),_=arguments.length,Z=_>1?arguments[1]:void 0,iA=Z!==void 0,cA=_J(k);if(cA&&!hL(cA))for(d=(u=dL(k,cA)).next,k=[];!(c=uL(d,u)).done;)k.push(c.value);for(iA&&_>2&&(Z=BL(Z,arguments[2])),o=QL(k),n=new(bJ(R))(o),a=pL(n),e=0;o>e;e++)I=iA?Z(k[e],e):k[e],n[e]=a?LJ(I):+I;return n},U0=ia,O0=eS,FJ=Ji,UJ=qo("species"),fL=Array,OJ=function(A){var e;return U0(A)&&(e=A.constructor,(O0(e)&&(e===fL||U0(e.prototype))||FJ(e)&&(e=e[UJ])===null)&&(e=void 0)),e===void 0?fL:e},mL=jc,xJ=ai,YJ=ao,DL=hs,PJ=function(A,e){return new(OJ(A))(e===0?0:e)},x0=Me([].push),yL=function(A){var e=A===1,o=A===2,n=A===3,a=A===4,I=A===6,c=A===7,u=A===5||I;return function(d,R,k,_){for(var Z,iA,cA=YJ(d),TA=xJ(cA),JA=DL(TA),Ie=mL(R,k),XA=0,Ft=_||PJ,ie=e?Ft(d,JA):o||c?Ft(d,0):void 0;JA>XA;XA++)if((u||XA in TA)&&(iA=Ie(Z=TA[XA],XA,cA),A))if(e)ie[XA]=iA;else if(iA)switch(A){case 3:return!0;case 5:return Z;case 6:return XA;case 2:x0(ie,Z)}else switch(A){case 4:return!1;case 7:x0(ie,Z)}return I?-1:n||a?a:ie}},RL={forEach:yL(0)},JJ=hs,ML=wr,wL=Q,SL=z,vL=M,HJ=cL,zp=zE,NL=kD,TL=oc,VJ=VA,qB=Bs,qJ=EL,KJ=Wr,GL=mD,Y0=lL,kL=function(A){var e=vJ(A);return e<0?0:e>255?255:255&e},P0=P,sQ=po,jJ=sg,J0=Ji,H0=Vo,WJ=fa,V0=YA,_y=q,zJ=Lg.f,_L=ky,bL=RL.forEach,by=bD,ZJ=dI,LL=oi,FL=f,UL=function(A,e,o){for(var n=0,a=arguments.length>2?o:JJ(e),I=new A(a);a>n;)I[n]=e[n++];return I},XJ=Uw,q0=on.get,$J=on.set,gQ=on.enforce,OL=LL.f,AH=FL.f,K0=wL.RangeError,xL=NL.ArrayBuffer,eH=xL.prototype,tH=NL.DataView,Kd=zp.NATIVE_ARRAY_BUFFER_VIEWS,YL=zp.TYPED_ARRAY_TAG,PL=zp.TypedArray,Zp=zp.TypedArrayPrototype,Xp=zp.isTypedArray,IQ="BYTES_PER_ELEMENT",Ly="Wrong length",Fy=function(A,e){ZJ(A,e,{configurable:!0,get:function(){return q0(this)[e]}})},JL=function(A){var e;return V0(eH,A)||(e=jJ(A))==="ArrayBuffer"||e==="SharedArrayBuffer"},j0=function(A,e){return Xp(A)&&!H0(e)&&e in A&&qJ(+e)&&e>=0},Uy=function(A,e){return e=P0(e),j0(A,e)?VJ(2,A[e]):AH(A,e)},HL=function(A,e,o){return e=P0(e),!(j0(A,e)&&J0(o)&&sQ(o,"value"))||sQ(o,"get")||sQ(o,"set")||o.configurable||sQ(o,"writable")&&!o.writable||sQ(o,"enumerable")&&!o.enumerable?OL(A,e,o):(A[e]=o.value,A)};vL?(Kd||(FL.f=Uy,LL.f=HL,Fy(Zp,"buffer"),Fy(Zp,"byteOffset"),Fy(Zp,"byteLength"),Fy(Zp,"length")),ML({target:"Object",stat:!0,forced:!Kd},{getOwnPropertyDescriptor:Uy,defineProperty:HL}),S0.exports=function(A,e,o){var n=A.match(/\d+/)[0]/8,a=A+(o?"Clamped":"")+"Array",I="get"+A,c="set"+A,u=wL[a],d=u,R=d&&d.prototype,k={},_=function(iA,cA){OL(iA,cA,{get:function(){return function(TA,JA){var Ie=q0(TA);return Ie.view[I](JA*n+Ie.byteOffset,!0)}(this,cA)},set:function(TA){return function(JA,Ie,XA){var Ft=q0(JA);Ft.view[c](Ie*n+Ft.byteOffset,o?kL(XA):XA,!0)}(this,cA,TA)},enumerable:!0})};Kd?HJ&&(d=e(function(iA,cA,TA,JA){return TL(iA,R),XJ(J0(cA)?JL(cA)?JA!==void 0?new u(cA,Y0(TA,n),JA):TA!==void 0?new u(cA,Y0(TA,n)):new u(cA):Xp(cA)?UL(d,cA):SL(_L,d,cA):new u(GL(cA)),iA,d)}),_y&&_y(d,PL),bL(zJ(u),function(iA){iA in d||qB(d,iA,u[iA])}),d.prototype=R):(d=e(function(iA,cA,TA,JA){TL(iA,R);var Ie,XA,Ft,ie=0,ke=0;if(J0(cA)){if(!JL(cA))return Xp(cA)?UL(d,cA):SL(_L,d,cA);Ie=cA,ke=Y0(TA,n);var Nt=cA.byteLength;if(JA===void 0){if(Nt%n)throw new K0(Ly);if((XA=Nt-ke)<0)throw new K0(Ly)}else if((XA=KJ(JA)*n)+ke>Nt)throw new K0(Ly);Ft=XA/n}else Ft=GL(cA),Ie=new xL(XA=Ft*n);for($J(iA,{buffer:Ie,byteOffset:ke,byteLength:XA,length:Ft,view:new tH(Ie)});ie1?arguments[1]:void 0,e>2?arguments[2]:void 0)},W0(function(){var A=0;return new Int8Array(2).fill({valueOf:function(){return A++}}),A!==1})),(0,zE.exportTypedArrayStaticMethod)("from",ky,cL);var KL=Q,jL=z,Z0=zE,WL=hs,sH=lL,gH=ao,zL=m,IH=KL.RangeError,X0=KL.Int8Array,$0=X0&&X0.prototype,Av=$0&&$0.set,ev=Z0.aTypedArray,ZL=Z0.exportTypedArrayMethod,Oy=!zL(function(){var A=new Uint8ClampedArray(2);return jL(Av,A,{length:1,0:3},1),A[1]!==3}),XL=Oy&&Z0.NATIVE_ARRAY_BUFFER_VIEWS&&zL(function(){var A=new X0(2);return A.set(1),A.set("2",1),A[0]!==0||A[1]!==2});ZL("set",function(A){ev(this);var e=sH(arguments.length>1?arguments[1]:void 0,1),o=gH(A);if(Oy)return jL(Av,this,o,e);var n=this.length,a=WL(o),I=0;if(a+e>n)throw new IH("Wrong length");for(;I0&&1/n<0?1:-1:o>n}}(A))},!xy||sv);var AF=wr,gv=z,Af=Me,Iv=no,cv=Ni,lH=Ji,eF=KS,ef=Mn,CH=An,tf=ny,tF=Yb,BH=qo("replace"),iF=TypeError,ZE=Af("".indexOf);Af("".replace);var of=Af("".slice),uH=Math.max;AF({target:"String",proto:!0},{replaceAll:function(A,e){var o,n,a,I,c,u,d,R,k,_=Iv(this),Z=0,iA="";if(lH(A)){if(eF(A)&&(o=ef(Iv(tf(A))),!~ZE(o,"g")))throw new iF("`.replaceAll` does not allow non-global regexes");if(n=CH(A,BH))return gv(n,A,_,e)}for(a=ef(_),I=ef(A),(c=cv(e))||(e=ef(e)),u=I.length,d=uH(1,u),R=ZE(a,I);R!==-1;)k=c?ef(e(I,R,a)):tF(I,a,R,[],void 0,e),iA+=of(a,Z,R)+k,Z=R+u,R=R+d>a.length?-1:ZE(a,I,R+d);return Z1?arguments[1]:void 0)},rF=Q,nF=Ev,hH=lv,Py=dH,pH=Bs,aF=function(A){if(A&&A.forEach!==Py)try{pH(A,"forEach",Py)}catch{A.forEach=Py}};for(var Cv in nF)nF[Cv]&&aF(rF[Cv]&&rF[Cv].prototype);aF(hH);var Jy=Q,sF=Ev,fH=lv,rf=si,nf=Bs,mH=Rs,Bv=qo("iterator"),uv=rf.values,gF=function(A,e){if(A){if(A[Bv]!==uv)try{nf(A,Bv,uv)}catch{A[Bv]=uv}if(mH(A,e,!0),sF[e]){for(var o in rf)if(A[o]!==rf[o])try{nf(A,o,rf[o])}catch{A[o]=rf[o]}}}};for(var Qv in sF)gF(Jy[Qv]&&Jy[Qv].prototype,Qv);gF(fH,"DOMTokenList");var dv=JD.clear;wr({global:!0,bind:!0,enumerable:!0,forced:Q.clearImmediate!==dv},{clearImmediate:dv});var af=Q,DH=OC,yH=Ni,RH=_n,MH=Te,wH=UA,SH=xD,hv=af.Function,vH=/MSIE .\./.test(MH)||RH==="BUN"&&function(){var A=af.Bun.version.split(".");return A.length<3||A[0]==="0"&&(A[1]<3||A[1]==="3"&&A[2]==="0")}(),IF=wr,cF=Q,Hy=JD.set,NH=function(A,e){var o=1;return vH?function(n,a){var I=SH(arguments.length,1)>o,c=yH(n)?n:hv(n),u=I?wH(arguments,o):[],d=I?function(){DH(c,this,u)}:c;return A(d)}:A},pv=cF.setImmediate?NH(Hy):Hy;IF({global:!0,bind:!0,enumerable:!0,forced:cF.setImmediate!==pv},{setImmediate:pv});var JC=dy.charAt,TH=Mn,Vy=on,GH=xA,EF=Qe,lF="String Iterator",kH=Vy.set,CF=Vy.getterFor(lF);GH(String,"String",function(A){kH(this,{type:lF,string:TH(A),index:0})},function(){var A,e=CF(this),o=e.string,n=e.index;return n>=o.length?EF(void 0,!0):(A=JC(o,n),e.index+=A.length,EF(A,!1))});var _H=m,bH=M,LH=qo("iterator"),BF=!_H(function(){var A=new URL("b?a=1&b=2&c=3","https://a"),e=A.searchParams,o=new URLSearchParams("a=1&a=2&b=3"),n="";return A.pathname="c%20d",e.forEach(function(a,I){e.delete("b"),n+=I+a}),o.delete("a",2),o.delete("b",void 0),!e.size&&!bH||!e.sort||A.href!=="https://a/c%20d?a=1&c=3"||e.get("c")!=="3"||String(new URLSearchParams("?a=1"))!=="a=1"||!e[LH]||new URL("https://a@b").username!=="a"||new URLSearchParams(new URLSearchParams("a=b")).get("a")!=="b"||new URL("https://тест").host!=="xn--e1aybc"||new URL("https://a#б").hash!=="#%D0%B1"||n!=="a1c3"||new URL("https://x",void 0).host!=="x"}),uF=M,FH=Me,fv=z,mv=m,Dv=pI,UH=Ug,OH=sA,xH=ao,QF=ai,cQ=Object.assign,dF=Object.defineProperty,hF=FH([].concat),YH=!cQ||mv(function(){if(uF&&cQ({b:1},cQ(dF({},"a",{enumerable:!0,get:function(){dF(this,"b",{value:3,enumerable:!1})}}),{b:2})).b!==1)return!0;var A={},e={},o=Symbol("assign detection"),n="abcdefghijklmnopqrst";return A[o]=7,n.split("").forEach(function(a){e[a]=a}),cQ({},A)[o]!==7||Dv(cQ({},e)).join("")!==n})?function(A,e){for(var o=xH(A),n=arguments.length,a=1,I=UH.f,c=OH.f;n>a;)for(var u,d=QF(arguments[a++]),R=I?hF(Dv(d),I(d)):Dv(d),k=R.length,_=0;k>_;)u=R[_++],uF&&!fv(c,d,u)||(o[u]=d[u]);return o}:cQ,PH=Zr,JH=Ab,HH=M,VH=oi,pF=VA,qH=jc,sf=z,fF=ao,mF=function(A,e,o,n){try{return n?e(PH(o)[0],o[1]):e(o)}catch(a){JH(A,"throw",a)}},yv=GS,KH=eS,jH=hs,gf=function(A,e,o){HH?VH.f(A,e,pF(0,o)):A[e]=o},Rv=eQ,WH=xp,DF=Array,KB=Me,Mv=2147483647,yF=/[^\0-\u007E]/,wv=/[.\u3002\uFF0E\uFF61]/g,RF="Overflow: input needs wider integers to process",MF=RangeError,zH=KB(wv.exec),jB=Math.floor,qy=String.fromCharCode,Ky=KB("".charCodeAt),sc=KB([].join),WB=KB([].push),Pn=KB("".replace),wF=KB("".split),ZH=KB("".toLowerCase),SF=function(A){return A+22+75*(A<26)},Sv=function(A,e,o){var n=0;for(A=o?jB(A/700):A>>1,A+=jB(A/e);A>455;)A=jB(A/35),n+=36;return jB(n+36*A/(A+38))},XH=function(A){var e=[];A=function(Ie){for(var XA=[],Ft=0,ie=Ie.length;Ft=55296&&ke<=56319&&Ft=I&&njB((Mv-c)/_))throw new MF(RF);for(c+=(k-I)*_,I=k,o=0;oMv)throw new MF(RF);if(n===I){for(var Z=c,iA=36;;){var cA=iA<=u?1:iA>=u+26?26:iA-u;if(Za;){if(e=+arguments[a++],$H(e,1114111)!==e)throw new AV(e+" is not a valid code point");o[a]=e<65536?HC(e):HC(55296+((e-=65536)>>10),e%1024+56320)}return cf(o,"")}});var EQ=wr,Zd=Q,lQ=y_,vv=MA,To=z,gc=Me,Xd=M,Nv=BF,NF=mn,eV=dI,tV=JE,iV=Rs,oV=bB,Ef=on,TF=oc,Tv=Ni,rV=po,nV=jc,aV=sg,sV=Zr,GF=Ji,Bg=Mn,gV=fa,kF=VA,_F=eQ,IV=xp,jy=Qe,$d=xD,cV=He,EV=qo("iterator"),CQ="URLSearchParams",Gv=CQ+"Iterator",bF=Ef.set,Ps=Ef.getterFor(CQ),VC=Ef.getterFor(Gv),LF=lQ("fetch"),Ah=lQ("Request"),lf=lQ("Headers"),kv=Ah&&Ah.prototype,FF=lf&&lf.prototype,UF=Zd.TypeError,lV=Zd.encodeURIComponent,CV=String.fromCharCode,BV=vv("String","fromCodePoint"),uV=parseInt,Wy=gc("".charAt),zy=gc([].join),qC=gc([].push),OF=gc("".replace),QV=gc([].shift),xF=gc([].splice),YF=gc("".split),PF=gc("".slice),_v=gc(/./.exec),JF=/\+/g,dV=/^[0-9a-f]+$/i,HF=function(A,e){var o=PF(A,e,e+2);return _v(dV,o)?uV(o,16):NaN},hV=function(A){for(var e=0,o=128;o>0&&A&o;o>>=1)e++;return e},pV=function(A){var e=null;switch(A.length){case 1:e=A[0];break;case 2:e=(31&A[0])<<6|63&A[1];break;case 3:e=(15&A[0])<<12|(63&A[1])<<6|63&A[2];break;case 4:e=(7&A[0])<<18|(63&A[1])<<12|(63&A[2])<<6|63&A[3]}return e>1114111?null:e},VF=function(A){for(var e=(A=OF(A,JF," ")).length,o="",n=0;ne){o+="%",n++;continue}var I=HF(A,n+1);if(I!=I){o+=a,n++;continue}n+=2;var c=hV(I);if(c===0)a=CV(I);else{if(c===1||c>4){o+="�",n++;continue}for(var u=[I],d=1;de||Wy(A,n)!=="%");){var R=HF(A,n+1);if(R!=R){n+=3;break}if(R>191||R<128)break;qC(u,R),n+=2,d++}if(u.length!==c){o+="�";continue}var k=pV(u);k===null?o+="�":a=BV(k)}}o+=a,n++}return o},fV=/[!'()~]|%20/g,mV={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},DV=function(A){return mV[A]},qF=function(A){return OF(lV(A),fV,DV)},bv=oV(function(A,e){bF(this,{type:Gv,target:Ps(A).entries,index:0,kind:e})},CQ,function(){var A=VC(this),e=A.target,o=A.index++;if(!e||o>=e.length)return A.target=null,jy(void 0,!0);var n=e[o];switch(A.kind){case"keys":return jy(n.key,!1);case"values":return jy(n.value,!1)}return jy([n.key,n.value],!1)},!0),KF=function(A){this.entries=[],this.url=null,A!==void 0&&(GF(A)?this.parseObject(A):this.parseQuery(typeof A=="string"?Wy(A,0)==="?"?PF(A,1):A:Bg(A)))};KF.prototype={type:CQ,bindURL:function(A){this.url=A,this.update()},parseObject:function(A){var e,o,n,a,I,c,u,d=this.entries,R=IV(A);if(R)for(o=(e=_F(A,R)).next;!(n=To(o,e)).done;){if(I=(a=_F(sV(n.value))).next,(c=To(I,a)).done||(u=To(I,a)).done||!To(I,a).done)throw new UF("Expected sequence with length 2");qC(d,{key:Bg(c.value),value:Bg(u.value)})}else for(var k in A)rV(A,k)&&qC(d,{key:k,value:Bg(A[k])})},parseQuery:function(A){if(A)for(var e,o,n=this.entries,a=YF(A,"&"),I=0;I0?arguments[0]:void 0));Xd||(this.size=A.entries.length)},BQ=eh.prototype;if(tV(BQ,{append:function(A,e){var o=Ps(this);$d(arguments.length,2),qC(o.entries,{key:Bg(A),value:Bg(e)}),Xd||this.size++,o.updateURL()},delete:function(A){for(var e=Ps(this),o=$d(arguments.length,1),n=e.entries,a=Bg(A),I=o<2?void 0:arguments[1],c=I===void 0?I:Bg(I),u=0;uo.key?1:-1}),A.updateURL()},forEach:function(A){for(var e,o=Ps(this).entries,n=nV(A,arguments.length>1?arguments[1]:void 0),a=0;a1?jF(arguments[1]):{})}}),Tv(Ah)){var Fv=function(A){return TF(this,kv),new Ah(A,arguments.length>1?jF(arguments[1]):{})};kv.constructor=Fv,Fv.prototype=kv,EQ({global:!0,constructor:!0,dontCallGetSet:!0,forced:!0},{Request:Fv})}}var Ic,RV=wr,Uv=M,WF=BF,Ov=Q,zF=jc,Wc=Me,Zy=mn,zc=dI,MV=oc,xv=po,Yv=YH,zB=function(A){var e=fF(A),o=KH(this),n=arguments.length,a=n>1?arguments[1]:void 0,I=a!==void 0;I&&(a=qH(a,n>2?arguments[2]:void 0));var c,u,d,R,k,_,Z=WH(e),iA=0;if(!Z||this===DF&&yv(Z))for(c=jH(e),u=o?new this(c):DF(c);c>iA;iA++)_=I?a(e[iA],iA):e[iA],gf(u,iA,_);else for(u=o?new this:[],k=(R=Rv(e,Z)).next;!(d=sf(k,R)).done;iA++)_=I?mF(R,a,[d.value,iA],!0):d.value,gf(u,iA,_);return u.length=iA,u},XE=UA,Pv=dy.codeAt,wV=function(A){var e,o,n=[],a=wF(Pn(ZH(A),wv,"."),".");for(e=0;e?@[\\\]^|]/,LV=/[\0\t\n\r #/:<>?@[\\\]^|]/,FV=/^[\u0000-\u0020]+/,UV=/(^|[^\u0000-\u0020])[\u0000-\u0020]+$/,OV=/[\t\n\r]/g,oh=function(A){var e,o,n,a;if(typeof A=="number"){for(e=[],o=0;o<4;o++)kV(e,A%256),A=jC(A/256);return Cf(e,".")}if(typeof A=="object"){for(e="",n=function(I){for(var c=null,u=1,d=null,R=0,k=0;k<8;k++)I[k]!==0?(R>u&&(c=d,u=R),d=null,R=0):(d===null&&(d=k),++R);return R>u?d:c}(A),o=0;o<8;o++)a&&A[o]===0||(a&&(a=!1),n===o?(e+=o?":":"::",a=!0):(e+=GV(A[o],16),o<7&&(e+=":")));return"["+e+"]"}return A},rh={},oU=Yv({},rh,{" ":1,'"':1,"<":1,">":1,"`":1}),jv=Yv({},oU,{"#":1,"?":1,"{":1,"}":1}),XB=Yv({},jv,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Al=function(A,e){var o=Pv(A,0);return o>32&&o<127&&!xv(e,A)?A:encodeURIComponent(A)},WC={ftp:21,file:null,http:80,https:443,ws:80,wss:443},nh=function(A,e){var o;return A.length===2&&$E(Bf,Zc(A,0))&&((o=Zc(A,1))===":"||!e&&o==="|")},Wv=function(A){var e;return A.length>1&&nh(uQ(A,0,2))&&(A.length===2||(e=Zc(A,2))==="/"||e==="\\"||e==="?"||e==="#")},uf=function(A){return A==="."||tR(A)==="%2e"},rU=function(A){return(A=tR(A))===".."||A==="%2e."||A===".%2e"||A==="%2e%2e"},cc={},DI={},$B={},zl={},Au={},rR={},nU={},Qf={},nR={},aR={},sR={},gR={},IR={},cR={},zv={},ER={},ah={},Zl={},df={},yI={},ug={},lR=function(A,e,o){var n,a,I,c=KC(A);if(e){if(a=this.parse(c))throw new Hv(a);this.searchParams=null}else{if(o!==void 0&&(n=new lR(o,!0)),a=this.parse(c,null,n))throw new Hv(a);(I=TV(new NV)).bindURL(this),this.searchParams=I}};lR.prototype={type:"URL",parse:function(A,e,o){var n,a,I,c,u=this,d=e||cc,R=0,k="",_=!1,Z=!1,iA=!1;for(A=KC(A),e||(u.scheme="",u.username="",u.password="",u.host=null,u.port=null,u.path=[],u.query=null,u.fragment=null,u.cannotBeABaseURL=!1,A=AR(A,FV,""),A=AR(A,UV,"$1")),A=AR(A,OV,""),n=zB(A);R<=n.length;){switch(a=n[R],d){case cc:if(!a||!$E(Bf,a)){if(e)return qv;d=$B;continue}k+=tR(a),d=DI;break;case DI:if(a&&($E(_V,a)||a==="+"||a==="-"||a==="."))k+=tR(a);else{if(a!==":"){if(e)return qv;k="",d=$B,R=0;continue}if(e&&(u.isSpecial()!==xv(WC,k)||k==="file"&&(u.includesCredentials()||u.port!==null)||u.scheme==="file"&&!u.host))return;if(u.scheme=k,e)return void(u.isSpecial()&&WC[u.scheme]===u.port&&(u.port=null));k="",u.scheme==="file"?d=cR:u.isSpecial()&&o&&o.scheme===u.scheme?d=zl:u.isSpecial()?d=Qf:n[R+1]==="/"?(d=Au,R++):(u.cannotBeABaseURL=!0,ih(u.path,""),d=df)}break;case $B:if(!o||o.cannotBeABaseURL&&a!=="#")return qv;if(o.cannotBeABaseURL&&a==="#"){u.scheme=o.scheme,u.path=XE(o.path),u.query=o.query,u.fragment="",u.cannotBeABaseURL=!0,d=ug;break}d=o.scheme==="file"?cR:rR;continue;case zl:if(a!=="/"||n[R+1]!=="/"){d=rR;continue}d=nR,R++;break;case Au:if(a==="/"){d=aR;break}d=Zl;continue;case rR:if(u.scheme=o.scheme,a===Ic)u.username=o.username,u.password=o.password,u.host=o.host,u.port=o.port,u.path=XE(o.path),u.query=o.query;else if(a==="/"||a==="\\"&&u.isSpecial())d=nU;else if(a==="?")u.username=o.username,u.password=o.password,u.host=o.host,u.port=o.port,u.path=XE(o.path),u.query="",d=yI;else{if(a!=="#"){u.username=o.username,u.password=o.password,u.host=o.host,u.port=o.port,u.path=XE(o.path),u.path.length--,d=Zl;continue}u.username=o.username,u.password=o.password,u.host=o.host,u.port=o.port,u.path=XE(o.path),u.query=o.query,u.fragment="",d=ug}break;case nU:if(!u.isSpecial()||a!=="/"&&a!=="\\"){if(a!=="/"){u.username=o.username,u.password=o.password,u.host=o.host,u.port=o.port,d=Zl;continue}d=aR}else d=nR;break;case Qf:if(d=nR,a!=="/"||Zc(k,R+1)!=="/")continue;R++;break;case nR:if(a!=="/"&&a!=="\\"){d=aR;continue}break;case aR:if(a==="@"){_&&(k="%40"+k),_=!0,I=zB(k);for(var cA=0;cA65535)return iR;u.port=u.isSpecial()&&Ie===WC[u.scheme]?null:Ie,k=""}if(e)return;d=ah;continue}return iR}k+=a;break;case cR:if(u.scheme="file",a==="/"||a==="\\")d=zv;else{if(!o||o.scheme!=="file"){d=Zl;continue}switch(a){case Ic:u.host=o.host,u.path=XE(o.path),u.query=o.query;break;case"?":u.host=o.host,u.path=XE(o.path),u.query="",d=yI;break;case"#":u.host=o.host,u.path=XE(o.path),u.query=o.query,u.fragment="",d=ug;break;default:Wv(Cf(XE(n,R),""))||(u.host=o.host,u.path=XE(o.path),u.shortenPath()),d=Zl;continue}}break;case zv:if(a==="/"||a==="\\"){d=ER;break}o&&o.scheme==="file"&&!Wv(Cf(XE(n,R),""))&&(nh(o.path[0],!0)?ih(u.path,o.path[0]):u.host=o.host),d=Zl;continue;case ER:if(a===Ic||a==="/"||a==="\\"||a==="?"||a==="#"){if(!e&&nh(k))d=Zl;else if(k===""){if(u.host="",e)return;d=ah}else{if(c=u.parseHost(k))return c;if(u.host==="localhost"&&(u.host=""),e)return;k="",d=ah}continue}k+=a;break;case ah:if(u.isSpecial()){if(d=Zl,a!=="/"&&a!=="\\")continue}else if(e||a!=="?")if(e||a!=="#"){if(a!==Ic&&(d=Zl,a!=="/"))continue}else u.fragment="",d=ug;else u.query="",d=yI;break;case Zl:if(a===Ic||a==="/"||a==="\\"&&u.isSpecial()||!e&&(a==="?"||a==="#")){if(rU(k)?(u.shortenPath(),a==="/"||a==="\\"&&u.isSpecial()||ih(u.path,"")):uf(k)?a==="/"||a==="\\"&&u.isSpecial()||ih(u.path,""):(u.scheme==="file"&&!u.path.length&&nh(k)&&(u.host&&(u.host=""),k=Zc(k,0)+":"),ih(u.path,k)),k="",u.scheme==="file"&&(a===Ic||a==="?"||a==="#"))for(;u.path.length>1&&u.path[0]==="";)eR(u.path);a==="?"?(u.query="",d=yI):a==="#"&&(u.fragment="",d=ug)}else k+=Al(a,jv);break;case df:a==="?"?(u.query="",d=yI):a==="#"?(u.fragment="",d=ug):a!==Ic&&(u.path[0]+=Al(a,rh));break;case yI:e||a!=="#"?a!==Ic&&(a==="'"&&u.isSpecial()?u.query+="%27":u.query+=a==="#"?"%23":Al(a,rh)):(u.fragment="",d=ug);break;case ug:a!==Ic&&(u.fragment+=Al(a,oU))}R++}},parseHost:function(A){var e,o,n;if(Zc(A,0)==="["){if(Zc(A,A.length-1)!=="]"||(e=function(a){var I,c,u,d,R,k,_,Z=[0,0,0,0,0,0,0,0],iA=0,cA=null,TA=0,JA=function(){return Zc(a,TA)};if(JA()===":"){if(Zc(a,1)!==":")return;TA+=2,cA=++iA}for(;JA();){if(iA===8)return;if(JA()!==":"){for(I=c=0;c<4&&$E(tU,JA());)I=16*I+$y(JA(),16),TA++,c++;if(JA()==="."){if(c===0||(TA-=c,iA>6))return;for(u=0;JA();){if(d=null,u>0){if(!(JA()==="."&&u<4))return;TA++}if(!$E(Kv,JA()))return;for(;$E(Kv,JA());){if(R=$y(JA(),10),d===null)d=R;else{if(d===0)return;d=10*d+R}if(d>255)return;TA++}Z[iA]=256*Z[iA]+d,++u!==2&&u!==4||iA++}if(u!==4)return;break}if(JA()===":"){if(TA++,!JA())return}else if(JA())return;Z[iA++]=I}else{if(cA!==null)return;TA++,cA=++iA}}if(cA!==null)for(k=iA-cA,iA=7;iA!==0&&k>0;)_=Z[iA],Z[iA--]=Z[cA+k-1],Z[cA+--k]=_;else if(iA!==8)return;return Z}(uQ(A,1,-1)),!e))return ZB;this.host=e}else if(this.isSpecial()){if(A=wV(A),$E(iU,A)||(e=function(a){var I,c,u,d,R,k,_,Z=Vv(a,".");if(Z.length&&Z[Z.length-1]===""&&Z.length--,(I=Z.length)>4)return a;for(c=[],u=0;u1&&Zc(d,0)==="0"&&(R=$E(oR,d)?16:8,d=uQ(d,R===8?1:2)),d==="")k=0;else{if(!$E(R===10?eU:R===8?bV:tU,d))return a;k=$y(d,R)}ih(c,k)}for(u=0;u=$F(256,5-I))return null}else if(k>255)return null;for(_=AU(c),u=0;u1?arguments[1]:void 0,n=vV(e,new lR(A,!1,o));Uv||(e.href=n.serialize(),e.origin=n.getOrigin(),e.protocol=n.getProtocol(),e.username=n.getUsername(),e.password=n.getPassword(),e.host=n.getHost(),e.hostname=n.getHostname(),e.port=n.getPort(),e.pathname=n.getPathname(),e.search=n.getSearch(),e.searchParams=n.getSearchParams(),e.hash=n.getHash())},Qg=zC.prototype,dg=function(A,e){return{get:function(){return Xy(this)[A]()},set:e&&function(o){return Xy(this)[e](o)},configurable:!0,enumerable:!0}};if(Uv&&(zc(Qg,"href",dg("serialize","setHref")),zc(Qg,"origin",dg("getOrigin")),zc(Qg,"protocol",dg("getProtocol","setProtocol")),zc(Qg,"username",dg("getUsername","setUsername")),zc(Qg,"password",dg("getPassword","setPassword")),zc(Qg,"host",dg("getHost","setHost")),zc(Qg,"hostname",dg("getHostname","setHostname")),zc(Qg,"port",dg("getPort","setPort")),zc(Qg,"pathname",dg("getPathname","setPathname")),zc(Qg,"search",dg("getSearch","setSearch")),zc(Qg,"searchParams",dg("getSearchParams")),zc(Qg,"hash",dg("getHash","setHash"))),Zy(Qg,"toJSON",function(){return Xy(this).serialize()},{enumerable:!0}),Zy(Qg,"toString",function(){return Xy(this).serialize()},{enumerable:!0}),th){var aU=th.createObjectURL,CR=th.revokeObjectURL;aU&&Zy(zC,"createObjectURL",zF(aU,th)),CR&&Zy(zC,"revokeObjectURL",zF(CR,th))}SV(zC,"URL"),RV({global:!0,constructor:!0,forced:!WF,sham:!Uv},{URL:zC});var sU=z;wr({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return sU(URL.prototype.toString,this)}});let gU=!0,BR=!0;function hf(A,e,o){const n=A.match(e);return n&&n.length>=o&&parseFloat(n[o],10)}function eu(A,e,o){if(!A.RTCPeerConnection)return;const n=A.RTCPeerConnection.prototype,a=n.addEventListener;n.addEventListener=function(c,u){if(c!==e)return a.apply(this,arguments);const d=R=>{const k=o(R);k&&(u.handleEvent?u.handleEvent(k):u(k))};return this._eventMap=this._eventMap||{},this._eventMap[e]||(this._eventMap[e]=new Map),this._eventMap[e].set(u,d),a.apply(this,[c,d])};const I=n.removeEventListener;n.removeEventListener=function(c,u){if(c!==e||!this._eventMap||!this._eventMap[e])return I.apply(this,arguments);if(!this._eventMap[e].has(u))return I.apply(this,arguments);const d=this._eventMap[e].get(u);return this._eventMap[e].delete(u),this._eventMap[e].size===0&&delete this._eventMap[e],Object.keys(this._eventMap).length===0&&delete this._eventMap,I.apply(this,[c,d])},Object.defineProperty(n,"on"+e,{get(){return this["_on"+e]},set(c){this["_on"+e]&&(this.removeEventListener(e,this["_on"+e]),delete this["_on"+e]),c&&this.addEventListener(e,this["_on"+e]=c)},enumerable:!0,configurable:!0})}function IU(A){return typeof A!="boolean"?new Error("Argument type: "+typeof A+". Please use a boolean."):(gU=A,A?"adapter.js logging disabled":"adapter.js logging enabled")}function xV(A){return typeof A!="boolean"?new Error("Argument type: "+typeof A+". Please use a boolean."):(BR=!A,"adapter.js deprecation warnings "+(A?"disabled":"enabled"))}function uR(){if(typeof window=="object"){if(gU)return;typeof console<"u"&&typeof console.log=="function"&&console.log.apply(console,arguments)}}function pf(A,e){BR&&console.warn(A+" is deprecated, please use "+e+" instead.")}function Zv(A){return Object.prototype.toString.call(A)==="[object Object]"}function Xv(A){return Zv(A)?Object.keys(A).reduce(function(e,o){const n=Zv(A[o]),a=n?Xv(A[o]):A[o],I=n&&!Object.keys(a).length;return a===void 0||I?e:Object.assign(e,{[o]:a})},{}):A}function $v(A,e,o){e&&!o.has(e.id)&&(o.set(e.id,e),Object.keys(e).forEach(n=>{n.endsWith("Id")?$v(A,A.get(e[n]),o):n.endsWith("Ids")&&e[n].forEach(a=>{$v(A,A.get(a),o)})}))}function cU(A,e,o){const n=o?"outbound-rtp":"inbound-rtp",a=new Map;if(e===null)return a;const I=[];return A.forEach(c=>{c.type==="track"&&c.trackIdentifier===e.id&&I.push(c)}),I.forEach(c=>{A.forEach(u=>{u.type===n&&u.trackId===c.id&&$v(A,u,a)})}),a}const AN=uR;function EU(A,e){const o=A&&A.navigator;if(!o.mediaDevices)return;const n=function(c){if(typeof c!="object"||c.mandatory||c.optional)return c;const u={};return Object.keys(c).forEach(d=>{if(d==="require"||d==="advanced"||d==="mediaSource")return;const R=typeof c[d]=="object"?c[d]:{ideal:c[d]};R.exact!==void 0&&typeof R.exact=="number"&&(R.min=R.max=R.exact);const k=function(_,Z){return _?_+Z.charAt(0).toUpperCase()+Z.slice(1):Z==="deviceId"?"sourceId":Z};if(R.ideal!==void 0){u.optional=u.optional||[];let _={};typeof R.ideal=="number"?(_[k("min",d)]=R.ideal,u.optional.push(_),_={},_[k("max",d)]=R.ideal,u.optional.push(_)):(_[k("",d)]=R.ideal,u.optional.push(_))}R.exact!==void 0&&typeof R.exact!="number"?(u.mandatory=u.mandatory||{},u.mandatory[k("",d)]=R.exact):["min","max"].forEach(_=>{R[_]!==void 0&&(u.mandatory=u.mandatory||{},u.mandatory[k(_,d)]=R[_])})}),c.advanced&&(u.optional=(u.optional||[]).concat(c.advanced)),u},a=function(c,u){if(e.version>=61)return u(c);if((c=JSON.parse(JSON.stringify(c)))&&typeof c.audio=="object"){const d=function(R,k,_){k in R&&!(_ in R)&&(R[_]=R[k],delete R[k])};d((c=JSON.parse(JSON.stringify(c))).audio,"autoGainControl","googAutoGainControl"),d(c.audio,"noiseSuppression","googNoiseSuppression"),c.audio=n(c.audio)}if(c&&typeof c.video=="object"){let d=c.video.facingMode;d=d&&(typeof d=="object"?d:{ideal:d});const R=e.version<66;if(d&&(d.exact==="user"||d.exact==="environment"||d.ideal==="user"||d.ideal==="environment")&&(!o.mediaDevices.getSupportedConstraints||!o.mediaDevices.getSupportedConstraints().facingMode||R)){let k;if(delete c.video.facingMode,d.exact==="environment"||d.ideal==="environment"?k=["back","rear"]:d.exact!=="user"&&d.ideal!=="user"||(k=["front"]),k)return o.mediaDevices.enumerateDevices().then(_=>{_=_.filter(iA=>iA.kind==="videoinput");let Z=_.find(iA=>k.some(cA=>iA.label.toLowerCase().includes(cA)));return!Z&&_.length&&k.includes("back")&&(Z=_[_.length-1]),Z&&(c.video.deviceId=d.exact?{exact:Z.deviceId}:{ideal:Z.deviceId}),c.video=n(c.video),AN("chrome: "+JSON.stringify(c)),u(c)})}c.video=n(c.video)}return AN("chrome: "+JSON.stringify(c)),u(c)},I=function(c){return e.version>=64?c:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[c.name]||c.name,message:c.message,constraint:c.constraint||c.constraintName,toString(){return this.name+(this.message&&": ")+this.message}}};if(o.getUserMedia=function(c,u,d){a(c,R=>{o.webkitGetUserMedia(R,u,k=>{d&&d(I(k))})})}.bind(o),o.mediaDevices.getUserMedia){const c=o.mediaDevices.getUserMedia.bind(o.mediaDevices);o.mediaDevices.getUserMedia=function(u){return a(u,d=>c(d).then(R=>{if(d.audio&&!R.getAudioTracks().length||d.video&&!R.getVideoTracks().length)throw R.getTracks().forEach(k=>{k.stop()}),new DOMException("","NotFoundError");return R},R=>Promise.reject(I(R))))}}}function lU(A){A.MediaStream=A.MediaStream||A.webkitMediaStream}function CU(A){if(typeof A=="object"&&A.RTCPeerConnection&&!("ontrack"in A.RTCPeerConnection.prototype)){Object.defineProperty(A.RTCPeerConnection.prototype,"ontrack",{get(){return this._ontrack},set(o){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=o)},enumerable:!0,configurable:!0});const e=A.RTCPeerConnection.prototype.setRemoteDescription;A.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=o=>{o.stream.addEventListener("addtrack",n=>{let a;a=A.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find(c=>c.track&&c.track.id===n.track.id):{track:n.track};const I=new Event("track");I.track=n.track,I.receiver=a,I.transceiver={receiver:a},I.streams=[o.stream],this.dispatchEvent(I)}),o.stream.getTracks().forEach(n=>{let a;a=A.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find(c=>c.track&&c.track.id===n.id):{track:n};const I=new Event("track");I.track=n,I.receiver=a,I.transceiver={receiver:a},I.streams=[o.stream],this.dispatchEvent(I)})},this.addEventListener("addstream",this._ontrackpoly)),e.apply(this,arguments)}}else eu(A,"track",e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e))}function eN(A){if(typeof A=="object"&&A.RTCPeerConnection&&!("getSenders"in A.RTCPeerConnection.prototype)&&"createDTMFSender"in A.RTCPeerConnection.prototype){const e=function(a,I){return{track:I,get dtmf(){return this._dtmf===void 0&&(I.kind==="audio"?this._dtmf=a.createDTMFSender(I):this._dtmf=null),this._dtmf},_pc:a}};if(!A.RTCPeerConnection.prototype.getSenders){A.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};const a=A.RTCPeerConnection.prototype.addTrack;A.RTCPeerConnection.prototype.addTrack=function(c,u){let d=a.apply(this,arguments);return d||(d=e(this,c),this._senders.push(d)),d};const I=A.RTCPeerConnection.prototype.removeTrack;A.RTCPeerConnection.prototype.removeTrack=function(c){I.apply(this,arguments);const u=this._senders.indexOf(c);u!==-1&&this._senders.splice(u,1)}}const o=A.RTCPeerConnection.prototype.addStream;A.RTCPeerConnection.prototype.addStream=function(a){this._senders=this._senders||[],o.apply(this,[a]),a.getTracks().forEach(I=>{this._senders.push(e(this,I))})};const n=A.RTCPeerConnection.prototype.removeStream;A.RTCPeerConnection.prototype.removeStream=function(a){this._senders=this._senders||[],n.apply(this,[a]),a.getTracks().forEach(I=>{const c=this._senders.find(u=>u.track===I);c&&this._senders.splice(this._senders.indexOf(c),1)})}}else if(typeof A=="object"&&A.RTCPeerConnection&&"getSenders"in A.RTCPeerConnection.prototype&&"createDTMFSender"in A.RTCPeerConnection.prototype&&A.RTCRtpSender&&!("dtmf"in A.RTCRtpSender.prototype)){const e=A.RTCPeerConnection.prototype.getSenders;A.RTCPeerConnection.prototype.getSenders=function(){const o=e.apply(this,[]);return o.forEach(n=>n._pc=this),o},Object.defineProperty(A.RTCRtpSender.prototype,"dtmf",{get(){return this._dtmf===void 0&&(this.track.kind==="audio"?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}}function BU(A){if(!A.RTCPeerConnection)return;const e=A.RTCPeerConnection.prototype.getStats;A.RTCPeerConnection.prototype.getStats=function(){const[o,n,a]=arguments;if(arguments.length>0&&typeof o=="function")return e.apply(this,arguments);if(e.length===0&&(arguments.length===0||typeof o!="function"))return e.apply(this,[]);const I=function(u){const d={};return u.result().forEach(R=>{const k={id:R.id,timestamp:R.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[R.type]||R.type};R.names().forEach(_=>{k[_]=R.stat(_)}),d[k.id]=k}),d},c=function(u){return new Map(Object.keys(u).map(d=>[d,u[d]]))};if(arguments.length>=2){const u=function(d){n(c(I(d)))};return e.apply(this,[u,o])}return new Promise((u,d)=>{e.apply(this,[function(R){u(c(I(R)))},d])}).then(n,a)}}function tN(A){if(!(typeof A=="object"&&A.RTCPeerConnection&&A.RTCRtpSender&&A.RTCRtpReceiver))return;if(!("getStats"in A.RTCRtpSender.prototype)){const o=A.RTCPeerConnection.prototype.getSenders;o&&(A.RTCPeerConnection.prototype.getSenders=function(){const a=o.apply(this,[]);return a.forEach(I=>I._pc=this),a});const n=A.RTCPeerConnection.prototype.addTrack;n&&(A.RTCPeerConnection.prototype.addTrack=function(){const a=n.apply(this,arguments);return a._pc=this,a}),A.RTCRtpSender.prototype.getStats=function(){const a=this;return this._pc.getStats().then(I=>cU(I,a.track,!0))}}if(!("getStats"in A.RTCRtpReceiver.prototype)){const o=A.RTCPeerConnection.prototype.getReceivers;o&&(A.RTCPeerConnection.prototype.getReceivers=function(){const n=o.apply(this,[]);return n.forEach(a=>a._pc=this),n}),eu(A,"track",n=>(n.receiver._pc=n.srcElement,n)),A.RTCRtpReceiver.prototype.getStats=function(){const n=this;return this._pc.getStats().then(a=>cU(a,n.track,!1))}}if(!("getStats"in A.RTCRtpSender.prototype)||!("getStats"in A.RTCRtpReceiver.prototype))return;const e=A.RTCPeerConnection.prototype.getStats;A.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof A.MediaStreamTrack){const o=arguments[0];let n,a,I;return this.getSenders().forEach(c=>{c.track===o&&(n?I=!0:n=c)}),this.getReceivers().forEach(c=>(c.track===o&&(a?I=!0:a=c),c.track===o)),I||n&&a?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):n?n.getStats():a?a.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return e.apply(this,arguments)}}function uU(A){A.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map(I=>this._shimmedLocalStreams[I][0])};const e=A.RTCPeerConnection.prototype.addTrack;A.RTCPeerConnection.prototype.addTrack=function(I,c){if(!c)return e.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};const u=e.apply(this,arguments);return this._shimmedLocalStreams[c.id]?this._shimmedLocalStreams[c.id].indexOf(u)===-1&&this._shimmedLocalStreams[c.id].push(u):this._shimmedLocalStreams[c.id]=[c,u],u};const o=A.RTCPeerConnection.prototype.addStream;A.RTCPeerConnection.prototype.addStream=function(I){this._shimmedLocalStreams=this._shimmedLocalStreams||{},I.getTracks().forEach(d=>{if(this.getSenders().find(R=>R.track===d))throw new DOMException("Track already exists.","InvalidAccessError")});const c=this.getSenders();o.apply(this,arguments);const u=this.getSenders().filter(d=>c.indexOf(d)===-1);this._shimmedLocalStreams[I.id]=[I].concat(u)};const n=A.RTCPeerConnection.prototype.removeStream;A.RTCPeerConnection.prototype.removeStream=function(I){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[I.id],n.apply(this,arguments)};const a=A.RTCPeerConnection.prototype.removeTrack;A.RTCPeerConnection.prototype.removeTrack=function(I){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},I&&Object.keys(this._shimmedLocalStreams).forEach(c=>{const u=this._shimmedLocalStreams[c].indexOf(I);u!==-1&&this._shimmedLocalStreams[c].splice(u,1),this._shimmedLocalStreams[c].length===1&&delete this._shimmedLocalStreams[c]}),a.apply(this,arguments)}}function QU(A,e){if(!A.RTCPeerConnection)return;if(A.RTCPeerConnection.prototype.addTrack&&e.version>=65)return uU(A);const o=A.RTCPeerConnection.prototype.getLocalStreams;A.RTCPeerConnection.prototype.getLocalStreams=function(){const d=o.apply(this);return this._reverseStreams=this._reverseStreams||{},d.map(R=>this._reverseStreams[R.id])};const n=A.RTCPeerConnection.prototype.addStream;A.RTCPeerConnection.prototype.addStream=function(d){if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},d.getTracks().forEach(R=>{if(this.getSenders().find(k=>k.track===R))throw new DOMException("Track already exists.","InvalidAccessError")}),!this._reverseStreams[d.id]){const R=new A.MediaStream(d.getTracks());this._streams[d.id]=R,this._reverseStreams[R.id]=d,d=R}n.apply(this,[d])};const a=A.RTCPeerConnection.prototype.removeStream;function I(d,R){let k=R.sdp;return Object.keys(d._reverseStreams||[]).forEach(_=>{const Z=d._reverseStreams[_],iA=d._streams[Z.id];k=k.replace(new RegExp(iA.id,"g"),Z.id)}),new RTCSessionDescription({type:R.type,sdp:k})}A.RTCPeerConnection.prototype.removeStream=function(d){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},a.apply(this,[this._streams[d.id]||d]),delete this._reverseStreams[this._streams[d.id]?this._streams[d.id].id:d.id],delete this._streams[d.id]},A.RTCPeerConnection.prototype.addTrack=function(d,R){if(this.signalingState==="closed")throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");const k=[].slice.call(arguments,1);if(k.length!==1||!k[0].getTracks().find(Z=>Z===d))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find(Z=>Z.track===d))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};const _=this._streams[R.id];if(_)_.addTrack(d),Promise.resolve().then(()=>{this.dispatchEvent(new Event("negotiationneeded"))});else{const Z=new A.MediaStream([d]);this._streams[R.id]=Z,this._reverseStreams[Z.id]=R,this.addStream(Z)}return this.getSenders().find(Z=>Z.track===d)},["createOffer","createAnswer"].forEach(function(d){const R=A.RTCPeerConnection.prototype[d],k={[d](){const _=arguments;return arguments.length&&typeof arguments[0]=="function"?R.apply(this,[Z=>{const iA=I(this,Z);_[0].apply(null,[iA])},Z=>{_[1]&&_[1].apply(null,Z)},arguments[2]]):R.apply(this,arguments).then(Z=>I(this,Z))}};A.RTCPeerConnection.prototype[d]=k[d]});const c=A.RTCPeerConnection.prototype.setLocalDescription;A.RTCPeerConnection.prototype.setLocalDescription=function(){return arguments.length&&arguments[0].type?(arguments[0]=function(d,R){let k=R.sdp;return Object.keys(d._reverseStreams||[]).forEach(_=>{const Z=d._reverseStreams[_],iA=d._streams[Z.id];k=k.replace(new RegExp(Z.id,"g"),iA.id)}),new RTCSessionDescription({type:R.type,sdp:k})}(this,arguments[0]),c.apply(this,arguments)):c.apply(this,arguments)};const u=Object.getOwnPropertyDescriptor(A.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(A.RTCPeerConnection.prototype,"localDescription",{get(){const d=u.get.apply(this);return d.type===""?d:I(this,d)}}),A.RTCPeerConnection.prototype.removeTrack=function(d){if(this.signalingState==="closed")throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!d._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(d._pc!==this)throw new DOMException("Sender was not created by this connection.","InvalidAccessError");let R;this._streams=this._streams||{},Object.keys(this._streams).forEach(k=>{this._streams[k].getTracks().find(_=>d.track===_)&&(R=this._streams[k])}),R&&(R.getTracks().length===1?this.removeStream(this._reverseStreams[R.id]):R.removeTrack(d.track),this.dispatchEvent(new Event("negotiationneeded")))}}function ff(A,e){!A.RTCPeerConnection&&A.webkitRTCPeerConnection&&(A.RTCPeerConnection=A.webkitRTCPeerConnection),A.RTCPeerConnection&&e.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(o){const n=A.RTCPeerConnection.prototype[o],a={[o](){return arguments[0]=new(o==="addIceCandidate"?A.RTCIceCandidate:A.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};A.RTCPeerConnection.prototype[o]=a[o]})}function dU(A,e){eu(A,"negotiationneeded",o=>{const n=o.target;if(!(e.version<72||n.getConfiguration&&n.getConfiguration().sdpSemantics==="plan-b")||n.signalingState==="stable")return o})}var iN=Object.freeze({__proto__:null,shimMediaStream:lU,shimOnTrack:CU,shimGetSendersWithDtmf:eN,shimGetStats:BU,shimSenderReceiverGetStats:tN,shimAddTrackRemoveTrackWithNative:uU,shimAddTrackRemoveTrack:QU,shimPeerConnection:ff,fixNegotiationNeeded:dU,shimGetUserMedia:EU,shimGetDisplayMedia:function(A,e){A.navigator.mediaDevices&&"getDisplayMedia"in A.navigator.mediaDevices||A.navigator.mediaDevices&&(typeof e=="function"?A.navigator.mediaDevices.getDisplayMedia=function(o){return e(o).then(n=>{const a=o.video&&o.video.width,I=o.video&&o.video.height,c=o.video&&o.video.frameRate;return o.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:n,maxFrameRate:c||3}},a&&(o.video.mandatory.maxWidth=a),I&&(o.video.mandatory.maxHeight=I),A.navigator.mediaDevices.getUserMedia(o)})}:console.error("shimGetDisplayMedia: getSourceId argument is not a function"))}});function hU(A,e){const o=A&&A.navigator,n=A&&A.MediaStreamTrack;if(o.getUserMedia=function(a,I,c){pf("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),o.mediaDevices.getUserMedia(a).then(I,c)},!(e.version>55&&"autoGainControl"in o.mediaDevices.getSupportedConstraints())){const a=function(c,u,d){u in c&&!(d in c)&&(c[d]=c[u],delete c[u])},I=o.mediaDevices.getUserMedia.bind(o.mediaDevices);if(o.mediaDevices.getUserMedia=function(c){return typeof c=="object"&&typeof c.audio=="object"&&(c=JSON.parse(JSON.stringify(c)),a(c.audio,"autoGainControl","mozAutoGainControl"),a(c.audio,"noiseSuppression","mozNoiseSuppression")),I(c)},n&&n.prototype.getSettings){const c=n.prototype.getSettings;n.prototype.getSettings=function(){const u=c.apply(this,arguments);return a(u,"mozAutoGainControl","autoGainControl"),a(u,"mozNoiseSuppression","noiseSuppression"),u}}if(n&&n.prototype.applyConstraints){const c=n.prototype.applyConstraints;n.prototype.applyConstraints=function(u){return this.kind==="audio"&&typeof u=="object"&&(u=JSON.parse(JSON.stringify(u)),a(u,"autoGainControl","mozAutoGainControl"),a(u,"noiseSuppression","mozNoiseSuppression")),c.apply(this,[u])}}}}function pU(A){typeof A=="object"&&A.RTCTrackEvent&&"receiver"in A.RTCTrackEvent.prototype&&!("transceiver"in A.RTCTrackEvent.prototype)&&Object.defineProperty(A.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function QR(A,e){if(typeof A!="object"||!A.RTCPeerConnection&&!A.mozRTCPeerConnection)return;!A.RTCPeerConnection&&A.mozRTCPeerConnection&&(A.RTCPeerConnection=A.mozRTCPeerConnection),e.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(a){const I=A.RTCPeerConnection.prototype[a],c={[a](){return arguments[0]=new(a==="addIceCandidate"?A.RTCIceCandidate:A.RTCSessionDescription)(arguments[0]),I.apply(this,arguments)}};A.RTCPeerConnection.prototype[a]=c[a]});const o={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},n=A.RTCPeerConnection.prototype.getStats;A.RTCPeerConnection.prototype.getStats=function(){const[a,I,c]=arguments;return n.apply(this,[a||null]).then(u=>{if(e.version<53&&!I)try{u.forEach(d=>{d.type=o[d.type]||d.type})}catch(d){if(d.name!=="TypeError")throw d;u.forEach((R,k)=>{u.set(k,Object.assign({},R,{type:o[R.type]||R.type}))})}return u}).then(I,c)}}function fU(A){if(typeof A!="object"||!A.RTCPeerConnection||!A.RTCRtpSender||A.RTCRtpSender&&"getStats"in A.RTCRtpSender.prototype)return;const e=A.RTCPeerConnection.prototype.getSenders;e&&(A.RTCPeerConnection.prototype.getSenders=function(){const n=e.apply(this,[]);return n.forEach(a=>a._pc=this),n});const o=A.RTCPeerConnection.prototype.addTrack;o&&(A.RTCPeerConnection.prototype.addTrack=function(){const n=o.apply(this,arguments);return n._pc=this,n}),A.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}function oN(A){if(typeof A!="object"||!A.RTCPeerConnection||!A.RTCRtpSender||A.RTCRtpSender&&"getStats"in A.RTCRtpReceiver.prototype)return;const e=A.RTCPeerConnection.prototype.getReceivers;e&&(A.RTCPeerConnection.prototype.getReceivers=function(){const o=e.apply(this,[]);return o.forEach(n=>n._pc=this),o}),eu(A,"track",o=>(o.receiver._pc=o.srcElement,o)),A.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}function mU(A){A.RTCPeerConnection&&!("removeStream"in A.RTCPeerConnection.prototype)&&(A.RTCPeerConnection.prototype.removeStream=function(e){pf("removeStream","removeTrack"),this.getSenders().forEach(o=>{o.track&&e.getTracks().includes(o.track)&&this.removeTrack(o)})})}function rN(A){A.DataChannel&&!A.RTCDataChannel&&(A.RTCDataChannel=A.DataChannel)}function DU(A){if(typeof A!="object"||!A.RTCPeerConnection)return;const e=A.RTCPeerConnection.prototype.addTransceiver;e&&(A.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];let o=arguments[1]&&arguments[1].sendEncodings;o===void 0&&(o=[]),o=[...o];const n=o.length>0;n&&o.forEach(I=>{if("rid"in I&&!/^[a-z0-9]{0,16}$/i.test(I.rid))throw new TypeError("Invalid RID value provided.");if("scaleResolutionDownBy"in I&&!(parseFloat(I.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in I&&!(parseFloat(I.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")});const a=e.apply(this,arguments);if(n){const{sender:I}=a,c=I.getParameters();(!("encodings"in c)||c.encodings.length===1&&Object.keys(c.encodings[0]).length===0)&&(c.encodings=o,I.sendEncodings=o,this.setParametersPromises.push(I.setParameters(c).then(()=>{delete I.sendEncodings}).catch(()=>{delete I.sendEncodings})))}return a})}function yU(A){if(typeof A!="object"||!A.RTCRtpSender)return;const e=A.RTCRtpSender.prototype.getParameters;e&&(A.RTCRtpSender.prototype.getParameters=function(){const o=e.apply(this,arguments);return"encodings"in o||(o.encodings=[].concat(this.sendEncodings||[{}])),o})}function RU(A){if(typeof A!="object"||!A.RTCPeerConnection)return;const e=A.RTCPeerConnection.prototype.createOffer;A.RTCPeerConnection.prototype.createOffer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then(()=>e.apply(this,arguments)).finally(()=>{this.setParametersPromises=[]}):e.apply(this,arguments)}}function MU(A){if(typeof A!="object"||!A.RTCPeerConnection)return;const e=A.RTCPeerConnection.prototype.createAnswer;A.RTCPeerConnection.prototype.createAnswer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then(()=>e.apply(this,arguments)).finally(()=>{this.setParametersPromises=[]}):e.apply(this,arguments)}}var wU=Object.freeze({__proto__:null,shimOnTrack:pU,shimPeerConnection:QR,shimSenderGetStats:fU,shimReceiverGetStats:oN,shimRemoveStream:mU,shimRTCDataChannel:rN,shimAddTransceiver:DU,shimGetParameters:yU,shimCreateOffer:RU,shimCreateAnswer:MU,shimGetUserMedia:hU,shimGetDisplayMedia:function(A,e){A.navigator.mediaDevices&&"getDisplayMedia"in A.navigator.mediaDevices||A.navigator.mediaDevices&&(A.navigator.mediaDevices.getDisplayMedia=function(o){if(!o||!o.video){const n=new DOMException("getDisplayMedia without video constraints is undefined");return n.name="NotFoundError",n.code=8,Promise.reject(n)}return o.video===!0?o.video={mediaSource:e}:o.video.mediaSource=e,A.navigator.mediaDevices.getUserMedia(o)})}});function SU(A){if(typeof A=="object"&&A.RTCPeerConnection){if("getLocalStreams"in A.RTCPeerConnection.prototype||(A.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in A.RTCPeerConnection.prototype)){const e=A.RTCPeerConnection.prototype.addTrack;A.RTCPeerConnection.prototype.addStream=function(o){this._localStreams||(this._localStreams=[]),this._localStreams.includes(o)||this._localStreams.push(o),o.getAudioTracks().forEach(n=>e.call(this,n,o)),o.getVideoTracks().forEach(n=>e.call(this,n,o))},A.RTCPeerConnection.prototype.addTrack=function(o,...n){return n&&n.forEach(a=>{this._localStreams?this._localStreams.includes(a)||this._localStreams.push(a):this._localStreams=[a]}),e.apply(this,arguments)}}"removeStream"in A.RTCPeerConnection.prototype||(A.RTCPeerConnection.prototype.removeStream=function(e){this._localStreams||(this._localStreams=[]);const o=this._localStreams.indexOf(e);if(o===-1)return;this._localStreams.splice(o,1);const n=e.getTracks();this.getSenders().forEach(a=>{n.includes(a.track)&&this.removeTrack(a)})})}}function vU(A){if(typeof A=="object"&&A.RTCPeerConnection&&("getRemoteStreams"in A.RTCPeerConnection.prototype||(A.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}),!("onaddstream"in A.RTCPeerConnection.prototype))){Object.defineProperty(A.RTCPeerConnection.prototype,"onaddstream",{get(){return this._onaddstream},set(o){this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=o),this.addEventListener("track",this._onaddstreampoly=n=>{n.streams.forEach(a=>{if(this._remoteStreams||(this._remoteStreams=[]),this._remoteStreams.includes(a))return;this._remoteStreams.push(a);const I=new Event("addstream");I.stream=a,this.dispatchEvent(I)})})}});const e=A.RTCPeerConnection.prototype.setRemoteDescription;A.RTCPeerConnection.prototype.setRemoteDescription=function(){const o=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(n){n.streams.forEach(a=>{if(o._remoteStreams||(o._remoteStreams=[]),o._remoteStreams.indexOf(a)>=0)return;o._remoteStreams.push(a);const I=new Event("addstream");I.stream=a,o.dispatchEvent(I)})}),e.apply(o,arguments)}}}function nN(A){if(typeof A!="object"||!A.RTCPeerConnection)return;const e=A.RTCPeerConnection.prototype,o=e.createOffer,n=e.createAnswer,a=e.setLocalDescription,I=e.setRemoteDescription,c=e.addIceCandidate;e.createOffer=function(d,R){const k=arguments.length>=2?arguments[2]:arguments[0],_=o.apply(this,[k]);return R?(_.then(d,R),Promise.resolve()):_},e.createAnswer=function(d,R){const k=arguments.length>=2?arguments[2]:arguments[0],_=n.apply(this,[k]);return R?(_.then(d,R),Promise.resolve()):_};let u=function(d,R,k){const _=a.apply(this,[d]);return k?(_.then(R,k),Promise.resolve()):_};e.setLocalDescription=u,u=function(d,R,k){const _=I.apply(this,[d]);return k?(_.then(R,k),Promise.resolve()):_},e.setRemoteDescription=u,u=function(d,R,k){const _=c.apply(this,[d]);return k?(_.then(R,k),Promise.resolve()):_},e.addIceCandidate=u}function aN(A){const e=A&&A.navigator;if(e.mediaDevices&&e.mediaDevices.getUserMedia){const o=e.mediaDevices,n=o.getUserMedia.bind(o);e.mediaDevices.getUserMedia=a=>n(NU(a))}!e.getUserMedia&&e.mediaDevices&&e.mediaDevices.getUserMedia&&(e.getUserMedia=function(o,n,a){e.mediaDevices.getUserMedia(o).then(n,a)}.bind(e))}function NU(A){return A&&A.video!==void 0?Object.assign({},A,{video:Xv(A.video)}):A}function TU(A){if(!A.RTCPeerConnection)return;const e=A.RTCPeerConnection;A.RTCPeerConnection=function(o,n){if(o&&o.iceServers){const a=[];for(let I=0;Ie.generateCertificate})}function GU(A){typeof A=="object"&&A.RTCTrackEvent&&"receiver"in A.RTCTrackEvent.prototype&&!("transceiver"in A.RTCTrackEvent.prototype)&&Object.defineProperty(A.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function dR(A){const e=A.RTCPeerConnection.prototype.createOffer;A.RTCPeerConnection.prototype.createOffer=function(o){if(o){o.offerToReceiveAudio!==void 0&&(o.offerToReceiveAudio=!!o.offerToReceiveAudio);const n=this.getTransceivers().find(I=>I.receiver.track.kind==="audio");o.offerToReceiveAudio===!1&&n?n.direction==="sendrecv"?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":n.direction==="recvonly"&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):o.offerToReceiveAudio!==!0||n||this.addTransceiver("audio",{direction:"recvonly"}),o.offerToReceiveVideo!==void 0&&(o.offerToReceiveVideo=!!o.offerToReceiveVideo);const a=this.getTransceivers().find(I=>I.receiver.track.kind==="video");o.offerToReceiveVideo===!1&&a?a.direction==="sendrecv"?a.setDirection?a.setDirection("sendonly"):a.direction="sendonly":a.direction==="recvonly"&&(a.setDirection?a.setDirection("inactive"):a.direction="inactive"):o.offerToReceiveVideo!==!0||a||this.addTransceiver("video",{direction:"recvonly"})}return e.apply(this,arguments)}}function kU(A){typeof A!="object"||A.AudioContext||(A.AudioContext=A.webkitAudioContext)}var _U=Object.freeze({__proto__:null,shimLocalStreamsAPI:SU,shimRemoteStreamsAPI:vU,shimCallbacksAPI:nN,shimGetUserMedia:aN,shimConstraints:NU,shimRTCIceServerUrls:TU,shimTrackEventTransceiver:GU,shimCreateOfferLegacy:dR,shimAudioContext:kU}),bU={exports:{}};(function(A){const e={generateIdentifier:function(){return Math.random().toString(36).substring(2,12)}};e.localCName=e.generateIdentifier(),e.splitLines=function(o){return o.trim().split(` +`).map(n=>n.trim())},e.splitSections=function(o){return o.split(` +m=`).map((n,a)=>(a>0?"m="+n:n).trim()+`\r +`)},e.getDescription=function(o){const n=e.splitSections(o);return n&&n[0]},e.getMediaSections=function(o){const n=e.splitSections(o);return n.shift(),n},e.matchPrefix=function(o,n){return e.splitLines(o).filter(a=>a.indexOf(n)===0)},e.parseCandidate=function(o){let n;n=o.indexOf("a=candidate:")===0?o.substring(12).split(" "):o.substring(10).split(" ");const a={foundation:n[0],component:{1:"rtp",2:"rtcp"}[n[1]]||n[1],protocol:n[2].toLowerCase(),priority:parseInt(n[3],10),ip:n[4],address:n[4],port:parseInt(n[5],10),type:n[7]};for(let I=8;I0?n[0].split("/")[1]:"sendrecv",uri:n[1],attributes:n.slice(2).join(" ")}},e.writeExtmap=function(o){return"a=extmap:"+(o.id||o.preferredId)+(o.direction&&o.direction!=="sendrecv"?"/"+o.direction:"")+" "+o.uri+(o.attributes?" "+o.attributes:"")+`\r +`},e.parseFmtp=function(o){const n={};let a;const I=o.substring(o.indexOf(" ")+1).split(";");for(let c=0;c{o.parameters[c]!==void 0?I.push(c+"="+o.parameters[c]):I.push(c)}),n+="a=fmtp:"+a+" "+I.join(";")+`\r +`}return n},e.parseRtcpFb=function(o){const n=o.substring(o.indexOf(" ")+1).split(" ");return{type:n.shift(),parameter:n.join(" ")}},e.writeRtcpFb=function(o){let n="",a=o.payloadType;return o.preferredPayloadType!==void 0&&(a=o.preferredPayloadType),o.rtcpFeedback&&o.rtcpFeedback.length&&o.rtcpFeedback.forEach(I=>{n+="a=rtcp-fb:"+a+" "+I.type+(I.parameter&&I.parameter.length?" "+I.parameter:"")+`\r +`}),n},e.parseSsrcMedia=function(o){const n=o.indexOf(" "),a={ssrc:parseInt(o.substring(7,n),10)},I=o.indexOf(":",n);return I>-1?(a.attribute=o.substring(n+1,I),a.value=o.substring(I+1)):a.attribute=o.substring(n+1),a},e.parseSsrcGroup=function(o){const n=o.substring(13).split(" ");return{semantics:n.shift(),ssrcs:n.map(a=>parseInt(a,10))}},e.getMid=function(o){const n=e.matchPrefix(o,"a=mid:")[0];if(n)return n.substring(6)},e.parseFingerprint=function(o){const n=o.substring(14).split(" ");return{algorithm:n[0].toLowerCase(),value:n[1].toUpperCase()}},e.getDtlsParameters=function(o,n){return{role:"auto",fingerprints:e.matchPrefix(o+n,"a=fingerprint:").map(e.parseFingerprint)}},e.writeDtlsParameters=function(o,n){let a="a=setup:"+n+`\r +`;return o.fingerprints.forEach(I=>{a+="a=fingerprint:"+I.algorithm+" "+I.value+`\r +`}),a},e.parseCryptoLine=function(o){const n=o.substring(9).split(" ");return{tag:parseInt(n[0],10),cryptoSuite:n[1],keyParams:n[2],sessionParams:n.slice(3)}},e.writeCryptoLine=function(o){return"a=crypto:"+o.tag+" "+o.cryptoSuite+" "+(typeof o.keyParams=="object"?e.writeCryptoKeyParams(o.keyParams):o.keyParams)+(o.sessionParams?" "+o.sessionParams.join(" "):"")+`\r +`},e.parseCryptoKeyParams=function(o){if(o.indexOf("inline:")!==0)return null;const n=o.substring(7).split("|");return{keyMethod:"inline",keySalt:n[0],lifeTime:n[1],mkiValue:n[2]?n[2].split(":")[0]:void 0,mkiLength:n[2]?n[2].split(":")[1]:void 0}},e.writeCryptoKeyParams=function(o){return o.keyMethod+":"+o.keySalt+(o.lifeTime?"|"+o.lifeTime:"")+(o.mkiValue&&o.mkiLength?"|"+o.mkiValue+":"+o.mkiLength:"")},e.getCryptoParameters=function(o,n){return e.matchPrefix(o+n,"a=crypto:").map(e.parseCryptoLine)},e.getIceParameters=function(o,n){const a=e.matchPrefix(o+n,"a=ice-ufrag:")[0],I=e.matchPrefix(o+n,"a=ice-pwd:")[0];return a&&I?{usernameFragment:a.substring(12),password:I.substring(10)}:null},e.writeIceParameters=function(o){let n="a=ice-ufrag:"+o.usernameFragment+`\r +a=ice-pwd:`+o.password+`\r +`;return o.iceLite&&(n+=`a=ice-lite\r +`),n},e.parseRtpParameters=function(o){const n={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},a=e.splitLines(o)[0].split(" ");n.profile=a[2];for(let c=3;c{n.headerExtensions.push(e.parseExtmap(c))});const I=e.matchPrefix(o,"a=rtcp-fb:* ").map(e.parseRtcpFb);return n.codecs.forEach(c=>{I.forEach(u=>{c.rtcpFeedback.find(d=>d.type===u.type&&d.parameter===u.parameter)||c.rtcpFeedback.push(u)})}),n},e.writeRtpDescription=function(o,n){let a="";a+="m="+o+" ",a+=n.codecs.length>0?"9":"0",a+=" "+(n.profile||"UDP/TLS/RTP/SAVPF")+" ",a+=n.codecs.map(c=>c.preferredPayloadType!==void 0?c.preferredPayloadType:c.payloadType).join(" ")+`\r +`,a+=`c=IN IP4 0.0.0.0\r +`,a+=`a=rtcp:9 IN IP4 0.0.0.0\r +`,n.codecs.forEach(c=>{a+=e.writeRtpMap(c),a+=e.writeFmtp(c),a+=e.writeRtcpFb(c)});let I=0;return n.codecs.forEach(c=>{c.maxptime>I&&(I=c.maxptime)}),I>0&&(a+="a=maxptime:"+I+`\r +`),n.headerExtensions&&n.headerExtensions.forEach(c=>{a+=e.writeExtmap(c)}),a},e.parseRtpEncodingParameters=function(o){const n=[],a=e.parseRtpParameters(o),I=a.fecMechanisms.indexOf("RED")!==-1,c=a.fecMechanisms.indexOf("ULPFEC")!==-1,u=e.matchPrefix(o,"a=ssrc:").map(Z=>e.parseSsrcMedia(Z)).filter(Z=>Z.attribute==="cname"),d=u.length>0&&u[0].ssrc;let R;const k=e.matchPrefix(o,"a=ssrc-group:FID").map(Z=>Z.substring(17).split(" ").map(iA=>parseInt(iA,10)));k.length>0&&k[0].length>1&&k[0][0]===d&&(R=k[0][1]),a.codecs.forEach(Z=>{if(Z.name.toUpperCase()==="RTX"&&Z.parameters.apt){let iA={ssrc:d,codecPayloadType:parseInt(Z.parameters.apt,10)};d&&R&&(iA.rtx={ssrc:R}),n.push(iA),I&&(iA=JSON.parse(JSON.stringify(iA)),iA.fec={ssrc:d,mechanism:c?"red+ulpfec":"red"},n.push(iA))}}),n.length===0&&d&&n.push({ssrc:d});let _=e.matchPrefix(o,"b=");return _.length&&(_=_[0].indexOf("b=TIAS:")===0?parseInt(_[0].substring(7),10):_[0].indexOf("b=AS:")===0?1e3*parseInt(_[0].substring(5),10)*.95-16e3:void 0,n.forEach(Z=>{Z.maxBitrate=_})),n},e.parseRtcpParameters=function(o){const n={},a=e.matchPrefix(o,"a=ssrc:").map(u=>e.parseSsrcMedia(u)).filter(u=>u.attribute==="cname")[0];a&&(n.cname=a.value,n.ssrc=a.ssrc);const I=e.matchPrefix(o,"a=rtcp-rsize");n.reducedSize=I.length>0,n.compound=I.length===0;const c=e.matchPrefix(o,"a=rtcp-mux");return n.mux=c.length>0,n},e.writeRtcpParameters=function(o){let n="";return o.reducedSize&&(n+=`a=rtcp-rsize\r +`),o.mux&&(n+=`a=rtcp-mux\r +`),o.ssrc!==void 0&&o.cname&&(n+="a=ssrc:"+o.ssrc+" cname:"+o.cname+`\r +`),n},e.parseMsid=function(o){let n;const a=e.matchPrefix(o,"a=msid:");if(a.length===1)return n=a[0].substring(7).split(" "),{stream:n[0],track:n[1]};const I=e.matchPrefix(o,"a=ssrc:").map(c=>e.parseSsrcMedia(c)).filter(c=>c.attribute==="msid");return I.length>0?(n=I[0].value.split(" "),{stream:n[0],track:n[1]}):void 0},e.parseSctpDescription=function(o){const n=e.parseMLine(o),a=e.matchPrefix(o,"a=max-message-size:");let I;a.length>0&&(I=parseInt(a[0].substring(19),10)),isNaN(I)&&(I=65536);const c=e.matchPrefix(o,"a=sctp-port:");if(c.length>0)return{port:parseInt(c[0].substring(12),10),protocol:n.fmt,maxMessageSize:I};const u=e.matchPrefix(o,"a=sctpmap:");if(u.length>0){const d=u[0].substring(10).split(" ");return{port:parseInt(d[0],10),protocol:d[1],maxMessageSize:I}}},e.writeSctpDescription=function(o,n){let a=[];return a=o.protocol!=="DTLS/SCTP"?["m="+o.kind+" 9 "+o.protocol+" "+n.protocol+`\r +`,`c=IN IP4 0.0.0.0\r +`,"a=sctp-port:"+n.port+`\r +`]:["m="+o.kind+" 9 "+o.protocol+" "+n.port+`\r +`,`c=IN IP4 0.0.0.0\r +`,"a=sctpmap:"+n.port+" "+n.protocol+` 65535\r +`],n.maxMessageSize!==void 0&&a.push("a=max-message-size:"+n.maxMessageSize+`\r +`),a.join("")},e.generateSessionId=function(){return Math.random().toString().substr(2,22)},e.writeSessionBoilerplate=function(o,n,a){let I;const c=n!==void 0?n:2;return I=o||e.generateSessionId(),`v=0\r +o=`+(a||"thisisadapterortc")+" "+I+" "+c+` IN IP4 127.0.0.1\r +s=-\r +t=0 0\r +`},e.getDirection=function(o,n){const a=e.splitLines(o);for(let I=0;I(o.candidate&&Object.defineProperty(o,"candidate",{value:new A.RTCIceCandidate(o.candidate),writable:"false"}),o))}function sN(A){!A.RTCIceCandidate||A.RTCIceCandidate&&"relayProtocol"in A.RTCIceCandidate.prototype||eu(A,"icecandidate",e=>{if(e.candidate){const o=el.parseCandidate(e.candidate.candidate);o.type==="relay"&&(e.candidate.relayProtocol={0:"tls",1:"tcp",2:"udp"}[o.priority>>24])}return e})}function mf(A,e){if(!A.RTCPeerConnection)return;"sctp"in A.RTCPeerConnection.prototype||Object.defineProperty(A.RTCPeerConnection.prototype,"sctp",{get(){return this._sctp===void 0?null:this._sctp}});const o=A.RTCPeerConnection.prototype.setRemoteDescription;A.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,e.browser==="chrome"&&e.version>=76){const{sdpSemantics:n}=this.getConfiguration();n==="plan-b"&&Object.defineProperty(this,"sctp",{get(){return this._sctp===void 0?null:this._sctp},enumerable:!0,configurable:!0})}if(function(n){if(!n||!n.sdp)return!1;const a=el.splitSections(n.sdp);return a.shift(),a.some(I=>{const c=el.parseMLine(I);return c&&c.kind==="application"&&c.protocol.indexOf("SCTP")!==-1})}(arguments[0])){const n=function(d){const R=d.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(R===null||R.length<2)return-1;const k=parseInt(R[1],10);return k!=k?-1:k}(arguments[0]),a=function(d){let R=65536;return e.browser==="firefox"&&(R=e.version<57?d===-1?16384:2147483637:e.version<60?e.version===57?65535:65536:2147483637),R}(n),I=function(d,R){let k=65536;e.browser==="firefox"&&e.version===57&&(k=65535);const _=el.matchPrefix(d.sdp,"a=max-message-size:");return _.length>0?k=parseInt(_[0].substring(19),10):e.browser==="firefox"&&R!==-1&&(k=2147483637),k}(arguments[0],n);let c;c=a===0&&I===0?Number.POSITIVE_INFINITY:a===0||I===0?Math.max(a,I):Math.min(a,I);const u={};Object.defineProperty(u,"maxMessageSize",{get:()=>c}),this._sctp=u}return o.apply(this,arguments)}}function pR(A){if(!A.RTCPeerConnection||!("createDataChannel"in A.RTCPeerConnection.prototype))return;function e(n,a){const I=n.send;n.send=function(){const c=arguments[0],u=c.length||c.size||c.byteLength;if(n.readyState==="open"&&a.sctp&&u>a.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+a.sctp.maxMessageSize+" bytes)");return I.apply(n,arguments)}}const o=A.RTCPeerConnection.prototype.createDataChannel;A.RTCPeerConnection.prototype.createDataChannel=function(){const n=o.apply(this,arguments);return e(n,this),n},eu(A,"datachannel",n=>(e(n.channel,n.target),n))}function gN(A){if(!A.RTCPeerConnection||"connectionState"in A.RTCPeerConnection.prototype)return;const e=A.RTCPeerConnection.prototype;Object.defineProperty(e,"connectionState",{get(){return{completed:"connected",checking:"connecting"}[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(e,"onconnectionstatechange",{get(){return this._onconnectionstatechange||null},set(o){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),o&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=o)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach(o=>{const n=e[o];e[o]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=a=>{const I=a.target;if(I._lastConnectionState!==I.connectionState){I._lastConnectionState=I.connectionState;const c=new Event("connectionstatechange",a);I.dispatchEvent(c)}return a},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),n.apply(this,arguments)}})}function fR(A,e){if(!A.RTCPeerConnection||e.browser==="chrome"&&e.version>=71||e.browser==="safari"&&e._safariVersion>=13.1)return;const o=A.RTCPeerConnection.prototype.setRemoteDescription;A.RTCPeerConnection.prototype.setRemoteDescription=function(n){if(n&&n.sdp&&n.sdp.indexOf(` +a=extmap-allow-mixed`)!==-1){const a=n.sdp.split(` +`).filter(I=>I.trim()!=="a=extmap-allow-mixed").join(` +`);A.RTCSessionDescription&&n instanceof A.RTCSessionDescription?arguments[0]=new A.RTCSessionDescription({type:n.type,sdp:a}):n.sdp=a}return o.apply(this,arguments)}}function mR(A,e){if(!A.RTCPeerConnection||!A.RTCPeerConnection.prototype)return;const o=A.RTCPeerConnection.prototype.addIceCandidate;o&&o.length!==0&&(A.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?(e.browser==="chrome"&&e.version<78||e.browser==="firefox"&&e.version<68||e.browser==="safari")&&arguments[0]&&arguments[0].candidate===""?Promise.resolve():o.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}function DR(A,e){if(!A.RTCPeerConnection||!A.RTCPeerConnection.prototype)return;const o=A.RTCPeerConnection.prototype.setLocalDescription;o&&o.length!==0&&(A.RTCPeerConnection.prototype.setLocalDescription=function(){let n=arguments[0]||{};if(typeof n!="object"||n.type&&n.sdp)return o.apply(this,arguments);if(n={type:n.type,sdp:n.sdp},!n.type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":n.type="offer";break;default:n.type="answer"}return n.sdp||n.type!=="offer"&&n.type!=="answer"?o.apply(this,[n]):(n.type==="offer"?this.createOffer:this.createAnswer).apply(this).then(a=>o.apply(this,[a]))})}var YV=Object.freeze({__proto__:null,shimRTCIceCandidate:hR,shimRTCIceCandidateRelayProtocol:sN,shimMaxMessageSize:mf,shimSendThrowTypeError:pR,shimConnectionState:gN,removeExtmapAllowMixed:fR,shimAddIceCandidateNullOrEmpty:mR,shimParameterlessSetLocalDescription:DR});(function({window:A}={},e={shimChrome:!0,shimFirefox:!0,shimSafari:!0}){const o=uR,n=function(I){const c={browser:null,version:null};if(I===void 0||!I.navigator||!I.navigator.userAgent)return c.browser="Not a browser.",c;const{navigator:u}=I;if(u.mozGetUserMedia)c.browser="firefox",c.version=parseInt(hf(u.userAgent,/Firefox\/(\d+)\./,1));else if(u.webkitGetUserMedia||I.isSecureContext===!1&&I.webkitRTCPeerConnection)c.browser="chrome",c.version=parseInt(hf(u.userAgent,/Chrom(e|ium)\/(\d+)\./,2));else{if(!I.RTCPeerConnection||!u.userAgent.match(/AppleWebKit\/(\d+)\./))return c.browser="Not a supported browser.",c;c.browser="safari",c.version=parseInt(hf(u.userAgent,/AppleWebKit\/(\d+)\./,1)),c.supportsUnifiedPlan=I.RTCRtpTransceiver&&"currentDirection"in I.RTCRtpTransceiver.prototype,c._safariVersion=hf(u.userAgent,/Version\/(\d+(\.?\d+))/,1)}return c}(A),a={browserDetails:n,commonShim:YV,extractVersion:hf,disableLog:IU,disableWarnings:xV,sdp:FU};switch(n.browser){case"chrome":if(!iN||!ff||!e.shimChrome)return o("Chrome shim is not included in this adapter release."),a;if(n.version===null)return o("Chrome shim can not determine version, not shimming."),a;o("adapter.js shimming chrome."),a.browserShim=iN,mR(A,n),DR(A),EU(A,n),lU(A),ff(A,n),CU(A),QU(A,n),eN(A),BU(A),tN(A),dU(A,n),hR(A),sN(A),gN(A),mf(A,n),pR(A),fR(A,n);break;case"firefox":if(!wU||!QR||!e.shimFirefox)return o("Firefox shim is not included in this adapter release."),a;o("adapter.js shimming firefox."),a.browserShim=wU,mR(A,n),DR(A),hU(A,n),QR(A,n),pU(A),mU(A),fU(A),oN(A),rN(A),DU(A),yU(A),RU(A),MU(A),hR(A),gN(A),mf(A,n),pR(A);break;case"safari":if(!_U||!e.shimSafari)return o("Safari shim is not included in this adapter release."),a;o("adapter.js shimming safari."),a.browserShim=_U,mR(A,n),DR(A),TU(A),dR(A),nN(A),SU(A),vU(A),GU(A),aN(A),kU(A),hR(A),sN(A),mf(A,n),pR(A),fR(A,n);break;default:o("Unsupported browser!")}})({window:typeof window>"u"?void 0:window});var Ii,UU=Object.create,Df=Object.defineProperty,PV=Object.defineProperties,yR=Object.getOwnPropertyDescriptor,yf=Object.getOwnPropertyDescriptors,JV=Object.getOwnPropertyNames,RR=Object.getOwnPropertySymbols,OU=Object.getPrototypeOf,IN=Object.prototype.hasOwnProperty,xU=Object.prototype.propertyIsEnumerable,YU=Reflect.get,Rf=Math.pow,MR=(A,e,o)=>e in A?Df(A,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):A[e]=o,bt=(A,e)=>{for(var o in e||(e={}))IN.call(e,o)&&MR(A,o,e[o]);if(RR)for(var o of RR(e))xU.call(e,o)&&MR(A,o,e[o]);return A},fi=(A,e)=>PV(A,yf(e)),PU=(A,e)=>{var o={};for(var n in A)IN.call(A,n)&&e.indexOf(n)<0&&(o[n]=A[n]);if(A!=null&&RR)for(var n of RR(A))e.indexOf(n)<0&&xU.call(A,n)&&(o[n]=A[n]);return o},ZC=(A,e)=>()=>(e||A((e={exports:{}}).exports,e),e.exports),XC=(A,e)=>{for(var o in e)Df(A,o,{get:e[o],enumerable:!0})},es=(A,e,o)=>(o=A!=null?UU(OU(A)):{},((n,a,I,c)=>{if(a&&typeof a=="object"||typeof a=="function")for(let u of JV(a))!IN.call(n,u)&&u!==I&&Df(n,u,{get:()=>a[u],enumerable:!(c=yR(a,u))||c.enumerable});return n})(!e&&A&&A.__esModule?o:Df(o,"default",{value:A,enumerable:!0}),A)),vt=(A,e,o,n)=>{for(var a,I=yR(e,o),c=A.length-1;c>=0;c--)(a=A[c])&&(I=a(e,o,I)||I);return I&&Df(e,o,I),I},G=(A,e,o)=>MR(A,typeof e!="symbol"?e+"":e,o),zg=(A,e,o)=>YU(OU(A),o,e),DA=(A,e,o)=>new Promise((n,a)=>{var I=d=>{try{u(o.next(d))}catch(R){a(R)}},c=d=>{try{u(o.throw(d))}catch(R){a(R)}},u=d=>d.done?n(d.value):Promise.resolve(d.value).then(I,c);u((o=o.apply(A,e)).next())}),hg=ZC((A,e)=>{var o=Object.prototype.hasOwnProperty,n="~";function a(){}function I(R,k,_){this.fn=R,this.context=k,this.once=_||!1}function c(R,k,_,Z,iA){if(typeof _!="function")throw new TypeError("The listener must be a function");var cA=new I(_,Z||R,iA),TA=n?n+k:k;return R._events[TA]?R._events[TA].fn?R._events[TA]=[R._events[TA],cA]:R._events[TA].push(cA):(R._events[TA]=cA,R._eventsCount++),R}function u(R,k){--R._eventsCount===0?R._events=new a:delete R._events[k]}function d(){this._events=new a,this._eventsCount=0}Object.create&&(a.prototype=Object.create(null),new a().__proto__||(n=!1)),d.prototype.eventNames=function(){var R,k,_=[];if(this._eventsCount===0)return _;for(k in R=this._events)o.call(R,k)&&_.push(n?k.slice(1):k);return Object.getOwnPropertySymbols?_.concat(Object.getOwnPropertySymbols(R)):_},d.prototype.listeners=function(R){var k=n?n+R:R,_=this._events[k];if(!_)return[];if(_.fn)return[_.fn];for(var Z=0,iA=_.length,cA=new Array(iA);Z{var o=e.exports={v:[{name:"version",reg:/^(\d*)$/}],o:[{name:"origin",reg:/^(\S*) (\d*) (\d*) (\S*) IP(\d) (\S*)/,names:["username","sessionId","sessionVersion","netType","ipVer","address"],format:"%s %s %d %s IP%d %s"}],s:[{name:"name"}],i:[{name:"description"}],u:[{name:"uri"}],e:[{name:"email"}],p:[{name:"phone"}],z:[{name:"timezones"}],r:[{name:"repeats"}],t:[{name:"timing",reg:/^(\d*) (\d*)/,names:["start","stop"],format:"%d %d"}],c:[{name:"connection",reg:/^IN IP(\d) (\S*)/,names:["version","ip"],format:"IN IP%d %s"}],b:[{push:"bandwidth",reg:/^(TIAS|AS|CT|RR|RS):(\d*)/,names:["type","limit"],format:"%s:%s"}],m:[{reg:/^(\w*) (\d*) ([\w/]*)(?: (.*))?/,names:["type","port","protocol","payloads"],format:"%s %d %s %s"}],a:[{push:"rtp",reg:/^rtpmap:(\d*) ([\w\-.]*)(?:\s*\/(\d*)(?:\s*\/(\S*))?)?/,names:["payload","codec","rate","encoding"],format:function(n){return n.encoding?"rtpmap:%d %s/%s/%s":n.rate?"rtpmap:%d %s/%s":"rtpmap:%d %s"}},{push:"fmtp",reg:/^fmtp:(\d*) ([\S| ]*)/,names:["payload","config"],format:"fmtp:%d %s"},{name:"control",reg:/^control:(.*)/,format:"control:%s"},{name:"rtcp",reg:/^rtcp:(\d*)(?: (\S*) IP(\d) (\S*))?/,names:["port","netType","ipVer","address"],format:function(n){return n.address!=null?"rtcp:%d %s IP%d %s":"rtcp:%d"}},{push:"rtcpFbTrrInt",reg:/^rtcp-fb:(\*|\d*) trr-int (\d*)/,names:["payload","value"],format:"rtcp-fb:%s trr-int %d"},{push:"rtcpFb",reg:/^rtcp-fb:(\*|\d*) ([\w-_]*)(?: ([\w-_]*))?/,names:["payload","type","subtype"],format:function(n){return n.subtype!=null?"rtcp-fb:%s %s %s":"rtcp-fb:%s %s"}},{push:"ext",reg:/^extmap:(\d+)(?:\/(\w+))?(?: (urn:ietf:params:rtp-hdrext:encrypt))? (\S*)(?: (\S*))?/,names:["value","direction","encrypt-uri","uri","config"],format:function(n){return"extmap:%d"+(n.direction?"/%s":"%v")+(n["encrypt-uri"]?" %s":"%v")+" %s"+(n.config?" %s":"")}},{name:"extmapAllowMixed",reg:/^(extmap-allow-mixed)/},{push:"crypto",reg:/^crypto:(\d*) ([\w_]*) (\S*)(?: (\S*))?/,names:["id","suite","config","sessionConfig"],format:function(n){return n.sessionConfig!=null?"crypto:%d %s %s %s":"crypto:%d %s %s"}},{name:"setup",reg:/^setup:(\w*)/,format:"setup:%s"},{name:"connectionType",reg:/^connection:(new|existing)/,format:"connection:%s"},{name:"mid",reg:/^mid:([^\s]*)/,format:"mid:%s"},{name:"msid",reg:/^msid:(.*)/,format:"msid:%s"},{name:"ptime",reg:/^ptime:(\d*(?:\.\d*)*)/,format:"ptime:%d"},{name:"maxptime",reg:/^maxptime:(\d*(?:\.\d*)*)/,format:"maxptime:%d"},{name:"direction",reg:/^(sendrecv|recvonly|sendonly|inactive)/},{name:"icelite",reg:/^(ice-lite)/},{name:"iceUfrag",reg:/^ice-ufrag:(\S*)/,format:"ice-ufrag:%s"},{name:"icePwd",reg:/^ice-pwd:(\S*)/,format:"ice-pwd:%s"},{name:"fingerprint",reg:/^fingerprint:(\S*) (\S*)/,names:["type","hash"],format:"fingerprint:%s %s"},{push:"candidates",reg:/^candidate:(\S*) (\d*) (\S*) (\d*) (\S*) (\d*) typ (\S*)(?: raddr (\S*) rport (\d*))?(?: tcptype (\S*))?(?: generation (\d*))?(?: network-id (\d*))?(?: network-cost (\d*))?/,names:["foundation","component","transport","priority","ip","port","type","raddr","rport","tcptype","generation","network-id","network-cost"],format:function(n){var a="candidate:%s %d %s %d %s %d typ %s";return a+=n.raddr!=null?" raddr %s rport %d":"%v%v",a+=n.tcptype!=null?" tcptype %s":"%v",n.generation!=null&&(a+=" generation %d"),a+=n["network-id"]!=null?" network-id %d":"%v",a+=n["network-cost"]!=null?" network-cost %d":"%v"}},{name:"endOfCandidates",reg:/^(end-of-candidates)/},{name:"remoteCandidates",reg:/^remote-candidates:(.*)/,format:"remote-candidates:%s"},{name:"iceOptions",reg:/^ice-options:(\S*)/,format:"ice-options:%s"},{push:"ssrcs",reg:/^ssrc:(\d*) ([\w_-]*)(?::(.*))?/,names:["id","attribute","value"],format:function(n){var a="ssrc:%d";return n.attribute!=null&&(a+=" %s",n.value!=null&&(a+=":%s")),a}},{push:"ssrcGroups",reg:/^ssrc-group:([\x21\x23\x24\x25\x26\x27\x2A\x2B\x2D\x2E\w]*) (.*)/,names:["semantics","ssrcs"],format:"ssrc-group:%s %s"},{name:"msidSemantic",reg:/^msid-semantic:\s?(\w*) (\S*)/,names:["semantic","token"],format:"msid-semantic: %s %s"},{push:"groups",reg:/^group:(\w*) (.*)/,names:["type","mids"],format:"group:%s %s"},{name:"rtcpMux",reg:/^(rtcp-mux)/},{name:"rtcpRsize",reg:/^(rtcp-rsize)/},{name:"sctpmap",reg:/^sctpmap:([\w_/]*) (\S*)(?: (\S*))?/,names:["sctpmapNumber","app","maxMessageSize"],format:function(n){return n.maxMessageSize!=null?"sctpmap:%s %s %s":"sctpmap:%s %s"}},{name:"xGoogleFlag",reg:/^x-google-flag:([^\s]*)/,format:"x-google-flag:%s"},{push:"rids",reg:/^rid:([\d\w]+) (\w+)(?: ([\S| ]*))?/,names:["id","direction","params"],format:function(n){return n.params?"rid:%s %s %s":"rid:%s %s"}},{push:"imageattrs",reg:new RegExp("^imageattr:(\\d+|\\*)[\\s\\t]+(send|recv)[\\s\\t]+(\\*|\\[\\S+\\](?:[\\s\\t]+\\[\\S+\\])*)(?:[\\s\\t]+(recv|send)[\\s\\t]+(\\*|\\[\\S+\\](?:[\\s\\t]+\\[\\S+\\])*))?"),names:["pt","dir1","attrs1","dir2","attrs2"],format:function(n){return"imageattr:%s %s %s"+(n.dir2?" %s %s":"")}},{name:"simulcast",reg:new RegExp("^simulcast:(send|recv) ([a-zA-Z0-9\\-_~;,]+)(?:\\s?(send|recv) ([a-zA-Z0-9\\-_~;,]+))?$"),names:["dir1","list1","dir2","list2"],format:function(n){return"simulcast:%s %s"+(n.dir2?" %s %s":"")}},{name:"simulcast_03",reg:/^simulcast:[\s\t]+([\S+\s\t]+)$/,names:["value"],format:"simulcast: %s"},{name:"framerate",reg:/^framerate:(\d+(?:$|\.\d+))/,format:"framerate:%s"},{name:"sourceFilter",reg:/^source-filter: *(excl|incl) (\S*) (IP4|IP6|\*) (\S*) (.*)/,names:["filterMode","netType","addressTypes","destAddress","srcList"],format:"source-filter: %s %s %s %s %s"},{name:"bundleOnly",reg:/^(bundle-only)/},{name:"label",reg:/^label:(.+)/,format:"label:%s"},{name:"sctpPort",reg:/^sctp-port:(\d+)$/,format:"sctp-port:%s"},{name:"maxMessageSize",reg:/^max-message-size:(\d+)$/,format:"max-message-size:%s"},{push:"tsRefClocks",reg:/^ts-refclk:([^\s=]*)(?:=(\S*))?/,names:["clksrc","clksrcExt"],format:function(n){return"ts-refclk:%s"+(n.clksrcExt!=null?"=%s":"")}},{name:"mediaClk",reg:/^mediaclk:(?:id=(\S*))? *([^\s=]*)(?:=(\S*))?(?: *rate=(\d+)\/(\d+))?/,names:["id","mediaClockName","mediaClockValue","rateNumerator","rateDenominator"],format:function(n){var a="mediaclk:";return a+=n.id!=null?"id=%s %s":"%v%s",a+=n.mediaClockValue!=null?"=%s":"",a+=n.rateNumerator!=null?" rate=%s":"",a+=n.rateDenominator!=null?"/%s":""}},{name:"keywords",reg:/^keywds:(.+)$/,format:"keywds:%s"},{name:"content",reg:/^content:(.+)/,format:"content:%s"},{name:"bfcpFloorCtrl",reg:/^floorctrl:(c-only|s-only|c-s)/,format:"floorctrl:%s"},{name:"bfcpConfId",reg:/^confid:(\d+)/,format:"confid:%s"},{name:"bfcpUserId",reg:/^userid:(\d+)/,format:"userid:%s"},{name:"bfcpFloorId",reg:/^floorid:(.+) (?:m-stream|mstrm):(.+)/,names:["id","mStream"],format:"floorid:%s mstrm:%s"},{push:"invalid",names:["value"]}]};Object.keys(o).forEach(function(n){o[n].forEach(function(a){a.reg||(a.reg=/(.*)/),a.format||(a.format="%s")})})}),sh=ZC(A=>{var e=function(c){return String(Number(c))===c?Number(c):c},o=function(c,u,d){var R=c.name&&c.names;c.push&&!u[c.push]?u[c.push]=[]:R&&!u[c.name]&&(u[c.name]={});var k=c.push?{}:R?u[c.name]:u;(function(_,Z,iA,cA){if(cA&&!iA)Z[cA]=e(_[1]);else for(var TA=0;TA1&&(c[d[0]]=void 0),c};A.parseParams=function(c){return c.split(/;\s?/).reduce(I,{})},A.parseFmtpConfig=A.parseParams,A.parsePayloads=function(c){return c.toString().split(" ").map(Number)},A.parseRemoteCandidates=function(c){for(var u=[],d=c.split(" ").map(e),R=0;R{var o=Xl(),n=/%[sdv%]/g,a=function(d){var R=1,k=arguments,_=k.length;return d.replace(n,function(Z){if(R>=_)return Z;var iA=k[R];switch(R+=1,Z){case"%%":return"%";case"%s":return String(iA);case"%d":return Number(iA);case"%v":return""}})},I=function(d,R,k){var _=[d+"="+(R.format instanceof Function?R.format(R.push?k:k[R.name]):R.format)];if(R.names)for(var Z=0;Z{var e=sh(),o=HV(),n=Xl();A.grammar=n,A.write=o,A.parse=e.parse,A.parseParams=e.parseParams,A.parseFmtpConfig=e.parseFmtpConfig,A.parsePayloads=e.parsePayloads,A.parseRemoteCandidates=e.parseRemoteCandidates,A.parseImageAttributes=e.parseImageAttributes,A.parseSimulcastStreamList=e.parseSimulcastStreamList}),Mf=ZC((A,e)=>{var o=e.exports={v:[{name:"version",reg:/^(\d*)$/}],o:[{name:"origin",reg:/^(\S*) (\d*) (\d*) (\S*) IP(\d) (\S*)/,names:["username","sessionId","sessionVersion","netType","ipVer","address"],format:"%s %s %d %s IP%d %s"}],s:[{name:"name"}],i:[{name:"description"}],u:[{name:"uri"}],e:[{name:"email"}],p:[{name:"phone"}],z:[{name:"timezones"}],r:[{name:"repeats"}],t:[{name:"timing",reg:/^(\d*) (\d*)/,names:["start","stop"],format:"%d %d"}],c:[{name:"connection",reg:/^IN IP(\d) (\S*)/,names:["version","ip"],format:"IN IP%d %s"}],b:[{push:"bandwidth",reg:/^(TIAS|AS|CT|RR|RS):(\d*)/,names:["type","limit"],format:"%s:%s"}],m:[{reg:/^(\w*) (\d*) ([\w/]*)(?: (.*))?/,names:["type","port","protocol","payloads"],format:"%s %d %s %s"}],a:[{push:"rtp",reg:/^rtpmap:(\d*) ([\w\-.]*)(?:\s*\/(\d*)(?:\s*\/(\S*))?)?/,names:["payload","codec","rate","encoding"],format:function(n){return n.encoding?"rtpmap:%d %s/%s/%s":n.rate?"rtpmap:%d %s/%s":"rtpmap:%d %s"}},{push:"fmtp",reg:/^fmtp:(\d*) ([\S| ]*)/,names:["payload","config"],format:"fmtp:%d %s"},{name:"control",reg:/^control:(.*)/,format:"control:%s"},{name:"rtcp",reg:/^rtcp:(\d*)(?: (\S*) IP(\d) (\S*))?/,names:["port","netType","ipVer","address"],format:function(n){return n.address!=null?"rtcp:%d %s IP%d %s":"rtcp:%d"}},{push:"rtcpFbTrrInt",reg:/^rtcp-fb:(\*|\d*) trr-int (\d*)/,names:["payload","value"],format:"rtcp-fb:%s trr-int %d"},{push:"rtcpFb",reg:/^rtcp-fb:(\*|\d*) ([\w-_]*)(?: ([\w-_]*))?/,names:["payload","type","subtype"],format:function(n){return n.subtype!=null?"rtcp-fb:%s %s %s":"rtcp-fb:%s %s"}},{push:"ext",reg:/^extmap:(\d+)(?:\/(\w+))?(?: (urn:ietf:params:rtp-hdrext:encrypt))? (\S*)(?: (\S*))?/,names:["value","direction","encrypt-uri","uri","config"],format:function(n){return"extmap:%d"+(n.direction?"/%s":"%v")+(n["encrypt-uri"]?" %s":"%v")+" %s"+(n.config?" %s":"")}},{name:"extmapAllowMixed",reg:/^(extmap-allow-mixed)/},{push:"crypto",reg:/^crypto:(\d*) ([\w_]*) (\S*)(?: (\S*))?/,names:["id","suite","config","sessionConfig"],format:function(n){return n.sessionConfig!=null?"crypto:%d %s %s %s":"crypto:%d %s %s"}},{name:"setup",reg:/^setup:(\w*)/,format:"setup:%s"},{name:"connectionType",reg:/^connection:(new|existing)/,format:"connection:%s"},{name:"mid",reg:/^mid:([^\s]*)/,format:"mid:%s"},{name:"msid",reg:/^msid:(.*)/,format:"msid:%s"},{name:"ptime",reg:/^ptime:(\d*(?:\.\d*)*)/,format:"ptime:%d"},{name:"maxptime",reg:/^maxptime:(\d*(?:\.\d*)*)/,format:"maxptime:%d"},{name:"direction",reg:/^(sendrecv|recvonly|sendonly|inactive)/},{name:"icelite",reg:/^(ice-lite)/},{name:"iceUfrag",reg:/^ice-ufrag:(\S*)/,format:"ice-ufrag:%s"},{name:"icePwd",reg:/^ice-pwd:(\S*)/,format:"ice-pwd:%s"},{name:"fingerprint",reg:/^fingerprint:(\S*) (\S*)/,names:["type","hash"],format:"fingerprint:%s %s"},{push:"candidates",reg:/^candidate:(\S*) (\d*) (\S*) (\d*) (\S*) (\d*) typ (\S*)(?: raddr (\S*) rport (\d*))?(?: tcptype (\S*))?(?: generation (\d*))?(?: network-id (\d*))?(?: network-cost (\d*))?/,names:["foundation","component","transport","priority","ip","port","type","raddr","rport","tcptype","generation","network-id","network-cost"],format:function(n){var a="candidate:%s %d %s %d %s %d typ %s";return a+=n.raddr!=null?" raddr %s rport %d":"%v%v",a+=n.tcptype!=null?" tcptype %s":"%v",n.generation!=null&&(a+=" generation %d"),a+=n["network-id"]!=null?" network-id %d":"%v",a+=n["network-cost"]!=null?" network-cost %d":"%v"}},{name:"endOfCandidates",reg:/^(end-of-candidates)/},{name:"remoteCandidates",reg:/^remote-candidates:(.*)/,format:"remote-candidates:%s"},{name:"iceOptions",reg:/^ice-options:(\S*)/,format:"ice-options:%s"},{push:"ssrcs",reg:/^ssrc:(\d*) ([\w_-]*)(?::(.*))?/,names:["id","attribute","value"],format:function(n){var a="ssrc:%d";return n.attribute!=null&&(a+=" %s",n.value!=null&&(a+=":%s")),a}},{push:"ssrcGroups",reg:/^ssrc-group:([\x21\x23\x24\x25\x26\x27\x2A\x2B\x2D\x2E\w]*) (.*)/,names:["semantics","ssrcs"],format:"ssrc-group:%s %s"},{name:"msidSemantic",reg:/^msid-semantic:\s?(\w*) (\S*)/,names:["semantic","token"],format:"msid-semantic: %s %s"},{push:"groups",reg:/^group:(\w*) (.*)/,names:["type","mids"],format:"group:%s %s"},{name:"rtcpMux",reg:/^(rtcp-mux)/},{name:"rtcpRsize",reg:/^(rtcp-rsize)/},{name:"sctpmap",reg:/^sctpmap:([\w_/]*) (\S*)(?: (\S*))?/,names:["sctpmapNumber","app","maxMessageSize"],format:function(n){return n.maxMessageSize!=null?"sctpmap:%s %s %s":"sctpmap:%s %s"}},{name:"xGoogleFlag",reg:/^x-google-flag:([^\s]*)/,format:"x-google-flag:%s"},{push:"rids",reg:/^rid:([\d\w]+) (\w+)(?: ([\S| ]*))?/,names:["id","direction","params"],format:function(n){return n.params?"rid:%s %s %s":"rid:%s %s"}},{push:"imageattrs",reg:new RegExp("^imageattr:(\\d+|\\*)[\\s\\t]+(send|recv)[\\s\\t]+(\\*|\\[\\S+\\](?:[\\s\\t]+\\[\\S+\\])*)(?:[\\s\\t]+(recv|send)[\\s\\t]+(\\*|\\[\\S+\\](?:[\\s\\t]+\\[\\S+\\])*))?"),names:["pt","dir1","attrs1","dir2","attrs2"],format:function(n){return"imageattr:%s %s %s"+(n.dir2?" %s %s":"")}},{name:"simulcast",reg:new RegExp("^simulcast:(send|recv) ([a-zA-Z0-9\\-_~;,]+)(?:\\s?(send|recv) ([a-zA-Z0-9\\-_~;,]+))?$"),names:["dir1","list1","dir2","list2"],format:function(n){return"simulcast:%s %s"+(n.dir2?" %s %s":"")}},{name:"simulcast_03",reg:/^simulcast:[\s\t]+([\S+\s\t]+)$/,names:["value"],format:"simulcast: %s"},{name:"framerate",reg:/^framerate:(\d+(?:$|\.\d+))/,format:"framerate:%s"},{name:"sourceFilter",reg:/^source-filter: *(excl|incl) (\S*) (IP4|IP6|\*) (\S*) (.*)/,names:["filterMode","netType","addressTypes","destAddress","srcList"],format:"source-filter: %s %s %s %s %s"},{name:"bundleOnly",reg:/^(bundle-only)/},{name:"label",reg:/^label:(.+)/,format:"label:%s"},{name:"sctpPort",reg:/^sctp-port:(\d+)$/,format:"sctp-port:%s"},{name:"maxMessageSize",reg:/^max-message-size:(\d+)$/,format:"max-message-size:%s"},{push:"tsRefClocks",reg:/^ts-refclk:([^\s=]*)(?:=(\S*))?/,names:["clksrc","clksrcExt"],format:function(n){return"ts-refclk:%s"+(n.clksrcExt!=null?"=%s":"")}},{name:"mediaClk",reg:/^mediaclk:(?:id=(\S*))? *([^\s=]*)(?:=(\S*))?(?: *rate=(\d+)\/(\d+))?/,names:["id","mediaClockName","mediaClockValue","rateNumerator","rateDenominator"],format:function(n){var a="mediaclk:";return a+=n.id!=null?"id=%s %s":"%v%s",a+=n.mediaClockValue!=null?"=%s":"",a+=n.rateNumerator!=null?" rate=%s":"",a+=n.rateDenominator!=null?"/%s":""}},{name:"keywords",reg:/^keywds:(.+)$/,format:"keywds:%s"},{name:"content",reg:/^content:(.+)/,format:"content:%s"},{name:"bfcpFloorCtrl",reg:/^floorctrl:(c-only|s-only|c-s)/,format:"floorctrl:%s"},{name:"bfcpConfId",reg:/^confid:(\d+)/,format:"confid:%s"},{name:"bfcpUserId",reg:/^userid:(\d+)/,format:"userid:%s"},{name:"bfcpFloorId",reg:/^floorid:(.+) (?:m-stream|mstrm):(.+)/,names:["id","mStream"],format:"floorid:%s mstrm:%s"},{push:"invalid",names:["value"]}]};Object.keys(o).forEach(function(n){o[n].forEach(function(a){a.reg||(a.reg=/(.*)/),a.format||(a.format="%s")})})}),JU=ZC(A=>{var e=function(c){return String(Number(c))===c?Number(c):c},o=function(c,u,d){var R=c.name&&c.names;c.push&&!u[c.push]?u[c.push]=[]:R&&!u[c.name]&&(u[c.name]={});var k=c.push?{}:R?u[c.name]:u;(function(_,Z,iA,cA){if(cA&&!iA)Z[cA]=e(_[1]);else for(var TA=0;TA1&&(c[d[0]]=void 0),c};A.parseParams=function(c){return c.split(/;\s?/).reduce(I,{})},A.parseFmtpConfig=A.parseParams,A.parsePayloads=function(c){return c.toString().split(" ").map(Number)},A.parseRemoteCandidates=function(c){for(var u=[],d=c.split(" ").map(e),R=0;R{var o=Mf(),n=/%[sdv%]/g,a=function(d){var R=1,k=arguments,_=k.length;return d.replace(n,function(Z){if(R>=_)return Z;var iA=k[R];switch(R+=1,Z){case"%%":return"%";case"%s":return String(iA);case"%d":return Number(iA);case"%v":return""}})},I=function(d,R,k){var _=[d+"="+(R.format instanceof Function?R.format(R.push?k:k[R.name]):R.format)];if(R.names)for(var Z=0;Z{var e=JU(),o=HU();A.write=o,A.parse=e.parse,A.parseParams=e.parseParams,A.parseFmtpConfig=e.parseFmtpConfig,A.parsePayloads=e.parsePayloads,A.parseRemoteCandidates=e.parseRemoteCandidates,A.parseImageAttributes=e.parseImageAttributes,A.parseSimulcastStreamList=e.parseSimulcastStreamList}),qV=es(hg()),tu=((Ii=tu||{})[Ii.INVALID_PARAMETER=4096]="INVALID_PARAMETER",Ii[Ii.INVALID_OPERATION=4097]="INVALID_OPERATION",Ii[Ii.NOT_SUPPORTED=4098]="NOT_SUPPORTED",Ii[Ii.DEVICE_NOT_FOUND=4099]="DEVICE_NOT_FOUND",Ii[Ii.INITIALIZE_FAILED=4100]="INITIALIZE_FAILED",Ii[Ii.SIGNAL_CHANNEL_SETUP_FAILED=16385]="SIGNAL_CHANNEL_SETUP_FAILED",Ii[Ii.SIGNAL_CHANNEL_ERROR=16386]="SIGNAL_CHANNEL_ERROR",Ii[Ii.ICE_TRANSPORT_ERROR=16387]="ICE_TRANSPORT_ERROR",Ii[Ii.JOIN_ROOM_FAILED=16388]="JOIN_ROOM_FAILED",Ii[Ii.CREATE_OFFER_FAILED=16389]="CREATE_OFFER_FAILED",Ii[Ii.SIGNAL_CHANNEL_RECONNECTION_FAILED=16390]="SIGNAL_CHANNEL_RECONNECTION_FAILED",Ii[Ii.UPLINK_RECONNECTION_FAILED=16391]="UPLINK_RECONNECTION_FAILED",Ii[Ii.DOWNLINK_RECONNECTION_FAILED=16392]="DOWNLINK_RECONNECTION_FAILED",Ii[Ii.REMOTE_STREAM_NOT_EXIST=16400]="REMOTE_STREAM_NOT_EXIST",Ii[Ii.CLIENT_BANNED=16448]="CLIENT_BANNED",Ii[Ii.SERVER_TIMEOUT=16449]="SERVER_TIMEOUT",Ii[Ii.SUBSCRIPTION_TIMEOUT=16450]="SUBSCRIPTION_TIMEOUT",Ii[Ii.PLAY_NOT_ALLOWED=16451]="PLAY_NOT_ALLOWED",Ii[Ii.DEVICE_AUTO_RECOVER_FAILED=16452]="DEVICE_AUTO_RECOVER_FAILED",Ii[Ii.START_PUBLISH_CDN_FAILED=16453]="START_PUBLISH_CDN_FAILED",Ii[Ii.STOP_PUBLISH_CDN_FAILED=16454]="STOP_PUBLISH_CDN_FAILED",Ii[Ii.START_MIX_TRANSCODE_FAILED=16455]="START_MIX_TRANSCODE_FAILED",Ii[Ii.STOP_MIX_TRANSCODE_FAILED=16456]="STOP_MIX_TRANSCODE_FAILED",Ii[Ii.NOT_SUPPORTED_H264=16457]="NOT_SUPPORTED_H264",Ii[Ii.SWITCH_ROLE_FAILED=16458]="SWITCH_ROLE_FAILED",Ii[Ii.API_CALL_TIMEOUT=16459]="API_CALL_TIMEOUT",Ii[Ii.SCHEDULE_FAILED=16460]="SCHEDULE_FAILED",Ii[Ii.API_CALL_ABORTED=16461]="API_CALL_ABORTED",Ii[Ii.SPC_INITIALIZED_FAILED=16462]="SPC_INITIALIZED_FAILED",Ii[Ii.VIDEO_MANAGER_ERROR=16463]="VIDEO_MANAGER_ERROR",Ii[Ii.SWITCH_ROOM_FAILED=16464]="SWITCH_ROOM_FAILED",Ii[Ii.VIDEO_ENCODE_FAILED=16465]="VIDEO_ENCODE_FAILED",Ii[Ii.AUDIO_ENCODE_FAILED=16466]="AUDIO_ENCODE_FAILED",Ii[Ii.UNKNOWN=65535]="UNKNOWN",Ii),Ge=tu,VU=class extends Error{constructor(A){let{name:e="RtcError",message:o,code:n=Ge.UNKNOWN,extraCode:a=0,constraint:I}=A,c="<".concat(function(d){for(let R in Ge)if(Ge[R]===d)return R;return"UNKNOWN"}(n)," 0x").concat(n.toString(16),">"),u="".concat(o).concat(I?" constraint: ".concat(I):"").concat(o!=null&&o.includes(c)?"":" ".concat(c));super(u),G(this,"code"),G(this,"extraCode"),G(this,"message"),G(this,"originMessage"),G(this,"name"),G(this,"constraint"),this.code=n,this.extraCode=a,this.name=e,this.message=u,this.constraint=I,this.originMessage=o}getCode(){return this.code}getExtraCode(){return this.extraCode}toString(){return this.originMessage}},Ct=VU,EN=0,qU=!0,iu=function(A){EN=A;let e=new Date;e.setTime(e.getTime()+A),nA[qU?"info":"debug"]("baseTime from server: ".concat(e," offset: ").concat(A)),qU=!1},KU=function(){return EN},gh=function(){return Date.now()+EN},jU=function(){let A=new Date;return A.setTime(gh()),A.toLocaleString()},lN=function(A){let e=String(A.getMilliseconds());return"padStart"in String.prototype&&(e=e.toString().padStart(3,"0")),"".concat(A.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/,"$1"),":").concat(e)},tl={};XC(tl,{REPORT_TYPE:()=>eM,buildSSOPackage:()=>Iu,bytes2ms:()=>jR,calculateScaleResolutionDownNumber:()=>AM,concatArrayBuffers:()=>qf,convertObjectNumberToInt:()=>$R,copyProperties:()=>dO,deepClone:()=>Dh,deepCloneBasic:()=>yh,deepMerge:()=>tB,delay:()=>AC,fibonacci:()=>ph,formatedTime:()=>MO,getConstructorName:()=>Yf,getContainerFromElement:()=>LN,getEnv:()=>BO,getFirst16Bits:()=>SO,getInternalVersion:()=>yO,getLast16Bits:()=>tM,getLoggerUrl:()=>dh,getMediaStreamTrackInfo:()=>YN,getMuteStateFromFlag:()=>mQ,getNetworkType:()=>qR,getNumNetworkType:()=>hh,getReconnectionTimeout:()=>fQ,getStringByteLength:()=>XR,getTestSignalDomain:()=>uO,getTurnServer:()=>RO,getUint32Version:()=>UN,getValueType:()=>ya,getViewListFromView:()=>Hf,glog:()=>pO,ipv4ToUint32:()=>Jf,isArray:()=>Aa,isAudioWorkletSupported:()=>fO,isBoolean:()=>rn,isConstructor:()=>mh,isEmpty:()=>zR,isFunction:()=>$n,isLangChinese:()=>rl,isMediaStreamTrack:()=>_N,isNumber:()=>hr,isObject:()=>Xc,isOverseaSdkAppId:()=>ol,isPlainObject:()=>Cc,isPortrait:()=>FN,isPromise:()=>fh,isRemoteTrack:()=>bN,isRotate90Or270:()=>gu,isSetSinkIdSupported:()=>mO,isString:()=>Sr,isUndefined:()=>Ee,isVideoMixerOutputTrack:()=>DQ,loadImage:()=>Vf,loadVideo:()=>wO,ms2bytes:()=>hO,ms2samples:()=>WR,normalizeUrl:()=>xN,performanceNow:()=>ki,promiseAny:()=>Pf,samples2ms:()=>kN,setNetworkTypeFromWebRTC:()=>KR,stringify:()=>nl,stringifyIncludeValue:()=>ZR,throttlePromise:()=>ON});var WU={};XC(WU,{ASR_ROBOT_FROM_TYPE:()=>xR,AUDIO_MUTE_BIT:()=>Eh,AUDIO_STAT_BIT:()=>Gf,AUX_STAT_BIT:()=>Tf,AUX_STREAM_MSID:()=>tO,BACKEND_ENV:()=>Ih,BASE_DOC_URL:()=>$C,BASE_HOST:()=>ZU,CAPABILITIES_KEYS:()=>RN,CLASS_NAME:()=>eq,CLOUD_CONSOLE_URL:()=>WV,CROSS_ROOM_BIT:()=>hN,DATA_CHANNEL_FROM_TYPE_BIT:()=>nu,DATA_FREEZE_TIMING:()=>DN,DOC_BILLING_CN:()=>NR,DOC_BILLING_OVERSEA:()=>uN,DOC_URL:()=>zV,DTLS_STATE_UNKNOWN:()=>AB,ENV_NAME:()=>ou,EXCHANGE_SDP_TIMEOUT:()=>aO,IS_WORKER:()=>SR,IS_WORKLET:()=>vR,KIBANA_EVENT:()=>oa,LOCAL_STREAM_PUBLISH_STATE:()=>sO,LOGGER_CMD_TYPE:()=>Xg,LOGGER_DOMAIN:()=>Zg,LOGGER_DOMAIN_OVERSEA:()=>QQ,LOG_LEVEL:()=>ru,LOG_LEVEL_NAME:()=>iq,MAIN_STREAM_MSID:()=>RI,MAX_RTT:()=>OR,MICROPHONE_COMMUNICATIONS:()=>tq,MICROPHONE_DEFAULT:()=>bf,MUTE_ALL_BIT:()=>eO,NAME:()=>fA,NETWORK_TYPE:()=>TR,NOT_SUPPORTED_H264:()=>FR,PAUSED_RETRY_COUNT:()=>pQ,PEERCONNECTION_CONNECTING_TIMEOUT:()=>yN,PEER_CONNECTION_STATE:()=>hi,PEER_LEAVE_REASON:()=>cO,RECOVER_CAPTURE_INTERVAL:()=>Ff,REMOTE_STREAM_TYPE_AUX:()=>pN,REMOTE_STREAM_TYPE_MAIN:()=>kR,RENDER_FREEZE_TIMING:()=>gO,SCHEDULE_DOMAIN:()=>su,SCHEDULE_TIMEOUT:()=>IO,SDP_SEMANTICS_PLAN_B:()=>LR,SDP_SEMANTICS_UNIFIED_PLAN:()=>_f,SECOND_HOST:()=>XU,SIGNAL_PING_PONG_INTERVAL:()=>lc,SIGNAL_PING_TIMEOUT:()=>$U,SIGNAL_RECONNECTION_COUNT:()=>ZV,SMALL_STAT_BIT:()=>dN,SPEAKER_DEFAULT:()=>UR,STORAGE_EXPIRES_TIME:()=>GR,STREAM_TYPE_BIG:()=>$V,STREAM_TYPE_SMALL:()=>Aq,SUBSCRIBE_SMALL_RETRY_COUNT:()=>Lf,SYNC_USER_LIST_INTERVAL:()=>XV,Scene:()=>ch,THIRD_HOST:()=>jV,TRANSPORT_DIRECTION:()=>_r,TRTC_ERROR_ASSISTANCE:()=>Sf,TRTC_QUALITY_BAD:()=>lh,TRTC_QUALITY_DISCONNECTED:()=>rO,TRTC_QUALITY_EXCELLENT:()=>_R,TRTC_QUALITY_GOOD:()=>au,TRTC_QUALITY_POOR:()=>iO,TRTC_QUALITY_UNKNOWN:()=>fN,TRTC_QUALITY_VERY_BAD:()=>oO,UPDATE_OFFER_TIMEOUT:()=>nO,VIDEO_MUTE_BIT:()=>kf,VIDEO_STAT_BIT:()=>Nf,WEBGL_ATTRIBUTES:()=>MN,audioProfileMap:()=>dQ,defaultBigVideoProfile:()=>vf,defaultSmallVideoProfile:()=>AO,getRetryCount:()=>Ch,getScriptDir:()=>KV,innerVersion:()=>wR,loggerProxy:()=>BN,screenProfileMap:()=>QN,setLoggerProxy:()=>wf,setRetryCount:()=>bR,setVersion:()=>zU,version:()=>il,videoProfileMap:()=>$l});var wR="4.15.00.1600",il="5.0.0";function zU(A){il=A;let[e,o,n]=A.split(".").map(a=>parseInt(a,10));wR="".concat(e,".").concat(Math.min(15,o),".").concat(Math.min(15,n),".").concat(o.toString().padStart(2,"0")).concat(n.toString().padStart(2,"0"))}var CN,Ec,SR=typeof importScripts<"u",vR=typeof registerProcessor<"u",KV=()=>{let A=SR?self.location.href:document.currentScript.src;return A.substring(0,A.lastIndexOf("/")+1)},BN="",wf=A=>BN=A,ZU="web.sdk.qcloud.com",XU="web.sdk.tencent.cn",jV="web.sdk.cloud.tencent.cn",WV="https://console.cloud.tencent.com/trtc",$C="https://".concat(ZU,"/trtc/webrtc/doc"),zV="".concat($C,"/zh-cn/"),NR="https://cloud.tencent.com/document/product/647/85386",uN="https://trtc.io/document/56025",Zg="https://yun.tim.qq.com",QQ="https://apisgp.my-imcloud.com",Sf="trtc_error_assistance",Xg={LOG:"jssdk_log",EVENT:"jssdk_event",KEY_POINT:"jssdk_new_endreport",KV_STAT:"jssdk_key_metrics_report"},ou={QCLOUD:"qcloud",OLD_CLOUD_LADDER:"trtc",WEBRTC:"webrtc"},ru=((Ec=ru||{})[Ec.TRACE=0]="TRACE",Ec[Ec.DEBUG=1]="DEBUG",Ec[Ec.INFO=2]="INFO",Ec[Ec.WARN=3]="WARN",Ec[Ec.ERROR=4]="ERROR",Ec[Ec.NONE=5]="NONE",Ec),$U=18e3,lc=2e3,TR={unknown:0,wifi:1,"4g":2,"3g":3,"2g":4,wired:5,"5g":6},GR=6048e5,dQ={standard:{sampleRate:48e3,channelCount:1,bitrate:40},"standard-stereo":{sampleRate:48e3,channelCount:2,bitrate:64},high:{sampleRate:48e3,channelCount:1,bitrate:128},"high-stereo":{sampleRate:48e3,channelCount:2,bitrate:192}},$l={"120p":{width:160,height:120,frameRate:15,bitrate:200},"120p_2":{width:160,height:120,frameRate:15,bitrate:100},"180p":{width:320,height:180,frameRate:15,bitrate:350},"180p_2":{width:320,height:180,frameRate:15,bitrate:150},"240p":{width:320,height:240,frameRate:15,bitrate:400},"240p_2":{width:320,height:240,frameRate:15,bitrate:200},"360p":{width:640,height:360,frameRate:15,bitrate:800},"360p_2":{width:640,height:360,frameRate:15,bitrate:400},"480p":{width:640,height:480,frameRate:15,bitrate:900},"480p_2":{width:640,height:480,frameRate:15,bitrate:500},"720p":{width:1280,height:720,frameRate:15,bitrate:1500},"1080p":{width:1920,height:1080,frameRate:15,bitrate:2e3},"1440p":{width:2560,height:1440,frameRate:30,bitrate:4860},"4K":{width:3840,height:2160,frameRate:30,bitrate:9e3}},vf=$l["480p_2"],AO=$l["120p_2"],QN={"480p":{width:640,height:480,frameRate:5,bitrate:900},"480p_2":{width:640,height:480,frameRate:30,bitrate:1e3},"720p":{width:1280,height:720,frameRate:5,bitrate:1200},"720p_2":{width:1280,height:720,frameRate:30,bitrate:3e3},"1080p":{width:1920,height:1080,frameRate:5,bitrate:1600},"1080p_2":{width:1920,height:1080,frameRate:30,bitrate:4e3}},fA={CANVAS:"canvas",AUDIO:"audio",VIDEO:"video",SCREEN:"screen",SMALL:"small",BIG:"big",AUXILIARY:"auxiliary",SMALL_VIDEO:"smallVideo",FACING_MODE_USER:"user",FACING_MODE_ENVIRONMENT:"environment",MUTE:"mute",UNMUTE:"unmute",ENDED:"ended",PLAYING:"playing",PAUSE:"pause",ERROR:"error",LOADSTART:"loadstart",LOADEDDATA:"loadeddata",LOADEDMETADATA:"loadedmetadata",AUDIO_INPUT:"audioinput",VIDEO_INPUT:"videoinput",DETAIL:"detail",TEXT:"text",MAIN:"main",BACKUP:"backup",BANNED:"banned",KICK:"kick",USER_TIME_OUT:"user_time_out",ROOM_DISBAND:"room_disband",SEI_MESSAGE:"sei-message",ADD:"add",REMOVE:"remove",REPLACE:"replace",TRACK:"track",SUBSCRIBE:"subscribe",UNSUBSCRIBE:"unsubscribe",TRANSCEIVER_DIRECTION_SENDONLY:"sendonly",TRANSCEIVER_DIRECTION_RECVONLY:"recvonly",ENTER_PICTURE_IN_PICTURE:"enterpictureinpicture",LEAVE_PICTURE_IN_PICTURE:"leavepictureinpicture",FULLSCREEN_CHANGE:"fullscreenchange",RESIZE:"resize",TIME_UPDATE:"timeupdate"},_r={INACTIVE:"inactive",SENDONLY:"sendonly",RECVONLY:"recvonly"},Ih={OLD_CLOUD_LADDER:"wss://trtc.rtc.qq.com",WEBRTC:"wss://webrtc.qq.com"},ch=((CN=ch||{}).LIVE="live",CN.RTC="rtc",CN),Nf=1,dN=2,Tf=4,Gf=8,Eh=64,kf=16,eO=112,hN=128,nu=256,RI="5Y2wZK8nANNAoVw6dSAHVjNxrD1ObBM2kBPV",tO="224d130c-7b5c-415b-aaa2-79c2eb5a6df2",kR=fA.MAIN,pN=fA.AUXILIARY,fN=0,_R=1,au=2,iO=3,lh=4,oO=5,rO=6,AB="unknown",hi={NEW:"new",CONNECTING:"connecting",FAILED:"failed",CLOSED:"closed",DISCONNECTED:"disconnected",CONNECTED:"connected",COMPLETED:"completed"},mN=1/0;function bR(A){mN=A}function Ch(){return mN}var hQ,ZV=30,oa={JOIN:"join",DELTA_JOIN:"delta-join",REJOIN:"rejoin",LEAVE:"leave",DELTA_LEAVE:"delta-leave",PUBLISH:"publish",DELTA_PUBLISH:"delta-publish",UNPUBLISH:"unpublish",SUBSCRIBE:"subscribe",UNSUBSCRIBE:"unsubscribe",UPLINK_CONNECTION:"uplink-connection",UPLINK_RECONNECTION:"uplink-reconnection",DOWNLINK_CONNECTION:"downlink-connection",DOWNLINK_RECONNECTION:"downlink-reconnection",ON_TRACK:"ontrack",ICE_CONNECTION_STATE:"iceConnectionState",LOCAL_STREAM_INITIALIZE:"stream-initialize",SIGNAL_CONNECTION:"websocketConnectionState",SIGNAL_RECONNECTION:"websocketReconnectionState",UPDATE_STREAM:"update-stream",RECOVER_LOCAL_AUDIO_TRACK:"recover-local-audio-track",RECOVER_LOCAL_VIDEO_TRACK:"recover-local-video-track",RECOVER_SUBSCRIPTION:"recover-subscription",START_MIX_TRANSCODE:"start-mix-transcode",STOP_MIX_TRANSCODE:"stop-mix-transcode",PLAYER_ERROR:"player-error",SCHEDULE:"schedule",LOAD_WORKLET:"load-worklet",VIDEO_FROZEN_COUNT:"videoFrozenCount",GET_USER_MEDIA_RETRY:"getUserMedia-retry",VIDEO_ENCODE_FAILED_DURING_CALL:"video-encode-failed-during-call",VIDEO_ENCODE_RESUME_DURING_CALL:"video-encode-resume-during-call",AUDIO_ENCODE_FAILED_DURING_CALL:"audio-encode-failed-during-call",AUDIO_ENCODE_RESUME_DURING_CALL:"audio-encode-resume-during-call",VIDEO_DECODE_FAILED_DURING_CALL:"video-decode-failed-during-call",VIDEO_DECODE_RESUME_DURING_CALL:"video-decode-resume-during-call",AUDIO_DECODE_FAILED_DURING_CALL:"audio-decode-failed-during-call",AUDIO_DECODE_RESUME_DURING_CALL:"audio-decode-resume-during-call",VIDEO_HARDWARE_DECODE_FAILED:"video-hardware-decode-failed",VIDEO_HARDWARE_DECODE_RESUME:"video-hardware-decode-resume"},XV=1e4,nO=1e4,aO=1e4,_f="unified-plan",LR="plan-b",FR=1028,sO=((hQ=sO||{})[hQ.UNPUBLISH=-1]="UNPUBLISH",hQ[hQ.PUBLISHING=0]="PUBLISHING",hQ[hQ.PUBLISHED=1]="PUBLISHED",hQ),DN=500,gO=1e3,$V=fA.BIG,Aq=fA.SMALL,yN=1e4,su={MAIN:"schedule.cloud-rtc.com",BACKUP:"schedule.cloud-rtc.net",MAIN_OVERSEA:"schedule.rtc-web.com",BACKUP_OVERSEA:"schedule.rtc-web.io",MAIN_OVERSEA_BACKUP:"intl-schedule.cloud-rtc.com"},IO=2e3,eq={TRTC:"TRTC",CLIENT:"Client",LOCAL_STREAM:"LocalStream",REMOTE_STREAM:"RemoteStream",STREAM:"Stream"},pQ=5,bf="default",UR=bf,tq="communications",iq=Object.keys(ru),cO=["normal leave","timeout leave","kick","role change"],Lf=10,Ff=2e3,RN=["width","height","frameRate","facingMode","sampleRate","sampleSize","channelCount","deviceId","min","max"],OR=1e4,xR=14,MN={alpha:!0,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0,powerPreference:"low-power"},EO=function(A,e,o,n){return new(o||(o=Promise))(function(a,I){function c(R){try{d(n.next(R))}catch(k){I(k)}}function u(R){try{d(n.throw(R))}catch(k){I(k)}}function d(R){R.done?a(R.value):function(k){return k instanceof o?k:new o(function(_){_(k)})}(R.value).then(c,u)}d((n=n.apply(A,[])).next())})},YR=Symbol(32),PR=Symbol(16),wN=Symbol(8),Bh=class{constructor(A){this.g=A,this.consumed=0,A&&(this.need=A.next().value)}setG(A){this.g=A,this.demand(A.next().value,!0)}consume(){this.buffer&&this.consumed&&(this.buffer.copyWithin(0,this.consumed),this.buffer=this.buffer.subarray(0,this.buffer.length-this.consumed),this.consumed=0)}demand(A,e){return e&&this.consume(),this.need=A,this.flush()}read(A){return EO(this,void 0,void 0,function*(){return this.lastReadPromise&&(yield this.lastReadPromise),this.lastReadPromise=new Promise((e,o)=>{var n;this.reject=o,this.resolve=a=>{delete this.lastReadPromise,delete this.resolve,delete this.need,e(a)},this.demand(A,!0)||(n=this.pull)===null||n===void 0||n.call(this,A)})})}readU32(){return this.read(YR)}readU16(){return this.read(PR)}readU8(){return this.read(wN)}close(){var A;this.g&&this.g.return(),this.buffer&&this.buffer.subarray(0,0),(A=this.reject)===null||A===void 0||A.call(this,new Error("EOF")),delete this.lastReadPromise}flush(){if(!this.buffer||!this.need)return;let A=null,e=this.buffer.subarray(this.consumed),o=0,n=a=>e.length<(o=a);if(typeof this.need=="number"){if(n(this.need))return;A=e.subarray(0,o)}else if(this.need===YR){if(n(4))return;A=e[0]<<24|e[1]<<16|e[2]<<8|e[3]}else if(this.need===PR){if(n(2))return;A=e[0]<<8|e[1]}else if(this.need===wN){if(n(1))return;A=e[0]}else if("buffer"in this.need){if("byteOffset"in this.need){if(n(this.need.byteLength-this.need.byteOffset))return;new Uint8Array(this.need.buffer,this.need.byteOffset).set(e.subarray(0,o)),A=this.need}else if(this.g)return void this.g.throw(new Error("Unsupported type"))}else{if(n(this.need.byteLength))return;new Uint8Array(this.need).set(e.subarray(0,o)),A=this.need}return this.consumed+=o,this.g?this.demand(this.g.next(A).value,!0):this.resolve&&this.resolve(A),A}write(A){if(A instanceof Uint8Array?this.malloc(A.length).set(A):"buffer"in A?this.malloc(A.byteLength).set(new Uint8Array(A.buffer,A.byteOffset,A.byteLength)):this.malloc(A.byteLength).set(new Uint8Array(A)),!this.g&&!this.resolve)return new Promise(e=>this.pull=e);this.flush()}writeU32(A){this.malloc(4).set([A>>24&255,A>>16&255,A>>8&255,255&A]),this.flush()}writeU16(A){this.malloc(2).set([A>>8&255,255&A]),this.flush()}writeU8(A){this.malloc(1)[0]=A,this.flush()}malloc(A){if(this.buffer){let e=this.buffer.length,o=e+A;if(o<=this.buffer.buffer.byteLength-this.buffer.byteOffset)this.buffer=new Uint8Array(this.buffer.buffer,this.buffer.byteOffset,o);else{let n=new Uint8Array(o);n.set(this.buffer),this.buffer=n}return this.buffer.subarray(e,o)}return this.buffer=new Uint8Array(A),this.buffer}};Bh.U32=YR,Bh.U16=PR,Bh.U8=wN;var Uf=128;function JR(A){let e=new Bh;for(;A>=128;)e.malloc(1)[0]=255&A|Uf,A>>>=7;return e.malloc(1)[0]=255&A,e.buffer||new Uint8Array(0)}function HR(A){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,o=new Bh,n=e<<3;switch(typeof A){case"boolean":let a=o.malloc(2);a[0]=n,a[1]=A?1:0;break;case"number":o.malloc(1)[0]=n,o.write(JR(A));break;case"string":o.malloc(1)[0]=2|n;let I=new TextEncoder().encode(A);o.write(JR(I.length));let c=o.malloc(I.length);for(let d=0;d>>24&255),this.buffer.push(A>>>16&255),this.buffer.push(A>>>8&255),this.buffer.push(255&A)}writeInt16(A){this.buffer.push(A>>>8&255),this.buffer.push(255&A)}writeByte(A){this.buffer.push(255&A)}writeBytes(A){for(let e=0;e>>24&255,A[o+1]=e>>>16&255,A[o+2]=e>>>8&255,A[o+3]=255&e}function MI(A,e){return A[e]<<24|A[e+1]<<16|A[e+2]<<8|A[e+3]}function CO(A,e){return A[e]}function Qh(A,e,o){return new TextDecoder().decode(function(n,a,I){return n.slice(a,a+I)}(A,e,o))}var Of=0,SN=2654435769,VR=16,eB=2,xf=7;function vN(A,e){let o=new lO,n=function(XA,Ft,ie){let ke=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"AVQualityReportSvc.C2S";return{version:arguments.length>4&&arguments[4]!==void 0?arguments[4]:2e3,encryption:arguments.length>5&&arguments[5]!==void 0?arguments[5]:2,d2:"",d2Len:0,uinType:arguments.length>6&&arguments[6]!==void 0?arguments[6]:30,uin:"",uinLen:0,reqHead:{seqNumber:ie,appId:XA,appidAtThird:new Uint8Array(0),a2:"",a2Len:0,serviceCmd:ke,serviceCmdLen:0,cookie:"",cookieLen:0,imei:"",imeiLen:0,ksid:"",ksidLen:0,clientVersionInfo:"",clientVersionInfoLen:0},busiBuff:Ft}}(e,A,Of);Of=Of+1&2147483647,o.writeInt32(0),o.writeInt32(n.version),o.writeByte(n.encryption);let a=new TextEncoder().encode(n.d2);o.writeInt32(a.length+4),a&&o.writeBytes(a),o.writeByte(n.uinType);let I=new TextEncoder().encode(n.uin);o.writeInt32(I.length+4),I.length&&o.writeBytes(I);let c=new lO;c.writeInt32(0),c.writeInt32(n.reqHead.seqNumber),c.writeInt32(n.reqHead.appId),c.writeByte(n.reqHead.appId>>>24&255),c.writeByte(n.reqHead.appId>>>16&255),c.writeByte(n.reqHead.appId>>>8&255),c.writeByte(255&n.reqHead.appId);for(let XA=4;XA<16;XA++)c.writeByte(0);let u=new TextEncoder().encode(n.reqHead.a2);c.writeInt32(u.length+4),u.length&&c.writeBytes(u);let d=new TextEncoder().encode(n.reqHead.serviceCmd);c.writeInt32(d.length+4),d.length&&c.writeBytes(d);let R=new TextEncoder().encode(n.reqHead.cookie);c.writeInt32(R.length+4),R.length&&c.writeBytes(R);let k=new TextEncoder().encode(n.reqHead.imei);c.writeInt32(k.length+4),k.length&&c.writeBytes(k);let _=new TextEncoder().encode(n.reqHead.ksid);c.writeInt32(_.length+4),_.length&&c.writeBytes(_);let Z=new TextEncoder().encode(n.reqHead.clientVersionInfo);c.writeInt16(Z.length+2),Z.length&&c.writeBytes(Z);let iA=c.length;c.data[0]=iA>>>24&255,c.data[1]=iA>>>16&255,c.data[2]=iA>>>8&255,c.data[3]=255&iA,Sr(A)&&(A=new TextEncoder().encode(A)),c.writeInt32(A.length+4),A.length&&c.writeBytes(A);let cA=new Uint8Array(c.data),TA=null;n.encryption===1?TA=new TextEncoder().encode(n.uin):n.encryption===2&&(TA=new Uint8Array(16)),TA&&(cA=function(XA,Ft){let ie=XA.length,ke=(ie+1+eB+xf)%8;ke&&(ke=8-ke);let Nt=ie+1+eB+xf+ke,Ut=new Uint8Array(Nt),Ui=0,Oi=new Uint8Array(8),or=new Uint8Array(8),xi=new Uint8Array(8),yo=0;Oi[0]=248&Math.floor(256*Math.random())|ke,yo=1;for(let Vn=0;Vn>>24&255,JA[1]=Ie>>>16&255,JA[2]=Ie>>>8&255,JA[3]=255&Ie,JA}function NN(A,e,o,n,a,I){for(let c=0;c<8;c++)A[c]^=n[c];(function(c,u,d,R){let k=MI(c,0),_=MI(c,4),Z=[];for(let cA=0;cA<4;cA++)Z[cA]=MI(u,4*cA);let iA=0;for(let cA=0;cA>>=0,k+=(_<<4)+Z[0]^_+iA^(_>>>5)+Z[1],k>>>=0,_+=(k<<4)+Z[2]^k+iA^(k>>>5)+Z[3],_>>>=0;uh(d,k,R),uh(d,_,R+4)})(A,e,a,I);for(let c=0;c<8;c++)a[I+c]^=o[c];for(let c=0;c<8;c++)o[c]=A[c]}var BO=function(){return new URLSearchParams(location.search).get("trtc_env")||""},uO=function(A){return A.includes(".")?A:"".concat(A).concat(".rtc.qq.com")},ol=A=>Number(A)<14e8,dh=function(A,e){let o;o=BN||(ol(A)?QQ:Zg);let n=Math.floor(Math.random()*Rf(2,31));return"".concat(o,"/v5/AVQualityReportSvc/C2S?random=").concat(n,"&sdkappid=").concat(A,"&cmdtype=").concat(e)},TN="unknown";function qR(){(function(){var I;QO||(QO=!0,(I=navigator.connection)==null||I.addEventListener("typechange",oq))})();let{userAgent:A,connection:e}=navigator,o=(A.match(/NetType\/\S+/)||[])[0]||"";o=o.toLowerCase().replace("nettype/",""),o==="3gnet"&&(o="3g");let n=e&&e.type&&e.type.toLowerCase(),a=e&&e.effectiveType&&e.effectiveType.toLowerCase();return a==="slow-2"&&(a="2g"),n?GN(n,a):TN}function oq(){nA.warn("netType changed",qR())}var QO=!1;function GN(A,e){if(TR[A])return A;switch(A){case"cellular":case"wimax":return e||"unknown";case"ethernet":return"wired";default:return"unknown"}}function KR(A){TN=GN(A)}function hh(){return TR[qR()]}function dO(A,e){for(let o of Reflect.ownKeys(e))if(o!=="constructor"&&o!=="prototype"&&o!=="name"){let n=Object.getOwnPropertyDescriptor(e,o)||"";Object.defineProperty(A,o,n)}return A}function jR(A){return kN(A/4,arguments.length>1&&arguments[1]!==void 0?arguments[1]:48e3)}function kN(A){return 1e3*A/(arguments.length>1&&arguments[1]!==void 0?arguments[1]:48e3)}function hO(A){return 4*WR(A,arguments.length>1&&arguments[1]!==void 0?arguments[1]:48e3)}function WR(A){return A*(arguments.length>1&&arguments[1]!==void 0?arguments[1]:48e3)/1e3}var pO=typeof window<"u"&&typeof window.glog=="function"?window.glog:()=>{},rl=()=>{let A=navigator.language;return A=A.substring(0,2),A==="zh"},Cc=function(A){if(!A||typeof A!="object"||Object.prototype.toString.call(A)!="[object Object]")return!1;let e=Object.getPrototypeOf(A);if(e===null)return!0;let o=Object.prototype.hasOwnProperty.call(e,"constructor")&&e.constructor;return typeof o=="function"&&o instanceof o&&Function.prototype.toString.call(o)===Function.prototype.toString.call(Object)};function ph(A){let e=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1;return A<=1?e:ph(A-1,e,(arguments.length>1&&arguments[1]!==void 0?arguments[1]:1)+e)}function fQ(A){return A>8?3e4:1e3*ph(A)}function ya(A){return Reflect.apply(Object.prototype.toString,A,[]).replace(/^\[object\s(\w+)\]$/,"$1").toLowerCase()}var $n=A=>typeof A=="function",Ee=A=>A===void 0,Sr=A=>typeof A=="string",hr=A=>typeof A=="number",rn=A=>typeof A=="boolean",Xc=A=>ya(A)==="object",Aa=A=>ya(A)==="array",_N=A=>ya(A)==="MediaStreamTrack".toLowerCase(),bN=A=>A.isRemote,fh=A=>ya(A)==="promise",mh=A=>$n(A)&&A.prototype.constructor===A,Yf=A=>mh(A)?A.prototype.constructor.name:"",fO=typeof AudioWorkletNode<"u",mO=typeof HTMLMediaElement<"u"&&"setSinkId"in HTMLMediaElement.prototype;function Pf(A){return new Promise((e,o)=>{let n=[];A.forEach(a=>{a.then(e).catch(I=>{n.push(I),n.length===A.length&&o(n)})})})}function ki(){return performance&&performance.now?Math.floor(performance.now()):Date.now()}var DO=A=>+A<10?"0".concat(A):A,yO=A=>{let e=A.match(/^\d+\.\d+\.\d+/)[0];if(!e)return A;let o=e.split("."),n=DO(o[1])+DO(o[2]);return o[1]-15>0&&(o[1]="15"),o[2]-15>0&&(o[2]="15"),"".concat(o.join("."),".").concat(n)},rq=Object.prototype.hasOwnProperty;function zR(A){if(A==null)return!0;if(typeof A=="boolean")return!1;if(typeof A=="number")return A===0;if(typeof A=="string"||typeof A=="function"||Array.isArray(A))return A.length===0;if(A instanceof Error)return A.message==="";if(Cc(A))switch(Object.prototype.toString.call(A)){case"[object File]":case"[object Map]":case"[object Set]":return A.size===0;case"[object Object]":for(let e in A)if(rq.call(A,e))return!1;return!0}return!1}function mQ(A,e){return{userId:e,hasAudio:!!(A&Gf),hasVideo:!!(A&Nf),hasAuxiliary:!!(A&Tf),hasSmall:!!(A&dN),audioMuted:!!(A&Eh),videoMuted:!!(A&kf),audioAvailable:!(!(A&Gf)||A&Eh),videoAvailable:!(!(A&Nf)||A&kf),hasDatachannel:!!(A&nu)}}function RO(A){let e={urls:A.url.startsWith("turn:")||A.url.startsWith("turns:")?A.url:"turn:".concat(A.url)};return!Ee(A.username)&&!Ee(A.credential)&&(e.username=A.username,e.credential=A.credential,e.credentialType="password",Ee(A.credentialType)||(e.credentialType=A.credentialType)),e}function Jf(A){let e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1];if(!Sr(A))return 0;let o=A.split(".");return e?(Number(o[0])<<24|Number(o[1])<<16|Number(o[2])<<8|Number(o[3]))>>>0:(Number(o[3])<<24|Number(o[2])<<16|Number(o[1])<<8|Number(o[0]))>>>0}var tB=function(A,e,o,n){if(!Xc(A)||!Xc(e))return 0;let a,I=0,c=Object.keys(e);for(let u=0,d=c.length;u{e[n]=Dh(o)}),e}if(Xc(A)){let e={};return Object.keys(A).forEach(o=>{e[o]=Dh(A[o])}),e}return A}var Hf=A=>{let e=[];if(Aa(A))e=[...A];else if(Sr(A)){let o=document.getElementById(A);o&&e.push(o)}else A&&e.push(A);return e},LN=A=>Sr(A)?document.getElementById(A):A,MO=()=>(A=>{let e=d=>d<10?"0".concat(d):"".concat(d),o=A.getFullYear(),n=A.getMonth()+1,a=A.getDate(),I=e(A.getHours()),c=e(A.getMinutes()),u=e(A.getSeconds());return"".concat(o,"/").concat(n,"/").concat(a," ").concat(I,":").concat(c,":").concat(u)})(new Date);function nl(A,e){let{keysToInclude:o,keysToExclude:n}=e;try{if(Aa(A))return"[".concat(A.map(u=>nl(u,{keysToInclude:o,keysToExclude:n})).join(","),"]");if(!Cc(A)||!Aa(o)&&!Aa(n))return JSON.stringify(A);let a={},I=new Set(o),c=new Set(n);return Object.keys(A).forEach(u=>{(c.size===0&&I.has(u)||I.size===0&&!c.has(u))&&(a[u]=Cc(A[u])||Aa(A[u])?JSON.parse(nl(A[u],{keysToExclude:n,keysToInclude:o})):A[u])}),JSON.stringify(a)}catch{return"{}"}}function ZR(A){let e=arguments.length>1&&arguments[1]!==void 0&&arguments[1],o=[];return Object.keys(A).forEach(n=>{e===A[n]&&o.push(n)}),nl(A,{keysToInclude:o})}function XR(A){return A.replace(/[\u4e00-\u9fa5]/g,"aa").length}var FN=()=>{var A,e,o,n;return(A=window.screen)!=null&&A.orientation?!((n=(o=(e=window.screen)==null?void 0:e.orientation)==null?void 0:o.type)==null||!n.includes("portrait")):window.orientation===0||window.orientation===180},Vf=A=>DA(null,null,function*(){return new Promise((e,o)=>{let n;if(Sr(A))n=new Image,n.crossOrigin="anonymous",n.src=A;else if(n=A,n.complete)return void e(n);n.onload=()=>e(n),n.onerror=()=>{o(new Ct({code:Ge.INVALID_PARAMETER,message:"load image failed, url: ".concat(A)}))}})}),UN=A=>{let e=A.split(".");return+e[0]<<24|+e[1]<<16|+e[2]<<8|+e[3]},$R=A=>(Object.keys(A).forEach(e=>{hr(A[e])&&(e.startsWith("uint")||e.startsWith("int"))?A[e]=Math.floor(A[e]):(Cc(A[e])||Aa(A[e]))&&$R(A[e])}),A);function AC(A,e){return new Promise(o=>{let n=setTimeout(o,A);e&&e(n)})}function ON(A,e){let o=null;return function(){for(var n=arguments.length,a=new Array(n),I=0;Io=null),o)}}function xN(A){return A.replace(/(^|[^:])\/{2,}/g,"$1/")}function YN(A){var e;try{let{width:o,height:n,frameRate:a,sampleRate:I,sampleSize:c,channelCount:u}=(e=A.getSettings)==null?void 0:e.call(A),d=A.kind===fA.AUDIO?"".concat(I,"x").concat(c,"@").concat(u):"".concat(o,"x").concat(n,"@").concat(a),R=A.stats?" stats: ".concat(JSON.stringify(A.stats).replaceAll('"',"")):"";return"".concat(A.id," ").concat(A.readyState," muted:").concat(A.muted," ").concat(A.kind," ").concat(A.label," ").concat(d).concat(R)}catch{return""}}function AM(A,e){return A.width*A.height===e.width*e.height?1:FN()&&e.width>e.height&&A.height>e.width?Math.max(A.width/e.height,A.height/e.width,1):Math.max(A.width/e.width,A.height/e.height,1)}function gu(A){return A===90||A===270}function wO(A){return DA(this,null,function*(){return new Promise((e,o)=>{let n=document.createElement("video");n.crossOrigin="anonymous",n.src=A,n.muted=!0,n.loop=!0,n.playsInline=!0,n.play().then(()=>e(n)),n.onerror=()=>{o(n.error)}})})}function yh(A){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:new WeakMap;if(typeof A!="object"||A===null)return A;if(e.has(A))return e.get(A);if(Array.isArray(A)){let o=[];return e.set(A,o),A.forEach((n,a)=>{o[a]=yh(n,e)}),o}if(Object.prototype.toString.call(A)==="[object Object]"){let o={};return e.set(A,o),Reflect.ownKeys(A).forEach(n=>{o[n]=yh(A[n],e)}),o}return A}var eM=(A=>(A[A.END_REPORT=2001]="END_REPORT",A[A.LOG=2002]="LOG",A[A.KEY_METRIC_REPORT=2003]="KEY_METRIC_REPORT",A))(eM||{});function Iu(A,e,o,n){try{let a=function(I,c,u,d){let R={data:I,random:Math.floor(2147483648*Math.random()),sdkAppId:u};return Ee(d)||(R=fi(bt({},R),{gzip:+d})),{uint32_sdkappid:0,uint64_from_uin:0,uint32_timestamp:0,uint32_seq:0,msg_common_info:{msg_device_info:{enum_device_type:0,str_device_brand:"",str_device_model:"",str_device_board:"",str_device_cpu_abi:""},msg_system_info:{enum_os_type:0,str_os_version:"",msg_network_info:0},msg_network_info:{enum_network_type:0}},msg_report_content:{uint32_type:c,bytes_report_data:JSON.stringify(R)}}}(A,e,o,n);return vN(HR(a),o)}catch{return JSON.stringify(A)}}function qf(A,e){let o=new Uint8Array(A.byteLength+e.byteLength);return o.set(new Uint8Array(A),0),o.set(new Uint8Array(e),A.byteLength),o.buffer}function tM(A){return(65535&A)>>>0}function SO(A){return(4294901760&A)>>>0}function DQ(A){return!!(A&&A instanceof CanvasCaptureMediaStreamTrack&&A.canvas.id.includes("trtc_mix"))}function nq(A){let e=function(o){try{let n={},a=0;n.totalLength=MI(o,a),a+=4,n.version=MI(o,a),a+=4,n.encryption=CO(o,a),a+=1,n.uinType=CO(o,a),a+=1,n.uinLength=MI(o,a),a+=4,n.uin=n.uinLength>4?Qh(o,a,n.uinLength-4):"",a+=n.uinLength-4;let I=o.slice(a);return n.encryption===2?(o=function(c,u){let d=0,R=new Uint8Array(8).fill(0),k=new Uint8Array(c.slice(0,8)),_=iM(k,u),Z=7&_[0],iA=c.length-1-Z-eB-xf,cA=new Uint8Array(iA),TA=0,JA=R,Ie=c.slice(0,8);d=8;let XA=1;XA+=Z;for(let ie=1;ie<=eB;)if(XA<8)XA++,ie++;else if(XA===8){let ke=Rh(c,d,JA,Ie,_,u);JA=ke.ivPreCrypt,Ie=ke.ivCurCrypt,_=ke.debiBuf,d=ke.bufPos,XA=0}let Ft=iA;for(;Ft>0;)if(XA<8)cA[TA++]=_[XA]^JA[XA],XA++,Ft--;else if(XA===8){let ie=Rh(c,d,JA,Ie,_,u);JA=ie.ivPreCrypt,Ie=ie.ivCurCrypt,_=ie.debiBuf,d=ie.bufPos,XA=0}for(let ie=1;ie<=xf;)if(XA<8)_[XA],JA[XA],XA++,ie++;else if(XA===8){if(d>=c.length)break;let ke=Rh(c,d,JA,Ie,_,u);if(!ke.success)break;JA=ke.ivPreCrypt,Ie=ke.ivCurCrypt,_=ke.debiBuf,d=ke.bufPos,XA=0}return cA}(I,new Uint8Array(16).fill(0)),n.decrypted=!0,a=0):(o=I,a=0),n.rspHeadLength=MI(o,a),a+=4,n.seqNo=MI(o,a),a+=4,n.retCode=MI(o,a),a+=4,n.retStrLength=MI(o,a),a+=4,n.retStr=n.retStrLength?Qh(o,a,n.retStrLength-4):"",a+=n.retStrLength-4,n.serviceCmdLength=MI(o,a),a+=4,n.serviceCmd=n.serviceCmdLength?Qh(o,a,n.serviceCmdLength-4):"",a+=n.serviceCmdLength-4,n.cookieLength=MI(o,a),a+=4,n.cookie=n.cookieLength?Qh(o,a,n.cookieLength-4):"",a+=n.cookieLength-4,n.flag=MI(o,a),a+=4,n.busiBuffLength=MI(o,a),a+=4,n.busiBuff=n.busiBuffLength?Qh(o,a,n.busiBuffLength-4):"",a+=n.busiBuffLength-4,n}catch{}}(A);return e?.busiBuff}function iM(A,e){let o=A[0]<<24|A[1]<<16|A[2]<<8|A[3],n=A[4]<<24|A[5]<<16|A[6]<<8|A[7];o>>>=0,n>>>=0;let a=SN*VR>>>0;for(let I=0;I>>5)+e[3],n>>>=0,o-=(n<<4)+e[0]^n+a^(n>>>5)+e[1],o>>>=0,a-=SN,a>>>=0;return new Uint8Array([o>>>24&255,o>>>16&255,o>>>8&255,255&o,n>>>24&255,n>>>16&255,n>>>8&255,255&n])}function Rh(A,e,o,n,a,I){if(e+8>A.length)return{success:!1};let c=new Uint8Array(n),u=A.slice(e,e+8),d=new Uint8Array(8);for(let R=0;R<8;R++)d[R]=a[R]^u[R];return{success:!0,ivPreCrypt:c,ivCurCrypt:u,debiBuf:iM(d,I),bufPos:e+8}}var yQ=typeof TextDecoder<"u"?new TextDecoder:void 0;function cu(A){let{url:e,body:o,method:n="POST",timeout:a,priority:I}=A;return new Promise((c,u)=>{if("fetch"in window)return fetch(e,{method:n,body:o,priority:I}).then(R=>R.clone().json().then(k=>({data:k}),()=>R.arrayBuffer().then(k=>({data:nq(new Uint8Array(k))||(yQ?yQ.decode(k):k)})))).then(c,u);let d=new XMLHttpRequest;d.onreadystatechange=()=>{if(d.readyState===4)if(d.status>=200&&d.status<300)try{let R=JSON.parse(d.response);c({data:R})}catch{c({data:d.response})}else u({status:d.status,statusText:d.statusText||"request failed!"})},d.timeout=a||5e3,d.open(n,e,!0),d.send(o)})}function PN(A){return DA(this,null,function*(){let e=ki(),o=JSON.stringify(A);try{if(!CompressionStream||o.length<=2800)return o;let n=new Blob([o],{type:"application/json"}).stream().pipeThrough(new CompressionStream("gzip")),a=yield(yield(yield new Response(n)).blob()).arrayBuffer();return nA.debug("compressJSON ".concat(o.length," -> ").concat(a.byteLength," ").concat(ki()-e,"ms")),a}catch{return o}})}var vO=Object.prototype.hasOwnProperty,RQ=A=>typeof A=="function",$c=A=>A===void 0,JN=A=>typeof A=="string",NO=A=>typeof A=="boolean",HN=A=>A.isRemote,TO=function(A){if(!A||typeof A!="object"||Object.prototype.toString.call(A)!="[object Object]")return!1;let e=Object.getPrototypeOf(A);if(e===null)return!0;let o=Object.prototype.hasOwnProperty.call(e,"constructor")&&e.constructor;return typeof o=="function"&&o instanceof o&&Function.prototype.toString.call(o)===Function.prototype.toString.call(Object)},Kf=function(A){let{retryFunction:e,settings:o,onError:n,onRetrying:a,onRetryFailed:I,onRetrySuccess:c,context:u}=A;return function(){for(var d=arguments.length,R=new Array(d),k=0;kDA(this,null,function*(){let Ft=u||this;try{let ie=yield e.apply(Ft,R);iA>0&&c&&c.call(this,iA),iA=0,Ie(ie)}catch(ie){let ke=()=>{clearTimeout(cA),iA=0,TA=2,XA(ie)},Nt=()=>{TA!==2&&iA<(RQ(_)?_():_)?(iA++,TA=1,RQ(a)&&a.call(this,iA,ke),cA=window.setTimeout(()=>{cA=-1,JA(Ie,XA)},RQ(Z)?Z(iA):Z)):(ke(),RQ(I)&&I.call(this,ie))};RQ(n)?n.call(this,{error:ie,retry:Nt,reject:XA,retryFuncArgs:R,retriedCount:iA}):Nt()}});return new Promise(JA)}},VN=class qZ{constructor(e){G(this,"_parentPath"),G(this,"userId"),G(this,"remoteUserId"),G(this,"id"),G(this,"sdkAppId"),G(this,"type"),G(this,"isLocal"),this.id=e.id,this.userId=e.userId,this.sdkAppId=e.sdkAppId,this.remoteUserId=e.remoteUserId,this.isLocal=!NO(e.isLocal)||e.isLocal,this.type=this.isLocal?"":e.type}getFullId(){return this._parentPath&&this.id?"".concat(this._parentPath,"-").concat(this.id):this._parentPath?this._parentPath:this.id}createChild(e){let o=new qZ({id:e.id,userId:$c(e.userId)?this.userId:e.userId,sdkAppId:$c(e.sdkAppId)?this.sdkAppId:e.sdkAppId,type:$c(e.type)?this.type:e.type,isLocal:$c(e.isLocal)?this.isLocal:e.isLocal,remoteUserId:$c(e.remoteUserId)?this.remoteUserId:e.remoteUserId});return o.bindParent(this),o}bindParent(e){let o=e.getFullId();this._parentPath!==o&&(this.debug("bind logger parent: ".concat(e.id)),this._parentPath=o,this.userId=e.userId||this.userId,this.sdkAppId=e.sdkAppId||this.sdkAppId)}setUserId(e){this.userId=e}setSdkAppId(e){this.sdkAppId=e}log(e,o){let n=this.isLocal?this.userId:this.remoteUserId,a=this.getFullId();o.unshift("[".concat(this.isLocal?"↑":"↓").concat(this.type&&this.type!=="main"?"*":"").concat(a).concat(n?"|".concat(n):"","]")),nA.log(e,o,$c(this.userId)||function(I){if(I==null)return!0;if(typeof I=="boolean")return!1;if(typeof I=="number")return I===0;if(typeof I=="string"||typeof I=="function"||Array.isArray(I))return I.length===0;if(I instanceof Error)return I.message==="";if(TO(I))switch(Object.prototype.toString.call(I)){case"[object File]":case"[object Map]":case"[object Set]":return I.size===0;case"[object Object]":for(let c in I)if(vO.call(I,c))return!1;return!0}return!1}(this.userId),this.userId,this.sdkAppId)}info(){for(var e=arguments.length,o=new Array(e),n=0;nnM,CHROME_MAJOR_VERSION:()=>tE,CHROME_VERSION:()=>uM,EDGE_VERSION:()=>KN,EDG_MAJOR_VERSION:()=>sM,EDG_VERSION:()=>jN,ELECTRON_MAJOR_VERSION:()=>OO,FIREFOX_MAJOR_VERSION:()=>aM,FIREFOX_VERSION:()=>Wf,HUAWEI_VERSION:()=>rT,IE_VERSION:()=>gq,IOS_MAIN_VERSION:()=>al,IOS_VERSION:()=>$g,IPADQQB_VERSION:()=>$f,IS_ANDROID:()=>ra,IS_ANDROID_WEBVIEW:()=>sT,IS_ANY_SAFARI:()=>TQ,IS_CHROME:()=>BM,IS_CHROME_OS:()=>eT,IS_CHROMIUM_128_TO_143:()=>Gh,IS_CHROMIUM_BASE:()=>Bc,IS_DESKTOP_IOS_CHROME:()=>PO,IS_EDG:()=>wh,IS_EDGE:()=>Mh,IS_ELECTRON:()=>Iq,IS_FIREFOX:()=>Yr,IS_HEADLESS_CHROME:()=>UO,IS_HONOR:()=>oT,IS_HUAWEI:()=>iT,IS_HUAWEIBROWSER:()=>iB,IS_IE:()=>LO,IS_IE8:()=>sq,IS_IOS:()=>Ea,IS_IOS_13_OR_14:()=>YO,IS_IOS_15_1:()=>xO,IS_IOS_CHROME:()=>rm,IS_IPAD:()=>MQ,IS_IPADQQB:()=>EM,IS_IPAD_PRO:()=>rM,IS_IPHONE:()=>wQ,IS_IPOD:()=>_O,IS_LINUX:()=>Nh,IS_LOCAL:()=>GQ,IS_MAC:()=>lu,IS_MACQQB:()=>Xf,IS_MIBROWSER:()=>lM,IS_MQQB:()=>Zf,IS_NATIVE_ANDROID:()=>bO,IS_OLD_ANDROID:()=>aq,IS_OPENHARMONY:()=>Th,IS_OPPOBROWSER:()=>em,IS_SAFARI:()=>Ma,IS_SAFARI_15_1:()=>cq,IS_SAMSUNGBROWSER:()=>Am,IS_SOGOU:()=>IM,IS_SOGOUM:()=>zf,IS_TBS:()=>eE,IS_UCBROWSER:()=>tT,IS_VIVOBROWSER:()=>tm,IS_WECHAT:()=>Eu,IS_WIN:()=>vh,IS_WQQB:()=>cM,IS_WX:()=>FO,IS_X5MQQB:()=>vQ,IS_XWEB:()=>SQ,MACQQB_VERSION:()=>AT,MI_VERSION:()=>NQ,MQQB_VERSION:()=>Sh,OPENHARMONY_VERSION:()=>CM,OPPO_VERSION:()=>aT,SAFARI_VERSION:()=>Cu,SAMSUNG_VERSION:()=>nT,SOGOUM_VERSION:()=>gM,SOGOU_VERSION:()=>WN,TBS_VERSION:()=>zN,UA_DATA_STRING:()=>eC,USER_AGENT:()=>AE,VIVO_VERSION:()=>im,WECHAT_VERSION:()=>XN,WQQB_VERSION:()=>$N,XWEB_VERSION:()=>ZN,browserInfo:()=>uu,getBrowserCoreNumber:()=>pg,getBrowserInfo:()=>IT,getChromeMajorVersion:()=>om,getDeviceModel:()=>Qu,getDeviceModelFromUA:()=>cT,getGPUInfo:()=>kQ,getOSName:()=>Js,getOSNumber:()=>_Q,getOSString:()=>bQ,getOSType:()=>l,getTerminalType:()=>er,getUserAgentData:()=>nm,isAMDGPU:()=>_h,isAppleSiliconGPU:()=>Eq,isLocalStorageEnabled:()=>Bu,isMobile:()=>QM,isNvidiaGPU:()=>JO,isRealIOS:()=>jf,isVersionLargerThan:()=>kh,isVersionSmallerThan:()=>gT});var AE=typeof navigator>"u"?"":navigator.userAgent,Do=A=>new RegExp(A,"i").test(AE),Ra=A=>{if(Do(A)){let e=new RegExp("".concat(A,"\\/([\\d.]+)")),o=AE.match(e);if(o&&o[1])return o[1]}return""},oM=A=>{if(Do(A)){let e=new RegExp("".concat(A,"\\/(\\d+)")),o=AE.match(e);if(o&&o[1])return parseFloat(o[1])}return NaN},qN=/AppleWebKit\/([\d.]+)/i.exec(AE),kO=qN?parseFloat(qN[1]):NaN,MQ=Do("iPad"),rM=typeof navigator<"u"&&navigator.maxTouchPoints&&navigator.maxTouchPoints>2&&Do("Macintosh"),wQ=Do("iPhone")&&!MQ,_O=Do("iPod"),Ea=wQ||MQ||_O||rM,jf=()=>{try{return Ea&&navigator.maxTouchPoints>1&&navigator.vendor.includes("Apple")}catch{return Ea}},ra=Do("Android"),nM=function(){if(ra){let A=AE.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i);if(A){let e=A[1]&&parseFloat(A[1]),o=A[2]&&parseFloat(A[2]);if(e&&o)return parseFloat("".concat(A[1],".").concat(A[2]));if(e)return e}}return NaN}(),aq=ra&&Do("webkit")&&nM<2.3,bO=ra&&nM<5&&kO<537,Yr=Do("Firefox"),Wf=Ra("Firefox"),aM=oM("Firefox"),Mh=Do("Edge"),KN=Ra("Edge"),wh=Do("Edg"),jN=Ra("Edg"),sM=oM("Edg"),zf=Do("SogouMobileBrowser"),gM=Ra("SogouMobileBrowser"),IM=Do("MetaSr\\s"),WN=Ra("MetaSr\\s"),eE=Do("TBS"),zN=Ra("TBS"),SQ=Do("XWEB"),ZN=Ra("XWEB"),sq=Do("MSIE\\s8\\.0"),LO=Do("MSIE\\/\\d+"),gq=function(){if(LO){let A=/MSIE\s(\d+)\.\d/.exec(AE),e=A&&parseFloat(A[1]);return!e&&/Trident\/7.0/i.test(AE)&&/rv:11.0/.test(AE)&&(e=11),e}return NaN}(),Eu=Do("(micromessenger|webbrowser)"),XN=Ra("MicroMessenger"),vQ=!eE&&Do("MQQBrowser")&&Do("COVC"),Zf=!eE&&Do("MQQBrowser")&&!Do("COVC"),Sh=Zf||vQ?Ra("MQQBrowser"):"",cM=!eE&&Do(" QQBrowser"),$N=Ra(" QQBrowser"),Xf=!eE&&Do("QQBrowserLite"),AT=Ra("QQBrowserLite"),EM=!eE&&Do("MQBHD"),$f=Ra("MQBHD"),vh=Do("Windows"),lu=!Ea&&Do("MAC OS X"),Nh=!ra&&Do("Linux"),eT=Do("CrOS"),FO=Do("MicroMessenger"),tT=Do("UCBrowser"),Iq=Do("Electron"),lM=Do("MiuiBrowser"),NQ=Ra("MiuiBrowser"),iB=Do("HuaweiBrowser"),iT=Do("Huawei")||Do("HUAWEI"),oT=Do("Honor")||Do("HONOR"),rT=Ra("HuaweiBrowser"),Am=Do("SamsungBrowser"),nT=Ra("SamsungBrowser"),em=Do("HeyTapBrowser"),aT=Ra("HeyTapBrowser"),tm=Do("VivoBrowser"),im=Ra("VivoBrowser"),Th=Do("OpenHarmony"),CM=Ra("OpenHarmony"),om=()=>oM("Chrome"),rm=Do("CriOS"),Bc=Do("Chrome"),BM=!Mh&&!IM&&!zf&&!eE&&!SQ&&!wh&&!cM&&!lM&&!iB&&!Am&&!em&&!tm&&Bc,UO=Do("HeadlessChrome"),tE=om(),Gh=Bc&&tE>=128&&tE<=143,uM=Ra("Chrome"),OO=oM("Electron"),Ma=!Bc&&!Zf&&!vQ&&!Xf&&!EM&&Do("Safari"),TQ=Ma||Ea,Cu=Ra("Version"),sT=/Android.*(wv|.0.0.0)/.test(AE),$g=(()=>{if(rM)return Cu;if(Ea){let A=AE.match(/OS (\d+)_(\d+)/i);if(A&&A[1]){let e=A[1];return A[2]&&(e+=".".concat(A[2])),e}}return""})();function gT(A,e){let o=A.split(".").map(a=>Number(a)),n=e.split(".").map(a=>Number(a));for(let a=0;ac)return!1}return!1}function kh(A,e){let o=arguments.length>2&&arguments[2]!==void 0&&arguments[2],n=A.split(".").map(I=>Number(I)),a=e.split(".").map(I=>Number(I));for(let I=0;Iu)return!0;if(c{let A=Number($g.split(".")[0]);return A===14||A===13})(),PO=rm&&Cu==="11.1.1",GQ=typeof location<"u"&&(location.protocol==="file:"||location.hostname==="localhost"||location.hostname==="127.0.0.1"),Bu=(()=>{let A;return()=>{if(A===void 0)try{A=!!window.localStorage}catch{A=!1}return A}})(),uu=IT();function IT(){let A=new Map([[Yr,["Firefox",Wf]],[wh,["Edg",jN]],[BM,["Chrome",uM]],[rm,["ChiOS",Ra("CriOS")]],[Ma&&!rm,["Safari",Cu]],[eE,["TBS",zN]],[SQ,["XWEB",ZN]],[Eu&&wQ,["WeChat",XN]],[cM,["QQ(Win)",$N]],[Zf,["QQ(Mobile)",Sh]],[vQ,["QQ(Mobile X5)",Sh]],[Xf,["QQ(Mac)",AT]],[EM,["QQ(iPad)",$f]],[lM,["MI",NQ]],[iB,["HW",rT]],[Am,["Samsung",nT]],[em,["OPPO",aT]],[tm,["VIVO",im]],[Mh,["EDGE",KN]],[zf,["SogouMobile",gM]],[IM,["Sogou",WN]]]),e="unknown",o="unknown";return A.has(!0)&&([e,o]=A.get(!0)),{name:e,version:o}}var Bn=null;function QM(){return Bn&&typeof Bn.mobile=="boolean"?Bn.mobile:ra||Ea||wQ||MQ||Th}var eC="";function nm(){return DA(this,null,function*(){if(Bn)return Bn;if(!navigator.userAgentData||typeof navigator.userAgentData.getHighEntropyValues!="function")return null;try{return(Bn=yield navigator.userAgentData.getHighEntropyValues(["architecture","bitness","model","platformVersion","fullVersionList"]))&&!eC&&(eC="UAData: ".concat(Bn.platform,"/").concat(Bn.platformVersion),Bn.architecture&&Bn.bitness&&(eC+=" ".concat(Bn.architecture,"/").concat(Bn.bitness)),Bn.mobile&&(eC+=" mobile"),Bn.model&&(eC+=" model: ".concat(Bn.model.replace(/\s+/g,"/"))),Bn.fullVersionList&&(eC+=" ".concat(Bn.fullVersionList.filter(A=>A.brand!=="Not/A)Brand").map(A=>"".concat(A.brand,"/").concat(A.version)).join(",")))),Bn}catch{return null}})}var am="";function kQ(){try{if(am)return am;let A=document.createElement("canvas"),e=A.getContext("webgl")||A.getContext("experimental-webgl");if(!e)return"";let o=e.getExtension("WEBGL_debug_renderer_info");if(o){let n=e.getParameter(o.UNMASKED_VENDOR_WEBGL),a=e.getParameter(o.UNMASKED_RENDERER_WEBGL);return am="".concat(n," ").concat(a)}return""}catch{return""}}function _h(){try{let A=kQ();return A.includes("AMD")||A.includes("ATI")}catch{return!1}}function JO(){try{let A=kQ();return A.includes("NVIDIA")||A.includes("GeForce")}catch{return!1}}function Eq(){try{return kQ().includes("Apple M")}catch{return!1}}function Qu(){return Bn?.model||cT()||""}function cT(){let A=AE.match(/;\s*([^;)]+)\s+Build\//);return A!=null&&A[1]?A[1].trim():null}var HO=new Map([[ra,"Android"],[Ea,"iOS"],[vh,"Windows"],[lu,"MacOS"],[Nh,"Linux"],[eT,"ChromeOS"]]),Js=function(){return HO.get(!0)?HO.get(!0):Bn?Bn.platform:"unknown"};function _Q(){return vh?1:ra?2:lu?3:Ea?4:Nh?5:eT?6:Th?7:0}function pg(){return Eu||SQ?4:Bc?1:Ma?2:Yr?3:0}var bQ=()=>{let A=Js();return Bn!=null&&Bn.platformVersion?A+="/".concat(Bn.platformVersion):Ea?A+="/".concat($g):ra&&(A+="/".concat(nM)),A+="/".concat(uu.name,"/").concat(Ma&&!rm?uu.version:uu.version.split(".")[0]),Bn!=null&&Bn.architecture&&(A+="/".concat(Bn.architecture)),A};function er(){return ra?4:wQ?2:MQ?3:lu?12:vh?5:Nh?13:Th?22:1}function l(){return ra?"Android":wQ?"iPhone":MQ?"iPad":lu?"Mac":vh?"Windows":Nh?"Linux":"unknown"}var p,S=new(es(hg(),1)).default,H=((p=H||{}).ROOM_DESTROY="1",p.JOIN_START="21",p.JOIN_SCHEDULE_SUCCESS="22",p.JOIN_SIGNAL_CONNECTION_START="23",p.JOIN_SIGNAL_CONNECTION_END="24",p.JOIN_SEND_CMD="25",p.JOIN_RECEIVED_CMD_RES="26",p.JOIN_SUCCESS="27",p.JOIN_FAILED="28",p.LEAVE_START="51",p.LEAVE_SEND_CMD="52",p.LEAVE_SUCCESS="53",p.PUBLISH_START="61",p.SEND_FIRST_VIDEO_FRAME="62",p.PUBLISH_FAILED="63",p.SUBSCRIBE_START="81",p.SUBSCRIBE_SUCCESS="82",p.SUBSCRIBE_FAILED="84",p.UNSUBSCRIBE_SUCCESS="83",p.LOCAL_TRACK_CAPTURE_START="101",p.LOCAL_TRACK_CAPTURE_SUCCESS="102",p.LOCAL_TRACK_CAPTURE_FAILED="103",p.LOCAL_TRACK_PUBLISHED="104",p.LOCAL_TRACK_UNPUBLISHED="105",p.LOCAL_TRACK_REPLACED="106",p.SWITCH_DEVICE_SUCCESS="107",p.TRACK_MUTED="108",p.TRACK_UNMUTED="109",p.REMOTE_TRACK_SUBSCRIBED="110",p.REMOTE_TRACK_UNSUBSCRIBED="111",p.LOCAL_TRACK_RECAPTURE="112",p.LOCAL_AUDIO_STARTED="113",p.LOCAL_AUDIO_STOPPED="114",p.REMOTE_AUDIO_STARTED="115",p.REMOTE_AUDIO_STOPPED="116",p.LOCAL_TRACK_STOPPED="117",p.LOCAL_VIDEO_TRACK_PREPROCESSED="118",p.PLAY_TRACK_START="151",p.PLAYER_STATE_CHANGED="152",p.VIDEO_LOADED_DATA="153",p.AUTOPLAY_DIALOG_CLICK_CONFIRM="154",p.AUDIO_CONTEXT_LONG_SUSPENDED="155",p.REMOTE_VIDEO_PLAY_START="156",p.REMOTE_VIDEO_PLAY_FINISH="157",p.SIGNAL_CONNECTION_STATE_CHANGED="201",p.PEER_CONNECTION_STATE_CHANGED="202",p.SINGLE_CONNECTION_STAT="203",p.SPC_RECONNECTED="204",p.HEARTBEAT_REPORT="251",p.RECEIVED_PUBLISHED_USER_LIST="252",p.REMOTE_PUBLISH_STATE_CHANGED="253",p.AUDIO_LEVEL_INTERVAL="260",p.NETWORK_QUALITY="261",p.VIDEO_CODEC_IMPLEMENTATION_CHANGED="262",p.QUALITY_LIMITATION_CHANGED="263",p.LOG="264",p.AUDIO_PROCESSOR_DEBUG="265",p.SSO_SWITCH="266",p.SEI_MESSAGE="267",p.USER_PAUSE_IN_PIP="268",p.USER_RESUME_IN_PIP="269",p.ENTER_PICTURE_IN_PICTURE="270",p.LEAVE_PICTURE_IN_PICTURE="271",p.SWITCH_ROOM_START="401",p.SWITCH_ROOM_SUCCESS="407",p.SWITCH_ROOM_FAILED="408",p),K=H,lA=new class{constructor(){G(this,"enable",!1),G(this,"ssoFailCount",0),S.on("22",A=>{let{schedule:e}=A;var o;(o=e?.config)!=null&&o.sso&&S.emit("266",{enable:!0})}),S.on("266",A=>{let{enable:e}=A;this.enable=e})}handleUploadFailed(){this.ssoFailCount++,this.ssoFailCount>3&&S.emit("266",{enable:!1})}},SA=class KZ{constructor(){G(this,"_isEnableUploadLog",!0),G(this,"_localJoinedUser",new Map),G(this,"_queue",[]),G(this,"_timeoutId",-1),G(this,"_logLevel",1),G(this,"_logLevelToUpload",2),!SR&&!vR&&(this.checkURLParam(),this.installEvents())}get isAbleToUpload(){return this._isEnableUploadLog&&this._timeoutId!==-1}installEvents(){S.on(K.JOIN_SCHEDULE_SUCCESS,e=>{let{schedule:o}=e;var n;(n=o?.config)!=null&&n.logLevelToUpload&&ru[o.config.logLevelToUpload]&&(this._logLevelToUpload=o.config.logLevelToUpload)}),S.on(K.JOIN_START,e=>{let{params:o}=e;this.addJoinedUser({userId:o.userId,sdkAppId:o.sdkAppId}),this.startUpload()}),S.on(K.LEAVE_SUCCESS,e=>{let{room:o}=e;this.deleteJoinedUser(o.userId)})}startUpload(){this._timeoutId===-1&&this.uploadInterval()}addJoinedUser(e){this._localJoinedUser.set(e.userId,e),this.startUpload()}deleteJoinedUser(e){this._localJoinedUser.delete(e)}uploadInterval(){this.upload().catch(()=>{}),this._timeoutId=window.setTimeout(()=>this.uploadInterval(),5e3)}getLogsToUpload(){let e={map:new Map,splicedQueue:[]};if(this._queue[0].forAllJoinedClients&&this._localJoinedUser.size===0)return e;let o=0;for(;o{let{userId:I,sdkAppId:c}=a;e.map.has(I)?e.map.get(I).logs.push(n):e.map.set(I,{userId:I,sdkAppId:c,logs:[n]})});else if(Sr(n.userId)&&hr(n.sdkAppId)){let{userId:a,sdkAppId:I}=n;e.map.has(a)?e.map.get(a).logs.push(n):e.map.set(a,{userId:a,sdkAppId:I,logs:[n]})}}return e.map.size>0&&(e.splicedQueue=this._queue.splice(0,o)),e}upload(){return DA(this,null,function*(){if(this._queue.length===0||!this._isEnableUploadLog)return;let{map:e,splicedQueue:o}=this.getLogsToUpload();if(e.size===0)return;try{let a=[...e.values()];for(let I=0;IZ.log).join(` +`)},k=JSON.stringify(R),_=lA.enable?Iu(R,2002,u):k;yield this.uploadLogWithRetry(_,u,_ instanceof Uint8Array,k),d.forEach(Z=>Z.uploaded=!0)}}catch{}let n=o.filter(a=>!a.uploaded);n.length>0&&(this._queue=n.concat(this._queue))})}uploadLogWithRetry(e,o,n,a){return Kf({retryFunction:()=>cu({url:dh(o,Xg.LOG),body:e,timeout:5e3,priority:"low"}).then(I=>{n&&I.data!=="ok"&&(lA.handleUploadFailed(),this.uploadLogWithRetry(a,o,!1,a))}),settings:{retries:3,timeout:2e3},onError:I=>{let{retry:c}=I;c()}})()}getPrefix(e){let o=new Date;return o.setTime(gh()),"[".concat(lN(o),"] <").concat(ru[e],">")}getLogLevel(){return this._logLevel}setLogLevel(e){Ee(ru[e])||(this._logLevel!==e&&this.info("setLogLevel",e),this._logLevel=e)}enableUploadLog(){this._isEnableUploadLog=!0}disableUploadLog(){this.warn("disableUploadLog"),this._isEnableUploadLog=!1}logChunkToString(e){if(Sr(e))return e;try{return e instanceof Error?e.toString():JSON.stringify(e)}catch{return""}}addLogToQueue(e,o){let n=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],a=arguments.length>3?arguments[3]:void 0,I=arguments.length>4?arguments[4]:void 0,c={log:o.reduce((u,d)=>"".concat(u," ").concat(this.logChunkToString(d)).trim(),""),level:e,userId:a,sdkAppId:I,forAllJoinedClients:n};S.emit(K.LOG,{log:c}),this._isEnableUploadLog&&e>=this._logLevelToUpload&&this._queue.push(c)}log(e,o){let n=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],a=arguments.length>3?arguments[3]:void 0,I=arguments.length>4?arguments[4]:void 0;var c;if(o.unshift(this.getPrefix(e)),this.addLogToQueue(e,o,n,a,I),e{let e=16*Math.random()|0;return(A=="x"?e:3&e|8).toString(16)})},yA=new class{constructor(){G(this,"_prefix","TRTC"),G(this,"_queue",new Map)}getRealKey(A){return"".concat(this._prefix,"_").concat(A)}checkStorage(){Bu()&&(setInterval(this.doFlush.bind(this),2e4),Object.keys(localStorage).filter(A=>{if(A.startsWith(this._prefix))try{let e=localStorage.getItem(A);if(!e)return!1;let o=JSON.parse(e);if(o&&o.expiresInlocalStorage.removeItem(A)))}doFlush(){if(Bu())try{for(let[A,e]of this._queue)localStorage.setItem(A,JSON.stringify(e))}catch(A){nA.warn(A)}}getItem(A){if(!Bu())return null;try{let e=localStorage.getItem(this.getRealKey(A));if(!e)return null;let o=JSON.parse(e);return o&&o.expiresIn>=Date.now()?o.value:null}catch(e){nA.warn(e)}}setItem(A,e){if(Bu())try{let o={expiresIn:Date.now()+GR,value:e};this._queue.set(this.getRealKey(A),o)}catch(o){nA.warn(o)}}deleteItem(A){if(!Bu())return!1;try{return A=this.getRealKey(A),this._queue.delete(A),localStorage.removeItem(A),!0}catch(e){return nA.warn(e),!1}}clear(){if(Bu())try{localStorage.clear()}catch(A){nA.warn(A)}}},kA={};XC(kA,{HTTPS_API:()=>MT,IS_GET_CAPABILITIES_FROM_INPUTDEVICE_SUPPORTED:()=>Ax,IS_GET_CAPABILITIES_SUPPORTED:()=>$O,IS_GET_SETTINGS_SUPPORTED:()=>Jh,IS_GET_SYNCHRONIZATION_SOURCES_SUPPORTED:()=>GT,IS_INSERTABLE_STREAM_SUPPORTED:()=>xQ,IS_JITTER_BUFFER_TARGET_SUPPORTED:()=>Du,IS_RTC_RTP_SENDER_SUPPORTED:()=>tC,IS_SCRIPT_TRANSFORM_SUPPORTED:()=>MM,IS_SEI_SUPPORTED:()=>kT,IS_SPC_SUPPORTED:()=>Qm,basis:()=>tx,capabilityCheck:()=>LT,checkSystemRequirementsInternal:()=>yT,decodeSupportStatus:()=>DT,detectH264SupportedByFakeStreaming:()=>ZO,detectVideoCodecCapabilities:()=>hm,detectVideoDecoderCapabilities:()=>UT,detectVideoEncoderCapabilities:()=>FT,encodeSupportStatus:()=>lm,getBrowserInfo:()=>cm,getDisplayResolution:()=>rE,getH264ProfileLevelIds:()=>rx,isAddTransceiverSupported:()=>sl,isBrowserSupported:()=>fT,isCanvasCaptureStreamAPISupported:()=>Bm,isCanvasSmallStreamSupported:()=>RM,isGetReceiversSupported:()=>Ph,isGetSendersSupported:()=>AI,isGetTransceiversSupported:()=>mu,isGetUserMediaSupported:()=>wT,isMediaDevicesSupported:()=>mT,isMediaSessionSupported:()=>ex,isMediaStreamTrackGeneratorSupported:()=>Bq,isMediaStreamTrackProcessorSupported:()=>Em,isReplaceTrackSupported:()=>XO,isRequestVideoFrameCallbackSupported:()=>YQ,isSIMDSupported:()=>dm,isScaleResolutionDownBySupported:()=>vT,isScreenCaptureApiAvailable:()=>OQ,isSelectedCandidatePair:()=>Cm,isSetParametersSupported:()=>TT,isSetSinkIdSupported:()=>Qq,isSmallStreamSupported:()=>um,isStopTransceiverSupported:()=>vn,isTRTCSupported:()=>uq,isUnifiedPlanDefault:()=>NT,isUsedInHttpProtocol:()=>wI,isWebAudioSupported:()=>ST,isWebCodecSupported:()=>wM,isWebCodecsSupported:()=>yM,isWebRTCSupported:()=>Hh,isWebTransportSupported:()=>Vh});var oe={};XC(oe,{AUDIO_LEVEL_SCALE:()=>iE,AlphaStitchingType:()=>Oh,AudioCodecPipelineType:()=>fu,AudioDecoderDowngradeState:()=>sm,AudioPlayerMode:()=>pM,AudioType:()=>VO,BASIC_TYPE:()=>uT,BannedReason:()=>wa,CONNECTION_CLOSED_REASON:()=>it,CheckPermissionType:()=>Hr,ClientEvent:()=>de,CodecType:()=>gm,ConnectionEvent:()=>Li,ConnectionState:()=>bh,DECODE_FAILED_ERROR_CODE:()=>Im,DenoiserMode:()=>LQ,DeviceType:()=>QT,FacingMode:()=>lT,FrameWorkType:()=>ni,LeaveReason:()=>CT,LocalTrackEvent:()=>Ri,MULTI_VIDEO_DATA_TYPE:()=>Uh,MediaType:()=>dM,MediaTypeLabel:()=>lq,MonitorEventId:()=>Hs,MutedFlag:()=>br,NetworkQualityValue:()=>uc,PlayerState:()=>ui,ReceiveMode:()=>fg,RemoteStreamType:()=>Fh,RemoteTrackEvent:()=>tr,RoomEvent:()=>ci,SMALL_MODE:()=>UQ,SceneNumber:()=>na,StreamEvent:()=>xt,StreamType:()=>pu,SubscribeMediaType:()=>BT,TIMER_TYPE:()=>mM,TRACK_ACTION:()=>ET,TRACK_KIND:()=>du,TrackEvent:()=>Fi,UserRole:()=>ws,UserRoleNumber:()=>zi,VideoCodec:()=>Vs,VideoCodecPipelineType:()=>FQ,VideoContentHint:()=>fM,VideoDecoderDowngradeState:()=>Lh,VideoPlayerMode:()=>hM,VideoType:()=>hu});var ee,PA,ve,dt,fe,Be,tA,Le,he,Zt,pt,ni=(A=>(A[A.WEBRTC=30]="WEBRTC",A[A.WASM=37]="WASM",A))(ni||{}),Li=((pt=Li||{}).TRACK_ADDED="track-added",pt.TRACK_UPDATED="track-updated",pt.TRACK_SUBSCRIBED="track-subscribed",pt.STREAM_ADDED="stream-added",pt.STREAM_REMOVED="stream-removed",pt.STREAM_UPDATED="stream-updated",pt.STREAM_PUBLISHED="stream-published",pt.STREAM_SUBSCRIBED="stream-subscribed",pt.STREAM_UNSUBSCRIBED="stream-unsubscribed",pt.STATE_CHANGED="state-changed",pt.ERROR="error",pt.CONNECTION_STATE_CHANGED="connection-state-changed",pt.FIREWALL_RESTRICTION="firewall-restriction",pt.SEI_MESSAGE="sei-message",pt.CLOSED="closed",pt),it=(A=>(A.REMOTE_LEAVE="remote user exitRoom",A.REMOTE_UNPUBLISH="remote user unpublished",A.LOCAL_LEAVE="you exitRoom",A.LOCAL_UNPUBLISH="you unpublished",A.LOCAL_UNSUBSCRIBE="you unsubscribed",A.SWITCH_ROLE="you switch role to audience",A))(it||{}),de=((Zt=de||{}).STREAM_ADDED="stream-added",Zt.STREAM_REMOVED="stream-removed",Zt.STREAM_UPDATED="stream-updated",Zt.STREAM_SUBSCRIBED="stream-subscribed",Zt.CONNECTION_STATE_CHANGED="connection-state-changed",Zt.PEER_JOIN="peer-join",Zt.PEER_LEAVE="peer-leave",Zt.MUTE_AUDIO="mute-audio",Zt.MUTE_VIDEO="mute-video",Zt.UNMUTE_AUDIO="unmute-audio",Zt.UNMUTE_VIDEO="unmute-video",Zt.CLIENT_BANNED="client-banned",Zt.NETWORK_QUALITY="network-quality",Zt.AUDIO_VOLUME="audio-volume",Zt.SEI_MESSAGE="sei-message",Zt.ERROR="error",Zt),xt=((he=xt||{}).PLAYER_STATE_CHANGED="player-state-changed",he.SCREEN_SHARING_STOPPED="screen-sharing-stopped",he.CONNECTION_STATE_CHANGED="connection-state-changed",he.DEVICE_AUTO_RECOVERED="device-auto-recovered",he.ERROR="error",he),Ri=((Le=Ri||{}).DEVICE_AUTO_RECOVERED="1",Le.DEVICE_RECOVER_FAILED="5",Le.DEVICE_CHANGED="2",Le.ERROR="3",Le.PUBLISH_STATE_CHANGED="4",Le.ENCODE_FAILED="6",Le.TRACK_ENDED="7",Le.RENDER="render",Le),ui=(A=>(A.PAUSED="PAUSED",A.PLAYING="PLAYING",A.STOPPED="STOPPED",A))(ui||{}),ci=((tA=ci||{}).PEER_JOIN="peer-join",tA.PEER_LEAVE="peer-leave",tA.SIGNAL_CONNECTION_STATE_CHANGED="signal-connection-state-changed",tA.MEDIA_CONNECTION_STATE_CHANGED="media-connection-state-changed",tA.BANNED="banned",tA.NETWORK_QUALITY="network-quality",tA.AUDIO_VOLUME="audio-volume",tA.SEI_MESSAGE="sei-message",tA.ERROR="error",tA.REMOTE_PUBLISH_STATE_CHANGED="remote-publish-state-changed",tA.REMOTE_PUBLISHED="remote-published",tA.REMOTE_UNPUBLISHED="remote-unpublished",tA.FIREWALL_RESTRICTION="firewall-restriction",tA.HEARTBEAT_REPORT="heartbeat-report",tA.CUSTOM_MESSAGE="custom-message",tA.LAYER_DATA="layerData",tA.FIRST_VIDEO_FRAME="first-video-frame",tA.FIRST_FRAME_RENDER="first-frame-render",tA.DUMP="dump",tA.AUDIO_FRAME="audio-frame",tA.SUBSCRIBE_SMALL_VIDEO_CHANGED="subscribe-small-video-changed",tA.LOCAL_PUBLISH_FLAG_CHANGED="local-publish-flag-changed",tA.NTP_TIME_UPDATED="ntp-time-updated",tA.DATA_CHANNEL_MESSAGE="data-channel-message",tA.ASR_ROBOT_PEER_JOIN="asr-robot-peer-join",tA.ASR_ROBOT_PEER_LEAVE="asr-robot-peer-leave",tA),Fi=((Be=Fi||{}).PLAYER_STATE_CHANGED="player-state-changed",Be.MUTE="mute",Be.UNMUTE="unmute",Be.ERROR="error",Be.INPUT_MEDIA_TRACK_CHANGED="input-media-track-changed",Be.OUTPUT_MEDIA_TRACK_CHANGED="output-media-track-changed",Be.FIRST_VIDEO_FRAME="first-video-frame",Be.FIRST_FRAME_RENDER="first-frame-render",Be.VIDEO_SIZE_CHANGED="video-size-changed",Be),tr=(A=>(A.DECODE_FAILED="decode-failed",A.DECODE_FAILED_DURING_CALL="decode-failed-during-call",A.DECODE_DOWNGRADE_STATE_CHANGED="decode-downgrade-state-changed",A.REMOTE_PUBLISH_CHANGED="remote-publish-changed",A.AUDIO_FRAME_WITH_NTP="audio-frame-with-ntp",A))(tr||{}),br=((fe=br||{})[fe.VIDEO=1]="VIDEO",fe[fe.SMALL=2]="SMALL",fe[fe.AUX=4]="AUX",fe[fe.AUDIO=8]="AUDIO",fe[fe.VIDEO_MUTE=16]="VIDEO_MUTE",fe[fe.AUX_MUTE=32]="AUX_MUTE",fe[fe.AUDIO_MUTE=64]="AUDIO_MUTE",fe),na=(A=>(A[A.RTC=1]="RTC",A[A.LIVE=2]="LIVE",A))(na||{}),zi=(A=>(A[A.ANCHOR=20]="ANCHOR",A[A.AUDIENCE=21]="AUDIENCE",A))(zi||{}),ws=(A=>(A.ANCHOR="anchor",A.AUDIENCE="audience",A))(ws||{}),bh=(A=>(A.CONNECTED="CONNECTED",A.DISCONNECTED="DISCONNECTED",A.CONNECTING="CONNECTING",A.RECONNECTED="RECONNECTED",A.RECONNECTING="RECONNECTING",A))(bh||{}),sm=((dt=sm||{}).INITIALIZED="INITIALIZED",dt.STARTING="STARTING",dt.STARTED="STARTED",dt.FAILED="FAILED",dt),Lh=(A=>(A.INITIALIZED="INITIALIZED",A.STARTING="STARTING",A.STARTED="STARTED",A.FAILED="FAILED",A))(Lh||{}),du=(A=>(A.AUDIO="audio",A.VIDEO="video",A.AUXILIARY="auxVideo",A))(du||{}),ET=(A=>(A.ADD="add",A.REMOVE="remove",A))(ET||{}),dM=(A=>(A[A.NULL=0]="NULL",A[A.AUDIO=1]="AUDIO",A[A.AUX_VIDEO=2]="AUX_VIDEO",A[A.BIG_VIDEO=4]="BIG_VIDEO",A[A.SMALL_VIDEO=8]="SMALL_VIDEO",A))(dM||{}),lq={1:"audio",2:"auxVideo",4:"video"},VO=((ve=VO||{})[ve.opus=111]="opus",ve),hu=(A=>(A[A.h264=100]="h264",A[A.vp8=101]="vp8",A))(hu||{}),pu=(A=>(A.Big="big",A.Small="small",A))(pu||{}),Fh=(A=>(A.Main="main",A.Aux="auxiliary",A))(Fh||{}),Uh=(A=>(A[A.MULTI_DATA_AUDIO=1]="MULTI_DATA_AUDIO",A[A.MULTI_DATA_BIG_IMG=2]="MULTI_DATA_BIG_IMG",A[A.MULTI_DATA_SMALL_IMG=3]="MULTI_DATA_SMALL_IMG",A[A.MULTI_DATA_AUX_IMG=7]="MULTI_DATA_AUX_IMG",A[A.MULTI_DATA_TYPE_BUTT=12]="MULTI_DATA_TYPE_BUTT",A))(Uh||{}),Hs=((PA=Hs||{})[PA.PUBLISH_VIDEO=32768]="PUBLISH_VIDEO",PA[PA.PUBLISH_AUDIO=32769]="PUBLISH_AUDIO",PA[PA.UNPUBLISH_VIDEO=32770]="UNPUBLISH_VIDEO",PA[PA.UNPUBLISH_AUDIO=32771]="UNPUBLISH_AUDIO",PA[PA.MUTE_AUDIO=32772]="MUTE_AUDIO",PA[PA.MUTE_VIDEO=32773]="MUTE_VIDEO",PA[PA.UNMUTE_AUDIO=32774]="UNMUTE_AUDIO",PA[PA.UNMUTE_VIDEO=32775]="UNMUTE_VIDEO",PA[PA.SUBSCRIBE_VIDEO=32776]="SUBSCRIBE_VIDEO",PA[PA.SUBSCRIBE_AUDIO=32777]="SUBSCRIBE_AUDIO",PA[PA.UNSUBSCRIBE_VIDEO=32778]="UNSUBSCRIBE_VIDEO",PA[PA.UNSUBSCRIBE_AUDIO=32779]="UNSUBSCRIBE_AUDIO",PA[PA.SWITCH_CAMERA=32780]="SWITCH_CAMERA",PA[PA.SWITCH_MICROPHONE=32781]="SWITCH_MICROPHONE",PA[PA.REPLACE_VIDEO=32782]="REPLACE_VIDEO",PA[PA.REPLACE_AUDIO=32783]="REPLACE_AUDIO",PA[PA.MUTE_REMOTE_VIDEO=32784]="MUTE_REMOTE_VIDEO",PA[PA.MUTE_REMOTE_AUDIO=32785]="MUTE_REMOTE_AUDIO",PA[PA.UNMUTE_REMOTE_VIDEO=32786]="UNMUTE_REMOTE_VIDEO",PA[PA.UNMUTE_REMOTE_AUDIO=32787]="UNMUTE_REMOTE_AUDIO",PA[PA.JOIN=32788]="JOIN",PA[PA.LEAVE=32789]="LEAVE",PA[PA.SIGNAL_DISCONNECTED=32790]="SIGNAL_DISCONNECTED",PA[PA.SIGNAL_CONNECTED=32791]="SIGNAL_CONNECTED",PA[PA.TRANSPORT_UPLINK_CONNECTED=32792]="TRANSPORT_UPLINK_CONNECTED",PA[PA.TRANSPORT_DOWNLINK_CONNECTED=32793]="TRANSPORT_DOWNLINK_CONNECTED",PA[PA.SIGNAl_RECONNECTING=32794]="SIGNAl_RECONNECTING",PA[PA.SIGNAL_RECONNECT_SUCCESS=32795]="SIGNAL_RECONNECT_SUCCESS",PA[PA.SIGNAL_RECONNECT_FAIL=32796]="SIGNAL_RECONNECT_FAIL",PA[PA.TRANSPORT_UPLINK_RECONNECTING=32797]="TRANSPORT_UPLINK_RECONNECTING",PA[PA.TRANSPORT_UPLINK_RECONNECT_SUCCESS=32798]="TRANSPORT_UPLINK_RECONNECT_SUCCESS",PA[PA.TRANSPORT_UPLINK_RECONNECT_FAIL=32799]="TRANSPORT_UPLINK_RECONNECT_FAIL",PA[PA.TRANSPORT_DOWNLINK_RECONNECTING=32800]="TRANSPORT_DOWNLINK_RECONNECTING",PA[PA.TRANSPORT_DOWNLINK_RECONNECT_SUCCESS=32801]="TRANSPORT_DOWNLINK_RECONNECT_SUCCESS",PA[PA.TRANSPORT_DOWNLINK_RECONNECT_FAIL=32802]="TRANSPORT_DOWNLINK_RECONNECT_FAIL",PA[PA.SUBSCRIBE_SMALL_VIDEO=32803]="SUBSCRIBE_SMALL_VIDEO",PA[PA.UNSUBSCRIBE_SMALL_VIDEO=32804]="UNSUBSCRIBE_SMALL_VIDEO",PA[PA.PUBLISH_AUX=32805]="PUBLISH_AUX",PA[PA.UNPUBLISH_AUX=32806]="UNPUBLISH_AUX",PA[PA.DEVICE_CAPTURE=2003]="DEVICE_CAPTURE",PA[PA.VIDEO_ENCODER=4004]="VIDEO_ENCODER",PA[PA.VIDEO_DECODER=4005]="VIDEO_DECODER",PA),uc=(A=>(A[A.UNKNOWN=0]="UNKNOWN",A[A.EXCELLENT=1]="EXCELLENT",A[A.GOOD=2]="GOOD",A[A.POOR=3]="POOR",A[A.BAD=4]="BAD",A[A.VERY_BAD=5]="VERY_BAD",A[A.DISCONNECTED=6]="DISCONNECTED",A))(uc||{}),fg=(A=>(A[A.MANUAL=0]="MANUAL",A[A.AUTO_AUDIO=1]="AUTO_AUDIO",A[A.AUTO_VIDEO=2]="AUTO_VIDEO",A[A.AUTO_ALL=3]="AUTO_ALL",A))(fg||{}),lT=(A=>(A.user="user",A.environment="environment",A))(lT||{}),hM=(A=>(A[A.ELEMENT=0]="ELEMENT",A[A.CANVAS_FROM_ELEMENT=1]="CANVAS_FROM_ELEMENT",A[A.CANVAS_WITHOUT_ELEMENT=2]="CANVAS_WITHOUT_ELEMENT",A))(hM||{}),pM=(A=>(A[A.ELEMENT=0]="ELEMENT",A[A.CONTEXT=1]="CONTEXT",A))(pM||{}),wa=(A=>(A.BANNED="banned",A.KICK="kick",A.USER_TIME_OUT="user_time_out",A.ROOM_DISBAND="room_disband",A))(wa||{}),CT=(A=>(A[A.USER_EXIT_REASON_TC_USER_EXIT_NORMAL=0]="USER_EXIT_REASON_TC_USER_EXIT_NORMAL",A[A.USER_EXIT_REASON_TC_USER_EXIT_TIMEOUT=1]="USER_EXIT_REASON_TC_USER_EXIT_TIMEOUT",A[A.USER_EXIT_REASON_TC_USER_EXIT_KICKED=2]="USER_EXIT_REASON_TC_USER_EXIT_KICKED",A[A.USER_EXIT_REASON_TC_USER_EXIT_CHANGED=3]="USER_EXIT_REASON_TC_USER_EXIT_CHANGED",A[A.USER_KICK_OUT_CODE_BUSINESS_USER=4]="USER_KICK_OUT_CODE_BUSINESS_USER",A[A.USER_KICK_OUT_CODE_BUSINESS_ROOM=5]="USER_KICK_OUT_CODE_BUSINESS_ROOM",A[A.USER_KICK_OUT_CODE_SERVER_USER=6]="USER_KICK_OUT_CODE_SERVER_USER",A[A.USER_KICK_OUT_CODE_SERVER_ROOM=7]="USER_KICK_OUT_CODE_SERVER_ROOM",A[A.USER_KICK_SESS_EXSIT=8]="USER_KICK_SESS_EXSIT",A))(CT||{}),iE=1e8,LQ=(A=>(A[A.NORMAL=0]="NORMAL",A[A.FAR_FIELD_REDUCTION=1]="FAR_FIELD_REDUCTION",A))(LQ||{}),BT=class{constructor(){G(this,"mediaType",0)}set audio(A){A?this.mediaType|=1:this.mediaType&=-2}get audio(){return!!(1&this.mediaType)}set video(A){A?this.mediaType|=4:this.mediaType&=-5}get video(){return!!(4&this.mediaType)}set auxiliary(A){A?this.mediaType|=2:this.mediaType&=-3}get auxiliary(){return!!(2&this.mediaType)}set smallVideo(A){A?this.mediaType|=8:this.mediaType&=-9}get smallVideo(){return!!(8&this.mediaType)}},uT=(A=>(A.String="string",A.Number="number",A.Boolean="boolean",A.Array="array",A.Object="object",A))(uT||{}),Vs=(A=>(A.H264="h264",A.H265="h265",A.VP8="vp8",A.VP9="vp9",A.AV1="av1",A))(Vs||{}),FQ=(A=>(A[A.ENCRYPT_AND_DECRYPT=0]="ENCRYPT_AND_DECRYPT",A[A.DUMP=1]="DUMP",A[A.SEI=2]="SEI",A[A.ENCODE_AND_DECODE=3]="ENCODE_AND_DECODE",A))(FQ||{}),fu=(A=>(A[A.ENCRYPT_AND_DECRYPT=0]="ENCRYPT_AND_DECRYPT",A[A.NTP_TO_AUDIO_FRAME=1]="NTP_TO_AUDIO_FRAME",A[A.DUMP=2]="DUMP",A[A.ENCODE_AND_DECODE=3]="ENCODE_AND_DECODE",A))(fu||{}),gm=(A=>(A.WebRTC="webrtc",A.WebCodecs="webcodecs",A.WebAssembly="webassembly",A))(gm||{}),Im=((ee=Im||{})[ee.SUCCESS=0]="SUCCESS",ee[ee.FAILED=1]="FAILED",ee[ee.WEBCODEC_INIT=2]="WEBCODEC_INIT",ee[ee.WEBCODEC_CONFIG_NOT_SUPPORT=3]="WEBCODEC_CONFIG_NOT_SUPPORT",ee[ee.WEBCODEC_DECODER_ERROR=4]="WEBCODEC_DECODER_ERROR",ee[ee.WEBCODEC_TRACK_MUTE=5]="WEBCODEC_TRACK_MUTE",ee[ee.WASM_INIT=6]="WASM_INIT",ee[ee.WASM_WEBGL_UNAVALIABLE=7]="WASM_WEBGL_UNAVALIABLE",ee[ee.WASM_DECODER_ERROR=8]="WASM_DECODER_ERROR",ee[ee.WASM_TRACK_MUTE=9]="WASM_TRACK_MUTE",ee[ee.TEST=10]="TEST",ee[ee.RENDER_2D_ERROR=11]="RENDER_2D_ERROR",ee),fM=(A=>(A.NONE="",A.DETAIL="detail",A.MOTION="motion",A.TEXT="text",A))(fM||{}),mM=(A=>(A.INTERVAL="interval",A.TIMEOUT="timeout",A.RAF="raf",A.RIC="ric",A.INTERVAL_IN_WORKER="intervalInWorker",A))(mM||{}),UQ=(A=>(A.CANVAS="canvas",A.API="api",A))(UQ||{}),Hr=(A=>(A[A.NONE=0]="NONE",A[A.MICROPHONE=1]="MICROPHONE",A[A.CAMERA=2]="CAMERA",A[A.BOTH=3]="BOTH",A))(Hr||{}),QT=(A=>(A.CAMERA="camera",A.MICROPHONE="microphone",A))(QT||{}),Oh=(A=>(A[A.none=0]="none",A[A.horizontal=1]="horizontal",A[A.vertical=2]="vertical",A))(Oh||{}),Mi={AVOID_REPEATED_CALL:"AVOID_REPEATED_CALL",INVALID_PARAMETER_REQUIRED:"INVALID_PARAMETER_REQUIRED",INVALID_PARAMETER_TYPE:"INVALID_PARAMETER_TYPE",INVALID_PARAMETER_EMPTY:"INVALID_PARAMETER_EMPTY",INVALID_PARAMETER_INSTANCE:"INVALID_PARAMETER_INSTANCE",INVALID_PARAMETER_RANGE:"INVALID_PARAMETER_RANGE",INVALID_PARAMETER_MIN:"INVALID_PARAMETER_MIN",INVALID_PARAMETER_MAX:"INVALID_PARAMETER_MAX",INVALID_PARAMETER_STREAMTYPE:"INVALID_PARAMETER_STREAMTYPE",API_CALL_TIMEOUT:"API_CALL_TIMEOUT",SIGNAL_CHANNEL_RECONNECTION_FAILED:"SIGNAL_CHANNEL_RECONNECTION_FAILED",SIGNAL_CHANNEL_SETUP_FAILED:"SIGNAL_CHANNEL_SETUP_FAILED",ERROR_MESSAGE:"ERROR_MESSAGE",EXCHANGE_SDP_TIMEOUT:"EXCHANGE_SDP_TIMEOUT",DOWNLINK_RECONNECTION_FAILED:"DOWNLINK_RECONNECTION_FAILED",EXCHANGE_SDP_FAILED:"EXCHANGE_SDP_FAILED",UPDATE_OFFER_TIMEOUT:"UPDATE_OFFER_TIMEOUT",UPLINK_RECONNECTION_FAILED:"UPLINK_RECONNECTION_FAILED",INVALID_RECORDID:"INVALID_RECORDID",INVALID_PURE_AUDIO:"INVALID_PURE_AUDIO",INVALID_STREAMID:"INVALID_STREAMID",INVALID_USER_DEFINE_RECORDID:"INVALID_USER_DEFINE_RECORDID",INVALID_USER_DEFINE_PUSH_ARGS:"INVALID_USER_DEFINE_PUSH_ARGS",INVALID_PROXY:"INVALID_PROXY",INVALID_JOIN:"INVALID_JOIN",INVALID_ROOMID_STRING:"INVALID_ROOMID_STRING",INVALID_ROOMID_INTEGER:"INVALID_ROOMID_INTEGER",INVALID_SIGNAL_CHANNEL:"INVALID_SIGNAL_CHANNEL",JOIN_ROOM_TIMEOUT:"JOIN_ROOM_TIMEOUT",JOIN_ROOM_FAILED:"JOIN_ROOM_FAILED",REJOIN_ROOM_FAILED:"REJOIN_ROOM_FAILED",INVALID_DESTROY:"INVALID_DESTROY",INVALID_PUBLISH:"INVALID_PUBLISH",INVALID_UNPUBLISH:"INVALID_UNPUBLISH",INVALID_AUDIENCE:"INVALID_AUDIENCE",INVALID_INITIALIZE:"INVALID_INITIALIZE",INVALID_DUPLICATE_PUBLISHING:"INVALID_DUPLICATE_PUBLISHING",INVALID_SUBSCRIBE_UNDEFINED:"INVALID_SUBSCRIBE_UNDEFINED",INVALID_SUBSCRIBE_LOCAL:"INVALID_SUBSCRIBE_LOCAL",INVALID_REMOTE_STREAM:"INVALID_REMOTE_STREAM",SUBSCRIBE_FAILED:"SUBSCRIBE_FAILED",INVALID_ROLE:"INVALID_ROLE",INVALID_PARAMETER_SWITCH_ROLE:"INVALID_PARAMETER_SWITCH_ROLE",INVALID_OPERATION_SWITCH_ROLE:"INVALID_OPERATION_SWITCH_ROLE",SWITCH_ROLE_TIMEOUT:"SWITCH_ROLE_TIMEOUT",SWITCH_ROLE_FAILED:"SWITCH_ROLE_FAILED",CLIENT_BANNED:"CLIENT_BANNED",INVALID_OPERATION_START_PUBLISH_CDN:"INVALID_OPERATION_START_PUBLISH_CDN",INVALID_OPERATION_STOP_PUBLISH_CDN:"INVALID_OPERATION_STOP_PUBLISH_CDN",INVALID_STREAM_ID:"INVALID_STREAM_ID",START_PUBLISH_CDN_FAILED:"START_PUBLISH_CDN_FAILED",STOP_PUBLISH_CDN_FAILED:"STOP_PUBLISH_CDN_FAILED",START_MIX_TRANSCODE:"START_MIX_TRANSCODE",STOP_MIX_TRANSCODE:"STOP_MIX_TRANSCODE",INVALID_AUDIO_VOLUME:"INVALID_AUDIO_VOLUME",ENABLE_SMALL_STREAM_PUBLISHED:"ENABLE_SMALL_STREAM_PUBLISHED",DISABLE_SMALL_STREAM_PUBLISHED:"DISABLE_SMALL_STREAM_PUBLISHED",NOT_SUPPORTED_SMALL_STREAM:"NOT_SUPPORTED_SMALL_STREAM",INVALID_SMALL_STREAM_PROFILE:"INVALID_SMALL_STREAM_PROFILE",INVALID_PARAMETER_REMOTE_STREAM:"INVALID_PARAMETER_REMOTE_STREAM",INVALID_OPERATION_CHANGE_SMALL:"INVALID_OPERATION_CHANGE_SMALL",REMOTE_NOT_PUBLISH_SMALL_STREAM:"REMOTE_NOT_PUBLISH_SMALL_STREAM",INVALID_SWITCH_DEVICE:"INVALID_SWITCH_DEVICE",INVALID_SWITCH_DEVICE_PUBLISHING:"INVALID_SWITCH_DEVICE_PUBLISHING",INVALID_REPLACE_TRACK:"INVALID_REPLACE_TRACK",INVALID_INITIALIZE_LOCAL_STREAM:"INVALID_INITIALIZE_LOCAL_STREAM",INVALID_ADD_TRACK_REPETITIVE:"INVALID_ADD_TRACK_REPETITIVE",INVALID_ADD_TRACK_REMOVING:"INVALID_ADD_TRACK_REMOVING",INVALID_ADD_TRACK_PUBLISHING:"INVALID_ADD_TRACK_PUBLISHING",INVALID_STREAM_INITIALIZED:"INVALID_STREAM_INITIALIZED",INVALID_ADD_TRACK_NUMBER:"INVALID_ADD_TRACK_NUMBER",INVALID_REMOVE_AUDIO_TRACK:"INVALID_REMOVE_AUDIO_TRACK",INVALID_REMOVE_AUDIO_ADDING:"INVALID_REMOVE_AUDIO_ADDING",INVALID_REMOVE_AUDIO_ON:"INVALID_REMOVE_AUDIO_ON",INVALID_REMOVE_TRACK_PUBLISHING:"INVALID_REMOVE_TRACK_PUBLISHING",INVALID_REMOVE_TRACK_NOT_TRACK:"INVALID_REMOVE_TRACK_NOT_TRACK",INVALID_REMOVE_TRACK_NUMBER:"INVALID_REMOVE_TRACK_NUMBER",INVALID_REPLACE_TRACK_NO_TRACK:"INVALID_REPLACE_TRACK_NO_TRACK",REPEAT_JOIN:"REPEAT_JOIN",CLIENT_DESTROYED:"CLIENT_DESTROYED",NOT_BUG_PACKAGE:"NOT_BUG_PACKAGE",START_MIX_TRANSCODE_FAILED:"START_MIX_TRANSCODE_FAILED",STOP_MIX_TRANSCODE_FAILED:"STOP_MIX_TRANSCODE_FAILED",MIX_TRANSCODE_NOT_STARTED:"MIX_TRANSCODE_NOT_STARTED",CANNOT_LESS_THAN_ZERO:"CANNOT_LESS_THAN_ZERO",MIX_PARAMS_VIDEO_FRAMERATE:"MIX_PARAMS_VIDEO_FRAMERATE",MIX_PARAMS_VIDEO_GOP:"MIX_PARAMS_VIDEO_GOP",MIX_PARAMS_AUDIO_BITRATE:"MIX_PARAMS_AUDIO_BITRATE",MIX_PARAMS_USER_Z_ORDER:"MIX_PARAMS_USER_Z_ORDER",MIX_PARAMS_NOT_SELF:"MIX_PARAMS_NOT_SELF",MIX_PARAMS_USER_STREAM:"MIX_PARAMS_USER_STREAM",INVALID_PLAY:"INVALID_PLAY",INVALID_ELEMENT_ID:"INVALID_ELEMENT_ID",INVALID_ELEMENT_ID_TYPE:"INVALID_ELEMENT_ID_TYPE",PLAY_FAILED:"PLAY_FAILED",INVALID_USERID:"INVALID_USERID",INVALID_CREATE_STREAM_SOURCE:"INVALID_CREATE_STREAM_SOURCE",INVALID_CREATE_STREAM_SCREEN:"INVALID_CREATE_STREAM_SCREEN",INVALID_CREATE_STREAM_AUDIO:"INVALID_CREATE_STREAM_AUDIO",INVALID_CREATE_STREAM_SCREEN_AUDIO:"INVALID_CREATE_STREAM_SCREEN_AUDIO",NOT_SUPPORTED_HTTP:"NOT_SUPPORTED_HTTP",NOT_SUPPORTED_WEBRTC:"NOT_SUPPORTED_WEBRTC",NOT_SUPPORTED_PROFILE:"NOT_SUPPORTED_PROFILE",NOT_SUPPORTED_MEDIA:"NOT_SUPPORTED_MEDIA",NOT_SUPPORTED_H264ENCODE:"NOT_SUPPORTED_H264ENCODE",NOT_SUPPORTED_H264DECODE:"NOT_SUPPORTED_H264DECODE",NOT_SUPPORTED_TRACK:"NOT_SUPPORTED_TRACK",NOT_SUPPORTED_SWITCH_DEVICE:"NOT_SUPPORTED_SWITCH_DEVICE",NOT_SUPPORTED_CAPTURE:"NOT_SUPPORTED_CAPTURE",NOT_SUPPORTED_AUX:"NOT_SUPPORTED_AUX",MICROPHONE_NOT_FOUND:"MICROPHONE_NOT_FOUND",CAMERA_NOT_FOUND:"CAMERA_NOT_FOUND",SIGNAL_RESPONSE_FAILED:"SIGNAL_RESPONSE_FAILED",CATCH_HANDLER_ERROR:"CATCH_HANDLER_ERROR",API_NOT_EXIST:"API_NOT_EXIST",CONNECTION_CLOSED:"CONNECTION_CLOSED",SUBSCRIBE_ALL_FALSE:"SUBSCRIBE_ALL_FALSE",SEI_NOT_SUPPORT:"SEI_NOT_SUPPORT",SEI_DISABLED:"SEI_DISABLED",SEI_BEFORE_PUBLISH:"SEI_BEFORE_PUBLISH",SEI_NOT_VIDEO:"SEI_NOT_VIDEO",CALL_FREQUENCY_LIMIT:"CALL_FREQUENCY_LIMIT",CONNECTION_ABORTED:"CONNECTION_ABORTED",API_CALL_ABORTED:"API_CALL_ABORTED",DUPLICATE_AUX:"DUPLICATE_AUX",SWITCH_PLAYBACK_QUALITY_TIMEOUT:"SWITCH_PLAYBACK_QUALITY_TIMEOUT"},ts={AVOID_REPEATED_CALL:A=>"previous ".concat(A.name,"() is ongoing, please avoid repeated calls."),INVALID_PARAMETER_REQUIRED(A){let{key:e,rule:o,fnName:n,value:a}=A;return"'".concat(e||o.name,"' is a required param when calling ").concat(n,"(), received: ").concat(a,".")},INVALID_PARAMETER_TYPE(A){let{key:e,rule:o,fnName:n,value:a}=A,I="".concat(e||o.name),c="";return c=Array.isArray(o.type)?o.type.join("|"):o.type,"'".concat(I,"' must be type of ").concat(c," when calling ").concat(n,"(), received type: ").concat(ya(a),".")},INVALID_PARAMETER_EMPTY(A){let{key:e,rule:o,fnName:n,value:a}=A;return"'".concat(e||o.name,"' cannot be '").concat(a,"' when calling ").concat(n,"().")},INVALID_PARAMETER_INSTANCE(A){let{key:e,rule:o,fnName:n,value:a}=A,I="".concat(e||o.name),c="".concat(o.instanceOf.name||o.instanceOf);return"'".concat(I,"' must be instanceof ").concat(c," when calling ").concat(n,"(), received type: ").concat(ya(a),".")},INVALID_PARAMETER_RANGE(A){let{key:e,rule:o,fnName:n,value:a}=A;return"'".concat(e||o.name,"' must be one of ").concat(o.values.join("|")," when calling ").concat(n,"(), received: ").concat(a,".")},INVALID_PARAMETER_MIN(A){let{key:e,rule:o,fnName:n,value:a}=A;return"the min value of ".concat(e||o.name," is ").concat(o.min,", received: ").concat(a,".")},INVALID_PARAMETER_MAX(A){let{key:e,rule:o,fnName:n,value:a}=A;return"the max value of ".concat(e||o.name," is ").concat(o.max,", received: ").concat(a,".")},API_CALL_TIMEOUT:A=>"".concat(A.commandDesc||A.command," timeout observed."),SIGNAL_CHANNEL_RECONNECTION_FAILED:"signal channel reconnection failed, please check your network.",SIGNAL_CHANNEL_SETUP_FAILED:A=>"SignalChannel setup failure: (errorCode: ".concat(A.errorCode,", errorMsg: ").concat(A.errorMsg," })."),ERROR_MESSAGE(A){let e="".concat(A.type," failed");return A.message&&(e="".concat(e,": ").concat(A.message,".")),e},EXCHANGE_SDP_TIMEOUT:"exchange sdp timeout.",DOWNLINK_RECONNECTION_FAILED:"downlink reconnection failed, please check your network and re-join room.",EXCHANGE_SDP_FAILED:A=>"exchange sdp failed ".concat(A.errMsg,"."),UPDATE_OFFER_TIMEOUT:"update offer timeout observed.",UPLINK_RECONNECTION_FAILED:"uplink reconnection failed, please check your network and publish again.",INVALID_RECORDID:"recordId must be an integer number.",INVALID_PURE_AUDIO:"pureAudioPushMode must be 1 or 2.",INVALID_STREAMID:"streamId must be a sting literal within 64 bytes, and not be empty.",INVALID_USER_DEFINE_RECORDID:"userDefineRecordId must be a sting literal contains (a-zA-Z),(0-9), underline and hyphen, within 64 bytes, and not be empty.",INVALID_USER_DEFINE_PUSH_ARGS:"userDefinePushArgs must be a sting literal within 256 bytes, and not be empty.",INVALID_PROXY:'proxy server url must start with "wss://".',INVALID_JOIN:"duplicate join() called.",INVALID_ROOMID_STRING:A=>"'".concat(A,"' must be validate string when useStringRoomId is true."),INVALID_ROOMID_INTEGER:A=>"'".concat(A,"' must be an integer between [1, 4294967294] when useStringRoomId is false."),INVALID_SIGNAL_CHANNEL:"SignalChannel is not ready yet.",JOIN_ROOM_TIMEOUT:"join room timeout.",JOIN_ROOM_FAILED(A){let{error:e,code:o}=A;return"Failed to join room - ".concat(e," code: ").concat(o)},REJOIN_ROOM_FAILED:A=>"reJoin room: ".concat(A.roomId," failed, please check your network."),INVALID_DESTROY:"please call leave() before destroy().",INVALID_PUBLISH:"please call join() before publish().",INVALID_UNPUBLISH:"stream has not been published yet.",INVALID_AUDIENCE:'no permission to publish() under live/audience, please call switchRole("anchor") firstly before publish().',INVALID_INITIALIZE:"cannot publish stream because stream is not initialized, is switching device, or has been closed.",INVALID_DUPLICATE_PUBLISHING:A=>"duplicate ".concat(A," stream publishing, please unpublish your prev ").concat(A," stream and then re-publish."),INVALID_SUBSCRIBE_UNDEFINED:"stream is undefined or null.",INVALID_SUBSCRIBE_LOCAL:"stream cannot be LocalStream.",INVALID_REMOTE_STREAM:"remoteStream does not exist because it has been unpublished by remote peer.",SUBSCRIBE_FAILED(A){let{message:e,userId:o,streamType:n}=A;return"failed to subscribe ".concat(o," ").concat(n," stream, reason: ").concat(e,".")},INVALID_ROLE:"switchRole can only be called in live mode.",INVALID_PARAMETER_SWITCH_ROLE:"role could only be set to a value as anchor or audience.",INVALID_OPERATION_SWITCH_ROLE:"please call join() before switchRole().",SWITCH_ROLE_TIMEOUT:"switchRole timeout.",SWITCH_ROLE_FAILED:A=>"switchRole failed, errCode: ".concat(A.code," errMsg: ").concat(A.message,"."),CLIENT_BANNED:A=>"client was banned because of ".concat(A.message,"."),INVALID_OPERATION_START_PUBLISH_CDN:"please call startPublishCDNStream() after join room and publish the local stream.",INVALID_OPERATION_STOP_PUBLISH_CDN:"please call startPublishCDNStream() before stopPublishCDNStream().",START_PUBLISH_CDN_FAILED:A=>"startPublishCDNStream failed, errMsg: ".concat(A.message,"."),STOP_PUBLISH_CDN_FAILED:A=>"stopPublishCDNStream failed, errMsg: ".concat(A.message,"."),INVALID_STREAM_ID:A=>"'".concat(A,"' can only consist of uppercase and lowercase english letters (a-zA-Z), numbers (0-9), hyphens and underscores."),START_MIX_TRANSCODE:"please call startMixTranscode() after join().",STOP_MIX_TRANSCODE:"please call stopMixTranscode() after startMixTranscode().",INVALID_AUDIO_VOLUME:"interval must be a number.",ENABLE_SMALL_STREAM_PUBLISHED:"Cannot enable small stream after localStream published.",DISABLE_SMALL_STREAM_PUBLISHED:"Cannot disable small stream after localStream published.",NOT_SUPPORTED_SMALL_STREAM:"your browser does not support opening small stream.",INVALID_SMALL_STREAM_PROFILE:"small stream profile is invalid.",INVALID_PARAMETER_REMOTE_STREAM:"remoteStream is invalid.",INVALID_OPERATION_CHANGE_SMALL:"cannot switch to the small stream without subscribing to the video of remoteStream.",REMOTE_NOT_PUBLISH_SMALL_STREAM:"remote peer does not publish small stream.",INVALID_SWITCH_DEVICE:"cannot switch device on current stream.",INVALID_SWITCH_DEVICE_PUBLISHING:"cannot switch device when publishing localStream.",INVALID_REPLACE_TRACK:"cannot replace track when publishing localStream.",INVALID_INITIALIZE_LOCAL_STREAM:"local stream has not initialized yet.",INVALID_ADD_TRACK_REPETITIVE:"previous addTrack is ongoing, please avoid repetitive execution.",INVALID_ADD_TRACK_REMOVING:"cannot add track when a track is removing.",INVALID_ADD_TRACK_PUBLISHING:"cannot add track when publishing localStream.",INVALID_STREAM_INITIALIZED:"your local stream haven't been initialized yet.",INVALID_ADD_TRACK_NUMBER:"a Stream has at most one audio track and one video track.",INVALID_REMOVE_AUDIO_TRACK:"remove audio track is not supported on your browser.",INVALID_REMOVE_AUDIO_ADDING:"cannot remove track when a track is adding.",INVALID_REMOVE_AUDIO_ON:"previous removeTrack is ongoing, please avoid repetitive execution.",INVALID_REMOVE_TRACK_PUBLISHING:"cannot remove track when publishing localStream.",INVALID_REMOVE_TRACK_NOT_TRACK:"localStream has not this track.",INVALID_REMOVE_TRACK_NUMBER:"remove the only video track is not supported, please use replaceTrack or muteVideo.",INVALID_REPLACE_TRACK_NO_TRACK:A=>"cannot replace ".concat(A.kind," track because stream has not ").concat(A.kind," track"),NOT_BUG_PACKAGE:"You need to buy packages, refer to tencent console.",START_MIX_TRANSCODE_FAILED:A=>"startMixTranscode failed, errMsg: ".concat(A.message,"."),STOP_MIX_TRANSCODE_FAILED:A=>"stopMixTranscode failed, errMsg: ".concat(A.message,"."),MIX_TRANSCODE_NOT_STARTED:"mixTranscode has not been started.",CANNOT_LESS_THAN_ZERO(A){let{key:e,rule:o,fnName:n,value:a}=A;return"'".concat(e||o.name,"' cannot be less than 0 when calling ").concat(n,"().")},MIX_PARAMS_VIDEO_FRAMERATE:"'config.videoFramerate' should be an integer between 0 and 30, excluding 0.",MIX_PARAMS_VIDEO_GOP:"'config.videoGOP' should be an integer between 1 and 8.",MIX_PARAMS_AUDIO_BITRATE:"'config.audioBitrate' should be an integer between 32 and 192.",MIX_PARAMS_USER_Z_ORDER:A=>"'".concat(A,"' is required and must be between 1 and 15."),MIX_PARAMS_NOT_SELF:"'config.mixUsers' must contain self.",MIX_PARAMS_USER_STREAM:"'config.videoWidth' and 'config.videoHeight' of output stream should be contain all mix stream.",INVALID_PLAY:"duplicate play() call observed, please stop() firstly.",INVALID_ELEMENT_ID:A=>{let{key:e,fnName:o}=A;return"'".concat(e,"' is not found in the document object when calling ").concat(o,"().")},INVALID_ELEMENT_ID_TYPE:A=>{let{key:e,fnName:o,type:n}=A;return"the element corresponding to '".concat(e,"' must be instanceof HTMLElement when calling ").concat(o,"(), received: ").concat(n,".")},PLAY_FAILED:A=>"".concat(A.media," play failed, browser exception: ").concat(A.error.toString()),INVALID_USERID:"userId cannot be all spaces.",INVALID_CREATE_STREAM_SOURCE:"LocalStream must be created by createStream() with either audio/video or audioSource/videoSource, but can not be mixed with audio/video and audioSource/videoSource.",INVALID_CREATE_STREAM_SCREEN:"screen/video cannot be both true.",INVALID_CREATE_STREAM_AUDIO:"audio/screenAudio cannot be both true.",INVALID_CREATE_STREAM_SCREEN_AUDIO:"when screen is true, screenAudio can be configured.",NOT_SUPPORTED_HTTP:"http protocol does not support the ability to capture microphone, camera and screen. please use https to deploy your page.",NOT_SUPPORTED_WEBRTC:"your browser or environment does not support full WebRTC capabilities.",NOT_SUPPORTED_PROFILE:"your browser does not support setVideoProfile.",NOT_SUPPORTED_MEDIA:"your browser or environment does not support navigator.mediaDevices.",NOT_SUPPORTED_H264ENCODE:"your device does not support H.264 encoding.",NOT_SUPPORTED_H264DECODE:"your device does not support H.264 decoding.",NOT_SUPPORTED_TRACK:A=>"".concat(A,"Track is not supported on your browser."),NOT_SUPPORTED_SWITCH_DEVICE:"switchDevice is not supported on your browser.",NOT_SUPPORTED_CAPTURE:"Your browser or environment does not support screen sharing, please check whether the browser version.",MICROPHONE_NOT_FOUND:"no microphone detected, please check your microphone.",CAMERA_NOT_FOUND:"no camera detected, please check your camera.",SIGNAL_RESPONSE_FAILED:A=>"".concat(A.signalResponse," failed, response code is ").concat(A.code," , errMsg: ").concat(A.message,"."),CATCH_HANDLER_ERROR(A){let{name:e,event:o}=A;return"an error was caught in ".concat(e,".on('").concat(o,"', handler), please check your code in 'handler'.")},API_NOT_EXIST(A){let{name:e}=A;return"experimental api ".concat(e," does not exist.")},REPEAT_JOIN:A=>"please avoid repeated join.",CONNECTION_CLOSED:"remoteStream has been unsubscribed or unpublished by remote user.",SUBSCRIBE_ALL_FALSE:"cannot subscribe when both audio & video are false, use client.unsubscribe() instead",CLIENT_DESTROYED(A){let{funName:e}=A;return"failed to call ".concat(e,"() because client was destroyed.")},SEI_NOT_SUPPORT:A=>"not support to sendSEIMessage".concat(A===!1?" without using h264 codec":""),SEI_DISABLED:"SEI is disabled",SEI_BEFORE_PUBLISH:"please call sendSEIMessage() after publish() success",SEI_NOT_VIDEO:"cannot send sei when localStream has not video.",CALL_FREQUENCY_LIMIT:A=>{let{isSize:e,name:o,timesInSecond:n,maxSizeInSecond:a}=A;return"api ".concat(o," call ").concat(e?"size":"times"," is over ").concat(e?"".concat(a," bytes"):n," in a second.")},CONNECTION_ABORTED:A=>"connection aborted due to: ".concat(A),API_CALL_ABORTED(A){let e;return e=A.message.includes("REMOTE_STREAM_NOT_EXIST")?"Subscribe ".concat(A.userId," ").concat(A.streamType," stream aborted, reason: remote user ").concat(A.userId," unpublished stream."):"API aborted, reason: ".concat(A.message),e},DUPLICATE_AUX:"only one auxiliary stream can be published in a room.",NOT_SUPPORTED_AUX:"publish auxiliary stream is not supported on your browser.",INVALID_PARAMETER_STREAMTYPE:A=>"'streamType' is required when 'userId' is not '*', calling ".concat(A,"()"),SWITCH_PLAYBACK_QUALITY_TIMEOUT:A=>"switchPlaybackQuality timeout: waiting for first frame of user ".concat(A.userId,".")},qO=(A,e)=>e?"".concat($C,"/").concat(A,"/").concat(e):"".concat($C,"/").concat(A,"/index.html"),dT=()=>{if(window.TRTC_ERROR_INFO&&window.TRTC_ERROR_LINK)return{TRTC_ERROR_INFO:window.TRTC_ERROR_INFO,TRTC_ERROR_LINK:window.TRTC_ERROR_LINK};let A=localStorage==null?void 0:localStorage.getItem(Sf);if(A){A=JSON.parse(A);let e=document.createElement("script");e.type="text/javascript",e.text=A.message,document.body.appendChild(e);let o=window.TRTC_ERROR_INFO,n=window.TRTC_ERROR_LINK;return document.body.removeChild(e),{TRTC_ERROR_INFO:o,TRTC_ERROR_LINK:n}}return{}};function Wi(A){let{key:e,data:o,link:n,addDocLink:a=!0}=A,I="",c="",u="";$n(ts[e])?I=ts[e](o):Sr(ts[e])&&(I=ts[e]);let{TRTC_ERROR_INFO:d,TRTC_ERROR_LINK:R}=dT();n?u="".concat(n.className,".html#").concat(n.fnName):R&&R[e]&&($n(R[e])?u=R[e](o):Sr(R[e])&&(u=R[e]));let k=I;return rl()&&(d&&d[e]&&($n(d[e])?c=d[e](o):Sr(d[e])&&(c=d[e])),c&&(k=a?"".concat(c,` +请查看文档: `).concat(qO("zh-cn",u),` + +`):"".concat(c,` + +`),k+=I)),a&&(k+=` +Refer to: `.concat(qO("en",u),` +`)),k}var Io,ir,hT=es(VV(),1),pT=class{constructor(){let A=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];G(this,"countMap",new Map),G(this,"distributionMap",new Map),G(this,"version"),G(this,"log",nA.createLogger({id:"kv"})),A&&(S.on("102",e=>{let{track:o,cost:n}=e;this.addSuccessEvent({key:o.kind===fA.AUDIO?501700:511700,cost:n})}),S.on("103",e=>{let{track:o,error:n}=e;this.addFailedEvent({key:o.kind===fA.AUDIO?501700:511700,error:n})}),S.on("266",e=>{let{enable:o}=e;this.log.info("".concat(o?"enable":"disable"," sso")),o?this.addSuccessEvent({key:525701}):this.addFailedEvent({key:525701})}))}getReportData(A,e){let o={msg_sdk_basic_info:{uint32_sdk_version:UN(this.version||il),uint32_terminal_type:15,bytes_device_name:"",bytes_os_version:"",uint32_framework:30,uint32_network_type:0},stats_count:[...this.countMap.entries()].map(n=>{let[a,I]=n;return{uint32_key:a,uint32_count:I}}),stats_distribution:[...this.distributionMap.entries()].map(n=>{let[a,I]=n;return{uint32_key:a,distribution_items:[...I.entries()].map(c=>{let[u,d]=c;return{uint32_item_key:u,uint32_item_value:d}})}}),str_user_sig:A,bytes_report_token:e};return this.countMap.clear(),this.distributionMap.clear(),o}clear(){this.countMap.clear(),this.distributionMap.clear()}isEnumKey(A){let e=+String(A).slice(-3);return e>=700&&e<799}isErrorCodeKey(A){let e=+String(A).slice(-3);return e>=600&&e<699}isCountKey(A){let e=+String(A).slice(-3);return e>=0&&e<599}isNumberKey(A){let e=+String(A).slice(-3);return e>=800&&e<899}addCount(A){let{key:e,useUV:o=!1}=A;this.isCountKey(e)?o&&this.countMap.has(e)||this.countMap.set(e,(this.countMap.get(e)||0)+1):this.log.debug("".concat(e," is not count key, last 3 number should be 0~599"))}addEnum(A){let{key:e,value:o,useUV:n=!0}=A;var a;if(!this.isEnumKey(e))return this.log.debug("".concat(e," is not enum key, last 3 number should be 700~799"));if(n&&this.countMap.has(e))return;this.countMap.set(e,(this.countMap.get(e)||0)+1);let I=((a=this.distributionMap)==null?void 0:a.get(e))||new Map;I.set(o,(I.get(o)||0)+1),this.distributionMap.set(e,I)}addNumber(A){let{key:e,value:o,split:n=100,useUV:a=!1,max:I=5e3}=A;var c;if(!this.isNumberKey(e))return this.log.debug("".concat(e," is not number key, last 3 number should be 800~899"));if(a&&this.countMap.has(e))return;o>I&&(o=I),this.countMap.set(e,(this.countMap.get(e)||0)+1);let u=((c=this.distributionMap)==null?void 0:c.get(e))||new Map,d=0;if(hr(n))d=Math.floor(o/n);else for(let R=n.length-1;R>0;R--)if(o>n[R]){d=R;break}u.set(d,(u.get(d)||0)+1),this.distributionMap.set(e,u)}addSuccessEvent(A){let{key:e,cost:o,timeKey:n,split:a}=A;if(e&&(this.addEnum({key:e,value:1,useUV:!1}),o)){let I=+String(e).slice(-3);I<800&&I>=700?this.addNumber({key:n||e+100,value:o,split:a}):n||this.log.debug("time stat ignored, ".concat(e))}}addFailedEvent(A){let{key:e,error:o}=A;if(!e)return;let n=Ge.UNKNOWN;o&&(hr(o)?n=o:(!Ee(o.extraCode)||!Ee(o.code))&&(n=o.extraCode||o.code)),this.addEnum({key:e,value:0,useUV:!1}),this.addEnum({key:e,value:Math.abs(n),useUV:!1})}},KO=((Io=KO||{})[Io.enterRoom=500700]="enterRoom",Io[Io.exitRoom=500701]="exitRoom",Io[Io.switchRole=500702]="switchRole",Io[Io.destroy=500703]="destroy",Io[Io.startLocalAudio=500704]="startLocalAudio",Io[Io.updateLocalAudio=500705]="updateLocalAudio",Io[Io.stopLocalAudio=500706]="stopLocalAudio",Io[Io.startLocalVideo=500707]="startLocalVideo",Io[Io.updateLocalVideo=500708]="updateLocalVideo",Io[Io.stopLocalVideo=500709]="stopLocalVideo",Io[Io.startScreenShare=500710]="startScreenShare",Io[Io.updateScreenShare=500711]="updateScreenShare",Io[Io.stopScreenShare=500712]="stopScreenShare",Io[Io.startRemoteVideo=500713]="startRemoteVideo",Io[Io.updateRemoteVideo=500714]="updateRemoteVideo",Io[Io.stopRemoteVideo=500715]="stopRemoteVideo",Io[Io.muteRemoteAudio=500716]="muteRemoteAudio",Io[Io.setRemoteAudioVolume=500717]="setRemoteAudioVolume",Io[Io.use=500718]="use",Io[Io.switchRoom=500719]="switchRoom",Io[Io.getPermissions=500720]="getPermissions",Io[Io.sendSEIMessage=5e5]="sendSEIMessage",Io[Io.sendCustomMessage=500001]="sendCustomMessage",Io),jO=(A=>(A[A.AudioMixer=550700]="AudioMixer",A[A.AIDenoiser=551700]="AIDenoiser",A[A.VirtualBackground=570700]="VirtualBackground",A[A.Beauty=571700]="Beauty",A[A.Watermark=572700]="Watermark",A[A.BasicBeauty=574700]="BasicBeauty",A[A.FaceDetector=575700]="FaceDetector",A[A.CDNStreaming=590700]="CDNStreaming",A[A.DeviceDetector=591700]="DeviceDetector",A[A.Debug=592700]="Debug",A[A.SmallStreamAutoSwitcher=593700]="SmallStreamAutoSwitcher",A[A.VideoMixer=594700]="VideoMixer",A[A.AudioProcessor=595700]="AudioProcessor",A[A.LEBPlayer=596700]="LEBPlayer",A[A.RealtimeTranscriber=597700]="RealtimeTranscriber",A))(jO||{}),xh=(A=>(A[A.AudioMixer=550701]="AudioMixer",A[A.AIDenoiser=551701]="AIDenoiser",A[A.VirtualBackground=570701]="VirtualBackground",A[A.Beauty=571701]="Beauty",A[A.Watermark=572701]="Watermark",A[A.BasicBeauty=574701]="BasicBeauty",A[A.FaceDetector=575701]="FaceDetector",A[A.CDNStreaming=590701]="CDNStreaming",A[A.DeviceDetector=591701]="DeviceDetector",A[A.Debug=592701]="Debug",A[A.SmallStreamAutoSwitcher=593701]="SmallStreamAutoSwitcher",A[A.VideoMixer=594701]="VideoMixer",A[A.AudioProcessor=595701]="AudioProcessor",A[A.LEBPlayer=596701]="LEBPlayer",A[A.RealtimeTranscriber=597701]="RealtimeTranscriber",A))(xh||{}),DM=(A=>(A[A.AudioMixer=550702]="AudioMixer",A[A.AIDenoiser=551702]="AIDenoiser",A[A.VirtualBackground=570702]="VirtualBackground",A[A.Beauty=571702]="Beauty",A[A.Watermark=572702]="Watermark",A[A.BasicBeauty=574702]="BasicBeauty",A[A.FaceDetector=575702]="FaceDetector",A[A.CDNStreaming=590702]="CDNStreaming",A[A.DeviceDetector=591702]="DeviceDetector",A[A.Debug=592702]="Debug",A[A.SmallStreamAutoSwitcher=593702]="SmallStreamAutoSwitcher",A[A.VideoMixer=594702]="VideoMixer",A[A.AudioProcessor=595702]="AudioProcessor",A[A.LEBPlayer=596702]="LEBPlayer",A[A.RealtimeTranscriber=597702]="RealtimeTranscriber",A))(DM||{}),Yh=((ir=Yh||{})[ir.DECODER_TYPE=514700]="DECODER_TYPE",ir[ir.DECODER_HW_SW=514701]="DECODER_HW_SW",ir[ir.DECODE_RESULT=514702]="DECODE_RESULT",ir[ir.DECODE_FAILED_OS=514703]="DECODE_FAILED_OS",ir[ir.DOWNGRADE_RESULT=514704]="DOWNGRADE_RESULT",ir[ir.DOWNGRADE_WEBCODECS_VIDEO=514705]="DOWNGRADE_WEBCODECS_VIDEO",ir[ir.DOWNGRADE_WEBCODECS_2D=514706]="DOWNGRADE_WEBCODECS_2D",ir[ir.DOWNGRADE_WASM_WEGBL=514707]="DOWNGRADE_WASM_WEGBL",ir[ir.DOWNGRADE_WASM_VIDEO=514708]="DOWNGRADE_WASM_VIDEO",ir[ir.DOWNGRADE_WASM_2D=514709]="DOWNGRADE_WASM_2D",ir[ir.DECODE_H264_RESULT=514710]="DECODE_H264_RESULT",ir[ir.DECODE_H265_RESULT=514711]="DECODE_H265_RESULT",ir[ir.DECODE_VP8_RESULT=514712]="DECODE_VP8_RESULT",ir[ir.DECODE_CAPABILITIES=514713]="DECODE_CAPABILITIES",ir[ir.H264_PROFILE_LEVEL_ID_HIGH=514714]="H264_PROFILE_LEVEL_ID_HIGH",ir[ir.H264_PROFILE_LEVEL_ID_MAIN=514715]="H264_PROFILE_LEVEL_ID_MAIN",ir[ir.RENDER_FREEZE_RATE=514850]="RENDER_FREEZE_RATE",ir[ir.DATA_FREEZE_RATE=514851]="DATA_FREEZE_RATE",ir[ir.VIDEO_CONSUME_RENDER_RATE=514852]="VIDEO_CONSUME_RENDER_RATE",ir),Cq=new pT(!0),oB=new pT(!1),ct=Cq,co={result:!1,detail:{isBrowserSupported:!1,isWebRTCSupported:!1,isWebCodecsSupported:!1,isMediaDevicesSupported:!1,isScreenShareSupported:!1,isSmallStreamSupported:!1,isH264EncodeSupported:!1,isVp8EncodeSupported:!1,isH265EncodeSupported:!1,isH264DecodeSupported:!1,isVp8DecodeSupported:!1,isH265DecodeSupported:!1}},WO=new Map([[Yr,["Firefox",Wf]],[wh,["Edg",jN]],[BM,["Chrome",uM]],[Ma,["Safari",Cu]],[eE,["TBS",zN]],[SQ,["XWEB",ZN]],[Eu&&wQ,["WeChat",XN]],[cM,["QQ(Win)",$N]],[Zf,["QQ(Mobile)",Sh]],[vQ,["QQ(Mobile X5)",Sh]],[Xf,["QQ(Mac)",AT]],[EM,["QQ(iPad)",$f]],[lM,["MI",NQ]],[iB,["HW",rT]],[Am,["Samsung",nT]],[em,["OPPO",aT]],[tm,["VIVO",im]],[Mh,["EDGE",KN]],[zf,["SogouMobile",gM]],[IM,["Sogou",WN]]]);function cm(){let A=WO.get(!0);return{browserName:A?A[0]:"unknown",browserVersion:A?A[1]:"unknown"}}var fT=function(){return!(tT||Mh||wh&&sM<80||Yr&&aM<56)},yM=function(){return["VideoDecoder","VideoEncoder","AudioEncoder","AudioDecoder"].every(A=>A in window)},mT=function(){if(!navigator.mediaDevices)return wI()||nA.error(ts.NOT_SUPPORTED_MEDIA),!1;let A=["getUserMedia","enumerateDevices"];return A.filter(e=>e in navigator.mediaDevices).length===A.length},zO=!1;function wI(){return location.protocol==="http:"&&!GQ&&(zO||nA.error(Wi({key:Mi.NOT_SUPPORTED_HTTP})),zO=!0,!0)}var Em=function(){return window?.OffscreenCanvas&&window?.MediaStreamTrackProcessor&&window?.MediaStreamTrackGenerator},Bq=function(){return!(window==null||!window.MediaStreamTrackGenerator)},lm=function(){return DA(this,null,function*(){var A,e,o;if(co.detail.isH264EncodeSupported&&co.detail.isVp8EncodeSupported)return{isH264EncodeSupported:co.detail.isH264EncodeSupported,isVp8EncodeSupported:co.detail.isVp8EncodeSupported,isH265EncodeSupported:co.detail.isH265EncodeSupported};let n,a=!1,I=!1,c=!1;try{let u=new RTCPeerConnection,d=document.createElement(fA.CANVAS);d.getContext("2d");let R=d.captureStream(0);return u.addTrack(R.getVideoTracks()[0],R),n=yield u.createOffer(),a=((A=n.sdp)==null?void 0:A.toLowerCase().indexOf("h264"))!==-1,I=((e=n.sdp)==null?void 0:e.toLowerCase().indexOf("vp8"))!==-1,c=((o=n.sdp)==null?void 0:o.toLowerCase().indexOf("h265"))!==-1,u.close(),{isH264EncodeSupported:a,isVp8EncodeSupported:I,isH265EncodeSupported:c}}catch{return{isH264EncodeSupported:!1,isVp8EncodeSupported:!1,isH265EncodeSupported:!1}}})},DT=function(){return DA(this,null,function*(){var A;if(co.detail.isH264DecodeSupported&&co.detail.isVp8DecodeSupported)return{isH264DecodeSupported:co.detail.isH264DecodeSupported,isVp8DecodeSupported:co.detail.isVp8DecodeSupported,isH265DecodeSupported:co.detail.isH265DecodeSupported};let e,o=!1,n=!1;try{let a=new RTCPeerConnection;sl()?(a.addTransceiver(fA.VIDEO,{direction:"recvonly"}),e=yield a.createOffer()):e=yield a.createOffer({offerToReceiveVideo:!0}),e.sdp.toLowerCase().indexOf("h264")!==-1&&(o=!0),e.sdp.toLowerCase().indexOf("vp8")!==-1&&(n=!0);let I=((A=e.sdp)==null?void 0:A.toLowerCase().indexOf("h265"))!==-1;return a.close(),{isH264DecodeSupported:o,isVp8DecodeSupported:n,isH265DecodeSupported:I}}catch{return{isH264DecodeSupported:!1,isVp8DecodeSupported:!1,isH265DecodeSupported:!1}}})},yT=ON(A=>DA(null,null,function*(){let e=Date.now(),o=Hh(),n=mT(),a=yM();if(co.detail.isWebRTCSupported=o,co.detail.isMediaDevicesSupported=n,co.detail.isWebCodecsSupported=a,co.detail.isScreenShareSupported=OQ(),co.detail.isSmallStreamSupported=um(),A===37)return Object.assign(co.detail,yield function(){return DA(this,null,function*(){return oE||(oE=new Promise(cA=>DA(null,null,function*(){let TA={isH264EncodeSupported:!1,isH264DecodeSupported:!1,isVp8EncodeSupported:!1,isVp8DecodeSupported:!1};if(!yM())return void cA(TA);let JA=null,Ie=null,XA=null,Ft=()=>{XA&&clearTimeout(XA),JA=null,Ie=null};try{JA=document.createElement("canvas"),Ie=JA.getContext("2d"),JA.width=320,JA.height=240;let ie=0,ke=()=>{!Ie||!JA||(Ie.fillStyle="hsl(".concat(ie%360,", 50%, 50%)"),Ie.fillRect(0,0,JA.width,JA.height),Ie.fillStyle="white",Ie.font="20px Arial",Ie.fillText("Frame ".concat(ie),10,30),ie++)};XA=setTimeout(()=>{Ft(),cA(TA)},5e3);let Nt=[{type:"h264",encodeConfig:{codec:"avc1.42E01E",avc:{format:"annexb"},width:320,height:240,bitrate:1e6},decodeConfig:{codec:"avc1.42E01E",avc:{format:"annexb"}}},{type:"vp8",encodeConfig:{codec:"vp8",width:320,height:240,bitrate:1e6},decodeConfig:{codec:"vp8"}}];(yield Promise.all(Nt.map(Ut=>DA(null,null,function*(){let Ui,Oi={type:Ut.type,encodeSupported:!1,decodeSupported:!1};try{Ui=yield new Promise((or,xi)=>DA(null,null,function*(){try{let yo=new VideoEncoder({output:Vn=>{or(Vn),Oi.encodeSupported=!0},error:xi});yo.configure(Ut.encodeConfig),ke();let Sa=new VideoFrame(JA,{timestamp:0});yo.encode(Sa,{keyFrame:!0}),Sa.close(),yield yo.flush(),yo.close()}catch(yo){xi(yo)}}))}catch(or){return nA.warn("".concat(Ut.type," encoder error:"),or),Oi}try{yield new Promise((or,xi)=>DA(null,null,function*(){try{let yo=new VideoDecoder({output:Sa=>{Oi.decodeSupported=!0,or(0),Sa.close()},error:xi});yo.configure(Ut.decodeConfig),yo.decode(Ui),yield yo.flush(),yo.close()}catch(yo){xi(yo)}}))}catch(or){nA.warn("".concat(Ut.type," decoder error:"),or)}return Oi})))).forEach(Ut=>{Ut.type==="h264"?(TA.isH264EncodeSupported=Ut.encodeSupported,TA.isH264DecodeSupported=Ut.decodeSupported):Ut.type==="vp8"&&(TA.isVp8EncodeSupported=Ut.encodeSupported,TA.isVp8DecodeSupported=Ut.decodeSupported)}),Ft(),cA(TA)}catch(ie){Ft(),nA.warn("detectWebCodecsSupported failed:",ie),cA(TA)}})),oE)})}()),co.detail.isBrowserSupported=a,co.result=n&&a,co.result||nA.error("".concat(navigator.userAgent," ").concat(ZR(co.detail,!1))),bT(A),ct.addNumber({key:523800,value:Date.now()-e}),co;if(co.result&&co.detail.isH264EncodeSupported&&co.detail.isVp8EncodeSupported&&co.detail.isH265EncodeSupported&&co.detail.isH264DecodeSupported&&co.detail.isVp8DecodeSupported&&co.detail.isH265DecodeSupported)return co;let I=fT(),{encode:c,decode:u}=yield function(){return DA(this,null,function*(){let[cA,TA]=yield Promise.all([lm(),DT()]);return{encode:{h264:cA.isH264EncodeSupported,vp8:cA.isVp8EncodeSupported,h265:cA.isH265EncodeSupported},decode:{h264:TA.isH264DecodeSupported,vp8:TA.isVp8DecodeSupported,h265:TA.isH265DecodeSupported}}})}(),{h264:d,vp8:R}=c,{h264:k}=u,{h265:_}=c,{vp8:Z,h265:iA}=u;if(!d||!R){let cA=yield lm();nA.warn("detect encode again h264:".concat(d," vp8:").concat(R," result: ").concat(JSON.stringify(cA))),d=cA.isH264EncodeSupported,R=cA.isVp8EncodeSupported}if(d&&k&&ra&&Bc&&!SQ&&!eE&&(!em||tE!==115)){let{encode:cA,decode:TA}=yield ZO();d=cA,k=TA}return co.result=I&&o&&n&&(d||R)&&(k||Z),co.detail.isBrowserSupported=I,co.detail.isWebRTCSupported=o,co.detail.isH264EncodeSupported=d,co.detail.isVp8EncodeSupported=R,co.detail.isH265EncodeSupported=_,co.detail.isH264DecodeSupported=k,co.detail.isVp8DecodeSupported=Z,co.detail.isH265DecodeSupported=iA,co.result||nA.error("".concat(navigator.userAgent," ").concat(ZR(co.detail,!1))),bT(),ct.addNumber({key:523800,value:Date.now()-e}),co})),uq=function(){return co.result},OQ=function(){return!(!navigator.mediaDevices||!navigator.mediaDevices.getDisplayMedia)},Qq=typeof HTMLMediaElement<"u"&&"setSinkId"in HTMLMediaElement.prototype,RT=null;function ZO(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:2e3;return DA(this,null,function*(){return RT||(RT=new Promise(e=>DA(null,null,function*(){let o={encode:!1,decode:!1},n=()=>{};try{let a=document.createElement("canvas"),I=a.getContext("2d");a.width=640,a.height=480;let c=setInterval(()=>{I.fillText("test",Math.floor(640*Math.random()),Math.floor(480*Math.random()))},66),u=-1,d=-1;n=()=>{clearInterval(u),clearInterval(c),clearTimeout(d),k.close(),_.close(),R.getTracks().forEach(JA=>JA.stop())},d=setTimeout(()=>{n(),e(o)},A);let R=a.captureStream(),k=new RTCPeerConnection({}),_=new RTCPeerConnection({offerToReceiveAudio:!0,offerToReceiveVideo:!0});k.addEventListener("icecandidate",JA=>_.addIceCandidate(JA.candidate)),_.addEventListener("icecandidate",JA=>k.addIceCandidate(JA.candidate)),k.addTrack(R.getVideoTracks()[0],R);let Z=yield k.createOffer();yield k.setLocalDescription(Z),yield _.setRemoteDescription(Z);let iA=yield _.createAnswer(),cA=hT.default.parse(iA.sdp),TA=cA.media[0].rtp.findIndex(JA=>JA.codec==="H264");cA.media[0].rtp=[cA.media[0].rtp[TA]],cA.media[0].fmtp=cA.media[0].fmtp.filter(JA=>JA.payload===cA.media[0].rtp[0].payload),cA.media[0].rtcpFb&&(cA.media[0].rtcpFb=cA.media[0].rtcpFb.filter(JA=>JA.payload===cA.media[0].rtp[0].payload)),iA.sdp=hT.default.write(cA),yield _.setLocalDescription(iA),yield k.setRemoteDescription(iA),u=setInterval(()=>DA(null,null,function*(){o.encode&&o.decode&&(n(),e(o));let[JA,Ie]=yield Promise.all([k.getSenders()[0].getStats(),_.getReceivers()[0].getStats()]);o.encode||JA.forEach(XA=>{XA.type==="outbound-rtp"&&(XA.mediaType===fA.VIDEO||XA.kind===fA.VIDEO)&&XA.bytesSent>0&&(o.encode=!0)}),o.decode||Ie.forEach(XA=>{XA.type==="inbound-rtp"&&(XA.mediaType===fA.VIDEO||XA.kind===fA.VIDEO)&&XA.bytesReceived>0&&(o.decode=!0)})}),100)}catch(a){n(),nA.warn("detectH264Supported failed",a),e({encode:!0,decode:!0})}})).then(e=>(e.encode||(e.decode=!0),(!e.encode||!e.decode)&&nA.warn("detectH264Supported encode: ".concat(e.encode," decode: ").concat(e.decode," ").concat(eC)),e)),RT)})}var oE=null,MT=(A,e,o)=>{location.protocol==="http:"&&!GQ&&(A[e]=()=>{throw new Ct({code:Ge.INVALID_OPERATION,message:ts.NOT_SUPPORTED_HTTP})})},Cm=function(A){return!(A.type!=="candidate-pair"||!A.nominated||A.state!=="in-progress"&&A.state!=="succeeded")&&!(rn(A.selected)&&!A.selected)};function rE(){let A="";if(screen.width){let e=screen.width?screen.width*window.devicePixelRatio:"",o=screen.height?screen.height*window.devicePixelRatio:"";A+="".concat(e," * ").concat(o)}return A}function wT(){return navigator.getUserMedia||navigator.mediaDevices&&navigator.mediaDevices.getUserMedia}function ST(){let A={isSupported:!1},e=["AudioContext","webkitAudioContext","mozAudioContext","msAudioContext"];for(let o=0;o=86,MM="RTCRtpScriptTransform"in window,kT=tC&&(xQ||MM),Hh=function(){return["RTCPeerConnection","webkitRTCPeerConnection","RTCIceGatherer"].filter(A=>A in window).length>0};function wM(){let A={AudioDecoder:!1,AudioEncoder:!1,VideoDecoder:!1,VideoEncoder:!1,ImageDecoder:!1};return Ee(window.AudioDecoder)||(A.AudioDecoder=!0),Ee(window.AudioEncoder)||(A.AudioEncoder=!0),Ee(window.VideoDecoder)||(A.VideoDecoder=!0),Ee(window.VideoEncoder)||(A.VideoEncoder=!0),Ee(window.ImageDecoder)||(A.ImageDecoder=!0),A}function ex(){return"mediaSession"in navigator&&!Ee(navigator.mediaSession.setActionHandler)}function Vh(){return!Ee(window.WebTransport)}function dm(){return typeof WebAssembly<"u"&&WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]))}function tx(){let A={browser:"".concat(uu.name,"/").concat(uu.version),os:Js(),displayResolution:rE(),isScreenShareSupported:OQ(),isWebRTCSupported:Hh(),isGetUserMediaSupported:wT(),isWebAudioSupported:ST(),isWebSocketsSupported:"WebSocket"in window&&window.WebSocket.CLOSING===2,isWebCodecSupported:wM(),isMediaSessionSupported:ex(),isWebTransportSupported:Vh()};return navigator.userAgent.includes("miniProgram")&&(A.browser="mini/".concat(A.browser)),A}var _T="checkResult";function bT(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:30;yA.setItem(_T+A,{ua:navigator.userAgent,checkResult:co})}function LT(A){wI();let e=yA.getItem(_T+A);e&&e.ua===navigator.userAgent&&e.checkResult&&function(o,n){return!!Xc(o)&&Object.keys(n).every(a=>a in o)}(e.checkResult.detail,co.detail)&&(co=e.checkResult),yT(A)}function YQ(){return"requestVideoFrameCallback"in HTMLVideoElement.prototype}var Du="RTCRtpReceiver"in window&&"jitterBufferTarget"in window.RTCRtpReceiver.prototype;function ix(A){return{h264:1,h265:2,vp8:3,vp9:4,av1:5}[A]}var ox=!1;function hm(){return DA(this,null,function*(){var A;try{if(ox||(A=navigator?.mediaCapabilities)==null||!A.encodingInfo)return;let e=_Q(),o=pg();if(e===0||o===0)return;ox=!0;let n=["H264","VP8","VP9","AV1","H265"],[a,I]=yield Promise.all([FT(n),UT(n)]);a&&Object.keys(a).forEach(d=>{let R=ix(d.toLowerCase());ct.addEnum({key:513707,value:+"".concat(R).concat(+a[d].supported).concat(+a[d].powerEfficient).concat(e).concat(o),useUV:!1})}),I&&Object.keys(I).forEach(d=>{let R=ix(d.toLowerCase());ct.addEnum({key:514713,value:+"".concat(R).concat(+I[d].supported).concat(+I[d].powerEfficient).concat(e).concat(o),useUV:!1})});let{sender:c,receiver:u}=rx();ct.addEnum({key:513708,value:+"".concat(e).concat(o).concat(+c.high),useUV:!1}),ct.addEnum({key:513709,value:+"".concat(e).concat(o).concat(+c.main),useUV:!1}),ct.addEnum({key:514714,value:+"".concat(e).concat(o).concat(+u.high),useUV:!1}),ct.addEnum({key:514715,value:+"".concat(e).concat(o).concat(+u.main),useUV:!1})}catch(e){nA.info("detectVideoCodecCapabilities failed",e)}})}function FT(A){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1920,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1080,n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:30,a=arguments.length>4&&arguments[4]!==void 0?arguments[4]:3e3;return DA(this,null,function*(){let I={};try{for(let c of A){let u=yield navigator.mediaCapabilities.encodingInfo({type:"webrtc",video:{contentType:"video/".concat(c),width:e,height:o,bitrate:a,framerate:n}});I[c]=u}}catch{}return I})}function UT(A){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1920,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1080,n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:30,a=arguments.length>4&&arguments[4]!==void 0?arguments[4]:3e3;return DA(this,null,function*(){let I={};try{for(let c of A){let u=yield navigator.mediaCapabilities.decodingInfo({type:"webrtc",video:{contentType:"video/".concat(c),width:e,height:o,bitrate:a,framerate:n}});I[c]=u}}catch{}return I})}function rx(){let A={sender:{base:!1,main:!1,high:!1},receiver:{base:!1,main:!1,high:!1}};try{if(RTCRtpSender&&typeof RTCRtpSender.getCapabilities=="function"){let e=RTCRtpSender.getCapabilities("video");e&&e.codecs&&e.codecs.filter(o=>o.mimeType.toLowerCase()==="video/h264").forEach(o=>{if(o.sdpFmtpLine){let n=o.sdpFmtpLine.match(/profile-level-id=([0-9a-fA-F]+)/);if(n&&n[1])switch(n[1].slice(0,2)){case"42":A.sender.base=!0;break;case"4d":A.sender.main=!0;break;case"64":A.sender.high=!0}}})}if(RTCRtpReceiver&&typeof RTCRtpReceiver.getCapabilities=="function"){let e=RTCRtpReceiver.getCapabilities("video");e&&e.codecs&&e.codecs.filter(o=>o.mimeType.toLowerCase()==="video/h264").forEach(o=>{if(o.sdpFmtpLine){let n=o.sdpFmtpLine.match(/profile-level-id=([0-9a-fA-F]+)/);if(n&&n[1])switch(n[1].slice(0,2)){case"42":A.receiver.base=!0;break;case"4d":A.receiver.main=!0;break;case"64":A.receiver.high=!0}}})}}catch(e){nA.warn("get H264 profile levelId failed",e)}return A}var dq=es(hg(),1),pm=Symbol("instance"),fm=Symbol("cacheResult"),iC=class{constructor(A,e,o){this.oldState=A,this.newState=e,this.action=o,this.aborted=!1}abort(A){this.aborted=!0,PQ.call(A,this.oldState,new Error("action '".concat(this.action,"' aborted")))}toString(){return"".concat(this.action,"ing")}},SM=class extends Error{constructor(A,e,o){super(e),this.state=A,this.message=e,this.cause=o}},mm=new Map;function is(A,e){let o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return(n,a,I)=>{let c=o.action||a;if(!o.context){let d=mm.get(n)||[];mm.has(n)||mm.set(n,d),d.push({from:A,to:e,action:c})}let u=I.value;I.value=function(){let d=this;for(var R=arguments.length,k=new Array(R),_=0;_{if(o.fail&&o.fail.call(this,XA),o.sync){if(o.ignoreError)return XA;throw XA}return o.ignoreError?Promise.resolve(XA):Promise.reject(XA)};if(Z)return iA(Z);let cA=d.state,TA=new iC(cA,e,c);PQ.call(d,TA);let JA=XA=>{var Ft;return d[fm]=XA,TA.aborted||(PQ.call(d,e),(Ft=o.success)===null||Ft===void 0||Ft.call(this,d[fm])),XA},Ie=XA=>(PQ.call(d,cA,XA),iA(XA));try{let XA=u.apply(this,k);return function(Ft){return typeof Ft=="object"&&Ft&&"then"in Ft}(XA)?XA.then(JA).catch(Ie):o.sync?JA(XA):Promise.resolve(JA(XA))}catch(XA){return Ie(new SM(d._state,"".concat(d.name," ").concat(c," from ").concat(A," to ").concat(e," failed: ").concat(XA),XA instanceof Error?XA:new Error(String(XA))))}}}}var vM=typeof window<"u"&&window.__AFSM__?(A,e)=>{window.dispatchEvent(new CustomEvent(A,{detail:e}))}:typeof importScripts<"u"?(A,e)=>{postMessage({type:A,payload:e})}:()=>{};function PQ(A,e){let o=this._state;this._state=A;let n=A.toString();A&&this.emit(n,o),this.emit(Uo.STATECHANGED,A,o,e),this.updateDevTools({value:A,old:o,err:e instanceof Error?e.message:String(e)})}var Uo=class cC extends dq.default{constructor(e,o,n){super(),this.name=e,this.groupName=o,this._state=cC.INIT,e||(e=Date.now().toString(36)),n?Object.setPrototypeOf(this,n):n=Object.getPrototypeOf(this),o||(this.groupName=this.constructor.name);let a=n[pm];a?this.name=a.name+"-"+a.count++:n[pm]={name:this.name,count:0},this.updateDevTools({diagram:this.stateDiagram})}get stateDiagram(){let e=Object.getPrototypeOf(this),o=mm.get(e)||[],n=new Set,a=[],I=[],c=new Set,u=Object.getPrototypeOf(e);mm.has(u)&&(u.stateDiagram.forEach(R=>n.add(R)),u.allStates.forEach(R=>c.add(R))),o.forEach(R=>{let{from:k,to:_,action:Z}=R;typeof k=="string"?a.push({from:k,to:_,action:Z}):k.length?k.forEach(iA=>{a.push({from:iA,to:_,action:Z})}):I.push({to:_,action:Z})}),a.forEach(R=>{let{from:k,to:_,action:Z}=R;c.add(k),c.add(_),c.add(Z+"ing"),n.add("".concat(k," --> ").concat(Z,"ing : ").concat(Z)),n.add("".concat(Z,"ing --> ").concat(_," : ").concat(Z," 🟢")),n.add("".concat(Z,"ing --> ").concat(k," : ").concat(Z," 🔴"))}),I.forEach(R=>{let{to:k,action:_}=R;n.add("".concat(_,"ing --> ").concat(k," : ").concat(_," 🟢")),c.forEach(Z=>{Z!==k&&n.add("".concat(Z," --> ").concat(_,"ing : ").concat(_))})});let d=[...n];return Object.defineProperties(e,{stateDiagram:{value:d},allStates:{value:c}}),d}static get(e){let o;return typeof e=="string"?(o=cC.instances.get(e),o||cC.instances.set(e,o=new cC(e,void 0,Object.create(cC.prototype)))):(o=cC.instances2.get(e),o||cC.instances2.set(e,o=new cC(e.constructor.name,void 0,Object.create(cC.prototype)))),o}static getState(e){var o;return(o=cC.get(e))===null||o===void 0?void 0:o.state}updateDevTools(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};vM(cC.UPDATEAFSM,Object.assign({name:this.name,group:this.groupName},e))}get state(){return this._state}set state(e){PQ.call(this,e)}};Uo.STATECHANGED="stateChanged",Uo.UPDATEAFSM="updateAFSM",Uo.INIT="[*]",Uo.ON="on",Uo.OFF="off",Uo.instances=new Map,Uo.instances2=new WeakMap;var NM=typeof window<"u",OT=NM&&window.requestIdleCallback||function(A){let e=Date.now();return setTimeout(()=>{A({didTimeout:!1,timeRemaining:()=>Math.max(0,50-(Date.now()-e))})},1e3)},qs=NM&&window.cancelIdleCallback||function(A){clearTimeout(A)},JQ=NM&&(window.cancelAnimationFrame||window.mozCancelAnimationFrame),qh=class hc{static generateTaskID(){return this.currentTaskID++}static run(e,o,n){n!=null&&n.fps&&(n.delay=n.delay||Number((1e3/n.fps).toFixed(2))),n=bt(e==="interval"?{delay:2e3,count:0,backgroundTask:!0}:e==="ric"?{delay:1e4,count:0}:e==="raf"?{fps:60,delay:16.6,count:0,backgroundTask:!0}:{delay:2e3,count:0,backgroundTask:!0},n);let a=fi(bt({taskID:this.generateTaskID(),loopCount:0,intervalID:null,timeoutID:null,rafID:null,ricID:null,taskName:e,callback:o},n),{delay:n.delay});return this.taskMap.set(a.taskID,a),this[e](a),a.taskID}static interval(e){return e.intervalID=setInterval(()=>{e.callback(),e.loopCount+=1,hc.isBreakLoop(e)},e.delay)}static intervalInWorker(e){hc.sharedWorker||(hc.sharedWorker=new Worker(URL.createObjectURL(new Blob([` + const timers = new Map(); + self.onmessage = function(e) { + const { taskId, delay, type } = e.data; + if (type === 'start') { + timers.set(taskId, setInterval(() => { + self.postMessage({ type: 'tick', taskId }); + }, delay)); + } else if (type === 'stop') { + clearInterval(timers.get(taskId)); + timers.delete(taskId); + } + }; + `],{type:"application/javascript"}))),hc.sharedWorker.onmessage=o=>{var n;if(o.data.type==="tick"){let a=hc.workerTasks.get(o.data.taskId);a&&(hc.isBreakLoop(a)?((n=hc.sharedWorker)==null||n.postMessage({type:"stop",taskId:a.taskID}),hc.workerTasks.delete(a.taskID)):(a.callback(),a.loopCount+=1))}}),hc.workerTasks.set(e.taskID,e),hc.sharedWorker.postMessage({taskId:e.taskID,delay:e.delay,type:"start"})}static timeout(e){let o=()=>{if(e.callback(),e.loopCount+=1,!hc.isBreakLoop(e))return e.timeoutID=setTimeout(o,e.delay)};return e.timeoutID=setTimeout(o,e.delay)}static ric(e){let o,n=ki(),a=()=>{if(o=ki()-n,o>=e.delay&&(n=ki()-Math.floor(o%e.delay),e.callback(),e.loopCount+=1),!hc.isBreakLoop(e))return e.ricID=OT(a,{timeout:e.delay})};return e.ricID=OT(a,{timeout:e.delay})}static raf(e){let o,n=ki(),a=()=>document.hidden&&e.backgroundTask?(o=ki()-n,n=ki(),e.callback(),e.loopCount+=1,hc.isBreakLoop(e)?void 0:e.timeoutID=setTimeout(a,e.delay-Math.floor(o%e.delay))):(o=ki()-n,o>=e.delay&&(n=ki()-Math.floor(o%e.delay),e.callback(),e.loopCount+=1),hc.isBreakLoop(e)?void 0:e.rafID=requestAnimationFrame(a));if(e.rafID=requestAnimationFrame(a),e.backgroundTask){let I=()=>{if(document.hidden){let c=ki()-n;c>=e.delay?a():e.timeoutID=setTimeout(a,e.delay-c)}};document.addEventListener("visibilitychange",I),e.onVisibilitychange=I,document.hidden&&I()}return e.taskID}static hasTask(e){return this.taskMap.has(e)}static clearTask(e){if(!this.taskMap.has(e))return!0;let{intervalID:o,timeoutID:n,rafID:a,ricID:I,onVisibilitychange:c}=this.taskMap.get(e);return o&&clearInterval(o),n&&clearTimeout(n),a&&JQ&&JQ(a),I&&qs(I),c&&document.removeEventListener("visibilitychange",c),this.taskMap.delete(e),!0}static isBreakLoop(e){return!this.hasTask(e.taskID)||e.count!==0&&e.loopCount>=e.count&&(this.clearTask(e.taskID),!0)}};G(qh,"taskMap",new Map),G(qh,"currentTaskID",1),G(qh,"sharedWorker",null),G(qh,"workerTasks",new Map);var nn=qh,mi={LOAD_START:fA.LOADSTART,LOADED_DATA:fA.LOADEDDATA,LOADED_META_DATA:fA.LOADEDMETADATA,MEDIA_TRACK_CHANGED:"media-track-changed",PLAYER_STATE_CHANGED:"player-state-changed",ERROR:"error",AUTOPLAY_FAILED:"autoplay-failed",RESIZE:fA.RESIZE,TIME_UPDATE:"time-update",LEAVE_PICTURE_IN_PICTURE:fA.LEAVE_PICTURE_IN_PICTURE,ENTER_PICTURE_IN_PICTURE:fA.ENTER_PICTURE_IN_PICTURE,USER_RESUME_IN_PIP_OR_FULL_SCREEN:"user-resume-in-pip-or-full-screen",USER_PAUSE_IN_PIP_OR_FULL_SCREEN:"user-pause-in-pip-or-full-screen",ENTER_FULL_SCREEN:"enter-full-screen",LEAVE_FULL_SCREEN:"leave-full-screen",VOLUME_CHANGE:"volume-change",FIRST_FRAME_RENDER:"first-frame-render"},xT={};XC(xT,{create:()=>nE,remove:()=>pr});var rB=new WeakMap;function nE(A,e){rB.has(A)||rB.set(A,[]);let o=rB.get(A),n={add:(a,I)=>("addEventListener"in e?(o.push(e.removeEventListener.bind(e,a,I)),e.addEventListener(a,I)):(o.push(e.off.bind(e,a,I)),e.on(a,I)),n)};return n}function pr(A){let e=rB.get(A);e&&(e.forEach(o=>o()),rB.delete(A))}var Jo=new class{constructor(){G(this,"_roomIdMap",new Map),G(this,"_configs"),typeof registerProcessor>"u"&&(this._configs={sdkAppId:"",userId:"",version:il,env:ou.QCLOUD,browserVersion:uu.name+uu.version,ua:navigator.userAgent})}setConfig(A){let{sdkAppId:e,env:o,userId:n,roomId:a}=A;e!==this._configs.sdkAppId&&(this._configs.sdkAppId=String(e)),this._configs.env=o,this._configs.userId=n,this._roomIdMap.set(n,String(a))}logSuccessEvent(A){GQ||!nA.isAbleToUpload||this._configs.env===ou.QCLOUD&&this.uploadEventToKibana(fi(bt({},A),{result:"success"}))}logFailedEvent(A){if(GQ||!nA.isAbleToUpload)return;let{eventType:e,code:o,error:n,userId:a}=A,I={roomId:this._roomIdMap.get(a||this._configs.userId),userId:a,eventType:e,result:"failed",code:o||n?.extraCode||n?.code||Ge.UNKNOWN};this._configs.env===ou.QCLOUD&&this.uploadEventToKibana(fi(bt({},I),{error:n}))}uploadEventToKibana(A){let e="stat-".concat(A.eventType,"-").concat(A.result);(A.eventType==="delta-join"||A.eventType==="delta-leave"||A.eventType==="delta-publish")&&(e="".concat(A.eventType,":").concat(A.delta)),this.uploadEvent({log:e,userId:A.userId}),A.result==="failed"&&(e="stat-".concat(A.eventType,"-").concat(A.result,"-").concat(A.code),this.uploadEvent({log:e,userId:A.userId,error:A.error}))}uploadEvent(A){let{log:e,userId:o,error:n}=A,a={timestamp:jU(),sdkAppId:this._configs.sdkAppId,userId:o||this._configs.userId,version:il,log:e};n&&(a.errorInfo=n.message,n.stack&&(a.errorInfo+=` +`.concat(n.stack)));let I=lA.enable?Iu(a,2002,Number(this._configs.sdkAppId)):JSON.stringify(a);this.sendRequest(dh(this._configs.sdkAppId,Xg.LOG),I)}sendRequest(A,e){setTimeout(()=>cu({url:A,body:e,priority:"low"}).catch(()=>{}),2e3)}},oC=new WeakMap;function nB(A){let{settings:e={retries:5,timeout:2e3},onError:o,onRetrying:n,onRetryFailed:a}=A;return function(I,c,u){let d=Kf({retryFunction:u.value,settings:e,onError(R){let{error:k,retry:_,reject:Z,retryFuncArgs:iA}=R;var cA;o?o.call(this,k,()=>{var TA;(TA=oC.get(I))!=null&&TA.has(c)?_():Z(k)},Z,iA):(cA=oC.get(I))!=null&&cA.has(c)?_():Z(k)},onRetrying(R,k){var _;RQ(n)&&n.call(this,R,k),(_=oC.get(I))!=null&&_.has(c)&&(oC.get(I).get(c).stopRetry=k)},onRetryFailed:a});return u.value=function(){let R=oC.get(I);for(var k=arguments.length,_=new Array(k),Z=0;Z{var iA;return(iA=oC.get(I))==null?void 0:iA.delete(c)})},u}}function TM(A){let{fnName:e,callback:o,validateArgs:n=!0}=A;return function(a,I,c){let u=c.value;return c.value=function(){for(var d,R,k=arguments.length,_=new Array(k),Z=0;ZIe===JA)){TA=!1;break}}TA&&(o&&o.apply(this,_),iA&&iA(),(R=oC.get(a))==null||R.delete(e))}return u.apply(this,_)},c}}var rC=class extends Uo{constructor(A,e){super(A.id,"".concat(e,"-player")),this.options=A,this.kind=e,G(this,"id"),G(this,"element",null),G(this,"track"),G(this,"url"),G(this,"attr"),G(this,"mode"),G(this,"muted"),G(this,"_log"),G(this,"isPausedByUserCall",!1),G(this,"_pausedRetryCount"),G(this,"_isElementPlayingFired",!1),G(this,"_interval"),G(this,"_delayDestroyTimeoutId",0),G(this,"_playSuccessResolve"),G(this,"_isReplayByRecreateMediaStreamCalled",!1),G(this,"isPlayCalled",!1),G(this,"isInAutoPlayFailedState",!1),G(this,"isBindAutoPlayEvent",!1),this.id=A.id,this._log=A.log,this.track=A.track,this.muted=A.muted,this._pausedRetryCount=pQ,this._state="STOPPED",this.bindTrackEvents(),this._log.info("create ".concat(e,"-player ").concat(this.id))}get isPlaying(){var A;return this._state==="PLAYING"&&((A=this.element)==null?void 0:A.paused)===!1}get isPaused(){var A;return this._state==="PAUSED"||((A=this.element)==null?void 0:A.paused)===!0}get isStopped(){return this._state==="STOPPED"}setAttr(A){this.attr=A}setUrl(A){this.track&&(this.unbindTrackEvents(),this.element&&(this.element.srcObject=null),this.track=null),A!==this.url&&(this.url=A,A!==null&&this.element&&(this.element.crossOrigin="anonymous",this.element.src=A))}play(){return DA(this,null,function*(){if(!this.isPlaying)try{this.isPlayCalled=!0,this._delayDestroyTimeoutId&&(clearTimeout(this._delayDestroyTimeoutId),this._delayDestroyTimeoutId=0,this.bindTrackEvents(),this.bindElementEvents()),this.bindAutoPlayEvent(),yield new Promise((A,e)=>{this._playSuccessResolve=A,this.element.play().then(A,e)})}catch(A){let e=Wi({key:Mi.PLAY_FAILED,data:{media:this.kind,error:A}});if(this._log.warn(A),e.includes("NotAllowedError"))throw this.isInAutoPlayFailedState=!0,new Ct({code:Ge.PLAY_NOT_ALLOWED,message:e})}})}stop(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0;var e;this.isPlayCalled=!1,this.isPausedByUserCall=!1,this._isElementPlayingFired=!1,this.unbindEvents(),A>0&&!TQ?this._delayDestroyTimeoutId||((e=this.element)==null||e.remove(),this._log.info("destroy element after 3 * ".concat(A)),this._delayDestroyTimeoutId=setTimeout(()=>this.destroyElement(),3*A)):this.destroyElement(),this.handleStopped(fA.ENDED),this._interval>0&&nn.clearTask(this._interval)}destroyElement(){this.element&&(this._log.debug("destroy element"),this.element.remove(),this.element.src="",this.element.srcObject=null,this.element=null),clearTimeout(this._delayDestroyTimeoutId),this._delayDestroyTimeoutId=0}pause(){this._log.info("pause"),this.isPausedByUserCall=!0,this.doPause()}doPause(){var A;(A=this.element)==null||A.pause()}resume(){let A=arguments.length>0&&arguments[0]!==void 0&&arguments[0];return this.isPausedByUserCall=!1,this.doResume(A)}doResume(){return this._log.info("resume"),this.isPausedByUserCall||this.isPlaying?Promise.resolve():xO?this.replay():this.play().catch(()=>{})}setMuted(A){this.element&&(this.element.muted=A),this.muted=A}replay(){return this.stop(),this.play().catch(()=>{})}bindElementEvents(){if(this.element){let A=this.handleElementEvent.bind(this);return nE(this.element,this.element).add(fA.PLAYING,A).add(fA.ENDED,A).add(fA.PAUSE,A).add(fA.ERROR,A).add(fA.LOADSTART,A).add(fA.LOADEDDATA,A).add(fA.LOADEDMETADATA,A)}}bindTrackEvents(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.track;if(A){let e=this.handleTrackEvent.bind(this);xT?.create(A,A).add(fA.ENDED,e).add(fA.MUTE,e).add(fA.UNMUTE,e),A.readyState===fA.ENDED&&this.handleTrackEvent({type:fA.ENDED}),A.muted&&this.handleTrackEvent({type:fA.MUTE})}}bindAutoPlayEvent(){this.isBindAutoPlayEvent||(this._log.warn("bindAutoPlayEvent"),S.on(K.AUTOPLAY_DIALOG_CLICK_CONFIRM,this.resume,this),this.isBindAutoPlayEvent=!0)}unbindTrackEvents(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.track;A&&pr(A)}unbindEvents(){this.element&&pr(this.element),this.unbindTrackEvents(),S.off(K.AUTOPLAY_DIALOG_CLICK_CONFIRM,this.resume,this),this.isBindAutoPlayEvent=!1}handleElementEvent(A){switch(A.type){case fA.PLAYING:Lt()||(this.isInAutoPlayFailedState=!1),this._isElementPlayingFired=!0,this._log.info("".concat(this.kind," player is playing")),this.handlePlaying(fA.PLAYING),this._interval&&(nn.clearTask(this._interval),this._interval=-1);break;case fA.ENDED:this._log.info("".concat(this.kind," player is ended")),this.handleStopped(fA.ENDED);break;case fA.PAUSE:this._log.info("".concat(this.kind," player is paused")),this.handlePaused(fA.PAUSE);break;case fA.ERROR:if(this.element&&this.element.error){this.handlePaused(fA.ERROR);let{code:e,message:o}=this.element.error;this._log.error("".concat(this.kind," ").concat(this._log.isLocal?"local":"remote"," MediaError code: ").concat(e," message: ").concat(o," userAgent: ").concat(navigator.userAgent)),Jo.uploadEvent({log:"stat-".concat(this.kind,"-").concat(oa.PLAYER_ERROR,"-").concat(e,"-").concat(navigator.userAgent),error:this.element.error}),oT||iT?this.emit(mi.ERROR,this.element.error):this.replayByRecreateMediaStream(this.element.error)}break;case fA.LOADEDDATA:this.kind===fA.VIDEO&&this.emit(mi.LOADED_DATA);break;case fA.LOADEDMETADATA:this.kind===fA.VIDEO&&this.emit(mi.LOADED_META_DATA);break;case fA.LOADSTART:this.emit(mi.LOAD_START)}}replayByRecreateMediaStream(A){if(!this._isReplayByRecreateMediaStreamCalled)return this._isReplayByRecreateMediaStreamCalled=!0,this.doReplayByRecreateMediaStream(1e3).then(()=>{this._log.warn("replayByRecreateMediaStream success"),Jo.uploadEvent({log:"stat-replayByRecreateMediaStream-success"}),ct.addSuccessEvent({key:this.kind===fA.AUDIO?506700:516700})}).catch(()=>{var e;this._log.error("replayByRecreateMediaStream failed"),Jo.uploadEvent({log:"stat-replayByRecreateMediaStream-failed"}),ct.addFailedEvent({key:this.kind===fA.AUDIO?506700:516700,error:(e=this.element)==null?void 0:e.error}),this.emit(mi.ERROR,A)})}doReplayByRecreateMediaStream(A){return this._log.warn("delay ".concat(A,"ms to recreate mediaStream")),new Promise((e,o)=>{AC(A).then(()=>{this.element&&(this.element.srcObject=null,this.element.srcObject=new MediaStream([this.track]),this._log.warn("recreated mediaStream"),this.element.onerror=()=>{var n,a,I;this._log.warn("element onerror ".concat((a=(n=this.element)==null?void 0:n.error)==null?void 0:a.code," fired after recreated mediaStream")),o((I=this.element)==null?void 0:I.error)}),AC(5e3).then(()=>{var n,a;(!this.isPlaying||(n=this.element)!=null&&n.error)&&o((a=this.element)==null?void 0:a.error),e()})})}).finally(()=>{this.element&&(this.element.onerror=null)})}handleTrackEvent(A){return DA(this,null,function*(){let e=A.type;switch(this.options.enableLogTrackState&&this._log[e===fA.UNMUTE?"info":"warn"]("track ".concat(e)),e){case fA.ENDED:this.handleStopped(fA.ENDED);break;case fA.MUTE:this.handlePaused(fA.MUTE);break;case fA.UNMUTE:this.mode>0?this.handlePlaying(this.mode.toString()):this.element&&(this.element.paused&&!this.isPausedByUserCall&&(this._log.warn("track unmuted and element is paused, resume"),yield this.doResume()),this.element&&!this.element.paused&&this._isElementPlayingFired&&this.handlePlaying(fA.UNMUTE))}})}handlePlaying(A){var e;return this._log.debug("handlePlaying",A),(e=this._playSuccessResolve)==null||e.call(this,A),A}handlePaused(A){return this._log.debug("handlePaused",A),A}handleStopped(A){return this._log.debug("handleStopped",A),A}getElement(){return this.element}};G(rC,"PlayerEvent",mi),vt([nB({settings:{retries:2,timeout:0},onError(A,e,o,n){n[0]=(n[0]||1e3)+1e3,e()}})],rC.prototype,"doReplayByRecreateMediaStream"),vt([is([],"PLAYING",{sync:!0,success(A){this.emit(mi.PLAYER_STATE_CHANGED,{type:this.kind,state:"PLAYING",reason:A})}})],rC.prototype,"handlePlaying"),vt([is("PLAYING","PAUSED",{ignoreError:!0,sync:!0,success(A){this.emit(mi.PLAYER_STATE_CHANGED,{type:this.kind,state:"PAUSED",reason:A})}})],rC.prototype,"handlePaused"),vt([is([],"STOPPED",{sync:!0,success(A){this.emit(mi.PLAYER_STATE_CHANGED,{type:this.kind,state:"STOPPED",reason:A})}})],rC.prototype,"handleStopped");var aB="trtc_autoplay",YT="".concat(aB,"_mask"),Dm="".concat(aB,"_wrapper"),ym="".concat(aB,"_header"),Rm="".concat(aB,"_content"),GM="".concat(aB,"_action_wrapper"),J="".concat(aB,"_question"),x="".concat(aB,"_collapse"),oA="".concat(aB,"_action_confirm"),uA="".concat(aB,"_detail"),FA="#2473E8",zA="dialog",$A="".concat(zA,"-show"),ne="".concat(zA,"-1"),De="".concat(zA,"-2"),le=!1,We=!1,Lt=()=>We,Pt="".concat($C,"/").concat(rl()?"zh-cn":"en","/tutorial-21-advanced-auto-play-policy.html"),uo="
").concat(rl()?"其他方案?":"Any other solution?",""),Br="".concat(rl()?"浏览器自动播放策略:在用户与页面产生交互(点击、触摸)之前,浏览器禁止播放有声媒体。该弹窗用于帮助用户恢复音视频播放。".concat(uo):"Autoplay Policy: Before user interacts with the web page (clicking, touching), page will not be allowed to play media with sound. This Dialog is used to help users resume playback. ".concat(uo)),Nn=class{constructor(){if(G(this,"content","音视频播放被浏览器拦截,请点击“恢复播放”。"),G(this,"_dialogNode",null),G(this,"_bodyPosition",""),G(this,"_showDetail",!1),G(this,"_isCollapseClicked",!1),G(this,"_isQuestionClicked",!1),rl()||(this.content='Media playback failed. Click the "Resume" to resume playback.'),!le){let A=document.createElement("style");A.innerHTML=".".concat(YT,"{position:fixed;top:0;left:0;right:0;bottom:0;width:100vw;height:100vh;display:flex;justify-content:center;align-items:center;background:rgba(0,0,0,0.5);z-index:1500;}.").concat(YT," div:not(.").concat(GM,"){display:block !important;}.").concat(Dm,"{padding:14px;background:#fff;border-radius:3px;box-shadow:0px 3px 15px #434343;border:1px solid #d1cfcf;max-width:500px;}.").concat(Dm," a{color:").concat(FA,";}.").concat(ym,"{overflow:hidden;text-overflow:ellipsis;font-size:16px;font-weight:600;}.").concat(Rm,"{margin:8px 0;}.").concat(GM,"{width:100%;display:flex !important;align-items:center;justify-content:right;float:right;}.").concat(x,"{margin-right:auto;cursor:pointer}.").concat(J,"{height:100%;line-height:16px;cursor:pointer;}.").concat(oA,"{margin-left:8px;color:#fff;background:").concat(FA,";padding:4px 12px;outline:none;border:1px solid;border-radius:3px;font-weight:bold;}.").concat(oA,":hover{opacity:0.9;}.").concat(x,",.").concat(oA,",.").concat(Rm,",.").concat(J,"{font-size:14px;}@media screen and (max-width:750px){.").concat(Dm,"{width:80vw;}}"),document.head.appendChild(A),le=!0}this.addDiaLog()}createDiaLog(){let A=document.createElement("template");A.innerHTML='
").concat(location.host,"
").concat(this.content,"
").trim();let e=document.createElement("button");e.className=oA,e.innerText=rl()?"恢复播放":"Resume",e.onclick=this.onConfirm.bind(this);let o=document.createElement("div");o.className=J,o.innerHTML=` + + + + + + `,o.onclick=this.onQuestionClick.bind(this);let n=document.createElement("div");n.className=x,n.innerText="".concat(rl()?"详情 >":"Detail >"),n.onclick=this.onCollapseClick.bind(this);let a=A.content.firstChild,I=a.querySelector(".".concat(GM));return I.appendChild(n),I.appendChild(o),I.appendChild(e),a}addDiaLog(){Lt()||(We=!0,this._dialogNode=this.createDiaLog(),document.body.appendChild(this._dialogNode),this._dialogNode.onclick=this.onConfirm.bind(this),this._dialogNode.querySelector(".".concat(Dm)).onclick=A=>A.stopPropagation(),this._bodyPosition=document.body.style.position,document.body.style.position="fixed",nA.info("show autoplay dialog"),Jo.uploadEvent({log:$A}))}deleteDialog(){this._dialogNode&&(document.body.removeChild(this._dialogNode),document.body.style.position=this._bodyPosition,this._dialogNode=null,We=!1),Ss=null}onConfirm(){nA.warn("confirm clicked, try resume stream"),S.emit(K.AUTOPLAY_DIALOG_CLICK_CONFIRM),this.deleteDialog()}onCollapseClick(){let A=this._dialogNode.querySelector(".".concat(uA));A.style.visibility="".concat(this._showDetail?"hidden":"visible"),A.style.height="".concat(this._showDetail?0:"fit-content"),this._showDetail=!this._showDetail,this._isCollapseClicked||Jo.uploadEvent({log:ne}),this._isCollapseClicked=!0}onQuestionClick(){window.open(Pt,"_blank"),this._isQuestionClicked||Jo.uploadEvent({log:De}),this._isQuestionClicked=!0}},Ss=null;function nC(){Ss||(Ss=new Nn)}var Mt,wi=class jZ extends rC{constructor(e){super(e,fA.VIDEO),G(this,"stat",{}),G(this,"_calculateTimeout",-1),G(this,"viewMirror",!1),G(this,"objectFit","cover"),G(this,"container"),G(this,"canvas"),G(this,"shouldRenderAlpha",!1),G(this,"_preSize",{width:0,height:0}),G(this,"posterImg"),G(this,"pipWindow"),G(this,"enterPIPPromise"),G(this,"_originContainerPosition"),G(this,"_isResettingSrcObject",!1),G(this,"_wrapper",null),G(this,"_useWrapper",!1),G(this,"_isFirstFrameRenderEmitted",!1),this.mode=e.canvas?1:0,this.container=e.container,this.canvas=e.canvas,Ee(e.viewMirror)||(this.viewMirror=e.viewMirror),Ee(e.objectFit)||(this.objectFit=e.objectFit),this.initializeElement()}get isPlaying(){var e;return!(this._state!=="PLAYING"||this.element&&this.element.paused)&&((e=this.track)==null?void 0:e.readyState)==="live"&&!this.track.muted}initializeElement(){let e=document.createElement(fA.VIDEO);this.track&&this.mode!==2&&(e.srcObject=new MediaStream([this.track])),e.muted=!0,e.setAttribute("id","video_".concat(this.id)),e.setAttribute("style",this.styleAttribute),this.canvas&&this.canvas.setAttribute("style",this.styleAttribute),e.setAttribute("autoplay","autoplay"),e.setAttribute("playsinline","playsinline"),this.element=e,ra&&(e.poster="data:,"),this._appendToWrapper(),this.bindElementEvents(),this.calculateStat(),this._bindFirstFrameRenderEvent(e)}_bindFirstFrameRenderEvent(e){let o=()=>{if(this._isFirstFrameRenderEmitted)return;this._isFirstFrameRenderEmitted=!0;let n=e.videoWidth||0,a=e.videoHeight||0;this._log.info("first frame render: ".concat(n,"x").concat(a)),this.emit(mi.FIRST_FRAME_RENDER,{width:n,height:a})};typeof e.requestVideoFrameCallback=="function"?e.requestVideoFrameCallback(o):e.addEventListener("loadeddata",o,{once:!0})}get styleAttribute(){let e=this._useWrapper?"grid-area:1/1;width:100%;height:100%;object-fit:".concat(this.objectFit,";").concat(this.shouldRenderAlpha?"":"background-color:black",";"):"width:100%;height:100%;object-fit:".concat(this.objectFit,";").concat(this.shouldRenderAlpha?"":"background-color:black",";");return this.viewMirror&&(e+="transform:scaleX(-1);"),e}setLiveMode(e){if(this._useWrapper!==e&&(this._useWrapper=e,this.elementToRender&&this.elementToRender.setAttribute("style",this.styleAttribute),this.container&&this.elementToRender))if(e){let o=this._getOrCreateWrapper();o.insertBefore(this.elementToRender,o.firstChild)}else this.container.appendChild(this.elementToRender),this._cleanupWrapper()}setContainer(e){if(this.container===e)return;let o=this._wrapper,n=this.container;this.container=e,this._pausedRetryCount=pQ,this.track&&this.elementToRender&&this._appendToWrapper(),o&&n&&n!==this.container&&o.isConnected&&o.children.length===0&&o.remove()}_getOrCreateWrapper(){if(!this.container)throw new Error("[VideoPlayer] container is required");let e=this.container.querySelector("[data-trtc-video-wrapper]");return e||(e=document.createElement("div"),e.setAttribute("data-trtc-video-wrapper","true"),e.style.cssText="display:grid;width:100%;height:100%;",this.container.appendChild(e)),this._wrapper=e,e}_appendToWrapper(e){let o=e??this.elementToRender;if(this.container&&o)if(this._useWrapper){let n=this._getOrCreateWrapper();n.insertBefore(o,n.firstChild)}else this.container.appendChild(o)}bindElementEvents(){let e=super.bindElementEvents();this.handleElementEvent=this.handleElementEvent.bind(this),this.handleFullscreenChange=this.handleFullscreenChange.bind(this),this.handleVolumeChange=this.handleVolumeChange.bind(this),e&&e.add(fA.ENTER_PICTURE_IN_PICTURE,this.handleElementEvent).add(fA.LEAVE_PICTURE_IN_PICTURE,this.handleElementEvent).add(fA.RESIZE,this.handleElementEvent),this.element&&(this.element.addEventListener(fA.FULLSCREEN_CHANGE,this.handleFullscreenChange),this.element.addEventListener("webkitbeginfullscreen",this.handleFullscreenChange),this.element.addEventListener("webkitendfullscreen",this.handleFullscreenChange),this.element.addEventListener("volumechange",this.handleVolumeChange))}handleTrackEvent(e){var o;return e.type===fA.MUTE&&((o=this.stat)!=null&&o.fps&&(this.stat.fps=0),this.isFullscreen()&&this.resetSrcObjectToReplay()),super.handleTrackEvent(e)}handleFullscreenChange(){this.isFullscreen()?(this._log.info("enter fullscreen"),this.emit(mi.ENTER_FULL_SCREEN)):(this._log.info("leave fullscreen"),this.emit(mi.LEAVE_FULL_SCREEN))}handleVolumeChange(){var e;(this.isPictureInPicture()||this.isFullscreen())&&this.emit(mi.VOLUME_CHANGE,{muted:(e=this.element)==null?void 0:e.muted})}handleElementEvent(e){var o,n,a,I,c,u;if(this.mode===2)return;super.handleElementEvent(e);let d=e.type,R=this.isPictureInPicture(),k=this.isFullscreen(),_=e.isTrusted&&(R&&Ma||k);if(d===fA.PLAYING&&_&&!this._isResettingSrcObject&&(this._log.warn("user resume in ".concat(k?"fullscreen":"pip")),this.emit(mi.USER_RESUME_IN_PIP_OR_FULL_SCREEN)),d===fA.PAUSE&&(_&&(this._log.warn("user pause in ".concat(k?"fullscreen":"pip")),this.emit(mi.USER_PAUSE_IN_PIP_OR_FULL_SCREEN)),this.container&&!this.container.isConnected&&(this._log.warn("".concat(this.kind," player has been remove, element ID: ").concat(this.container.id)),AC(500).then(()=>{var Z;(Z=this.container)!=null&&Z.isConnected&&(this._pausedRetryCount=pQ,this._log.info("view container ".concat(this.container.id," is in dom, reset pausedRetryCount")))})),this._pausedRetryCount>0&&!Lt()&&!this.isPausedByUserCall&&!_&&(this._log.info("[".concat(pQ-this._pausedRetryCount+1,"/").concat(pQ,"] ").concat(this.kind," player auto resume when paused")),this.doResume(),this._pausedRetryCount--),Ea&&!_&&(this._interval=nn.run("timeout",()=>{this.element&&this._state==="PAUSED"&&!this.isPausedByUserCall&&this.doResume()},{delay:3e3})),this.stat.fps&&(this.stat.fps=0)),this.viewMirror&&this.element){let Z=this.element.style.transform;d===fA.ENTER_PICTURE_IN_PICTURE?this.element.style.transform=Z.replace("scaleX(-1)",""):d===fA.LEAVE_PICTURE_IN_PICTURE&&!Z.includes("scaleX")&&(this.element.style.transform="".concat(Z," scaleX(-1)"))}d===fA.RESIZE&&(this._preSize.height!==((o=this.element)==null?void 0:o.videoHeight)||this._preSize.width!==((n=this.element)==null?void 0:n.videoWidth))&&(this._log.info("video size changed to ".concat((a=this.element)==null?void 0:a.videoWidth,"x").concat((I=this.element)==null?void 0:I.videoHeight)),this._preSize.height=((c=this.element)==null?void 0:c.videoHeight)||0,this._preSize.width=((u=this.element)==null?void 0:u.videoWidth)||0,this.emit(mi.RESIZE,{newWidth:this._preSize.width,newHeight:this._preSize.height})),d===fA.LEAVE_PICTURE_IN_PICTURE&&(this._log.warn("exit pip"),this.isPaused&&!this.isPausedByUserCall&&(this._log.warn("resume after exit pip"),this.doResume()),this.resetSrcObjectToReplay(),this.emit(mi.LEAVE_PICTURE_IN_PICTURE)),d===fA.ENTER_PICTURE_IN_PICTURE&&this.emit(mi.ENTER_PICTURE_IN_PICTURE)}resetSrcObjectToReplay(){ra&&Gh&&this.isPlayCalled&&this.element&&this.track&&!this.isPausedByUserCall&&(this._log.warn("reset srcObject to replay for android chromium"),this._isResettingSrcObject=!0,this.element.srcObject=new MediaStream([this.track]),this.element.play().catch(e=>{this._log.warn("play failed after reset srcObject",e)}).finally(()=>{this._isResettingSrcObject=!1}))}setCanvas(e){let o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1;var n,a;this.canvas!==e&&((n=this.canvas)==null||n.remove(),e?.setAttribute("style",this.styleAttribute),this.canvas=e,this.mode=e?o:0,this.mode===2&&this.setTrack(e.captureStream().getVideoTracks()[0]),e?((a=this.element)==null||a.remove(),this._appendToWrapper(e)):this.element&&this._appendToWrapper(this.element))}setAttr(e){let o=Object.assign({autoplay:"autoplay",playsinline:"playsinline",muted:!0},e);o.style=Object.assign({width:"100%",height:"100%"},o.style),super.setAttr(o)}get mirror(){return this.viewMirror}setRect(e,o){this.elementToRender&&(this.elementToRender.style.width="".concat(e,"px"),this.elementToRender.style.height="".concat(o,"px"))}setViewMirror(e){this.elementToRender&&(this.elementToRender.style.transform=e?"scaleX(-1)":""),this.viewMirror=e}setObjectFit(e){this.elementToRender&&(this.elementToRender.style.objectFit="".concat(e)),this.objectFit=e}setPoster(e){let o=arguments.length>1&&arguments[1]!==void 0&&arguments[1];return new Promise(n=>{if(!this.element||(this._log.info("setPoster",e.slice(0,10)),e===""?this.element.removeAttribute("poster"):this.element.poster=e,!o||!Ma&&!Yr))return n();if(e==="")return this.removePosterImg(),n();if(this.posterImg)return n();let a=document.createElement("img");a.src=e;let I=window.getComputedStyle(this.element),c=I.objectFit||this.objectFit,u=1;if(this._useWrapper){let d=parseInt(I.zIndex,10);isNaN(d)||(u=d+1)}a.style.cssText=this._useWrapper?"grid-area:1/1;z-index:".concat(u,";width:100%;height:100%;object-fit:").concat(c,";"):"position:absolute;top:0;left:0;width:100%;height:100%;object-fit:".concat(c,";"),a.onload=()=>DA(this,null,function*(){try{a.decode&&(yield a.decode()),this.container&&!this._useWrapper&&window.getComputedStyle(this.container).position==="static"&&(this._originContainerPosition=this.container.style.position,this.container.style.position="relative"),this.posterImg=a;let d=this._useWrapper?this._wrapper:this.container;d?.appendChild(a),jf()&&al<=17&&this.elementToRender&&(this.elementToRender.style.visibility="hidden")}catch(d){this._log.warn("decode poster image error",d)}return n()}),a.onerror=()=>(this._log.warn("load poster image error"),n())})}removePosterImg(){this.posterImg&&(jf()&&al<=17&&this.elementToRender&&(this.elementToRender.style.visibility=""),this.posterImg.remove(),URL.revokeObjectURL(this.posterImg.src),!this._useWrapper&&this.container&&!Ee(this._originContainerPosition)&&this.container.style.position==="relative"&&(this.container.style.position=this._originContainerPosition),delete this.posterImg)}get hasPoster(){var e;return!!this.posterImg||!((e=this.element)==null||!e.getAttribute("poster"))}pause(){let e=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];return DA(this,null,function*(){zg(jZ.prototype,this,"pause").call(this),!this.isPictureInPicture()&&!this.hasPoster&&(Gh||e&&(Yr||Ma))&&(yield this.setPoster(this.getVideoFrame(),!0))})}resume(){let e=arguments.length>0&&arguments[0]!==void 0&&arguments[0];return super.resume(e).then(()=>{var o;(this.posterImg||(o=this.element)!=null&&o.poster)&&this.setPoster("",!0)})}doResume(){let e=arguments.length>0&&arguments[0]!==void 0&&arguments[0];return this.isPaused&&e&&this.element&&this.track&&Gh&&this.track.kind==="video"&&(this.element.srcObject=new MediaStream([this.track])),super.doResume()}stop(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0;var o;this.isPictureInPicture()&&this.exitPictureInPicture().catch(n=>{}),this.isFullscreen()&&this.exitFullscreen().catch(n=>{}),this.element&&(this.element.removeEventListener(fA.FULLSCREEN_CHANGE,this.handleFullscreenChange),this.element.removeEventListener("webkitbeginfullscreen",this.handleFullscreenChange),this.element.removeEventListener("webkitendfullscreen",this.handleFullscreenChange),this.element.removeEventListener("volumechange",this.handleVolumeChange)),this._isFirstFrameRenderEmitted=!1,super.stop(e),(o=this.canvas)==null||o.remove(),this.removePosterImg(),this._useWrapper&&this._cleanupWrapper()}_cleanupWrapper(){this._wrapper&&this._wrapper.children.length===0&&this._wrapper.remove(),this._wrapper=null}play(e){if(Ee(e?.isLiveStream)||this.setLiveMode(e.isLiveStream),this.element){if(this.elementToRender&&this.container)if(this._useWrapper){let o=this._getOrCreateWrapper();this.elementToRender.parentElement!==o&&o.insertBefore(this.elementToRender,o.firstChild)}else this.elementToRender.parentElement!==this.container&&this.container.append(this.elementToRender)}else this.initializeElement();return this.mode===2?Promise.resolve():super.play()}get elementToRender(){return this.canvas||this.element}setTrack(e){e!==this.track&&(this.unbindTrackEvents(),this.track=e,this.emit(mi.MEDIA_TRACK_CHANGED,e),e!==null&&(this.bindTrackEvents(),this.element&&this.mode!==2&&(this.element.srcObject=new MediaStream([e]),this.element.remove()),this._appendToWrapper()))}getVideoFrame(){if(this.canvas)return this.canvas.toDataURL("image/png");if(!this.element)return"";let e=document.createElement("canvas");return e.width=this.element.videoWidth,e.height=this.element.videoHeight,e.getContext("2d").drawImage(this.element,0,0),e.toDataURL("image/png")}getElement(){return this.element}calculateStat(){try{if(YQ()&&this.element&&this._calculateTimeout<0){let e=0,o=null,n=(a,I)=>{this.stat.width=I.width,this.stat.height=I.height,o&&(this.stat.fps=Math.round((I.presentedFrames-o.presentedFrames)/(a-e)*1e3)),e=a,o=I,this._calculateTimeout=-1,this.element&&(this._calculateTimeout=setTimeout(()=>{var c;return(c=this.element)==null?void 0:c.requestVideoFrameCallback(n)},2e3))};this.element.requestVideoFrameCallback(n)}}catch(e){this._log.warn("init stat failed",e)}}enterFullscreen(){return DA(this,null,function*(){let e=this.elementToRender;if(!e)throw this._log.warn("no element to render, cannot enter fullscreen"),new Error("No element available for fullscreen");if(Ea&&this.isPictureInPicture()){this._log.info("exit pip before entering fullscreen");try{yield this.exitPictureInPicture()}catch(o){this._log.warn("exit pip failed before fullscreen:",o)}}try{if(e.requestFullscreen)yield e.requestFullscreen();else if(e.webkitRequestFullscreen)yield e.webkitRequestFullscreen();else if(e.webkitEnterFullscreen)yield e.webkitEnterFullscreen();else if(e.mozRequestFullScreen)yield e.mozRequestFullScreen();else{if(!e.msRequestFullscreen)throw new Error("Fullscreen API not supported");yield e.msRequestFullscreen()}this._log.info("entered fullscreen mode")}catch(o){throw this._log.error("failed to enter fullscreen:",o),o}})}exitFullscreen(){return DA(this,null,function*(){try{if(!this.isFullscreen())return;if(document.exitFullscreen)yield document.exitFullscreen();else if(document.webkitExitFullscreen)yield document.webkitExitFullscreen();else if(document.mozCancelFullScreen)yield document.mozCancelFullScreen();else{if(!document.msExitFullscreen)throw new Error("Exit fullscreen API not supported");yield document.msExitFullscreen()}this._log.info("exited fullscreen mode")}catch(e){throw this._log.error("failed to exit fullscreen:",e),e}})}isFullscreen(){let e=this.elementToRender;return!!e&&(this.element&&this.element.webkitDisplayingFullscreen?!this.isPictureInPicture():(document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement)===e)}toggleFullscreen(){return DA(this,null,function*(){this.isFullscreen()?yield this.exitFullscreen():yield this.enterFullscreen()})}enterPictureInPicture(){return DA(this,null,function*(){this.enterPIPPromise=this._enterPictureInPicture();try{return yield this.enterPIPPromise}finally{delete this.enterPIPPromise}})}_enterPictureInPicture(){return DA(this,null,function*(){try{if(!this.element)throw new Error("No video element available for pip");if(this.canvas&&this.mode!==1)throw new Error("pip is not supported for canvas-only mode");let{element:e}=this;if(e.requestPictureInPicture){this._log.info("requestPictureInPicture");let o=yield e.requestPictureInPicture();return this.pipWindow=o,this._log.info("entered pip mode"),this.elementToRender===this.canvas&&(this.canvas.remove(),this._appendToWrapper(this.element)),o}if(e.webkitSetPresentationMode)return this._log.info("webkitSetPresentationMode"),yield e.webkitSetPresentationMode("picture-in-picture"),this._log.info("entered pip mode (webkit)"),{};throw new Error("pip API not supported")}catch(e){throw this._log.error("failed to enter pip:",e.name,e.message),e}})}exitPictureInPicture(){return DA(this,null,function*(){var e;try{if(!this.isPictureInPicture())return;if(delete this.pipWindow,document.pictureInPictureElement&&document.exitPictureInPicture)yield document.exitPictureInPicture(),this.elementToRender===this.canvas&&((e=this.element)==null||e.remove(),this._pausedRetryCount=pQ,this._appendToWrapper(this.canvas)),this._log.info("exited pip mode");else{if(!this.element||!this.element.webkitSetPresentationMode)throw new Error("Exit pip API not supported or not in PiP mode");yield this.element.webkitSetPresentationMode("inline"),this._log.info("exited pip mode (webkit)")}}catch(o){throw this._log.error("failed to exit pip:",o),o}})}isPictureInPicture(){if(!this.element)return!1;let{element:e}=this;return document.pictureInPictureElement?document.pictureInPictureElement===e:!!e.webkitPresentationMode&&e.webkitPresentationMode==="picture-in-picture"}togglePictureInPicture(){return DA(this,null,function*(){this.isPictureInPicture()?yield this.exitPictureInPicture():yield this.enterPictureInPicture()})}};function Fa(A,e){return DA(this,null,function*(){if(!A.audioWorklet)return Promise.reject("audioWorklet is not supported");try{yield A.audioWorklet.addModule(e),nA.info("worklet addModule success")}catch(o){throw nA.info("worklet addModule catch error. ".concat(o.message)),o}})}typeof AudioContext<"u"?Mt=AudioContext:typeof webkitAudioContext<"u"?Mt=webkitAudioContext:typeof mozAudioContext<"u"&&(Mt=mozAudioContext);var fr,SI=1500,gl=-1,HQ=0,aE=-1,eI=!1,nx=0,kM=-1,PT=-1;(function A(){try{if(fr)return;(fr=new Mt({sampleRate:48e3})).onstatechange=()=>{nA.info("context state: ".concat(fr.state).concat(fr.state!=="running"?" visibilityState: ".concat(document.visibilityState):"")),_M()},clearTimeout(gl)}catch(e){nA.error("initAudioContext failed: ".concat(e," typeof AudioContextClass: ").concat(typeof Mt)),gl=setTimeout(A,1e3)}})();var _M=()=>{fr.state==="suspended"?(HQ=ki(),aE===-1&&(aE=setTimeout(()=>{fr.state==="suspended"&&(eI=!0,S.emit("155",{isSuspended:!0}))},SI)),JT(),document.addEventListener("click",_M)):fr.state==="interrupted"?JT():(HQ&&(ct.addNumber({key:507800,value:ki()-HQ,split:[0,500,1e3,1500,2e3,3e3,4e3,5e3,1e4,3e4],max:6e4}),HQ=0),aE!==-1&&(clearTimeout(aE),aE=-1,eI&&(eI=!1,S.emit("155",{isSuspended:!1}))),document.removeEventListener("visibilitychange",_M),document.removeEventListener("click",_M))},hq=0,pq=-1;function JT(){return new Promise((A,e)=>{if(fr.state==="running")return A();Date.now()-hq<1e3?(clearTimeout(pq),pq=setTimeout(()=>{hq=Date.now(),fr.resume().then(A,e)},1e3)):(clearTimeout(pq),hq=Date.now(),fr.resume().then(A,e))}).catch(A=>{nA.warn("context resume failed: ".concat(A)),document.addEventListener("visibilitychange",_M)})}document.addEventListener("click",_M);var tI=A=>fr,iI=class{constructor(A){this.name=A,G(this,"node"),G(this,"node2"),G(this,"pre",new Set),G(this,"next",new Set),G(this,"context"),G(this,"connectedNodes",new Set),G(this,"nextInputChannelMap",new Map),G(this,"_channelCount",1)}get channelCount(){return this._channelCount}set channelCount(A){this._channelCount=A,this.setChannelCount(this.node,A),this.setChannelCount(this.node2,A),this.next.forEach(e=>e.channelCount=A)}setChannelCount(A,e){!A||A instanceof ScriptProcessorNode||(A.channelCountMode="explicit",A.channelCount=e||this.channelCount||1)}setContext(A){this.context=A,this.node&&A.addMixWeight()}removeContext(){var A;this.node&&((A=this.context)==null||A.reduceMixWeight()),delete this.context}replaceNode(A){var e;if(A!==this.node)try{this.node?this._disconnect():(e=this.context)==null||e.addMixWeight(),this.node=A,this.setChannelCount(this.node),this.preNodeReconnect(),this.reconnect()}catch(o){nA.error(o)}}setNode(A,e){var o;if(!this.node)try{(o=this.context)==null||o.addMixWeight(),this.node=A,this.setChannelCount(this.node),e&&(this.node2=e,this.setChannelCount(this.node2)),this.preNodeReconnect(),this.reconnect(),ct.addSuccessEvent({key:502701})}catch(n){nA.error(n),ct.addFailedEvent({key:502701,error:n})}}deleteNode(){var A;if(this.node)try{this._disconnect(),delete this.node,delete this.node2,(A=this.context)==null||A.reduceMixWeight(),this.preNodeReconnect(),ct.addSuccessEvent({key:502702})}catch(e){nA.error(e),ct.addFailedEvent({key:502702,error:e})}}preNodeReconnect(){this.pre.forEach(A=>{A.node?A.reconnect():A.preNodeReconnect()})}connectNext(A){this.next.forEach(e=>{let o=this.nextInputChannelMap.get(e);A._connect(e.node,o)||e.connectNext(A)})}_connect(A){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return!(!this.node||!A)&&((this.node2||this.node).connect(A,0,e),this.connectedNodes.add(A),!0)}_disconnect(){this.connectedNodes.forEach(A=>{var e;return(e=this.node2||this.node)==null?void 0:e.disconnect(A)}),this.connectedNodes.clear()}reconnect(){this._disconnect(),this.connectNext(this)}pipeTo(A){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return this.next.add(A),A.pre.add(this),this.nextInputChannelMap.set(A,e),A}},Q$=class extends iI{constructor(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:256;super(),this.fftSize=A,G(this,"dataArray",new Uint8Array(0))}setNode(A){A.fftSize=this.fftSize,this.dataArray=new Uint8Array(A.frequencyBinCount),super.setNode(A)}getByteTimeDomainData(){var A;return(A=this.node)==null||A.getByteTimeDomainData(this.dataArray),this.dataArray}get level(){var A;return(A=this.node)==null||A.getByteTimeDomainData(this.dataArray),Math.max(...this.dataArray)/128-1}get timeDomainPathData(){let A=this.getByteTimeDomainData(),e=0,o=0,n="M".concat(e,",").concat(o);for(let a=0;a0&&arguments[0]!==void 0?arguments[0]:1;this.mixWeight+=A,this.mixWeight-1==A+1>>1&&this.mixOnChange()}reduceMixWeight(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:1;this.addMixWeight(-A)}close(){this.inputs.forEach(A=>A.remove())}get mixTrack(){return this.destination.stream.getAudioTracks()[0]}},dW=new WeakMap;function ax(A){try{let e=dW.get(A);if(e)return e;let o=tI();if(A instanceof HTMLAudioElement)e=o.createMediaElementSource(A);else{if(!(A instanceof MediaStreamTrack))return A;e=o.createMediaStreamSource(new MediaStream([A]))}return dW.set(A,e),e}catch(e){if(!(Yr&&e instanceof Error&&e.name==="NotSupportedError"))throw e;nA.warn(e)}}var sx=class XQ{constructor(e){G(this,"_volume",0),G(this,"_volumeDb",0),G(this,"_log"),G(this,"_scriptProcessorNode",null),G(this,"_audioWorkletNode",null),G(this,"_interval",200),G(this,"ready",this.preload());let{log:o}=e;this._log=o,S.on(K.AUDIO_LEVEL_INTERVAL,this.handleAudioLevelInterval,this)}static get isRunning(){return Date.now()-XQ.lastMessageTime<2e3}get node(){return this._audioWorkletNode||this._scriptProcessorNode}preload(){if(!XQ.workletReady){let e='class VolumeMeterWorklet extends AudioWorkletProcessor{constructor(){super(),this.volume=0,this.intervalTime=200,this.tick=200,this.isStop=!1,this.cache=[],this.sentFirstInfo1=!1,this.unmute=!1,this.port.onmessage=t=>{var e=t.data;switch(e.name){case"chunk":this.cache.push(...e.data),this.sentFirstInfo1||(this.port.postMessage({cl:e.data.length}),this.sentFirstInfo1=!0);break;case"setIntervalTime":this.intervalTime=e.intervalTime;break;case"unmute":this.unmute=!0;break;case"stop":this.isStop=!0}}}process(t,s){t=t[0],s=s[0];if(t||s){if(this.isStop)return!1;var i=s&&s[0]?s[0].length:0,h=this.cache.length,a=(it+e*e,0)/a.length;this.volume=e,this.tick-=a.length,this.tick<0&&(this.tick+=this.intervalTime/1e3*sampleRate,this.port.postMessage({volume:this.volume,volumeDb:Math.max(10*Math.log10(s)+100,0)/100,cacheLen:h,outputLen:i}))}}return!0}}registerProcessor("volume-meter",VolumeMeterWorklet);';XQ.workletReady=Fa(XQ.audioContext,URL.createObjectURL(new Blob([e],{type:"application/javascript"})))}return XQ.workletReady.then(()=>this.initAudioWorklet()).catch(e=>(this._log.error("volumeMeter preload error: ".concat(e)),this.initScriptProcessor()))}initAudioWorklet(){if(!this._audioWorkletNode)try{this._audioWorkletNode=new AudioWorkletNode(XQ.audioContext,"volume-meter");let e=!1;this._audioWorkletNode.port.onmessage=o=>{XQ.lastMessageTime=Date.now(),this._volume=o.data.volume||0,this._volumeDb=o.data.volumeDb||0,!e&&o.data.cacheLen&&o.data.outputLen&&(this._log.warn("worklet play success"),e=!0)},this.handleAudioLevelInterval({interval:this._interval})}catch(e){this._log.error("volumeMeter init audio worklet error: ".concat(e)),Jo.logFailedEvent({userId:this._log.userId,eventType:oa.LOAD_WORKLET,error:e}),this.initScriptProcessor()}}initScriptProcessor(){if(!this._scriptProcessorNode)try{this._scriptProcessorNode=tI().createScriptProcessor(2048,1,1),this._scriptProcessorNode.onaudioprocess=e=>{XQ.lastMessageTime=Date.now();let o=e.inputBuffer.getChannelData(0),n=0;for(let a=0;a>2);A.copyTo(o,{planeIndex:0}),this.node.port.postMessage({name:"chunk",data:o},[o.buffer]),A.close()}}},gx=hW,h$=es(hg(),1),fW=A=>e=>e.deviceId===A,fq=class{constructor(A,e){G(this,"kind"),G(this,"type"),G(this,"devices",[]),this.kind=A,this.type=e}update(A,e){let o=A.filter(n=>n.kind==="".concat(this.kind).concat(this.type.toLocaleLowerCase()));this.devices.length===1&&HT(this.devices[0])||e&&(o.forEach(n=>{if(n.deviceId&&!this.devices.find(fW(n.deviceId))){let a="".concat(this.kind).concat(this.type,"Added");nA.warn("".concat(a,": ").concat(JSON.stringify(n))),e.emit(a,n)}}),this.devices.forEach(n=>{if(n.deviceId&&!o.find(fW(n.deviceId))){let a="".concat(this.kind).concat(this.type,"Removed");nA.warn("".concat(a,": ").concat(JSON.stringify(n))),e.emit(a,n)}})),this.devices=o}hasDevice(A){return!!this.devices.find(e=>e.deviceId===A)}},p$=class extends h$.EventEmitter{constructor(){super(),G(this,"audioInputs",new fq(fA.AUDIO,"Input")),G(this,"videoInputs",new fq(fA.VIDEO,"Input")),G(this,"audioOutputs",new fq(fA.AUDIO,"Output")),this.init(),navigator.mediaDevices&&(navigator.mediaDevices.addEventListener&&navigator.mediaDevices.addEventListener("devicechange",()=>this.update()),"ondevicechange"in navigator.mediaDevices||nn.run("interval",()=>{this.update()},{delay:1e4}))}init(){Ix().then(A=>{this.audioInputs.update(A),this.videoInputs.update(A),this.audioOutputs.update(A)})}update(){return DA(this,arguments,function(){var A=this;let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0;return function*(){let o=yield Ix(e);return A.audioInputs.update(o,A),A.videoInputs.update(o,A),A.audioOutputs.update(o,A),A}()})}hasBlueTooth(){var A;if(1e3*((A=tI())==null?void 0:A.outputLatency)>150)return!0;let e=["bluetooth","air","wireless","bt","tws","buds","headset","headphone"];return this.audioOutputs.devices.some(o=>e.some(n=>o.label.toLowerCase().includes(n)))||this.audioInputs.devices.some(o=>e.some(n=>o.label.toLowerCase().includes(n)))}},vs=vR||SR?null:new p$;function HT(A){return A.deviceId===A.groupId&&A.groupId===""}function Ix(){return DA(this,arguments,function(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0;return function*(){if(wI()||!mT())return[];let e=yield navigator.mediaDevices.enumerateDevices();if(A!==0){let o={audio:!1,video:!1};if(e.forEach(n=>{HT(n)&&(n.kind===fA.AUDIO_INPUT?o.audio=!0:n.kind===fA.VIDEO_INPUT&&(o.video=!0))}),A===2&&(o.audio=!1),A===1&&(o.video=!1),o.audio||o.video){let n;try{n=yield navigator.mediaDevices.getUserMedia(o),o.audio&&JT()}catch(a){nA.debug("capture before getDevices failed: ",a)}e=yield navigator.mediaDevices.enumerateDevices(),n?.getTracks().forEach(a=>a.stop())}}return e.map((o,n)=>{let a={kind:o.kind,deviceId:o.deviceId,groupId:o.groupId,label:o.label||"".concat(o.kind,"_").concat(n)};return o.deviceId.length>0&&mq.add("".concat(o.deviceId,"_").concat(o.kind)),o.getCapabilities&&(a.getCapabilities=()=>o.getCapabilities()),a})}()})}function VQ(){let A=arguments.length>0&&arguments[0]!==void 0&&arguments[0];return vs.update(A?1:0).then(e=>e.audioInputs.devices)}function qQ(){let A=arguments.length>0&&arguments[0]!==void 0&&arguments[0];return vs.update(A?2:0).then(e=>e.videoInputs.devices)}var mW=!1;function Mm(){let A=arguments.length>0&&arguments[0]!==void 0&&arguments[0];return DA(this,null,function*(){return(Ea||Ma)&&(A=!1),vs.update(A?1:0).then(e=>e.audioOutputs.devices)})}var mq=new Set;function DW(A,e){return DA(this,null,function*(){let o=(yield VQ()).find(n=>n.deviceId===bf);return!e&&o?.groupId===A||o?.groupId===A&&o.label===e})}var cx,f$=class extends uW{constructor(A){super(),this.log=A,G(this,"volumeMeter"),G(this,"volumeMeterAfter3A"),G(this,"volumeDestination"),G(this,"analyser",new Q$),this.volumeMeter=new pW({log:this.log}),this.volumeMeterAfter3A=new pW({log:this.log}),this.volumeDestination=new iI,this.volumeMeter.pipeTo(this.volumeDestination)}destroy(){this.gain.deleteNode(),this.volumeMeter.deleteNode(),this.analyser.deleteNode(),this.source.deleteNode(),this.destination.deleteNode(),this.volumeDestination.deleteNode()}},Dq=class WZ extends rC{constructor(e){super(e,fA.AUDIO),G(this,"_outputDeviceId"),G(this,"_floatVolume",1),G(this,"_destination"),G(this,"pipeline"),G(this,"volumeMeterMode","worklet"),G(this,"enableVolumeControlInIOS"),this.enableVolumeControlInIOS=e.enableVolumeControlInIOS,this.mode=0,e.url&&(this.url=e.url),this.pipeline=new f$(this._log)}setTrack(e){}get duration(){var e;return Math.floor(1e3*(((e=this.element)==null?void 0:e.duration)||0))}get currentTime(){var e;return Math.floor(1e3*(((e=this.element)==null?void 0:e.currentTime)||0))}set currentTime(e){this.element&&(this.element.currentTime=e/1e3)}getMediaStream(){return this.pipeline.stream||(this.track?new MediaStream([this.track]):null)}initializeElement(e){if(($g==="15.2"||$g==="15.3"||$g==="15.4")&&this.muted)return void this._log.info("audioElement is muted.");this._log.info("audio player initializeElement");let o=cx||new Audio;o.setAttribute("autoplay","autoplay"),o.srcObject=this.getMediaStream(),o.muted=this.muted,this.url&&(o.crossOrigin="anonymous",o.src=this.url),this.element=o,this.setVolume(hr(e)?e/100:this._floatVolume),o===cx&&(cx=void 0),this.options.enableTimeupdateEvent&&(this.element.ontimeupdate=()=>this.emit(mi.TIME_UPDATE,this.currentTime)),this.bindElementEvents()}play(e){return DA(this,null,function*(){if(this.track||this.url){try{!this.pipeline.source.node&&this.track&&this.pipeline.replaceSource(this.track),this.element||this.initializeElement(e?.volume),this._outputDeviceId&&(yield this.setSinkId(this._outputDeviceId)),this.volumeMeterMode==="worklet"?(this.pipeline.volumeMeter.init(),this.pipeline.volumeMeterAfter3A.init()):this.volumeMeterMode==="analyser"&&this.pipeline.analyser.setNode(tI().createAnalyser()),function(){DA(this,null,function*(){try{mW||(mW=!0,nA.info("speakers:".concat((yield Mm()).map(o=>" ".concat(o.deviceId.slice(0,8),": ").concat(o.label)))))}catch{}})}()}catch(o){throw this._log.warn("audio play error: ".concat(o)),kh($g,"18.7",!0)&&this.bindAutoPlayEvent(),o}return zg(WZ.prototype,this,"play").call(this)}})}stop(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0;this.pipeline.destroy(),super.stop(e)}setVolume(e){this._floatVolume=e,this.element&&(this.element.volume=e)}setSinkId(e){return DA(this,null,function*(){var o,n;this._outputDeviceId!==e&&(this._outputDeviceId=e),this.element&&this.element.sinkId!==e&&(yield(n=(o=this.element).setSinkId)==null?void 0:n.call(o,e))})}get useDestination(){return!!this.pipeline.stream}setLoop(e){this.element&&(this.element.loop=e)}getAudioLevel(){return this.pipeline.volumeMeter.getCalculatedVolume()}getInternalAudioLevel(){return this.pipeline.volumeMeter.getInternalAudioLevel()}getInternalAudioLevelAfter3A(){return this.pipeline.volumeMeterAfter3A.getInternalAudioLevel()}},m$=class extends Dq{setTrack(A){this.track!==A&&(this.unbindTrackEvents(),this.track=A,this.emit(mi.MEDIA_TRACK_CHANGED,A),A&&(this.bindTrackEvents(),this.element&&(this.element.srcObject=new MediaStream([A]))))}},yW=class extends Dq{constructor(A){super(A),G(this,"_sourceElement"),G(this,"_output",new iI),this.pipeline.source.pipeTo(this.pipeline.gain),this.pipeline.gain.pipeTo(this.pipeline.volumeMeter).pipeTo(this._output),this.pipeline.gain.pipeTo(this.pipeline.destination)}setOutput(){this.mode=1,this._output.setNode(tI().destination)}write(A){this.pipeline.volumeMeter.write(A)}setTrack(A){var e,o,n;((o=(e=this.element)==null?void 0:e.error)==null?void 0:o.code)!==MediaError.MEDIA_ERR_DECODE&&this.track!==A&&(this.unbindTrackEvents(),this.track=A,this.emit(mi.MEDIA_TRACK_CHANGED,A),A?(this.bindTrackEvents(),this._sourceElement?this._sourceElement.srcObject=new MediaStream([A]):!this.useDestination&&this.element&&(this.element.srcObject=new MediaStream([A])),this.pipeline.source.channelCount=((n=A.getSettings())==null?void 0:n.channelCount)||1,this.pipeline.replaceSource(A)):this.pipeline.source.deleteNode())}setVolume(A){var e;let o=A<=1&&!jf();if(this._floatVolume!==A||!(o&&((e=this.element)==null?void 0:e.volume)===A||!o&&this.pipeline.volume===A))if(this._floatVolume=A,this.useDestination)this.pipeline.setVolume(A),this._log.info("set pipeline volume: ".concat(A));else if(o)this.element?(this._log.info("set element volume: ".concat(A)),this.element.volume=A):this._log.info("set element volume: no element");else{if(jf()){if(!this.enableVolumeControlInIOS)return;(function(){if(!Ea||PT!==-1)return;let n=()=>{ki()-nx<500||(fr&&fr.state==="running"&&fr.currentTime===kM&&(nA.warn("context is fake running, auto resume"),fr.suspend().catch(a=>{nA.warn("context suspend failed: ".concat(a))})),kM=fr.currentTime,nx=ki())};PT=setInterval(()=>{n()},2e3),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&n()})})()}if(Yr&&!this.pipeline.source.node)return void this._log.warn("set pipeline volume failed: no source node");this._log.info("start set pipeline volume: ".concat(A)),this.pipeline.setVolume(A),this.element&&!this._sourceElement&&(this._destination||(this._destination=tI().createMediaStreamDestination()),this.pipeline.destination.setNode(this._destination),pr(this.element),this._sourceElement=this.element,this._sourceElement.muted=!0,this.element=null,this.play().catch(n=>{this.emit(mi.AUTOPLAY_FAILED,n)}))}}stop(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0;this.pipeline.destroy();let e=this._sourceElement||this.element;e&&TQ&&(cx=e),this._sourceElement&&(this._sourceElement.srcObject=null,delete this._sourceElement),super.stop(A)}},yq=class extends Uo{constructor(A){let{userId:e,sdkAppId:o,mediaType:n,room:a,PlayerClass:I=n===1?yW:wi}=A;var c;super(),G(this,"id",hA()),G(this,"userId",""),G(this,"isRemote"),G(this,"mediaType"),G(this,"room"),G(this,"user"),G(this,"_log"),G(this,"_inputTrack"),G(this,"_outputTrack"),G(this,"isPlayCalled"),G(this,"container",null),G(this,"player"),G(this,"subVideoPlayerMap"),G(this,"muted",!1),G(this,"abortCtrl"),G(this,"objectFit","cover"),G(this,"mirror"),G(this,"rotation"),G(this,"isScreen",!1),G(this,"manager"),G(this,"trackSettings"),G(this,"isFirstVideoFrameEmitted",!1),this.userId=e||"",this.mediaType=n,this._log=nA.createLogger({parent:a?.getLogger(),id:"".concat(this.kind[0],"t"),userId:(c=a||this.room)==null?void 0:c.userId,remoteUserId:this instanceof ZT?void 0:this.userId,sdkAppId:o,type:this.mediaType===2?"auxiliary":"main",isLocal:this instanceof ZT}),this.player=new I({id:this.userId||this.id,track:null,muted:!1,container:null,log:this._log,enableVolumeControlInIOS:a?.enableVolumeControlInIOS}),this.player.on(mi.PLAYER_STATE_CHANGED,u=>{if(S.emit(K.PLAYER_STATE_CHANGED,bt({track:this},u)),this.emit("player-state-changed",u),u.state==="PLAYING"&&this.room){let d=!0;for(let{remoteAudioTrack:R,remoteVideoTrack:k,remoteAuxiliaryTrack:_}of[...this.room.remotePublishedUserMap.values()])if(R.isAvailable&&!R.player.isPlaying||k.isAvailable&&!k.player.isPlaying||_.isAvailable&&!_.player.isPlaying){d=!1;break}d&&Lt()&&Ss&&Ss.deleteDialog()}}),this.kind===fA.VIDEO&&(this.player.on(mi.LOADED_DATA,()=>{this.emitFirstVideoFrameEvent(mi.LOADED_DATA),S.emit(K.VIDEO_LOADED_DATA,{track:this})}),this.player.on(mi.LOADED_META_DATA,()=>{this.emitFirstVideoFrameEvent(mi.LOADED_META_DATA)}),this.player.on(mi.MEDIA_TRACK_CHANGED,u=>{var d;(d=this.subVideoPlayerMap)==null||d.forEach(R=>R.setTrack(u))}),this.player.on(mi.RESIZE,u=>{this.emitFirstVideoFrameEvent(mi.RESIZE),this.emit("video-size-changed",bt({userId:this.userId,streamType:this.mediaType===2?"auxiliary":"main"},u))}),this.player.on(mi.FIRST_FRAME_RENDER,u=>{this.emit("first-frame-render",fi(bt({},u),{streamType:this.streamType,userId:this.isRemote?this.userId:""}))})),this.onTrackMuted=this.onTrackMuted.bind(this),this.onTrackUnmuted=this.onTrackUnmuted.bind(this),this.onTrackEnded=this.onTrackEnded.bind(this),this.onPlayerError&&this.player.on(mi.ERROR,this.onPlayerError.bind(this)),this.player.on(mi.AUTOPLAY_FAILED,this.handleAutoPlayFailed,this)}get log(){return this._log||nA}get kind(){return this.mediaType===1?fA.AUDIO:fA.VIDEO}get isAudio(){return this.kind===fA.AUDIO}get strMediaType(){return this.mediaType===4?fA.VIDEO:this.mediaType===2?fA.SCREEN:fA.AUDIO}get streamType(){return 2&this.mediaType?"auxiliary":"main"}get isMediaTrackActive(){return!!this.mediaTrack&&!this.mediaTrack.muted&&this.mediaTrack.readyState==="live"&&this.mediaTrack.enabled}play(A,e){return DA(this,null,function*(){let o=Aa(A)?A[0]:A;if(this.isPlayCalled)return this.log.info("play update options: ".concat(JSON.stringify(e))),e&&!Ee(e.muted)&&this.setPlayerMute(e.muted),e&&!Ee(e.objectFit)&&(this.objectFit=e.objectFit),void(this.player instanceof wi&&(this.player.setObjectFit(this.objectFit),this.container!==o&&o&&(Aa(A)&&A.length>=1&&this.container&&A.includes(this.container)&&this.container.contains(this.player.elementToRender)?(A.splice(A.indexOf(this.container),1),A.unshift(this.container)):(this.container=o,this.player.setContainer(o))),Aa(A)&&A.length>=1&&(yield this.playSubContainer(A.slice(1),e))));if(e&&!Ee(e.muted)?this.setPlayerMute(e.muted):(!this.isRemote||this.kind===fA.VIDEO)&&this.setPlayerMute(!0),e&&!Ee(e.objectFit)&&(this.objectFit=e.objectFit),this.player instanceof wi&&(Ee(e?.isLiveStream)||this.player.setLiveMode(e.isLiveStream),this.player.setObjectFit(this.objectFit),e&&!Ee(e.poster)&&this.player.setPoster(e.poster)),this.isPlayCalled=!0,o&&(this.container=o,this.player instanceof wi&&this.player.setContainer(o)),S.emit(K.PLAY_TRACK_START,{track:this}),this._outputTrack){this._log.info("play with options: ".concat(JSON.stringify(e)));try{this.player.setTrack(this.playerMediaTrack),yield this.player.play(e),Aa(A)&&A.length>1&&(yield this.playSubContainer(A.slice(1),e))}catch(n){throw this.handleAutoPlayFailed(n),n}}else this.log.info("play has not mediaTrack, abort")})}setMirror(A,e){if(this.isScreen||this.kind!==fA.VIDEO||Ee(A)||A===this.mirror)return;this.mirror=A;let o=this.player;e&&(o=e);let n=this.manager;if(rn(this.mirror))return o.setViewMirror(this.mirror),void(!this.isRemote&&n&&(n.mirror=!1));switch(this.mirror){case"view":n&&(n.mirror=!1),o.setViewMirror(!0);break;case"publish":n&&(n.mirror=!0),o.setViewMirror(!0);break;case"both":n&&(n.mirror=!0),o.setViewMirror(!1)}}playSubContainer(A,e){return DA(this,null,function*(){if(!this._outputTrack||this.kind===fA.AUDIO)return;this.subVideoPlayerMap||(this.subVideoPlayerMap=new Map),this.subVideoPlayerMap.forEach((n,a)=>{var I;A.find(c=>a===c)||(n.stop(),(I=this.subVideoPlayerMap)==null||I.delete(a))});for(let[n,a]of A.entries()){let I=this.subVideoPlayerMap.get(a);I?e&&(Ee(e.objectFit)||I.setObjectFit(e.objectFit)):this.subVideoPlayerMap.set(a,new wi({id:this.userId||this.id,track:this.playerMediaTrack,container:a,muted:this.player.muted,objectFit:this.objectFit,log:this.log.createChild({id:"vp-sub".concat(n+1)})}))}let o=[...this.subVideoPlayerMap.values()];for(let n of o)n.setViewMirror(this.player.mirror),yield n.play()})}setAudioOutput(A){return this.player.setSinkId(A)}setAudioVolume(A){this.player.setVolume(A)}getAudioLevel(){return this.player.getAudioLevel()||0}getInternalAudioLevel(){var A;return((A=this.player)==null?void 0:A.getInternalAudioLevel())||0}stop(){let A=arguments.length>0&&arguments[0]!==void 0&&arguments[0];this.isPlayCalled&&(this.isPlayCalled=!1,this.isFirstVideoFrameEmitted=!1,this.player&&(this.log.info("stop ".concat(this.kind," player")),this.player.stop(HN(this)&&!A?this.jitterBufferDelay:0)),this.subVideoPlayerMap&&this.subVideoPlayerMap.size>0&&this.subVideoPlayerMap.forEach(e=>{e.stop()}),this.container=null)}resume(){return DA(this,null,function*(){var A;this.isPlayCalled&&(yield(A=this.player)==null?void 0:A.resume())})}close(){this._toInitState(),this.log.info("close"),this.isPlayCalled&&this.stop(!0)}_toInitState(){}setMute(A){this.muted=A,this._inputTrack&&(this._inputTrack.enabled=!A),this._outputTrack&&(this._outputTrack.enabled=!A),this.emit(A?"mute":"unmute",this),S.emit(A?K.TRACK_MUTED:K.TRACK_UNMUTED,{track:this})}setPlayerMute(A){this.player.setMuted(A)}get mediaTrack(){return this._inputTrack||null}get outMediaTrack(){return this._outputTrack||null}get playerMediaTrack(){return this.outMediaTrack}installTrackEvent(A){nE(A,A).add(fA.MUTE,this.onTrackMuted).add(fA.UNMUTE,this.onTrackUnmuted).add(fA.ENDED,this.onTrackEnded),A.muted&&this.onTrackMuted(),A.readyState===fA.ENDED&&this.onTrackEnded()}uninstallTrackEvent(A){pr(A)}setInputMediaStreamTrack(A){var e;let o=this._inputTrack;if(A!==o)return this._inputTrack=A,this.trackSettings=(e=A.getSettings)==null?void 0:e.call(A),A.enabled=!this.muted,o&&this.uninstallTrackEvent(o),this.installTrackEvent(A),this.emit("input-media-track-changed",A||null,o||null),this.manager?this.manager.changeInput(this):this.setOutputMediaStreamTrack(A)}setOutputMediaStreamTrack(A){var e;let o=this._outputTrack;this instanceof Ru&&DQ(o)||A!==o&&(this.isRemote?this.log.debug("setOutputMediaStreamTrack",A.label):this.log.info("setOutputMediaStreamTrack",(e=A.getSettings)==null?void 0:e.call(A).deviceId,A.label),this._outputTrack=A,this._inputTrack&&(this._outputTrack.contentHint=this._inputTrack.contentHint,this._outputTrack.enabled=this._inputTrack.enabled),this.updatePlayingState(!!A),this.emit("output-media-track-changed",A))}setMediaType(A){this.mediaType=A}updatePlayingState(A){var e,o;if(this.isPlayCalled){if(A){if(this.player.setTrack(this.playerMediaTrack),this.player.isStopped)return this.player.play().catch(n=>this.handleAutoPlayFailed(n)),void this.log.info("playing state updated, play ".concat(this.kind))}else if(!this.player.isStopped)return HN(this)&&this.isAudio&&(e=this.user)!=null&&e.muteState.hasAudio&&(o=this.user)!=null&&o.muteState.audioMuted?void 0:(this.player.stop(HN(this)?this.jitterBufferDelay:0),void this.log.info("playing state updated, stop ".concat(this.kind)))}this.log.debug("updatePlayingState abort ".concat(this.isPlayCalled," ").concat(A," ").concat(this.player.isStopped))}handleAutoPlayFailed(A){return DA(this,null,function*(){var e;this.log.warn("handleAutoPlayFailed",A);let o=()=>{this.resume().then(()=>{document.removeEventListener("click",o,!0)})};if(this.room&&this.room.enableAutoPlayDialog){if((SQ||Eu)&&(yield AC(100),(e=this.player)!=null&&e.isPlaying))return;nC()}else document.addEventListener("click",o,!0);S.once(K.LOCAL_TRACK_CAPTURE_SUCCESS,n=>{let{track:a}=n;a.kind==="audio"&&Lt()&&!this.player.isPlaying&&this.isRemote&&this.isAvailable&&o()}),this.emit("error",A)})}getVideoFrame(){return this.player instanceof wi?this.player.getVideoFrame():""}emitFirstVideoFrameEvent(A){var e,o,n;if(this.isFirstVideoFrameEmitted)return;let a=(e=this.mediaTrack)==null?void 0:e.getSettings(),I=a?.width||((o=this.player.element)==null?void 0:o.videoWidth)||0,c=a?.height||((n=this.player.element)==null?void 0:n.videoHeight)||0;A===mi.RESIZE&&!I&&!c||A===mi.LOADED_META_DATA&&!I&&!c||(A===mi.LOADED_DATA&&!I&&!c&&this._log.warn("the dimension of video is 0x0 in first-video-frame event"),this.isFirstVideoFrameEmitted=!0,gu(this.rotation)&&([I,c]=[c,I]),this.emit("first-video-frame",{width:I,height:c,streamType:this.streamType,userId:this.isRemote?this.userId:""}))}onTrackMuted(){this._log.warn("".concat(this.kind," track is unable to provide media output"))}onTrackUnmuted(){this._log.info("".concat(this.kind," track is able to provide media output"))}onTrackEnded(){this._log.warn("".concat(this.kind," track ended"))}};vt([is([],Uo.INIT,{sync:!0})],yq.prototype,"_toInitState");var D$=Object.prototype.hasOwnProperty,KQ=function(A){if(A==null)return!0;if(typeof A=="boolean")return!1;if(typeof A=="number")return A===0;if(typeof A=="string"||typeof A=="function"||Array.isArray(A))return A.length===0;if(A instanceof Error)return A.message==="";if(Cc(A))switch(Object.prototype.toString.call(A)){case"[object File]":case"[object Map]":case"[object Set]":return A.size===0;case"[object Object]":for(let e in A)if(D$.call(A,e))return!1;return!0}return!1},y$=Kf({retryFunction:function(A){return DA(this,null,function*(){let e=function(I){return{audio:R$(I),video:M$(I)}}(A);nA.info("getUserMedia with constraints: ".concat(JSON.stringify(e)));let o=[],n=[],a=["label","deviceId","groupId"];if(e.audio&&(o=yield VQ(),nA.info("microphones: ".concat(nl(o.map(I=>fi(bt({},I),{groupId:I.groupId.substring(0,8)})),{keysToInclude:a})))),e.video&&(n=yield qQ(),nA.info("cameras: ".concat(nl(n,{keysToInclude:a}))),!rn(e.video)&&e.video.facingMode==="user"&&!e.video.deviceId)){let I=n.filter(c=>!c.label.includes("infrared")).find(c=>c.label.includes("facing front"));I&&(e.video.deviceId=I.deviceId,nA.info("exclude infrared camera: ".concat(JSON.stringify(e))))}try{let I=yield navigator.mediaDevices.getUserMedia(e);return $O&&I.getTracks().forEach(c=>{var u;let d=c.getCapabilities();nA.info("".concat(c.kind," capabilities: ").concat(nl(d,{keysToInclude:RN}))),!Ee(A.echoCancellation)&&((u=d.echoCancellation)==null?void 0:u.indexOf(A.echoCancellation))===-1&&nA.warn("Invalid argument for 'echoCancellation'. Expected one of [".concat(JSON.stringify(d.echoCancellation),"], but received '").concat(A.echoCancellation,"'"))}),e.audio&&JT(),I}catch(I){let{message:c}=I;throw I.name==="NotFoundError"&&(A.video&&n&&n.length===0&&(c=Wi({key:Mi.CAMERA_NOT_FOUND})),A.audio&&o&&o.length===0&&(c=Wi({key:Mi.MICROPHONE_NOT_FOUND}))),new Ct({code:Ge.INITIALIZE_FAILED,name:I.name,message:c,constraint:I.constraint})}})},settings:{retries:3,timeout:500},onError:A=>{let{error:e,retry:o,reject:n,retryFuncArgs:a,retriedCount:I}=A,c=I+1;e.name==="NotReadableError"||e.name==="OverconstrainedError"||e.name==="AbortError"?(c===1?(a[0].video&&(a[0].maxResolution=!1,(!Ma||a[0].width*a[0].height<=2073600)&&a[0].frameRate&&(a[0].frameRate=a[0].frameRate>10?10:5)),a[0].retryWhenExactFailed&&a[0].useExactDeviceId&&(a[0].useExactDeviceId=!1)):c===2?a[0].useDeviceIdOnly=!0:c===3&&!a[0].useExactDeviceId&&(a[0].useTrueAsConstraint=!0),o()):n(e),a[0].microphoneId&&RW(a[0].microphoneId,!1),a[0].cameraId&&RW(a[0].cameraId,!0)},onRetrying:A=>{nA.warn("getUserMedia NotReadableError observed, retrying [".concat(A,"/3]"))},onRetryFailed:A=>{Jo.logFailedEvent({eventType:oa.GET_USER_MEDIA_RETRY,error:A})},onRetrySuccess:A=>{Jo.logSuccessEvent({eventType:oa.GET_USER_MEDIA_RETRY}),Jo.uploadEvent({log:"stat-".concat(oa.GET_USER_MEDIA_RETRY,"-success-").concat(A)})}});function RW(A,e){return DA(this,null,function*(){let o=(e?yield qQ():yield VQ()).find(n=>n.deviceId===A);o&&$n(o.getCapabilities)&&nA.warn(nl(o.getCapabilities(),{keysToInclude:RN}))})}function R$(A){if(!A.audio)return!1;if(A.useTrueAsConstraint)return!0;let e={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0,sampleRate:A.sampleRate};return!KQ(A.microphoneId)&&(e.deviceId=A.useExactDeviceId?{exact:A.microphoneId}:A.microphoneId,A.useDeviceIdOnly)?e:(hr(A.channelCount)&&(e.channelCount=A.channelCount),(rn(A.echoCancellation)||A.echoCancellation==="remote-only"||A.echoCancellation==="all")&&(e.echoCancellation=A.echoCancellation),rn(A.noiseSuppression)&&!A.noiseSuppression&&(e.noiseSuppression=!1),rn(A.autoGainControl)&&!A.autoGainControl&&(e.autoGainControl=!1),!!KQ(e)||e)}function M$(A){if(!A.video)return!1;if(A.useTrueAsConstraint)return!0;let{maxResolution:e=!0}=A,o={};return A.cameraId?o.deviceId=A.useExactDeviceId?{exact:A.cameraId}:A.cameraId:A.facingMode&&(o.facingMode=A.facingMode),A.useDeviceIdOnly&&!KQ(o)?o:(A.width&&(o.width={ideal:A.width},e&&!Yr&&(o.width.max=A.width)),A.height&&(o.height={ideal:A.height},e&&!Yr&&(o.height.max=A.height)),Yr&&lu&&A.width&&A.height&&A.width*A.height<101376&&(o.width=A.width,o.height=A.height),A.frameRate&&(o.frameRate=A.frameRate),!!KQ(o)||o)}var w$=y$;function MW(A){return Dn((e,o)=>function(){for(var n=arguments.length,a=new Array(n),I=0;Ifunction(){for(var n=arguments.length,a=new Array(n),I=0;Ifunction(){for(var n=arguments.length,a=new Array(n),I=0;I{let A=!1,e=document.visibilityState;return()=>{document.visibilityState!==e&&nA.info("visibility change: ".concat(document.visibilityState)),!A&&(document.addEventListener("visibilitychange",()=>{nA.info("visibility change: ".concat(document.visibilityState)),e=document.visibilityState}),A=!0)}})(),v$=0,SW=class{constructor(A){G(this,"log"),G(this,"isRunning",!1),G(this,"queue",[]);let e="fq".concat(++v$);A&&(e+="|".concat(A)),this.log=nA.createLogger({id:e})}get length(){return this.queue.length}get lastQueueItem(){return this.length===0?null:this.queue[this.length-1]}push(A){let e=arguments.length>1&&arguments[1]!==void 0&&arguments[1];var o,n;let a=bt({},A),I=new Promise((c,u)=>{a.resolve=c,a.reject=u});return a.promise=I,e?this.length<=1?this.queue.push(a):(n=(o=this.lastQueueItem)==null?void 0:o.promise)==null||n.then(a.resolve,a.reject):this.queue.push(a),this.log.debug("push ".concat(this.length),A.funcName,A.args),this.isRunning||this.callNext(),I}shift(){let A=this.queue.shift();return this.log.debug("shift ".concat(this.length),A?.funcName,A?.args),A}callNext(){if(this.isRunning||this.length===0)return;let{fn:A,args:e,context:o,resolve:n,reject:a,funcName:I}=this.queue[0];this.log.debug("callNext",this.length,I,e),this.isRunning=!0,A.apply(o,e).then(n,a).finally(()=>{this.isRunning=!1,this.shift(),this.callNext()})}},Ex=new WeakMap,lx=new WeakMap;function VT(){let A=arguments.length>0&&arguments[0]!==void 0&&arguments[0];return function(e,o,n){let a=n.value;return n.value=function(){let I=Ex.get(this)||new SW;for(var c=arguments.length,u=new Array(c),d=0;dd.push(Z)),(u=lx.get(this))==null||u.forEach(Z=>Z?.queue.forEach(iA=>d.push(iA))),d.forEach(Z=>{Z.reject(new Ct({code:Ge.API_CALL_ABORTED,message:A}))}),Ex.delete(this),lx.delete(this),a.apply(this,k)},n}}function Kh(A,e){return function(o,n,a){let I=a.value,c=u=>A(...u);return a.value=function(){for(var u=arguments.length,d=new Array(u),R=0;Rfunction(){let a=A;try{for(var I=arguments.length,c=new Array(I),u=0;u(e?ct.addSuccessEvent({key:a,cost:ki()-R}):ct.addSuccessEvent({key:a}),k)).catch(k=>{throw ct.addFailedEvent({key:a,error:k}),k}):(ct.addSuccessEvent({key:a}),d)}catch(d){throw ct.addFailedEvent({key:a,error:d}),d}})}var NW={};function la(){}XC(NW,{Events:()=>os,Inspect:()=>Wh,LastSink:()=>Cx,Sink:()=>Go,Subscribe:()=>Bx,TimeoutError:()=>kW,audit:()=>CAA,bindCallback:()=>Z$,bindNodeCallback:()=>X$,buffer:()=>O$,bufferCount:()=>U$,bufferTime:()=>FAA,call:()=>TW,catchError:()=>XW,combineLatest:()=>LW,concat:()=>k$,concatMap:()=>wAA,concatMapTo:()=>SAA,count:()=>eAA,create:()=>Vr,debounce:()=>uAA,debounceTime:()=>QAA,defer:()=>FW,delay:()=>UAA,deliver:()=>ko,dispose:()=>Rq,elementAt:()=>dAA,empty:()=>Nq,every:()=>DAA,exhaustMap:()=>kAA,exhaustMapTo:()=>_AA,expand:()=>xAA,filter:()=>Sm,find:()=>hAA,findIndex:()=>pAA,first:()=>fAA,fromAnimationFrame:()=>W$,fromArray:()=>J$,fromEvent:()=>Ln,fromEventPattern:()=>H$,fromFetch:()=>V$,fromIterable:()=>q$,fromPromise:()=>YW,fromReadableStream:()=>j$,fromReader:()=>K$,groupBy:()=>bAA,identity:()=>N$,ignoreElements:()=>rAA,iif:()=>b$,inspect:()=>GW,interval:()=>xW,last:()=>mAA,map:()=>Gq,mapTo:()=>RAA,max:()=>tAA,merge:()=>Mq,mergeMap:()=>NAA,mergeMapTo:()=>TAA,min:()=>iAA,never:()=>$$,nothing:()=>la,of:()=>P$,pairwise:()=>yAA,pipe:()=>Jn,race:()=>bW,range:()=>z$,reduce:()=>PW,retry:()=>HAA,scan:()=>VW,setAsapScheduler:()=>Y$,share:()=>qT,shareReplay:()=>_$,skip:()=>sAA,skipUntil:()=>gAA,skipWhile:()=>Tq,startWith:()=>wq,subject:()=>yu,subscribe:()=>Ks,sum:()=>oAA,switchMap:()=>Qx,switchMapTo:()=>hx,take:()=>LM,takeLast:()=>aAA,takeUntil:()=>Qc,takeWhile:()=>nAA,tap:()=>kq,throttle:()=>EAA,throwError:()=>AAA,timeInterval:()=>LAA,timeout:()=>JAA,timer:()=>vq,toPromise:()=>YAA,toReadableStream:()=>PAA,withLatestFrom:()=>F$,zip:()=>L$});var TW=A=>A(),N$=A=>A;function Rq(){this.dispose()}var GW=()=>typeof __FASTRX_DEVTOOLS__<"u",T$=1,Wh=class extends Function{toString(){return"".concat(this.name,"(").concat(this.args.length?[...this.args].join(", "):"",")")}subscribe(A){let e=new G$(A,this,this.streamId++);return os.subscribe({id:this.id,end:!1},{nodeId:e.sourceId,streamId:e.id}),this(e),e}},Cx=class{constructor(){this.defers=new Set,this.disposed=!1}next(A){}complete(){this.dispose()}error(A){this.dispose()}get bindDispose(){return()=>this.dispose()}dispose(){this.disposed=!0,this.complete=la,this.error=la,this.next=la,this.dispose=la,this.subscribe=la,this.doDefer()}subscribe(A){return A instanceof Wh?A.subscribe(this):A(this),this}get bindSubscribe(){return A=>this.subscribe(A)}doDefer(){this.defers.forEach(TW),this.defers.clear()}defer(A){this.defers.add(A)}removeDefer(A){this.defers.delete(A)}reset(){this.disposed=!1,delete this.complete,delete this.next,delete this.dispose,delete this.next,delete this.subscribe}resetNext(){delete this.next}resetComplete(){delete this.complete}resetError(){delete this.error}},Go=class extends Cx{constructor(A){super(),this.sink=A,A.defer(this.bindDispose)}next(A){this.sink.next(A)}complete(){this.sink.complete()}error(A){this.sink.error(A)}},Bx=class extends Cx{constructor(A){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:la,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:la,n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:la;if(super(),this._next=e,this._error=o,this._complete=n,this.then=la,A instanceof Wh){let a={toString:()=>"subscribe",id:0,source:A};this.defer(()=>{os.defer(a,0)}),os.create(a),os.pipe(a),this.sourceId=a.id,this.subscribe(A),os.subscribe({id:a.id,end:!0}),e==la?this._next=I=>os.next(a,0,I):this.next=I=>{os.next(a,0,I),e(I)},n==la?this._complete=()=>os.complete(a,0):this.complete=()=>{this.dispose(),os.complete(a,0),n()},o==la?this._error=I=>os.complete(a,0,I):this.error=I=>{this.dispose(),os.complete(a,0,I),o(I)}}else this.subscribe(A)}next(A){this._next(A)}complete(){this.dispose(),this._complete()}error(A){this.dispose(),this._error(A)}};function Jn(A){for(var e=arguments.length,o=new Array(e>1?e-1:0),n=1;nI(a),A)}function Vr(A,e,o){if(GW()){let n=Object.defineProperties(Object.setPrototypeOf(A,Wh.prototype),{streamId:{value:0,writable:!0,configurable:!0},name:{value:e,writable:!0,configurable:!0},args:{value:o,writable:!0,configurable:!0},id:{value:0,writable:!0,configurable:!0}});os.create(n);for(let a=0;a{if(I instanceof Wh){let c=Vr(u=>{let d=new A(u,...n);d.sourceId=c.id,d.subscribe(I)},e,arguments);return c.source=I,os.pipe(c),c}return c=>I(new A(c,...n))}}}function zh(A,e){window.postMessage({source:"fastrx-devtools-backend",payload:{event:A,payload:e}})}var G$=class extends Go{constructor(A,e,o){super(A),this.source=e,this.id=o,this.sourceId=A.sourceId,this.defer(()=>{os.defer(this.source,this.id)})}next(A){os.next(this.source,this.id,A),this.sink.next(A)}complete(){os.complete(this.source,this.id),this.sink.complete()}error(A){os.complete(this.source,this.id,A),this.sink.error(A)}},os={addSource(A,e){zh("addSource",{id:A.id,name:A.toString(),source:{id:e.id,name:e.toString()}})},next(A,e,o){zh("next",{id:A.id,streamId:e,data:o&&o.toString()})},subscribe(A,e){let{id:o,end:n}=A;zh("subscribe",{id:o,end:n,sink:{nodeId:e&&e.nodeId,streamId:e&&e.streamId}})},complete(A,e,o){zh("complete",{id:A.id,streamId:e,err:o?o.toString():null})},defer(A,e){zh("defer",{id:A.id,streamId:e})},pipe(A){zh("pipe",{name:A.toString(),id:A.id,source:{id:A.source.id,name:A.source.toString()}})},update(A){zh("update",{id:A.id,name:A.toString()})},create(A){A.id||(A.id=T$++),zh("create",{name:A.toString(),id:A.id})}},kW=class extends Error{constructor(A){super("timeout after ".concat(A,"ms")),this.timeout=A}},_W=class extends Cx{constructor(A){super(),this.source=A,this.sinks=new Set}add(A){A.defer(()=>this.remove(A)),this.sinks.add(A).size===1&&(this.reset(),this.subscribe(this.source))}remove(A){this.sinks.delete(A),this.sinks.size===0&&this.dispose()}next(A){this.sinks.forEach(e=>e.next(A))}complete(){this.sinks.forEach(A=>A.complete()),this.sinks.clear()}error(A){this.sinks.forEach(e=>e.error(A)),this.sinks.clear()}};function qT(){return A=>{let e=new _W(A);if(A instanceof Wh){let o=Vr(n=>{e.add(n)},"share",arguments);return e.sourceId=o.id,o.source=A,os.pipe(o),o}return Vr(e.add.bind(e),"share",arguments)}}function Mq(){for(var A=arguments.length,e=new Array(A),o=0;o{let a=new Go(n),I=e.length;a.complete=()=>{--I===0&&n.complete()},e.forEach(a.bindSubscribe)},"merge",arguments)}function bW(){for(var A=arguments.length,e=new Array(A),o=0;o{let a=new Map;e.forEach(I=>{let c=new Go(n);a.set(I,c),c.complete=()=>{a.delete(I),a.size===0?n.complete():c.dispose()},c.next=u=>{a.delete(I),a.forEach(d=>d.dispose()),c.resetNext(),c.resetComplete(),c.next(u)}}),e.forEach(I=>a.get(I).subscribe(I))},"race",arguments)}function k$(){for(var A=arguments.length,e=new Array(A),o=0;o{let a=0,I=e.length,c=new Go(n);c.complete=()=>{a{let o=new _W(e),n=[];return o.next=function(a){n.push(a),n.length>A&&n.shift(),this.sinks.forEach(I=>I.next(a))},Vr(a=>{a.defer(()=>o.remove(a)),n.forEach(I=>a.next(I)),o.add(a)},"shareReplay",arguments)}}function b$(A,e,o){return Vr(n=>A()?e(n):o(n),"iif",arguments)}function LW(){for(var A=arguments.length,e=new Array(A),o=0;o{let a=e.length,I=a,c=a,u=new Array(a),d=()=>{--c===0&&n.complete()};e.forEach((R,k)=>{let _=new Go(n);_.next=Z=>{I--,_.next=iA=>{u[k]=iA,I===0&&n.next(u)},_.next(Z)},_.complete=d,_.subscribe(R)})},"combineLatest",arguments)}function L$(){for(var A=arguments.length,e=new Array(A),o=0;o{let a=e.length,I=a,c=new Array(a),u=()=>{--I===0&&n.complete()};e.forEach((d,R)=>{let k=new Go(n),_=[];c[R]=_,k.next=Z=>{_.push(Z),c.every(iA=>iA.length)&&n.next(c.map(iA=>iA.shift()))},k.complete=u,k.subscribe(d)})},"zip",arguments)}function wq(){for(var A=arguments.length,e=new Array(A),o=0;oVr(function(a){let I=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,c=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length;for(;I1?o-1:0),a=1;athis.buffer=I,e.complete=la,e.subscribe(LW(...n))}next(A){this.buffer&&this.sink.next([A,...this.buffer])}},"withLatestFrom"),U$=ko(class extends Go{constructor(A,e,o){super(A),this.bufferSize=e,this.startBufferEvery=o,this.buffer=[],this.count=0,this.startBufferEvery&&(this.buffers=[[]])}next(A){this.startBufferEvery?(this.count++===this.startBufferEvery&&(this.buffers.push([]),this.count=1),this.buffers.forEach(e=>{e.push(A)}),this.buffers[0].length===this.bufferSize&&this.sink.next(this.buffers.shift())):(this.buffer.push(A),this.buffer.length===this.bufferSize&&(this.sink.next(this.buffer),this.buffer=[]))}complete(){this.buffer.length?this.sink.next(this.buffer):this.buffers.length&&this.buffers.forEach(A=>this.sink.next(A)),super.complete()}},"bufferCount"),O$=ko(class extends Go{constructor(A,e){super(A),this.buffer=[];let o=new Go(A);o.next=n=>{A.next(this.buffer),this.buffer=[]},o.complete=la,o.subscribe(e)}next(A){this.buffer.push(A)}complete(){this.buffer.length&&this.sink.next(this.buffer),super.complete()}},"buffer"),x$=function(A,e,o,n){return new(o||(o=Promise))(function(a,I){function c(R){try{d(n.next(R))}catch(k){I(k)}}function u(R){try{d(n.throw(R))}catch(k){I(k)}}function d(R){R.done?a(R.value):function(k){return k instanceof o?k:new o(function(_){_(k)})}(R.value).then(c,u)}d((n=n.apply(A,[])).next())})};function yu(A){let e=arguments,o=qT()(Vr(n=>{o.next=a=>n.next(a),o.complete=()=>n.complete(),o.error=a=>n.error(a),A&&n.subscribe(A)},"subject",e));return o.next=la,o.complete=la,o.error=la,o}function FW(A){return Vr(e=>e.subscribe(A()),"defer",arguments)}var bM={promise:A=>{Promise.resolve().then(A)},setImmediate:typeof setImmediate<"u"?A=>setImmediate(A):null,setTimeout:A=>setTimeout(A,0)},Sq=typeof Promise<"u"?bM.promise:bM.setImmediate?bM.setImmediate:bM.setTimeout,UW=A=>e=>{Sq(()=>A(e))},Y$=A=>{typeof A=="function"?Sq=A:bM[A]&&(Sq=bM[A])},OW=A=>UW(e=>{for(let o=0;!e.disposed&&o{let o=0,n=setInterval(()=>e.next(o++),A);return e.defer(()=>{clearInterval(n)}),"interval"},"interval",arguments)}function vq(A,e){return Vr(o=>{let n=0,a=setTimeout(()=>{if(o.removeDefer(I),o.next(n++),e){let c=setInterval(()=>o.next(n++),e);o.defer(()=>{clearInterval(c)})}else o.complete()},A),I=()=>clearTimeout(a);o.defer(I)},"timer",arguments)}function ux(A,e){return o=>{let n=a=>o.next(a);o.defer(()=>e(n)),A(n)}}function H$(A,e){return Vr(ux(A,e),"fromEventPattern",arguments)}function Ln(A,e){if("on"in A&&"off"in A)return Vr(ux(o=>A.on(e,o),o=>A.off(e,o)),"fromEvent",arguments);if("addListener"in A&&"removeListener"in A)return Vr(ux(o=>A.addListener(e,o),o=>A.removeListener(e,o)),"fromEvent",arguments);if("addEventListener"in A)return Vr(ux(o=>A.addEventListener(e,o),o=>A.removeEventListener(e,o)),"fromEvent",arguments);throw"target is not a EventDispachter"}function YW(A){return Vr(e=>{A.then(o=>{e.next(o),e.complete()},e.error.bind(e))},"fromPromise",arguments)}function V$(A,e){return Vr(FW(()=>YW(fetch(A,e))),"fromFetch",arguments)}function q$(A){return Vr(UW(e=>{try{for(let o of A){if(e.disposed)return;e.next(o)}e.complete()}catch(o){e.error(o)}}),"fromIterable",arguments)}function K$(A){let e=o=>x$(this,void 0,void 0,function*(){try{if(o.disposed)return;let{done:n,value:a}=yield A.read();if(n)return void o.complete();o.next(a),e(o)}catch(n){o.error(n)}});return Vr(o=>{e(o)},"fromReader",arguments)}function j$(A){return Vr(e=>{let o=new AbortController,n=o.signal;e.defer(()=>o.abort("cancelled")),A.pipeTo(new WritableStream({write(a){e.next(a)},close(){e.complete()},abort(a){e.error(a)}}),{signal:n}).then(()=>e.complete(),a=>e.error(a))},"fromReadableStream",arguments)}function W$(){return Vr(A=>{let e=requestAnimationFrame(function o(n){A.disposed||(A.next(n),e=requestAnimationFrame(o))});A.defer(()=>cancelAnimationFrame(e))},"fromAnimationFrame",arguments)}function z$(A,e){return Vr(function(o){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:A,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e+A;for(;n2?o-2:0),a=2;a{let c=n.concat(u=>(I.next(u),I.complete()));A.apply(e,c)},"bindCallback",arguments)}function X$(A,e){for(var o=arguments.length,n=new Array(o>2?o-2:0),a=2;a{let c=n.concat((u,d)=>u?I.error(u):(I.next(d),I.complete()));A.apply(e,c)},"bindNodeCallback",arguments)}function $$(){return Vr(()=>{},"never",arguments)}function AAA(A){return Vr(e=>e.error(A),"throwError",arguments)}function Nq(){return Vr(A=>A.complete(),"empty",arguments)}var KT=class extends Go{constructor(A,e,o){super(A),this.f=e;let n=()=>{this.sink.next(this.acc),this.sink.complete()};o===void 0?this.next=a=>{this.acc=a,this.complete=n,this.resetNext()}:(this.acc=o,this.complete=n)}next(A){this.acc=this.f(this.acc,A)}},PW=ko(KT,"reduce"),eAA=A=>ko(KT,"count")((e,o)=>A(o)?e+1:e,0),tAA=()=>ko(KT,"max")(Math.max),iAA=()=>ko(KT,"min")(Math.min),oAA=()=>ko(KT,"sum")((A,e)=>A+e,0),Sm=ko(class extends Go{constructor(A,e,o){super(A),this.filter=e,this.thisArg=o}next(A){this.filter.call(this.thisArg,A)&&this.sink.next(A)}},"filter"),rAA=ko(class extends Go{next(A){}},"ignoreElements"),LM=ko(class extends Go{constructor(A,e){super(A),this.count=e}next(A){this.sink.next(A),--this.count===0&&(this.doDefer(),this.complete())}},"take"),Qc=ko(class extends Go{constructor(A,e){super(A);let o=new Go(A);o.next=()=>{o.doDefer(),A.complete()},o.complete=Rq,o.subscribe(e)}},"takeUntil"),nAA=ko(class extends Go{constructor(A,e){super(A),this.f=e}next(A){this.f(A)?this.sink.next(A):(this.doDefer(),this.complete())}},"takeWhile"),aAA=A=>PW((e,o)=>(e.push(o),e.length>A&&e.shift(),e),[]),sAA=ko(class extends Go{constructor(A,e){super(A),this.count=e}next(A){--this.count===0&&(this.next=super.next)}},"skip"),gAA=ko(class extends Go{constructor(A,e){super(A),A.next=la;let o=new Go(A);o.next=()=>{o.doDefer(),A.resetNext()},o.complete=Rq,o.subscribe(e)}},"skipUntil"),Tq=ko(class extends Go{constructor(A,e){super(A),this.f=e}next(A){this.f(A)||(this.next=super.next,this.next(A))}},"skipWhile"),IAA={leading:!0,trailing:!1},cAA=class extends Go{constructor(A,e,o){super(A),this.durationSelector=e,this.trailing=o}cacheValue(A){this.last=A,this.disposed&&this.throttle(A)}send(A){this.sink.next(A),this.throttle(A)}throttle(A){this.reset(),this.subscribe(this.durationSelector(A))}next(){this.complete()}complete(){this.dispose(),this.trailing&&this.send(this.last)}},JW=class extends Go{constructor(A,e){let o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:IAA;super(A),this.durationSelector=e,this.config=o,this._throttle=new cAA(this.sink,this.durationSelector,this.config.trailing),this._throttle.dispose()}next(A){this._throttle.disposed&&this.config.leading?this._throttle.send(A):this._throttle.cacheValue(A)}complete(){this._throttle.throttle=la,this._throttle.complete(),super.complete()}},EAA=ko(JW,"throttle"),lAA={leading:!1,trailing:!0},CAA=A=>ko(JW,"audit")(A,lAA),BAA=class extends Go{next(){this.complete()}complete(){this.dispose(),this.sink.next(this.last)}},HW=class extends Go{constructor(A,e){super(A),this.durationSelector=e,this._debounce=new BAA(this.sink),this._debounce.dispose()}next(A){this._debounce.dispose(),this._debounce.reset(),this._debounce.last=A,this._debounce.subscribe(this.durationSelector(A))}complete(){this._debounce.complete(),super.complete()}},uAA=ko(HW,"debounce"),QAA=A=>ko(HW,"debounceTime")(e=>vq(A)),dAA=ko(class extends Go{constructor(A,e,o){super(A),this.count=e,this.defaultValue=o}next(A){this.count--===0&&(this.defaultValue=A,this.doDefer(),this.complete())}complete(){this.defaultValue!==void 0?(this.sink.next(this.defaultValue),super.complete()):this.error(new Error("not enough elements in sequence"))}},"elementAt"),hAA=A=>e=>LM(1)(Tq(o=>!A(o))(e)),pAA=ko(class extends Go{constructor(A,e){super(A),this.f=e,this.i=0}next(A){this.f(A)?(this.sink.next(this.i++),this.doDefer(),this.complete()):++this.i}},"findIndex"),fAA=ko(class extends Go{constructor(A,e,o){super(A),this.f=e,this.defaultValue=o,this.index=0}next(A){(!this.f||this.f(A,this.index++))&&(this.defaultValue=A,this.doDefer(),this.complete())}complete(){this.defaultValue!==void 0?(this.sink.next(this.defaultValue),super.complete()):this.error(new Error("no elements in sequence"))}},"first"),mAA=ko(class extends Go{constructor(A,e,o){super(A),this.f=e,this.defaultValue=o,this.index=0}next(A){(!this.f||this.f(A,this.index++))&&(this.defaultValue=A)}complete(){this.defaultValue!==void 0?(this.sink.next(this.defaultValue),super.complete()):this.error(new Error("no elements in sequence"))}},"last"),DAA=ko(class extends Go{constructor(A,e){super(A),this.predicate=e,this.index=0}next(A){this.predicate(A,this.index++)?this.result=!0:(this.result=!1,this.doDefer(),this.complete())}complete(){this.result!==void 0?(this.sink.next(this.result),super.complete()):this.error(new Error("no elements in sequence"))}},"every"),VW=ko(class extends Go{constructor(A,e,o){super(A),this.f=e,o===void 0?this.next=n=>{this.acc=n,this.resetNext(),this.sink.next(this.acc)}:this.acc=o}next(A){this.sink.next(this.acc=this.f(this.acc,A))}},"scan"),yAA=ko(class extends Go{constructor(){super(...arguments),this.hasLast=!1}next(A){this.hasLast?this.sink.next([this.last,A]):this.hasLast=!0,this.last=A}},"pairwise"),qW=class extends Go{constructor(A,e,o){super(A),this.mapper=e,this.thisArg=o}next(A){super.next(this.mapper.call(this.thisArg,A))}},Gq=ko(qW,"map"),RAA=A=>ko(qW,"mapTo")(e=>A),jT=class extends Go{constructor(A,e,o){super(A),this.data=e,this.context=o}next(A){let e=this.context.combineResults;e?this.sink.next(e(this.data,A)):this.sink.next(A)}tryComplete(){this.context.resetComplete(),this.dispose()}},WT=class zZ extends Go{constructor(e,o,n){super(e),this.makeSource=o,this.combineResults=n,this.index=0}subInner(e,o){let n=this.currentSink=new o(this.sink,e,this);this.complete===zZ.prototype.complete&&(this.complete=this.tryComplete),n.complete=n.tryComplete,n.subscribe(this.makeSource(e,this.index++))}complete(){this.sink.complete()}tryComplete(){this.currentSink.resetComplete(),this.dispose()}},KW=class extends jT{},jW=class extends WT{next(A){this.subInner(A,KW),this.next=e=>{this.currentSink.dispose(),this.subInner(e,KW)}}},Qx=ko(jW,"switchMap");function dx(A){return(e,o)=>A(()=>e,o)}var hx=dx(ko(jW,"switchMapTo")),MAA=class extends jT{tryComplete(){this.dispose(),this.context.sources.length?this.context.subNext():(this.context.resetNext(),this.context.resetComplete())}},WW=class extends WT{constructor(){super(...arguments),this.sources=[],this.next2=this.sources.push.bind(this.sources)}next(A){this.next2(A),this.subNext()}subNext(){this.next=this.next2,this.subInner(this.sources.shift(),MAA),this.disposed&&this.sources.length===0&&this.currentSink.resetComplete()}tryComplete(){this.sources.length===0&&this.currentSink.resetComplete(),this.dispose()}},wAA=ko(WW,"concatMap"),SAA=dx(ko(WW,"concatMapTo")),vAA=class extends jT{tryComplete(){this.context.inners.delete(this),super.dispose(),this.context.inners.size===0&&this.context.resetComplete()}},zW=class extends WT{constructor(){super(...arguments),this.inners=new Set}next(A){this.subInner(A,vAA),this.inners.add(this.currentSink)}tryComplete(){this.inners.size===1?this.inners.forEach(A=>A.resetComplete()):this.dispose()}},NAA=ko(zW,"mergeMap"),TAA=dx(ko(zW,"mergeMapTo")),GAA=class extends jT{dispose(){this.context.resetNext(),super.dispose()}},ZW=class extends WT{next(A){this.next=la,this.subInner(A,GAA)}},kAA=ko(ZW,"exhaustMap"),_AA=dx(ko(ZW,"exhaustMapTo")),bAA=ko(class extends Go{constructor(A,e){super(A),this.f=e,this.groups=new Map}next(A){let e=this.f(A),o=this.groups.get(e);o===void 0&&(o=yu(),o.key=e,this.groups.set(e,o),super.next(o)),o.next(A)}complete(){this.groups.forEach(A=>A.complete()),super.complete()}error(A){this.groups.forEach(e=>e.error(A)),super.error(A)}},"groupBy"),LAA=ko(class extends Go{constructor(){super(...arguments),this.start=new Date}next(A){this.sink.next({value:A,interval:Number(new Date)-Number(this.start)}),this.start=new Date}},"timeInterval"),FAA=ko(class extends Go{constructor(A,e){super(A),this.miniseconds=e,this.buffer=[],this.id=setInterval(()=>{this.sink.next(this.buffer.concat()),this.buffer.length=0},this.miniseconds)}next(A){this.buffer.push(A)}complete(){this.sink.next(this.buffer),super.complete()}dispose(){clearInterval(this.id),super.dispose()}},"bufferTime"),UAA=ko(class extends Go{constructor(A,e){super(A),this.buffer=[],this.delayTime=e}dispose(){clearTimeout(this.timeoutId),super.dispose()}delay(A){this.timeoutId=setTimeout(()=>{let e=this.buffer.shift();if(e){let{time:o,data:n}=e;super.next(n),this.buffer.length&&this.delay(Number(this.buffer[0].time)-Number(o))}},A)}next(A){this.buffer.length||this.delay(this.delayTime),this.buffer.push({time:new Date,data:A})}complete(){this.timeoutId=setTimeout(()=>super.complete(),this.delayTime)}},"delay"),XW=ko(class extends Go{constructor(A,e){super(A),this.selector=e}error(A){this.dispose(),this.selector(A)(this.sink)}},"catchError"),OAA=class extends jT{tryComplete(){let A=this.context.inners.delete(this);super.dispose(),A&&this.context.checkComplete()}next(A){this.sink.next(A),this.context.expandValue(A)}},xAA=ko(class extends WT{constructor(A,e){super(A,e),this.project=e,this.inners=new Set,this.sourceCompleted=!1}next(A){this.sink.next(A),this.expandValue(A)}expandValue(A){let e=new OAA(this.sink,A,this);this.currentSink=e,this.complete=this.tryComplete,e.complete=e.tryComplete,this.inners.add(e),e.subscribe(this.makeSource(A,this.index++))}complete(){this.sourceCompleted=!0,this.checkComplete()}checkComplete(){this.sourceCompleted&&this.inners.size===0&&(this.resetComplete(),super.complete())}tryComplete(){this.sourceCompleted=!0,this.checkComplete()}},"expand"),YAA=()=>A=>new Promise((e,o)=>{let n;new Bx(A,a=>n=a,o,()=>e(n))}),PAA=()=>A=>{let e;return new ReadableStream({start(o){e=new Bx(A,o.enqueue.bind(o),o.error.bind(o),o.close.bind(o))},cancel(){e.dispose()}})},Ks=function(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:la,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:la,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:la;return n=>new Bx(n,A,e,o)},kq=ko(class extends Go{constructor(A,e){super(A),e instanceof Function?this.next=o=>{e(o),A.next(o)}:(e.next&&(this.next=o=>{e.next(o),A.next(o)}),e.complete&&(this.complete=()=>{e.complete(),A.complete()}),e.error&&(this.error=o=>{e.error(o),A.error(o)}))}},"tap"),JAA=ko(class extends Go{constructor(A,e){super(A),this.timeout=e,this.id=setTimeout(()=>this.error(new kW(this.timeout)),this.timeout)}next(A){super.next(A),clearTimeout(this.id),this.next=super.next}dispose(){clearTimeout(this.id),super.dispose()}},"timeout"),HAA=function(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:1/0;return e=>{if(e instanceof Wh){let o=Vr(n=>{let a=A,I=new Go(n);I.error=c=>{a-- >0?I.subscribe(e):n.error(c)},I.sourceId=o.id,I.subscribe(e)},"retry",[A]);return o.source=e,os.pipe(o),o}return o=>{let n=A,a=new Go(o);a.error=I=>{n-- >0?e(a):o.error(I)},e(a)}}},_q=(A=>(A[A.AUTO_SWITCH_NEW_DEVICE=0]="AUTO_SWITCH_NEW_DEVICE",A[A.WAIT_CURRENT_DEVICE=1]="WAIT_CURRENT_DEVICE",A))(_q||{}),zT=class ZZ extends yq{constructor(e,o){super({mediaType:e,PlayerClass:o}),G(this,"isRemote",!1),G(this,"deviceId"),G(this,"groupId",""),G(this,"label",""),G(this,"sourceTrack"),G(this,"enableAutoSwitchWhenRecapturing",!0),G(this,"_isRecapturing",!1),G(this,"_lastRecaptureTime",0),G(this,"_onMuteTimeoutId",-1),G(this,"_encodeCheckTimeoutId",-1),G(this,"recaptureMode",0),G(this,"profile"),G(this,"retryEncodeFailed")}get enableEncodeFrame(){return!1}get isPublishing(){return this.state.toString()==="publishing"}get isPublished(){return this.state==="publish"}get isUseCustomSource(){return!(!this.mediaTrack||this.sourceTrack===this.mediaTrack)}encodeFrame(e,o){throw new Error("Method not implemented.")}installTrackEvent(e){e.addEventListener(fA.MUTE,this.onTrackMuted),e.addEventListener(fA.UNMUTE,this.onTrackUnmuted),e.addEventListener(fA.ENDED,this.onTrackEnded),e.muted&&this.onTrackMuted(),e.readyState===fA.ENDED&&this.onTrackEnded()}uninstallTrackEvent(e){e.removeEventListener(fA.MUTE,this.onTrackMuted),e.removeEventListener(fA.UNMUTE,this.onTrackUnmuted),e.removeEventListener(fA.ENDED,this.onTrackEnded)}setStateToReady(){}capture(e){let o=arguments.length>1&&arguments[1]!==void 0&&arguments[1];return DA(this,null,function*(){var n,a;let I=this.sourceTrack;try{let c,u=ki();S.emit(K.LOCAL_TRACK_CAPTURE_START,{track:this}),e.customSource?(c=new MediaStream,c.addTrack(e.customSource)):(o||(n=this.sourceTrack)==null||n.stop(),c=yield w$(e));let d=c.getTracks()[0];return yield this.setInputMediaStreamTrack(d),e.customSource||(this.sourceTrack=d,this.updateDeviceIdInUse(),this.listenDeviceChange()),S.emit(K.LOCAL_TRACK_CAPTURE_SUCCESS,{track:this,cost:ki()-u,profile:this.profile,room:(a=this.manager)==null?void 0:a.room}),c}catch(c){throw S.emit(K.LOCAL_TRACK_CAPTURE_FAILED,{track:this,error:c}),this.log.error("getUserMedia error observed ".concat(c)),c}finally{o&&I?.stop()}})}setOutputMediaStreamTrack(e){var o;if(super.setOutputMediaStreamTrack(e),this.setStateToReady(),this.isPublishing||this.isPublished)return(o=this.room)==null?void 0:o.replaceTrack(this)}get hasFlag(){var e,o;let n=mQ(((e=this.room)==null?void 0:e.localPublishFlag)||0,((o=this.room)==null?void 0:o.userId)||"");return this.mediaType===4&&n.hasVideo||this.mediaType===1&&n.hasAudio||this.mediaType===2&&n.hasAuxiliary}publish(e,o){return DA(this,null,function*(){return this.room=e,this.room.localTracks.add(this),this.emit("4",{mediaType:this.strMediaType,state:"starting",prevState:"stopped"}),this.userId=e.userId,this._log.bindParent(e.getLogger()),yield o,this._checkPublishFlag(e)})}_checkPublishFlag(e){return new Promise((o,n)=>DA(this,null,function*(){var a,I,c,u,d;let R=()=>n(new Ct({code:Ge.API_CALL_ABORTED,message:"publish aborted"}));if(this.hasFlag||this.muted?o():((this.state===Uo.INIT||this.state==="ready")&&R(),Jn(Ln(e,"local-publish-flag-changed"),Sm(()=>this.hasFlag),Qc(Mq(Ln(this,Uo.INIT),Ln(this,"ready"))),Ks(o,n,R))),(c=(I=(a=this.room)==null?void 0:a.networkQuality)==null?void 0:I.hadRecentBadUplink)!=null&&c.call(I,2))return o();let k=e.heartbeatCount,_=((d=(u=this.mediaTrack)==null?void 0:u.stats)==null?void 0:d.totalFrames)||0;this._encodeCheckTimeoutId=setTimeout(()=>DA(this,null,function*(){var Z,iA,cA,TA,JA,Ie,XA,Ft;if((cA=(iA=(Z=this.room)==null?void 0:Z.networkQuality)==null?void 0:iA.hadRecentBadUplink)!=null&&cA.call(iA,2)||e.heartbeatCount-k<3)return o();if((this.isPublished||this.isPublishing)&&this.isMediaTrackActive){if((TA=this.mediaTrack)!=null&&TA.stats){let Nt=this.mediaTrack.stats.totalFrames||0;Nt-_===0&&this.log.warn("capture totalFrames is 0 during encode check, totalFrames",Nt)}let ie=this.kind===fA.AUDIO,ke=this.stat.bytesSent>0;if(ct[ke?"addSuccessEvent":"addFailedEvent"]({key:ie?503700:513702}),!ie){let Nt={H264:513704,H265:513705,VP8:513706}[((Ie=(JA=this.room)==null?void 0:JA.videoCodec)==null?void 0:Ie.toUpperCase())||"H264"];Nt&&ct[ke?"addSuccessEvent":"addFailedEvent"]({key:Nt})}if(!ke){if(ct.addEnum({key:ie?503701:513703,value:_Q()}),Jo.uploadEvent({log:"stat-encode-failed-".concat(this.kind,"-").concat(Qu()||bQ()),userId:this.userId}),this.log.warn(ie?"encode failed":"".concat((Ft=(XA=this.room)==null?void 0:XA.videoCodec)==null?void 0:Ft.toUpperCase()," encode failed")),this.retryEncodeFailed&&(this.log.warn("retry encode"),yield this.retryEncodeFailed(this),this.stat.bytesSent>0||this.hasFlag||(yield AC(5e3),this.stat.bytesSent>0||this.hasFlag)))return o();this.emit("6",this),n(new Ct({message:"".concat(this.strMediaType," encode failed"),code:ie?Ge.AUDIO_ENCODE_FAILED:Ge.VIDEO_ENCODE_FAILED}))}}}),1e4)}))}unpublish(){this.room&&this.room.localTracks.delete(this),this.log.info("unpublish"),S.emit(K.LOCAL_TRACK_UNPUBLISHED,{track:this})}updateDeviceIdInUse(){return DA(this,null,function*(){if(this.sourceTrack&&Jh){let{deviceId:e,groupId:o}=this.sourceTrack.getSettings(),{label:n}=this.sourceTrack;(yield function(a){return DA(this,arguments,function(I){let{newDeviceId:c,oldDeviceId:u,oldGroupId:d,oldLabel:R,kind:k}=I;return function*(){return c===u&&(k!==fA.AUDIO||c!==bf||(yield DW(d,R)))}()})}({newDeviceId:e,oldDeviceId:this.deviceId,oldGroupId:this.groupId,oldLabel:this.label,kind:this.kind}))||(this.deviceId=e,this.label=n,o&&(this.groupId=o),Ix().then(a=>{let I=a.find(c=>{let u=c.deviceId===e;return o&&(u=u&&c.groupId===o),u});I&&this.emit("2",I)}))}})}setProfile(e){this.log.info("setProfile",e),Object.assign(this.profile,e)}isNeedToRecapture(){let e=arguments.length>0&&arguments[0]!==void 0&&arguments[0];return!(!this.deviceId||!this.sourceTrack||this.kind===fA.AUDIO&&!function(o){if(o instanceof CanvasCaptureMediaStreamTrack||!(o instanceof MediaStreamTrack))return!1;let n=o.label.toLocaleLowerCase();if(n.includes("mic")||n.includes("麦克风"))return!0;let a="".concat((o?.getSettings()||{}).deviceId,"_").concat(fA.AUDIO_INPUT);return!!mq.has(a)}(this.sourceTrack)||this.kind===fA.VIDEO&&!function(o){if(o instanceof CanvasCaptureMediaStreamTrack||!(o instanceof MediaStreamTrack))return!1;let n=o.label.toLocaleLowerCase();if(n.includes("camera")||n.includes("webcam"))return!0;let a="".concat((o?.getSettings()||{}).deviceId,"_").concat(fA.VIDEO_INPUT);return!!mq.has(a)}(this.sourceTrack)||this._isRecapturing||e&&lu&&Ma)}onTrackMuted(){if(super.onTrackMuted(),S$(),this.isNeedToRecapture(!0)){if(Date.now()-this._lastRecaptureTimethis.onTrackMuted(),Ff);this._onMuteTimeoutId=setTimeout(()=>DA(this,null,function*(){var e;if((e=this.sourceTrack)!=null&&e.muted){if((Ea||ra)&&document.visibilityState!=="visible")return;this.recapture(yield this.getRecoverCaptureDeviceId())}}),5e3)}}onTrackUnmuted(){super.onTrackUnmuted(),this._onMuteTimeoutId>0&&clearTimeout(this._onMuteTimeoutId)}onTrackEnded(){return DA(this,null,function*(){if(zg(ZZ.prototype,this,"onTrackEnded").call(this),this.isNeedToRecapture()&&this.recaptureMode===0){if(Date.now()-this._lastRecaptureTimethis.onTrackEnded(),Ff);this.emit("7"),this.recapture(yield this.getRecoverCaptureDeviceId())}})}recapture(e){let o=arguments.length>1&&arguments[1]!==void 0&&arguments[1];return DA(this,null,function*(){var n;if(this._isRecapturing||!this.sourceTrack)return;this.log.warn("recapture trying");let a=this.sourceTrack;o||(n=this.sourceTrack)==null||n.stop(),this._isRecapturing=!0,this._lastRecaptureTime=Date.now();let I={useExactDeviceId:!0};if(e==="user"||e==="environment")I.facingMode=e;else{let c;(this.kind==="audio"?yield VQ():yield qQ()).find(u=>u.deviceId===e)&&(c=e),I.deviceId=c}return this.capture(I,o).then(()=>{this._isRecapturing=!1,this.log.warn("recapture success"),this.emit("1",{deviceId:this.deviceId}),S.emit(K.LOCAL_TRACK_RECAPTURE,{track:this})}).catch(c=>{this._isRecapturing=!1,this.log.warn("recapture failed ".concat(c.message)),this.emit("5",c),S.emit(K.LOCAL_TRACK_RECAPTURE,{track:this,error:c})}).finally(()=>{o&&a?.stop()})})}getRecoverCaptureDeviceId(){return DA(this,null,function*(){let e=this instanceof Ru;if(e&&this.facingMode)return this.facingMode;let{deviceId:o}=this;if(o){let n=(XT.get(o)||0)+1;if(XT.set(o,n),n>=3&&this.enableAutoSwitchWhenRecapturing){let a=e?(yield qQ()).find(I=>!XT.has(I.deviceId)):(yield VQ()).find(I=>!XT.has(I.deviceId));a&&(this.log.warn("".concat(o," capture fail ").concat(n," times, change new ").concat(a.deviceId)),o=a.deviceId)}}return o})}stopCapture(){var e;this.sourceTrack&&(this.sourceTrack.stop(),S.emit(K.LOCAL_TRACK_STOPPED,{track:this}),this.uninstallTrackEvent(this.sourceTrack)),this._inputTrack&&this.uninstallTrackEvent(this._inputTrack),(e=this.manager)==null||e.removeInput(this),this._onMuteTimeoutId&&clearTimeout(this._onMuteTimeoutId)}close(){super.close(),this.stopCapture()}};vt([is(Uo.INIT,"ready",{ignoreError:!0,sync:!0})],zT.prototype,"setStateToReady"),vt([VT()],zT.prototype,"capture"),vt([is("ready","publish",{ignoreError:!0,success(){S.emit(K.LOCAL_TRACK_PUBLISHED,{track:this,room:this.room}),this.emit("4",{mediaType:this.strMediaType,state:"started",prevState:"starting"}),this.log.info("published")},fail(A){var e;(e=this.room)==null||e.localTracks.delete(this);let o="error",n=A instanceof Ct?A:A.cause instanceof Ct?A.cause:A,a=!1;n instanceof Ct&&(n.message.includes("timeout")?o="timeout":n.code===Ge.API_CALL_ABORTED&&(a=!0,o="api-call")),this.emit("4",{mediaType:this.strMediaType,state:"stopped",prevState:"starting",reason:o,error:n}),this.log[a?"info":"error"]("publish failed",n)}}),jh(521714,!1)],zT.prototype,"publish"),vt([Dn(A=>function(){return DA(this,null,function*(){let e=this.state==="publish"?"started":"starting";A.call(this),this.emit("4",{mediaType:this.strMediaType,state:"stopped",prevState:e,reason:"api-call"}),clearTimeout(this._encodeCheckTimeoutId)})}),is([],"ready",{sync:!0})],zT.prototype,"unpublish");var ZT=zT,XT=new Map;S.on(K.SWITCH_DEVICE_SUCCESS,A=>{A.track.deviceId&&XT.delete(A.track.deviceId)});var vm=class mG extends ZT{constructor(e){super(1,m$),G(this,"mediaType",1),G(this,"volume",0),G(this,"profile",{echoCancellation:!0,autoGainControl:!0,noiseSuppression:!0,sampleRate:48e3,channelCount:1,bitrate:40}),G(this,"playerMuted",!0),G(this,"pipeline"),G(this,"earMonitorGainNode",new iI),G(this,"_output",new iI),G(this,"codecPipeline",[]),G(this,"stat",{bytesSent:0,packetsSent:0,audioLevel:0,totalAudioEnergy:0}),G(this,"mixedAudioReferenceMap",new Map),G(this,"isAudioContextLongSuspended",!1),G(this,"after3aSilenceStartTime",0),G(this,"_micMuted",!1),G(this,"_volumeDetectionTrack",null),G(this,"_volumeDetectionSource",new iI),this.manager=e,this.pipeline=new QW(e),this.pipeline.source.pipeTo(this.player.pipeline.volumeMeter),this.pipeline.gain.pipeTo(this.earMonitorGainNode).pipeTo(this._output),this.pipeline.gain.pipeTo(this.player.pipeline.volumeMeterAfter3A),this._volumeDetectionSource.pipeTo(this.player.pipeline.volumeMeter),this.handleMicrophoneAdded=this.handleMicrophoneAdded.bind(this),this.handleMicrophoneRemoved=this.handleMicrophoneRemoved.bind(this),S.on(K.AUDIO_CONTEXT_LONG_SUSPENDED,this.handleAudioContextLongSuspended,this)}get dbVolume(){return gx.isRunning?this.player.pipeline.volumeMeter.getVolumeDb():Math.floor(Math.max(10*Math.log10(this.volume)+100,0))}getAudioLevel(){let e=(this.volume||super.getAudioLevel())*this.captureVolume;return e>1?1:e}getInternalAudioLevelAfter3A(){if(this.pipeline.isProcessEnabled)return this.player.getInternalAudioLevelAfter3A()}updateAfter3aSilenceStartTime(e){Ee(e)||(e!==0||this.after3aSilenceStartTime?e>0&&(this.after3aSilenceStartTime=0):this.after3aSilenceStartTime=ki())}setInputMediaStreamTrack(e){return DA(this,null,function*(){let o=this.trackSettings||{};ct.addEnum({key:501701,value:o.channelCount||0,useUV:!1}),ct.addEnum({key:501702,value:o.sampleRate||0,useUV:!1}),ct.addEnum({key:502700,value:0});let{sampleRate:n,channelCount:a}=o;this._log.info("local audio track input ".concat(JSON.stringify({sampleRate:n,channelCount:a}))),this.pipeline.source.channelCount=a||1,this.pipeline.replaceSource(e),yield zg(mG.prototype,this,"setInputMediaStreamTrack").call(this,e),this.updatePlayingState(!!e)})}capture(e){return DA(this,arguments,function(o){var n=this;let{deviceId:a,customSource:I,useExactDeviceId:c=!0,retryWhenExactFailed:u}=o,d=arguments.length>1&&arguments[1]!==void 0&&arguments[1];return function*(){let R=yield zg(mG.prototype,n,"capture").call(n,{video:!1,audio:!0,microphoneId:a,echoCancellation:n.profile.echoCancellation,autoGainControl:n.profile.autoGainControl,noiseSuppression:n.profile.noiseSuppression,sampleRate:n.profile.sampleRate,channelCount:n.profile.channelCount,useExactDeviceId:c,retryWhenExactFailed:u,customSource:I},d);return JT(),R}()})}switchDevice(e){return DA(this,null,function*(){if(this.mediaTrack){if(this.deviceId===e&&!this.isUseCustomSource&&(e!==bf||(yield DW(this.groupId,this.label))))return;try{this.log.info("switchDevice audio to: ".concat(e)),this.sourceTrack&&this.sourceTrack.stop(),yield this.capture({deviceId:e,useExactDeviceId:!0,retryWhenExactFailed:!1}),S.emit(K.SWITCH_DEVICE_SUCCESS,{track:this}),this.log.info("switch microphone success")}catch(o){throw this.log.error("switch microphone failed ".concat(o)),this.deviceId&&this.recapture(this.deviceId),o}}})}listenDeviceChange(){vs&&!vs.listeners("audioInputRemoved").includes(this.handleMicrophoneRemoved)&&vs.on("audioInputRemoved",this.handleMicrophoneRemoved,this)}handleMicrophoneRemoved(e){return DA(this,null,function*(){if(e.deviceId===this.deviceId){let o=this.recaptureMode===1;if(this.log.warn("RecaptureMode: ".concat(_q[this.recaptureMode],". Current microphone is lost: ").concat(JSON.stringify(e))),this.recaptureMode===0){Ua(this.userId,{eventId:2003,param1:6,streamType:1});let n=yield VQ();n[0]?this.recapture(n[0].deviceId):o=!0}o&&vs.on("audioInputAdded",this.handleMicrophoneAdded,this)}})}handleMicrophoneAdded(e){this.recaptureMode===1&&e.deviceId!==this.deviceId||(vs.off("audioInputAdded",this.handleMicrophoneAdded,this),this.log.warn("microphone added: ".concat(JSON.stringify(e))),this.recapture(e.deviceId))}update3A(e){return DA(this,arguments,function(o){var n=this;let{echoCancellation:a,noiseSuppression:I,autoGainControl:c}=o;return function*(){let u=n.sourceTrack||n.mediaTrack;if(!u)return;let d=u.getConstraints(),R=!1;!Ee(a)&&a!==n.profile.echoCancellation&&(n.profile.echoCancellation=a,d.echoCancellation=a,R=!0),!Ee(I)&&I!==n.profile.noiseSuppression&&(n.profile.noiseSuppression=I,d.noiseSuppression=I,R=!0),!Ee(c)&&c!==n.profile.autoGainControl&&(n.profile.autoGainControl=c,d.autoGainControl=c,R=!0),R&&(Yr||Ma?yield u.applyConstraints(d).catch(k=>n._log.warn("update3A failed: ",k)):n.deviceId&&(yield n.recapture(n.deviceId,!0)))}()})}get captureVolume(){return this.pipeline.volume}setCaptureVolume(e){this.pipeline.setVolume(e/100),this.pipeline.gain.node&&ct.addEnum({key:502700,value:2})}setMute(e,o){var n;this._cleanupVolumeDetectionTrack(),e==="microphone"?(this._micMuted=!0,this.sourceTrack&&(this.sourceTrack.enabled=!1),o&&this._setupVolumeDetectionTrack(),((n=this.manager)==null?void 0:n.mixWeight)<=1?(this.muted=!0,this._inputTrack&&(this._inputTrack.enabled=!1),this._outputTrack&&(this._outputTrack.enabled=!1),this.emit("mute",this),S.emit(K.TRACK_MUTED,{track:this})):this._outputTrack&&(this._outputTrack.enabled=!0)):e===!0?(this._micMuted=!1,this.muted=!0,this.sourceTrack&&(this.sourceTrack.enabled=!1),this._inputTrack&&(this._inputTrack.enabled=!1),this._outputTrack&&(this._outputTrack.enabled=!1),o&&this._setupVolumeDetectionTrack(),this.emit("mute",this),S.emit(K.TRACK_MUTED,{track:this})):(this._micMuted=!1,this.muted=!1,this.sourceTrack&&(this.sourceTrack.enabled=!0),this._inputTrack&&(this._inputTrack.enabled=!0),this._outputTrack&&(this._outputTrack.enabled=!0),this.emit("unmute",this),S.emit(K.TRACK_UNMUTED,{track:this}))}_setupVolumeDetectionTrack(){let e=this.sourceTrack||this.mediaTrack;if(!e)return;this._volumeDetectionTrack=e.clone(),this._volumeDetectionTrack.enabled=!0;let o=ax(this._volumeDetectionTrack);o&&this._volumeDetectionSource.setNode(o)}_cleanupVolumeDetectionTrack(){this._volumeDetectionTrack&&(this._volumeDetectionTrack.stop(),this._volumeDetectionTrack=null),this._volumeDetectionSource.deleteNode()}get isMicMuted(){return this._micMuted}setAudioVolume(e){super.setAudioVolume(0),Ea&&this.player.setMuted(!0),this.earMonitorGainNode.node||(this.earMonitorGainNode.setNode(tI().createGain()),this._output.setNode(tI().destination)),this.earMonitorGainNode.node.gain.value=e}enableTrackANS(e){return this.update3A({noiseSuppression:e})}enableTrackAEC(e){if(this.sourceTrack&&!Ma&&!Ea)return this.update3A({echoCancellation:e})}addDenoiser(e){var o;tE<=92&&((o=this.trackSettings)==null?void 0:o.sampleRate)!==48e3?this._log.warn("denoiser only support sampleRate 48000 before chrome 93"):(ct.addEnum({key:502700,value:1}),this.pipeline.denoiser.setNode(e),this.enableTrackANS(!1))}mixAudioReference(e,o){if(this.mixedAudioReferenceMap.has(o))return;this.log.info("mixAudioReference() => ".concat(o));let n=ax(e);if(!n)return;let a=new iI,I=tI().createGain();I.gain.value=1;let c=new iI;a.pipeTo(c).pipeTo(this.pipeline.mixNode),a.setNode(n),c.setNode(I),this.mixedAudioReferenceMap.set(o,[a,c])}unMixAudioReference(e){let[o,n]=this.mixedAudioReferenceMap.get(e)||[];o&&(this.log.info("unMixAudioReference() => ".concat(e)),o.deleteNode(),n?.deleteNode(),this.mixedAudioReferenceMap.delete(e))}setAudioReferenceVolume(e,o){let[n,a]=this.mixedAudioReferenceMap.get(e)||[];a!=null&&a.node&&(a.node.gain.value=o/100,this.log.info("setAudioReferenceVolume() => ".concat(e," ").concat(a.node.gain.value)))}addAudioProcessor(e,o,n){this.pipeline.silentNode.setNode(n),this.pipeline.mixNode.setNode(o),this.pipeline.aec.setNode(e)}removeDenoiser(e){if(this.pipeline.denoiser.node===e)return this.pipeline.denoiser.deleteNode(),this.enableTrackANS(!0)}removeAudioProcessor(e){this.pipeline.aec.node===e&&(this.pipeline.aec.deleteNode(),this.pipeline.silentNode.deleteNode(),this.pipeline.mixNode.deleteNode())}close(){this._cleanupVolumeDetectionTrack(),this.mixedAudioReferenceMap.forEach(e=>{let[o,n]=e;o.deleteNode(),n.deleteNode()}),this.mixedAudioReferenceMap.clear(),this.pipeline.remove(),this.earMonitorGainNode.deleteNode(),this._output.deleteNode(),vs.off("audioInputAdded",this.handleMicrophoneAdded,this),vs.off("audioInputRemoved",this.handleMicrophoneRemoved,this),S.off(K.AUDIO_CONTEXT_LONG_SUSPENDED,this.handleAudioContextLongSuspended,this),super.close()}recapture(e){let o=arguments.length>1&&arguments[1]!==void 0&&arguments[1];return DA(this,null,function*(){try{yield zg(mG.prototype,this,"recapture").call(this,e,o)}catch(n){let a=(yield VQ()).find(I=>I.deviceId!==e);if(!a)throw n;yield zg(mG.prototype,this,"recapture").call(this,a.deviceId)}})}encodeFrame(e){return this.manager?this.manager.encodePipeline.reduceRight((o,n)=>n?n({frame:o,ntp:gh()}):o,e):e}get enableEncodeFrame(){return!!this.manager&&this.manager.encodePipeline.some(e=>e)}get enableEncryptFrame(){return this.manager&&!!this.manager.encodePipeline[0]}handleAudioContextLongSuspended(e){let{isSuspended:o}=e;if(this.pipeline.isProcessEnabled)if(o){this.isAudioContextLongSuspended=!0,this.log.warn("context has suspended for ".concat(1.5," seconds, change to source audio").concat(TQ?"":", non-Safari"));let n=this.sourceTrack||this.mediaTrack;n&&this.setOutputMediaStreamTrack(n)}else this.isAudioContextLongSuspended=!1,this.log.warn("context has resumed, change to processed audio"),this.pipeline.track&&this.setOutputMediaStreamTrack(this.pipeline.track)}setOutputMediaStreamTrack(e){if(this.isAudioContextLongSuspended){let o=this.sourceTrack||this.mediaTrack;o&&(e=o)}super.setOutputMediaStreamTrack(e)}};function px(A,e){return e+4<=A.byteLength&&A.getUint8(e)===0&&A.getUint8(e+1)===0&&A.getUint8(e+2)===0&&A.getUint8(e+3)===1?4:e+3<=A.byteLength&&A.getUint8(e)===0&&A.getUint8(e+1)===0&&A.getUint8(e+2)===1?3:0}function $W(A){let e=arguments.length>1&&arguments[1]!==void 0&&arguments[1],o=new DataView(A),n=[],a=0;for(;a0){c=_;break}let u=c===-1?o.byteLength:c,d=u-a,R=new ArrayBuffer(d),k=new DataView(R);for(let _=0;_1&&arguments[1]!==void 0&&arguments[1];this.dataView=A,this.isSEI&&(e?this.addPreventionByte():this.removePreventionByte())}addPreventionByte(){let{seiPayloadStartIndex:A}=this,e=this.dataView.byteLength-2,o=[],n=0;for(let I=A;I<=e;I++){let c=this.dataView.getInt8(I);switch(c){case 0:case 1:case 2:case 3:n===2&&(o.push(3),n=0),c===0?n+=1:n=0,o.push(c);break;default:n=0,o.push(c)}}o.push(this.dataView.getInt8(this.dataView.byteLength-1));let a=new DataView(new Uint8Array([...new Uint8Array(this.dataView.buffer).slice(0,A),...o]).buffer);this.dataView=a}removePreventionByte(){let{seiPayloadStartIndex:A}=this,e=this.dataView.byteLength-1,o=[],n=0;for(let I=A;I<=e;I++)switch(this.dataView.getInt8(I)){case 0:n++,o.push(this.dataView.getInt8(I));break;case 3:n!==2&&o.push(this.dataView.getInt8(I)),n=0;break;default:o.push(this.dataView.getInt8(I)),n=0}let a=new DataView(new Uint8Array([...new Uint8Array(this.dataView.buffer).slice(0,A),...o]).buffer);this.dataView=a}get seiPayloadStartIndex(){let A=6;for(let e=6;e=this.dataView.byteLength?0:31&this.dataView.getUint8(A)}getStartCodeLength(){return this.dataView.byteLength>=4&&this.dataView.getUint8(0)===0&&this.dataView.getUint8(1)===0&&this.dataView.getUint8(2)===0&&this.dataView.getUint8(3)===1?4:this.dataView.byteLength>=3&&this.dataView.getUint8(0)===0&&this.dataView.getUint8(1)===0&&this.dataView.getUint8(2)===1?3:0}get isIDR(){return this.naluType===5}get isSPS(){return this.naluType===7}get isPPS(){return this.naluType===8}get isSEI(){return this.naluType===6}},VAA=class{constructor(){G(this,"_seiMessageList",[]),G(this,"_smallSeiMessageList",[]),G(this,"_seiPayloadType",243)}encodeSEINalu(A){let e=A.byteLength,o=parseInt(String(e/255),10),n=e%255,a=[];a.push(0,0,0,1,6,this._seiPayloadType);for(let c=0;c0&&A.data.byteLength>0){let n=9-this.getNaluCount(A.data);if(n<=0)return 0;let a=o.splice(0,n).reverse().map(this.encodeSEINalu.bind(this)),I=a.reduce((k,_)=>k+_.dataView.byteLength,0),c=new ArrayBuffer(I+A.data.byteLength),u=new DataView(c),d=new DataView(A.data),R=0;for(let k=0;k1&&arguments[1]!==void 0?arguments[1]:4,wi),G(this,"profile",bt({},vf)),G(this,"avoidCropping",!1),G(this,"_scaleResolutionDownBy"),G(this,"stat",{bytesSent:0,packetsSent:0,framesEncoded:0,framesSent:0,frameWidth:0,frameHeight:0,fpsCapture:0,framesCaptured:0}),G(this,"small"),G(this,"isNeedToSetBandwidth"),G(this,"muteImage"),G(this,"manager"),G(this,"_seiCodec",new VAA),this.manager=e;let o=()=>{var n;if(this.isAllowed2k4k(this.profile))this.room&&this.settings.height>=1440&&this.state==="publish"&&this.room.sendAbilityStatus({"2k4k":1});else{let a=ol(((n=this.room)==null?void 0:n.sdkAppId)||0)?uN:NR;this.log.warn("Resolution is reset to 1080p, need to upgrade ability here ".concat(a)),this.setProfile(fi(bt({},this.profile),{width:1920,height:1080})),this.applyProfile()}};this.on("input-media-track-changed",o),this.on("publish",o),this.handleCameraAdded=this.handleCameraAdded.bind(this),this.handleCameraRemoved=this.handleCameraRemoved.bind(this)}get facingMode(){if(Jh&&this.mediaTrack)return this.mediaTrack.getSettings().facingMode}get contentHint(){var e;return((e=this._inputTrack)==null?void 0:e.contentHint)||""}get isQosClearFirst(){var e;return((e=this._inputTrack)==null?void 0:e.contentHint)==="detail"}get hasSmall(){var e;return!((e=this.manager)==null||!e.hasSmall)}setMute(e){return DA(this,null,function*(){var o,n,a;if(Sr(e)){if(this.muteImage===e)return;yield(o=this.manager)==null?void 0:o.deleteWatermark("mute"),yield(n=this.manager)==null?void 0:n.setWatermark({x:0,y:0,width:this.settings.width,height:this.settings.height,type:"mute",zIndex:999,imageUrl:e,fillVideo:!0}),this.muteImage=e,zg($M.prototype,this,"setMute").call(this,!1)}else this.muteImage&&(yield(a=this.manager)==null?void 0:a.deleteWatermark("mute"),this.muteImage=void 0),zg($M.prototype,this,"setMute").call(this,e)})}capture(e){return DA(this,arguments,function(o){var n=this;let{deviceId:a,facingMode:I,useExactDeviceId:c=!0,customSource:u,retryWhenExactFailed:d=!0}=o;return function*(){let R={audio:!1,video:!0,facingMode:I||n.facingMode,cameraId:a,width:n.profile.width,height:n.profile.height,frameRate:n.profile.frameRate,useExactDeviceId:c,retryWhenExactFailed:d,customSource:u};if(R.facingMode==="environment"){let k=yield n.getDeviceIdWhenUsingBackCamera();k&&(R.cameraId=k)}return zg($M.prototype,n,"capture").call(n,R)}()})}setProfile(e){var o;let n=this.fallbackProfile(e);if(n.bitrate&&(this.isNeedToSetBandwidth=n.bitrate!==this.profile.bitrate),this.isAllowed2k4k(this.profile))super.setProfile(n);else{let a=ol(((o=this.room)==null?void 0:o.sdkAppId)||0)?uN:NR;this.log.warn("Resolution is reset to 1080p, need to upgrade ability here ".concat(a)),super.setProfile(fi(bt({},this.profile),{width:1920,height:1080}))}}applyProfile(){return DA(this,null,function*(){var e,o;if(!this.mediaTrack)return;let{width:n=0,height:a=0}=(this.sourceTrack||this.mediaTrack).getSettings(),I=n*a,c=this.settings,u=c.height!==this.profile.height||c.width!==this.profile.width||c.frameRate!==this.profile.frameRate;if(u&&(al===16&&this.deviceId?yield this.recapture(this.deviceId):(DQ(this.outMediaTrack)?yield(e=this.outMediaTrack)==null?void 0:e.applyConstraints({width:this.profile.width,height:this.profile.height,frameRate:this.profile.frameRate}):yield(o=this.sourceTrack||this.mediaTrack)==null?void 0:o.applyConstraints({width:this.profile.width,height:this.profile.height,frameRate:this.profile.frameRate}),this.manager&&this.manager.changeInput(this)),this.room&&this.settings.height>=1440&&this.state==="publish"&&this.room.sendAbilityStatus({"2k4k":1})),this.isNeedToSetBandwidth&&this.room&&this.room.setBandWidth){this.isNeedToSetBandwidth=!1;let{width:d=0,height:R=0}=(this.sourceTrack||this.mediaTrack).getSettings(),k=d*R;return u&&k&&I&&k===I?void this.log.warn("set bandwidth failed: resolution is not changed"):this.room.setBandWidth({bandwidth:this.profile.bitrate,type:fA.VIDEO,videoType:fA.BIG})}})}get settings(){let e={width:this.profile.width,height:this.profile.height,frameRate:this.profile.frameRate},o=this.sourceTrack||this.mediaTrack;return Jh&&o&&Object.assign(e,o.getSettings()),e}get scaleResolutionDownBy(){return this._scaleResolutionDownBy?this._scaleResolutionDownBy:AM(this.settings,this.profile)}isAllowed2k4k(e){var o;return!(this.room&&this.room.scheduleResult&&!this.isScreen&&!(e.height*e.width<3686400))||((o=this.room.scheduleResult.trtcAutoConf)==null?void 0:o["2k4k"])===1}isNeedToSwitchDevice(e){return!(!this.mediaTrack||this.deviceId===e||this.facingMode===e)}switchDevice(e){return DA(this,null,function*(){try{if(!this.isNeedToSwitchDevice(e)&&!this.isUseCustomSource)return;let o={useExactDeviceId:!0,retryWhenExactFailed:!1};e==="user"||e==="environment"?o.facingMode=e:o.deviceId=e,this.sourceTrack&&this.sourceTrack.stop(),yield this.capture(o),S.emit(K.SWITCH_DEVICE_SUCCESS,{track:this}),this.log.info("switch camera success")}catch(o){throw this.log.error("switch camera failed ".concat(o)),this.deviceId&&this.recapture(this.deviceId),o}})}getDeviceIdWhenUsingBackCamera(){return DA(this,null,function*(){let e;try{if(iT&&!Th&&Ax){let o=(yield qQ(!0)).map(a=>{var I;return fi(bt({},a),{capabilities:(I=a.getCapabilities)==null?void 0:I.call(a)})}).filter(a=>{var I,c;return(c=(I=a.capabilities)==null?void 0:I.facingMode)==null?void 0:c.includes("environment")}),n=o[0];o.forEach(a=>{var I,c,u,d;let{capabilities:R}=a;((I=R.width)!=null&&I.max&&(c=R.height)!=null&&c.max?R.width.max*R.height.max:0)>((u=n.capabilities.width)!=null&&u.max&&(d=n.capabilities.height)!=null&&d.max?n.capabilities.width.max*n.capabilities.height.max:0)&&(n=a)}),n!=null&&n.capabilities&&(this._log.info("use max resolution back camera",n),e=n.deviceId)}}catch(o){this._log.warn("get max res camera failed",o)}return e})}updateSmallConfig(e){return DA(this,null,function*(){var o,n;this._log.info("update small stream config: ".concat(JSON.stringify(e)));let a=!this.small;this.small=this.fallbackProfile(e,!0),yield(o=this.manager)==null?void 0:o.update(),a&&(yield(n=this.room)==null?void 0:n.enableSmall(!0)),this.log.info("update small stream config success")})}fallbackProfile(e){let o=arguments.length>1&&arguments[1]!==void 0&&arguments[1],n=e.width>e.height,a=bt({},e);return e.width*e.height<=19200&&ra&&Bc&&(this.log.warn("".concat(o?"small ":"","resolution is ").concat(e.width,"*").concat(e.height,", fallback to 240*180 for android chrome")),a.width=n?240:180,a.height=n?180:240,a.bitrate=Math.max(e.bitrate,150)),e.width*e.height>921600&&YO&&(a.width=n?1280:720,a.height=n?720:1280,this.log.warn("reset to 1280 * 720 on iOS 13~14")),gT($g,"14.3")&&kh($g,"14.0",!0)&&this.on("7",()=>{let I=this.profile.width>this.profile.height;this.profile.width*this.profile.height>307200?(this.profile.width=I?640:480,this.profile.height=I?480:640,this.log.warn("reduce the resolution to 480p on iOS 14.0 ~ 14.2")):this.profile.width*this.profile.height>230400&&(this.profile.width=I?640:360,this.profile.height=I?360:640,this.log.warn("reduce the resolution to 360p on iOS 14.0 ~ 14.2"))}),!o&&this.avoidCropping&&(Bc||Yr)&&!QM()&&e.width*e.height<=230400&&e.width/e.height===16/9&&(this._scaleResolutionDownBy=1280/e.width,a.width=1280,a.height=720,this.log.warn("capture 720p, scale: ".concat(this._scaleResolutionDownBy))),a}stopSmall(){var e,o;this.small&&(delete this.small,(e=this.manager)==null||e.update(),(o=this.room)==null||o.enableSmall(!1))}listenDeviceChange(){vs&&!vs.listeners("videoInputRemoved").includes(this.handleCameraRemoved)&&vs.on("videoInputRemoved",this.handleCameraRemoved,this)}handleCameraRemoved(e){return DA(this,null,function*(){if(e.deviceId===this.deviceId){let o=this.recaptureMode===1;if(this.log.warn("RecaptureMode: ".concat(_q[this.recaptureMode],". Current camera is lost: ").concat(JSON.stringify(e))),this.recaptureMode===0){Ua(this.userId,{eventId:2003,param1:7,streamType:2});let n=yield qQ();n[0]?this.recapture(n[0].deviceId):o=!0}o&&vs.on("videoInputAdded",this.handleCameraAdded,this)}})}handleCameraAdded(e){return DA(this,null,function*(){this.recaptureMode===1&&e.deviceId!==this.deviceId||(vs.off("videoInputAdded",this.handleCameraAdded,this),this.log.warn("camera added: ".concat(JSON.stringify(e))),this.recapture(e.deviceId))})}encodeFrame(e,o){if(!this.manager)return e;let n=o?8:this.mediaType;return this.manager.encodePipeline.reduceRight((a,I)=>I?I({frame:a,mediaType:n}):a,e)}get enableEncodeFrame(){return!!this.manager&&this.manager.encodePipeline.some(e=>e)}play(e,o){return Ee(this.mirror)&&!this.isScreen&&this.setMirror("view"),super.play(e,o)}close(){vs.off("videoInputAdded",this.handleCameraAdded,this),vs.off("videoInputRemoved",this.handleCameraRemoved,this),super.close()}recapture(e){return DA(this,null,function*(){try{yield zg($M.prototype,this,"recapture").call(this,e)}catch(o){let n=(yield qQ()).find(a=>a.deviceId!==e);if(!n)throw o;yield zg($M.prototype,this,"recapture").call(this,n.deviceId)}})}setContentHint(e){this.mediaTrack&&"contentHint"in this.mediaTrack&&(this.mediaTrack.contentHint!==e&&(this.log.info("setContentHint ".concat(e)),this.mediaTrack.contentHint=e),this.outMediaTrack&&this.outMediaTrack.contentHint!==e&&(this.outMediaTrack.contentHint=e))}setRotation(e){this.manager&&(this.isScreen||Ee(e)||e!==this.rotation&&(this.rotation=e,this.manager.rotation=e))}};vt([wm(function(A){this.setContentHint(A.contentHint||"motion")})],A4.prototype,"capture");var Ru=A4,e4={};XC(e4,{REPORT_TYPE:()=>eM,buildSSOPackage:()=>Iu,bytes2ms:()=>jR,calculateScaleResolutionDownNumber:()=>AM,concatArrayBuffers:()=>qf,convertObjectNumberToInt:()=>$R,copyProperties:()=>dO,deepClone:()=>Dh,deepCloneBasic:()=>yh,deepMerge:()=>tB,delay:()=>AC,fibonacci:()=>ph,formatedTime:()=>MO,getConstructorName:()=>Yf,getContainerFromElement:()=>LN,getEnv:()=>BO,getFirst16Bits:()=>SO,getInternalVersion:()=>yO,getLast16Bits:()=>tM,getLoggerUrl:()=>dh,getMediaStreamTrackInfo:()=>YN,getMuteStateFromFlag:()=>mQ,getNetworkType:()=>qR,getNumNetworkType:()=>hh,getReconnectionTimeout:()=>fQ,getStringByteLength:()=>XR,getTestSignalDomain:()=>uO,getTurnServer:()=>RO,getUint32Version:()=>UN,getValueType:()=>ya,getViewListFromView:()=>Hf,glog:()=>pO,ipv4ToUint32:()=>Jf,isArray:()=>Aa,isAudioWorkletSupported:()=>fO,isBoolean:()=>rn,isConstructor:()=>mh,isEmpty:()=>zR,isFunction:()=>$n,isLangChinese:()=>rl,isMediaStreamTrack:()=>_N,isNumber:()=>hr,isObject:()=>Xc,isOverseaSdkAppId:()=>ol,isPlainObject:()=>Cc,isPortrait:()=>FN,isPromise:()=>fh,isRemoteTrack:()=>bN,isRotate90Or270:()=>gu,isSetSinkIdSupported:()=>mO,isString:()=>Sr,isUndefined:()=>Ee,isVideoMixerOutputTrack:()=>DQ,loadImage:()=>Vf,loadVideo:()=>wO,ms2bytes:()=>hO,ms2samples:()=>WR,normalizeUrl:()=>xN,performanceNow:()=>ki,promiseAny:()=>Pf,samples2ms:()=>kN,setNetworkTypeFromWebRTC:()=>KR,stringify:()=>nl,stringifyIncludeValue:()=>ZR,throttlePromise:()=>ON});var qAA=[-1,-1,1,-1,-1,1,1,1],KAA=[0,0,1,0,0,1,1,1],$T=class mj extends Uo{constructor(e,o){if(super(),this.context=e,G(this,"name"),G(this,"input"),G(this,"output"),G(this,"texture"),G(this,"ctx2d",null),G(this,"fbo"),G(this,"width",0),G(this,"height",0),G(this,"x",0),G(this,"y",0),G(this,"program"),G(this,"vertexShader"),G(this,"fragmentShader"),G(this,"totalFrames",0),G(this,"dropFrames",0),G(this,"matchInputSize",!0),G(this,"texCoordBuffer"),G(this,"positionBuffer"),G(this,"lastInfo",{name:"",timestamp:0,totalFrames:0,x:0,y:0,width:0,height:0,fps:0}),G(this,"cost",0),G(this,"_canvas",null),G(this,"_image"),G(this,"log"),this.context.on("disconnect",this.close,this),this.name=o.name,this.log=o.logger,this.matchInputSize=o.matchInputSize!==!1,this.width=o.width||e.width,this.height=o.height||e.height,this._image=o.image,e instanceof Mu)e.ctx&&o.create2d&&(typeof OffscreenCanvas=="function"&&al!==16?this._canvas=new OffscreenCanvas(this.width,this.height):(this._canvas=document.createElement("canvas"),this._canvas.width=this.width,this._canvas.height=this.height),this.ctx2d=this._canvas.getContext("2d"),this._image=this._canvas);else try{let n=e.ctx;this.texCoordBuffer=this.createBuffer(KAA),this.positionBuffer=this.createBuffer(qAA),o.createTexture!==!1&&(this.texture=n.createTexture(),this.useTexture(),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.LINEAR),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.LINEAR),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.pixelStorei(n.UNPACK_ALIGNMENT,1)),o.useFbo&&(this.fbo=n.createFramebuffer(),this.useBufferFrame(),this.useTexture(),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,this.width,this.height,0,n.RGBA,n.UNSIGNED_BYTE,null),n.framebufferTexture2D(n.FRAMEBUFFER,n.COLOR_ATTACHMENT0,n.TEXTURE_2D,this.texture,0)),o.useDefaultProgram?this.program=e.defaultProgam:(o.vertexShaderSource||o.fragmentShaderSource)&&(this.vertexShader=o.vertexShaderSource?e.createShader(n.VERTEX_SHADER,o.vertexShaderSource):e.defaultVShader,this.fragmentShader=o.fragmentShaderSource?e.createShader(n.FRAGMENT_SHADER,o.fragmentShaderSource):e.defaultFShader,this.program=e.createProgram(this.vertexShader,this.fragmentShader))}catch(n){this.context.destroy(new Ct({code:Ge.VIDEO_MANAGER_ERROR,extraCode:3,message:"create video node ".concat(this.name," error ").concat(n.message||n)}))}}get image(){return this._image}set image(e){this._image=e}createFramebuffer(e){let o=this.context.ctx,n=o.createFramebuffer();return o.bindFramebuffer(o.FRAMEBUFFER,n),o.framebufferTexture2D(o.FRAMEBUFFER,o.COLOR_ATTACHMENT0,o.TEXTURE_2D,e,0),n}connect(e){for(var o=arguments.length,n=new Array(o>1?o-1:0),a=1;a0&&arguments[0]!==void 0?arguments[0]:0;var o;(o=this.output)==null||o.update(e)}disconnect(){for(var e,o=arguments.length,n=new Array(o),a=0;a{I&&(e.activeTexture(e.TEXTURE0+c),e.bindTexture(e.TEXTURE_2D,I))})}useProgram(){this.context.ctx.useProgram(this.program)}useBufferFrame(){let e=this.context.ctx;e.bindFramebuffer(e.FRAMEBUFFER,this.fbo||null)}createBuffer(e){let o=this.context.ctx,n=o.createBuffer();return o.bindBuffer(o.ARRAY_BUFFER,n),o.bufferData(o.ARRAY_BUFFER,new Float32Array(e),o.STATIC_DRAW),n}setTexBuffer(e){let o=this.context.ctx;o.bindBuffer(o.ARRAY_BUFFER,this.texCoordBuffer),o.bufferData(o.ARRAY_BUFFER,new Float32Array(e),o.STATIC_DRAW)}setPosBuffer(e){let o=this.context.ctx;o.bindBuffer(o.ARRAY_BUFFER,this.positionBuffer),o.bufferData(o.ARRAY_BUFFER,new Float32Array(e),o.STATIC_DRAW)}changeBufferData(e,o){let n=this.context.ctx;n.bindBuffer(n.ARRAY_BUFFER,e),n.bufferData(n.ARRAY_BUFFER,new Float32Array(o),n.STATIC_DRAW)}setAttributes(){let e=this.context.ctx;for(var o=arguments.length,n=new Array(o),a=0;a{e.enableVertexAttribArray(c),e.bindBuffer(e.ARRAY_BUFFER,I),e.vertexAttribPointer(c,2,e.FLOAT,!1,0,0)})}getVertexPoint(e,o){return[e/this.width*2-1,o/this.height*2-1]}layout2texCoords(e){return[...this.getVertexPoint(e.x,e.y),...this.getVertexPoint(e.x+e.width,e.y),...this.getVertexPoint(e.x,e.y+e.height),...this.getVertexPoint(e.x+e.width,e.y+e.height)]}resize(e,o){if(this.width!==e||this.height!==o){if(this.width=e,this.height=o,this._canvas&&(this._canvas.width=e,this._canvas.height=o),this.texture&&this.fbo){this.useTexture();let n=this.context.ctx;n.texImage2D(n.TEXTURE_2D,0,n.RGBA,e,o,0,n.RGBA,n.UNSIGNED_BYTE,null)}this.output&&this.output.matchInputSize&&this.output.resize(e,o)}}draw(e,o){this.setAttributes(e||this.positionBuffer,o||this.texCoordBuffer);let n=this.context.ctx;n.drawArrays(n.TRIANGLE_STRIP,0,4)}draw2d(e,o,n,a,I,c,u,d,R){let k=!(Ee(c)||Ee(u)||Ee(d)||Ee(R));return!(!this.ctx2d||!e)&&(e instanceof ImageData?(k?this.ctx2d.putImageData(e,o,n,c,u,d,R):this.ctx2d.putImageData(e,o,n),this.emit(mj.RENDER,this.ctx2d.canvas)):(k?this.ctx2d.drawImage(e,c,u,d,R,o,n,a,I):this.ctx2d.drawImage(e,o,n,a,I),this.emit(mj.RENDER,e)),typeof VideoFrame<"u"&&e instanceof VideoFrame&&e.close(),!0)}drawBackGround2d(e){this.ctx2d&&(this.ctx2d.save(),this.ctx2d.fillStyle=e,this.ctx2d.fillRect(0,0,this.width,this.height),this.ctx2d.restore())}getInfo(){var e;let{totalFrames:o,x:n,y:a,width:I,height:c,name:u,cost:d}=this,R=Date.now(),k=(o-this.lastInfo.totalFrames)/((R-this.lastInfo.timestamp)/1e3)|0;return this.lastInfo={totalFrames:o,x:n,y:a,width:I,height:c,timestamp:R,fps:k,name:u,cost:d},bt({parent:(e=this.input)==null?void 0:e.getInfo()},this.lastInfo)}createTexture(e){let o=this.context.ctx,n=o.createTexture();return this.useTextures(n),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MIN_FILTER,o.LINEAR),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MAG_FILTER,o.LINEAR),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_S,o.CLAMP_TO_EDGE),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_T,o.CLAMP_TO_EDGE),o.pixelStorei(o.UNPACK_ALIGNMENT,1),o.texImage2D(o.TEXTURE_2D,0,o.RGBA,o.RGBA,o.UNSIGNED_BYTE,e),n}};G($T,"RENDER","render"),vt([is(Uo.INIT,"connected",{sync:!0})],$T.prototype,"connect"),vt([is("connected",Uo.INIT,{ignoreError:!0,sync:!0})],$T.prototype,"disconnect"),vt([is([],"closed",{sync:!0})],$T.prototype,"close");var Il=$T,jAA=Jn(xW(250),Gq(()=>performance.now()),qT()),WAA=[0,1,1,1,0,0,1,0],bq=class extends Il{constructor(A,e){super(A,Object.assign({useDefaultProgram:!0,createTexture:!1,name:"destination"},e)),G(this,"_intervalId",0),G(this,"_sequence",0),G(this,"checkGLError",!1),G(this,"checkVisibilityChange"),A instanceof Mu?this.ctx2d=A.ctx||null:A.available&&e!=null&&e.mirrorUpAndDown&&this.setTexBuffer(WAA)}start(A){this.log.info("".concat(this.name," start render ").concat(A," fps")),nn.clearTask(this._intervalId),this._intervalId=nn.run("intervalInWorker",()=>{if(A!==this.context.frameRate&&(nn.clearTask(this._intervalId),this.start(this.context.frameRate)),this.requestFrame(this._sequence++),this.checkGLError&&this.context instanceof aC){let e=this.context.ctx.getError();e&&this.context.destroy(new Ct({code:Ge.VIDEO_MANAGER_ERROR,extraCode:5,message:"".concat(this.name," req ").concat(this._sequence," render ").concat(this.totalFrames," faild ").concat(e)}))}},{fps:this.context.frameRate})}render(A){var e;return!((e=this.input)==null||!e.requestFrame(A))&&(this.useProgram(),this.useBufferFrame(),this.useInputTexture(),this.draw(),this.emit(Il.RENDER,this.context._canvas),!0)}addInput(A){for(var e=arguments.length,o=new Array(e>1?e-1:0),n=1;n0&&arguments[0]!==void 0?arguments[0]:0;this.state!=="closed"&&(this._intervalId&&(nn.clearTask(this._intervalId),this._intervalId=0,A===1&&(this.log.info("".concat(this.name," use requestVideoFrameCallback")),this.checkVisibilityChange=()=>{document.hidden&&(this.start(this.context.frameRate),this.log.info("".concat(this.name," use timer")),document.removeEventListener("visibilitychange",this.checkVisibilityChange))},document.addEventListener("visibilitychange",this.checkVisibilityChange))),this.requestFrame(this._sequence++))}removeInput(A){super.removeInput(A),nn.clearTask(this._intervalId)}resize(A,e){super.resize(A,e),this.context.setSize(A,e)}close(){super.close(),nn.clearTask(this._intervalId),document.removeEventListener("visibilitychange",this.checkVisibilityChange)}},Lq=class extends bq{constructor(A,e){super(A,e),G(this,"_videoTrack"),G(this,"_muteOb"),G(this,"_closedOb",Ln(this,"closed")),G(this,"_subscription"),G(this,"_canvasContainer"),Number(Cu)<17&&(this._canvasContainer=document.createElement("div"),this._canvasContainer.style.display="none"),[this._videoTrack]=A.canvas.captureStream().getVideoTracks(),this._muteOb=Ln(this._videoTrack,"mute"),Jn(Ln(this._videoTrack,"ended"),Qc(this._closedOb),Ks(()=>{this.context.destroy(new Ct({code:Ge.VIDEO_MANAGER_ERROR,extraCode:8,message:"video track ended"}))}))}enableCheckMute(){var A;this._subscription=Jn(this._muteOb,Qc(this._closedOb),hx((A=5e3,e=>{let o=performance.now();Jn(jAA,Tq(n=>n-o{var e;return!((e=this._videoTrack)==null||!e.muted||document.hidden)}),Ks(()=>{this.context.destroy(new Ct({code:Ge.VIDEO_MANAGER_ERROR,extraCode:7,message:"video track muted"}))}))}disableCheckMute(){var A;(A=this._subscription)==null||A.dispose()}get videoTrack(){return this._videoTrack}putCanvasIntoDom(){!this.context._canvas||!this._canvasContainer||document.getElementById(this.context._canvas.id)||(this.log.info("".concat(this.name," put canvas to body")),document.body.appendChild(this._canvasContainer),this._canvasContainer.appendChild(this.context._canvas))}render(A){return this.putCanvasIntoDom(),super.render(A)}render2d(A){return this.putCanvasIntoDom(),super.render2d(A)}close(){var A,e;super.close(),(A=this._videoTrack)==null||A.stop(),delete this._videoTrack,(e=this._canvasContainer)==null||e.remove()}},zAA=class extends Lq{render(A){var e;let o=!((e=this.input)==null||!e.requestFrame(A));if(this.context._canvas2d){let n=this.context._canvas2d.getContext("2d");n.clearRect(0,0,this.context._canvas2d.width,this.context._canvas2d.height),n.drawImage(this.context._canvas,0,0,this.context._canvas2d.width,this.context._canvas2d.height),this.emit(Il.RENDER,this.context._canvas2d)}else this.emit(Il.RENDER,this.context._canvas);return o}},ZAA=class extends Lq{constructor(A,e,o){super(A,{name:"smallDestination",logger:o}),this.resolution=e}resize(A,e){let o,n=A*e,a=this.resolution.width*this.resolution.height;this.log.info("big res: ".concat(A,"*").concat(e," small res: ").concat(this.resolution.width,"*").concat(this.resolution.height," ")),n>a?o=n/a:(this.log.warn("Small stream resolution is not smaller than big stream, which is invalid. big: ".concat(A," * ").concat(e," small: ").concat(this.resolution.width," * ").concat(this.resolution.height)),o=n/19200),super.resize(A/Math.sqrt(o),e/Math.sqrt(o))}},t4=class extends Il{constructor(A,e){super(A,bt({name:"imageSource"},e)),G(this,"_lastImage"),G(this,"_totalFrames",0),G(this,"_autoResize",!1),G(this,"_canvasRendered"),G(this,"videoCallbackId",0),G(this,"waitingFirstFrame",!0),G(this,"shouldUpdate",!0),this._autoResize=e?.autoResize!==!1,al===16&&(this._canvasRendered=yu(),Jn(this._canvasRendered,wq(this._image),Qx(o=>o instanceof HTMLCanvasElement?Ln(o,"rendered"):Nq()),Qc(Ln(this,"closed")),Ks(()=>{this.update()})))}onFirstFrame(){this.waitingFirstFrame=!1}tryVideoFrameCallback(){if(!this.shouldUpdate)return;let A=this.image;this.videoCallbackId&&A.cancelVideoFrameCallback(this.videoCallbackId),YQ()&&!document.hidden&&(this.videoCallbackId=A.requestVideoFrameCallback((e,o)=>{this.waitingFirstFrame&&this.onFirstFrame(),document.hidden||(this._totalFrames=o.presentedFrames,this.update(1))}))}_render(A,e){var o;let{width:n,height:a}=this,{image:I}=this;if(I instanceof HTMLVideoElement){if(this.tryVideoFrameCallback(),{videoWidth:n,videoHeight:a}=I,!n||!a)return!1;I.width=n,I.height=a}else if(I instanceof HTMLImageElement||I instanceof ImageData||I instanceof ImageBitmap){if({width:n,height:a}=I,I!==this._lastImage)this._lastImage=I;else if(n===this.width&&a===this.height)return!0}else I instanceof HTMLCanvasElement||I instanceof OffscreenCanvas?({width:n,height:a}=I,this._lastImage=I):typeof VideoFrame<"u"&&I instanceof VideoFrame&&({displayWidth:n,displayHeight:a}=I,(o=this._lastImage)==null||o.close(),this._lastImage=I);if(!this._autoResize)return!0;if(this.width===n&&this.height===a&&this.totalFrames){if(e){this.useTexture();let c=this.context.ctx;c.texSubImage2D(c.TEXTURE_2D,0,0,0,c.RGBA,c.UNSIGNED_BYTE,I)}}else{if(e){this.useTexture();let c=this.context.ctx;c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,I)}this.resize(n,a)}return!0}get image(){return this._image}set image(A){var e;(e=this._canvasRendered)==null||e.next(A),this._image=A}render(A){return this._render(A,!0)}render2d(A){return this._render(A,!1)}},i4=class extends t4{constructor(A,e,o){super(A,o),this._player=e,this.name="videoPlayerSource",Jn(Ln(this._player,mi.PLAYER_STATE_CHANGED),Qc(Ln(this,"closed")),Sm(n=>{let{state:a}=n;return a==="PLAYING"}),Ks(()=>{this.tryVideoFrameCallback()}))}get image(){return this._player.element}},FM=class extends i4{get available(){return this._player.isPlaying&&!this.waitingFirstFrame}constructor(A,e,o){super(A,new wi({id:o.name,track:e,muted:!0,container:null,objectFit:"contain",log:o.logger}),o),this.name="videoTrackSource",this._player.play()}replaceTrack(A){this.waitingFirstFrame=!0,this._player.setTrack(A),this._player.play()}close(){super.close(),this._player.stop()}},XAA=class extends Il{constructor(A,e,o){super(A,fi(bt({name:"textSource"},o),{create2d:!0})),G(this,"hasChange",!0),G(this,"content",""),this.ctx2d.textBaseline="top",this.content=e.content||"",e.font&&(this.font=e.font),e.color&&(this.color=e.color)}set font(A){this.ctx2d&&(this.ctx2d.font=A,this.hasChange=!0)}get font(){var A;return((A=this.ctx2d)==null?void 0:A.font)||""}set color(A){this.ctx2d&&(this.ctx2d.fillStyle=A,this.hasChange=!0)}get color(){var A;return((A=this.ctx2d)==null?void 0:A.fillStyle)||""}render2d(A){return!(!this.ctx2d||!this.hasChange)&&(this.ctx2d.clearRect(0,0,this.width,this.height),this.drawMultilineText(0,0),this.hasChange=!1,!0)}render(A){return!1}resize(A,e){if(!this.ctx2d)return;let{color:o,font:n}=this;super.resize(A,e),this.color=o,this.font=n}drawMultilineText(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1.2;if(!this.ctx2d)return;let n=this.ctx2d.measureText(this.content);e+=n.fontBoundingBoxAscent||n.actualBoundingBoxAscent||0;let a=this.font.match(/(\d+)px/),I=(a?parseInt(a[1],10):16)*o,c=this.content.split(` +`);for(let u=0;u0&&arguments[0]!==void 0&&arguments[0];if(this._canvas||(this._canvas=document.createElement("canvas"),this._canvas.id="trtc_".concat(this.name,"_").concat(AG._ids++)),A&&(this._canvas2d=document.createElement("canvas")),this.ctx=this._canvas.getContext("webgl2",MN),!this.ctx)throw new Ct({code:Ge.VIDEO_MANAGER_ERROR,extraCode:2,message:"webgl2 not supported"});this.defaultVShader=this.createShader(this.ctx.VERTEX_SHADER,` +// 顶点着色器 +attribute vec4 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; + +void main() { + gl_Position = a_position; + v_texCoord = a_texCoord; +} +`),this.defaultFShader=this.createShader(this.ctx.FRAGMENT_SHADER,` +// 片元着色器 +precision mediump float; +varying vec2 v_texCoord; +uniform sampler2D u_texture; + +void main() { + gl_FragColor = texture2D(u_texture, v_texCoord); +} `),this.defaultProgam=this.createProgram(this.defaultVShader,this.defaultFShader),this._canvas.addEventListener("webglcontextlost",()=>{this.destroy(new Ct({code:Ge.VIDEO_MANAGER_ERROR,extraCode:4,message:"webgl context lost"}))})}destroy(A){let e="";return A&&(e=A.message,this.error=A,ct.addFailedEvent({key:512702,error:A})),this.disconnect(),this.log.info("video context destroy".concat(e)?": ".concat(e):""),this.ctx&&(this.ctx.deleteShader(this.defaultVShader),this.ctx.deleteShader(this.defaultFShader),this.ctx.deleteProgram(this.defaultProgam),delete this.ctx),A}set width(A){var e;(e=this.ctx)==null||e.viewport(0,0,A,this.height),super.width=A,this._canvas2d&&(this._canvas2d.width=A)}set height(A){var e;(e=this.ctx)==null||e.viewport(0,0,this.width,A),super.height=A,this._canvas2d&&(this._canvas2d.height=A)}setSize(A,e){var o;(o=this.ctx)==null||o.viewport(0,0,A,e),super.setSize(A,e),this._canvas2d&&(this._canvas2d.width=A,this._canvas2d.height=e)}createShader(A,e){let o=this.ctx,n=o.createShader(A);return o.shaderSource(n,e),o.compileShader(n),n}createProgram(A,e){let o=this.ctx,n=o.createProgram();return o.attachShader(n,A),o.attachShader(n,e),o.linkProgram(n),o.getProgramParameter(n,o.LINK_STATUS)||this.log.error(o.getProgramInfoLog(n)),n}};G(eG,"UNAVAILABLE","unavailable"),vt([is(Uo.INIT,"created",{sync:!0,fail(A){this.log.error("video gl context create failed",A.cause),ct.addFailedEvent({key:512700,error:A.cause||A})},success(){this.log.info("video context created use webgl"),ct.addSuccessEvent({key:512700})}})],eG.prototype,"create"),vt([is("created",Uo.INIT,{ignoreError:!0,sync:!0,success(A){A&&this.emit(eG.UNAVAILABLE,A),this.removeAllListeners()}})],eG.prototype,"destroy");var aC=eG,Mu=class extends AG{constructor(){super(...arguments),G(this,"ctx")}create(A){if(this.hasAlpha=A.alpha,this._canvas=document.createElement("canvas"),this._canvas.id="trtc_".concat(this.name,"_").concat(AG._ids++),this.ctx=this._canvas.getContext("2d",{alpha:A.alpha,willReadFrequently:A.willReadFrequently}),!this.ctx)throw new Ct({code:Ge.VIDEO_MANAGER_ERROR,extraCode:2,message:"2d context not supported"});this._canvas.addEventListener("contextlost",()=>{this.log.error("2d context lost")}),this._canvas.addEventListener("contextrestored",()=>{this.log.warn("2d context restored")})}destroy(A){let e="";A&&(e=A.message,this.error=A,ct.addFailedEvent({key:512703,error:A})),this.disconnect(),this.log.info("video context destroy ".concat(e?": ".concat(e):"")),delete this.ctx,this._canvas&&(this._canvas.remove(),this._canvas.width=0,this._canvas.height=0,delete this._canvas),this.removeAllListeners(),ct.addSuccessEvent({key:512703})}};function $AA(A,e,o,n,a){arguments.length>5&&arguments[5]!==void 0&&arguments[5]&&([o,n]=[n,o]);let I={sWidth:A,sHeight:e,dWidth:o,dHeight:n,sx:0,sy:0,dx:0,dy:0};if(A===0||e===0)return I;switch(a){case void 0:case"fill":break;case"contain":{let c=Math.min(o/A,n/e);I.dWidth=A*c,I.dHeight=e*c,I.dx=(o-I.dWidth)/2,I.dy=(n-I.dHeight)/2;break}case"cover":{let c=Math.max(o/A,n/e),u=o/c,d=n/c;I.sx=(A-u)/2,I.sy=(e-d)/2,I.sWidth=u,I.sHeight=d;break}}return I}vt([is(Uo.INIT,"created",{sync:!0,fail(A){this.log.error("video 2d context create failed",A.cause),ct.addFailedEvent({key:512701,error:A.cause||A})},success(){this.log.info("video context created use 2d"),ct.addSuccessEvent({key:512701})}})],Mu.prototype,"create"),vt([is("created",Uo.INIT,{ignoreError:!0,sync:!0})],Mu.prototype,"destroy");var AeA=class{constructor(A,e){this.node=A,this.layout=e,G(this,"positionBuffer")}get x(){return this.layout.x||this.node.x}get y(){return this.layout.y||this.node.y}get width(){return this.layout.width||this.node.width}get height(){return this.layout.height||this.node.height}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get fillMode(){return this.layout.fillMode}get rotation(){return this.layout.rotation}get hidden(){return!!this.layout.hidden}},o4=class extends Il{constructor(A,e){super(A,{useDefaultProgram:!0,useFbo:!0,name:"mix",create2d:!0,logger:e}),G(this,"inputs",[]),G(this,"backgroundColor","black")}addInput(A,e){let o=0,n=this.inputs.length;for(;oe.zIndex))throw new Error("input already exists at zIndex ".concat(e.zIndex));n=I}}let a=new AeA(A,e);this.inputs.splice(o,0,a)}changeInputLayout(A,e){let o=this.inputs.findIndex(Z=>Z.node===A);if(o<0)return;let{x:n,y:a,width:I,height:c,zIndex:u,fillMode:d,rotation:R,hidden:k}=e;if(!Ee(u)&&this.inputs.some(Z=>Z.layout.zIndex===u&&Z.node!==A))throw new Error("input already exists at zIndex ".concat(e.zIndex));let _=this.inputs[o];Ee(n)||(_.layout.x=n),Ee(a)||(_.layout.y=a),Ee(I)||(_.layout.width=I),Ee(c)||(_.layout.height=c),Ee(R)||(_.layout.rotation=R),Ee(k)||(_.layout.hidden=k),d&&(_.layout.fillMode=d),!Ee(u)&&u!==_.layout.zIndex&&(_.layout.zIndex=u,this.inputs.sort((Z,iA)=>Z.layout.zIndex-iA.layout.zIndex))}hasInput(A){return this.inputs.some(e=>e.node===A)}hasNoInput(){return this.inputs.length===0}resize(A,e){if(!this.matchInputSize)return void super.resize(A,e);let o=this.inputs.reduce((n,a)=>a?Object.assign(n,{width:Math.max(n.width,a.right),height:Math.max(n.height,a.bottom)}):n,{width:0,height:0});super.resize(o.width,o.height),this.context instanceof aC&&this.inputs.forEach(n=>{if(n){let a=this.layout2texCoords(n);n.positionBuffer?this.changeBufferData(n.positionBuffer,a):n.positionBuffer=this.createBuffer(a)}})}connect(A){for(var e=arguments.length,o=new Array(e>1?e-1:0),n=1;ne.node!==A),this.inputs.length===0&&this.drawBackGround2d(this.backgroundColor)}render(A){let e=this.context.ctx;if(e.clearColor(0,0,0,0),this.inputs.reduce((o,n)=>n.node.requestFrame(A)||o,!1)&&e){this.useProgram(),e.enable(e.BLEND),e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA),this.useBufferFrame();for(let o=0;oe.node.requestFrame(A)),this.ctx2d){this.drawBackGround2d(this.backgroundColor);for(let e=0;e4&&arguments[4]!==void 0&&arguments[4];this.ctx2d&&(a&&([o,n]=[n,o]),this.ctx2d.save(),this.ctx2d.strokeStyle="red",this.ctx2d.lineWidth=2,this.ctx2d.strokeRect(A,e,o,n),this.ctx2d.restore())}getInfo(){let{totalFrames:A,x:e,y:o,width:n,height:a,name:I}=this,c=Date.now(),u=(A-this.lastInfo.totalFrames)/((c-this.lastInfo.timestamp)/1e3)|0;return this.lastInfo={totalFrames:A,x:e,y:o,width:n,height:a,timestamp:c,fps:u,name:I},bt({parent:this.inputs.filter(d=>d).map(d=>d.node.getInfo())},this.lastInfo)}removeAllInputs(){this.inputs.forEach(A=>{var e;if(A.node.disconnect(),A.positionBuffer&&this.context instanceof aC)try{(e=this.context.ctx)==null||e.deleteBuffer(A.positionBuffer)}catch{}})}close(){super.close(),this.removeAllInputs()}},eeA=[1,0,0,0,1,1,0,1],Zh=class extends Il{constructor(A,e,o,n){if(super(A,{useDefaultProgram:!0,useFbo:!0,create2d:!0,name:"transform",logger:e}),G(this,"mirror",!1),G(this,"rotation",0),o&&(this.mirror=o),n&&(this.rotation=n),A instanceof aC)try{this.setTexBuffer(eeA)}catch(a){A.destroy(new Ct({code:Ge.VIDEO_MANAGER_ERROR,extraCode:3,message:"create video node ".concat(this.name," error ").concat(a.message||a)}))}}draw2d(A,e,o,n,a){if(this.ctx2d){this.ctx2d.clearRect(0,0,this.width,this.height),this.ctx2d.save(),this.mirror&&(this.ctx2d.scale(-1,1),this.ctx2d.translate(-this.width,0)),this.rotation===90?(this.ctx2d.translate(n,0),this.ctx2d.rotate(Math.PI/2),this.ctx2d.scale(a/n,n/a)):this.rotation===180?(this.ctx2d.translate(this.width,this.height),this.ctx2d.rotate(Math.PI)):this.rotation===270&&(this.ctx2d.translate(0,a),this.ctx2d.rotate(3*Math.PI/2),this.ctx2d.scale(a/n,n/a));let I=super.draw2d(A,e,o,n,a);return this.ctx2d.restore(),I}return!1}render(A){var e;return!((e=this.input)==null||!e.requestFrame(A))&&(this.useProgram(),this.useBufferFrame(),this.useInputTexture(),this.draw(),!0)}resize(A,e){gu(this.rotation)&&([A,e]=[e,A]),super.resize(A,e)}},Fq=class extends ZT{constructor(A){super(arguments.length>1&&arguments[1]!==void 0?arguments[1]:4,wi),G(this,"inputLocalVideoTracks",new Map),G(this,"inputLocalScreenTracks",new Map),G(this,"cameraNodeMap",new Map),G(this,"screenNodeMap",new Map),G(this,"textNodeMap",new Map),G(this,"imageNodeMap",new Map),G(this,"videoNodeMap",new Map),G(this,"endedIds",new Set),G(this,"videoContext"),G(this,"mixNode"),G(this,"destination"),G(this,"manager"),G(this,"stat"),G(this,"_checkId",0),G(this,"autoSetFps",!0),this.manager=A,this.log.id+="mix",this.create2dVideoContext(),this.destination=this.videoContext.createVideoTrackDestination({name:"mainDestination2d",logger:this.log}),this.destination.on(Il.RENDER,e=>{this.emit("render",e)}),this.mixNode=new o4(this.videoContext,this.log),this.mixNode.matchInputSize=!1}listenDeviceChange(){throw new Error("Method not implemented.")}enablePrintDetail(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:2e3;this._checkId=nn.run("interval",()=>{this.destination&&this.log.debug(this.destination.getInfo())},{delay:A})}create2dVideoContext(){this.videoContext?this.videoContext.destroy():this.videoContext=new Mu({frameRate:15,logger:this.log,name:"mix-ctx"}),this.videoContext.create({alpha:!1})}setFps(A){this.autoSetFps=!1,this.videoContext.frameRate=A;for(let e of[...this.cameraNodeMap.values(),...this.screenNodeMap.values()])e.shouldUpdate=!1;setTimeout(()=>{var e;return(e=this.destination)==null?void 0:e.start(this.videoContext.frameRate)},500)}setFpsAuto(){var A;if(!this.autoSetFps)return;for(let a of[...this.cameraNodeMap.values(),...this.screenNodeMap.values()])a.shouldUpdate=!1;let e=null,o=0,n=!0;for(let[a,I]of this.inputLocalVideoTracks)if(I.profile.frameRate>o){if(this.endedIds.has(a)){let c=this.cameraNodeMap.get(a);c&&c.image.cancelVideoFrameCallback(c.videoCallbackId);continue}o=I.profile.frameRate,e=a}for(let[a,I]of this.inputLocalScreenTracks)if(I.profile.frameRate>o){if(this.endedIds.has(a)){let c=this.screenNodeMap.get(a);c&&c.image.cancelVideoFrameCallback(c.videoCallbackId);continue}o=I.profile.frameRate,e=a,n=!1}if(e!==null){let a=n?this.cameraNodeMap.get(e):this.screenNodeMap.get(e);a&&(a.shouldUpdate=!0,a.tryVideoFrameCallback()),this.log.info("set mix fps: ",o)}else(A=this.destination)==null||A.start(this.videoContext.frameRate),this.log.info("fallback to timer, fps: ",this.videoContext.frameRate)}setMixBackground(A){this.mixNode&&(this.mixNode.backgroundColor=A)}resizeMixCanvas(A,e){var o;(o=this.mixNode)==null||o.resize(A,e)}startMix(){return DA(this,null,function*(){var A;if(!this.mixNode||!this.destination)throw new Error("can't mix without necessary conditions");this.mixNode.disconnect(),this.mixNode.connect(this.destination),TQ&&this.player.setCanvas(this.videoContext._canvas),this.setOutputMediaStreamTrack(this.destination.videoTrack),(A=this.manager)==null||A.changeInput(this)})}addCameraSource(A,e,o){if(this.inputLocalVideoTracks.has(A)||this.cameraNodeMap.has(A))throw new Error("There is already a cameraSource with the same ID: ".concat(A));let n,{mediaTrack:a}=e;if(!a)throw new Error("no mediaTrack, add cameraSource failed");e.recaptureMode=1,nE(this,vs).add("videoInputRemoved",I=>{I.deviceId===e.deviceId&&(this.endedIds.add(A),this.setFpsAuto())}),e.on("output-media-track-changed",()=>{this.endedIds.delete(A),this.updateCameraSource(A,o,e.mediaTrack)}),n=al===16&&a instanceof CanvasCaptureMediaStreamTrack?this.videoContext.createVideoImageSource(a.canvas,{name:"cameraCanvasSource",logger:this.log}):this.videoContext.createVideoTrackSource(a,"cameraNodeSource"),n.resize(e.settings.width,e.settings.height),n.shouldUpdate=!1,this._connectMix(n,o,"cover"),this.inputLocalVideoTracks.set(A,e),this.cameraNodeMap.set(A,n),this.setFpsAuto()}addScreenSource(A,e,o){if(this.inputLocalScreenTracks.has(A)||this.screenNodeMap.has(A))throw new Error("There is already a screenSource with the same ID: ".concat(A));let{mediaTrack:n}=e;if(!n)throw new Error("no mediaTrack, add screenSource failed");e.on("output-media-track-changed",()=>{this.updateScreenSource(A,o,e.mediaTrack)});let a=this.videoContext.createVideoTrackSource(n,"screenNodeSource");a.resize(e.settings.width,e.settings.height),a.shouldUpdate=!1,this._connectMix(a,o),this.inputLocalScreenTracks.set(A,e),this.screenNodeMap.set(A,a),this.setFpsAuto()}addTextSource(A){let{id:e,content:o="",font:n,color:a,layout:I}=A;if(this.textNodeMap.has(e))throw new Error("There is already a textSource with the same ID: ".concat(e));let c=this.videoContext.createTextSource({content:o,font:n,color:a});c.resize(I.width,I.height),this._connectMix(c,I),this.textNodeMap.set(e,c)}addImageSource(A,e,o){if(this.imageNodeMap.has(A))throw new Error("There is already a imageSource with the same ID: ".concat(A));let n=this.videoContext.createVideoImageSource(e,{autoResize:!1,logger:this.log});n.resize(e.width,e.height),this._connectMix(n,o),this.imageNodeMap.set(A,n)}addVideoSource(A,e,o){if(this.videoNodeMap.has(A))throw new Error("There is already a videoSource with the same ID: ".concat(A));let n=this.videoContext.createVideoImageSource(e,{autoResize:!1,logger:this.log});n.resize(e.videoWidth,e.videoHeight),n.shouldUpdate=!1,this._connectMix(n,o),this.videoNodeMap.set(A,n)}updateCameraSource(A,e){let o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:null,n=arguments.length>3?arguments[3]:void 0,a=this.inputLocalVideoTracks.get(A);a&&o&&o!==a.mediaTrack&&(this.log.debug("updateCameraSource mixerLocalVideoTrack newTrack:",o,"oldTrack:",a.mediaTrack),a.setInputMediaStreamTrack(o));let I=this.cameraNodeMap.get(A);if(I){if(o){if(al===16&&o instanceof CanvasCaptureMediaStreamTrack)if(I instanceof FM){let d=I.output;I.close(),I=this.videoContext.createVideoImageSource(o.canvas,{name:"cameraCanvasSource",logger:this.log}),I.connect(d),this.cameraNodeMap.set(A,I)}else I.image=o.canvas;else if(I instanceof FM)I.replaceTrack(o);else{let d=I.output;I.close(),I=this.videoContext.createVideoTrackSource(o,"cameraNodeSource"),I.connect(d),this.cameraNodeMap.set(A,I)}let{width:c,height:u}=o.getSettings();c&&u&&I.resize(c,u)}n&&I.resize(n.width,n.height),(n||o)&&this.setFpsAuto(),this._changeMixLayout(I,e)}}updateScreenSource(A,e){let o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:null,n=this.inputLocalScreenTracks.get(A);this.log.debug("updateScreenSource mixerLocalScreenTrack",n,o),n&&o&&o!==n.mediaTrack&&n.setInputMediaStreamTrack(o);let a=this.screenNodeMap.get(A);a&&(o&&a.replaceTrack(o),this._changeMixLayout(a,e))}updateTextSource(A){let{id:e,content:o,font:n,color:a,layout:I}=A,c=this.textNodeMap.get(e);c&&(Ee(o)||(c.content=o),Ee(n)||(c.font=n),Ee(a)||(c.color=a),c.resize(I.width,I.height),this._changeMixLayout(c,I))}updateImageSource(A,e,o){let n=this.imageNodeMap.get(A);n&&(o&&(n.image=o,n.resize(o.width,o.height)),this._changeMixLayout(n,e))}updateVideoSource(A,e,o){let n=this.videoNodeMap.get(A);if(n){if(o){let a=n.image;a instanceof HTMLVideoElement&&this.stopVideoElement(a),n.image=o,n.resize(o.videoWidth,o.videoHeight)}this._changeMixLayout(n,e)}}_connectMix(A,e){let o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"contain";if(!this.mixNode)return;let{mirror:n,rotation:a}=e;A.disconnect();let I=new Zh(this.videoContext,this.log,n,a);I=A.connect(I),e.fillMode||(e.fillMode=o),I.connect(this.mixNode,e)}_changeMixLayout(A,e){if(!this.mixNode)return;let{mirror:o,rotation:n}=e,a=A.output||A;a instanceof Zh&&(Ee(o)||(a.mirror=o),Ee(n)||(a.rotation=n),a.resize(A.width,A.height)),this.mixNode.changeInputLayout(a,e)}removeCameraSource(A){let e=this.inputLocalVideoTracks.get(A);if(!e)return;e.close(),this.inputLocalVideoTracks.delete(A);let o=this.cameraNodeMap.get(A);o&&(o.output instanceof Zh&&o.output.close(),o.close(),this.cameraNodeMap.delete(A)),this.checkAfterRemove(!0)}removeScreenSource(A){let e=this.inputLocalScreenTracks.get(A);if(!e)return;e.close(),this.inputLocalScreenTracks.delete(A);let o=this.screenNodeMap.get(A);o&&(o.output instanceof Zh&&o.output.close(),o.close(),this.screenNodeMap.delete(A)),this.checkAfterRemove(!0)}removeTextSource(A){let e=this.textNodeMap.get(A);e&&(e.output instanceof Zh&&e.output.close(),e.close(),this.textNodeMap.delete(A)),this.checkAfterRemove()}removeImageSource(A){let e=this.imageNodeMap.get(A);e&&(e.output instanceof Zh&&e.output.close(),e.close(),this.imageNodeMap.delete(A)),this.checkAfterRemove()}removeVideoSource(A){let e=this.videoNodeMap.get(A);e&&(e.output instanceof Zh&&e.output.close(),e.image instanceof HTMLVideoElement&&this.stopVideoElement(e.image),e.close(),this.videoNodeMap.delete(A)),this.checkAfterRemove()}checkAfterRemove(){arguments.length>0&&arguments[0]!==void 0&&arguments[0]&&this.setFpsAuto()}stopVideoElement(A){A.pause(),A.src="",A.srcObject=null,A.remove()}close(){var A;super.close(),nn.clearTask(this._checkId),(A=this.videoContext)==null||A.destroy(),delete this.mixNode,delete this.destination;for(let e of[...this.inputLocalVideoTracks.values(),...this.inputLocalScreenTracks.values()])e.close();this.inputLocalVideoTracks.clear(),this.inputLocalScreenTracks.clear(),this.cameraNodeMap.clear(),this.screenNodeMap.clear(),this.textNodeMap.clear(),this.imageNodeMap.clear(),pr(this);for(let e of this.videoNodeMap.values())e.image instanceof HTMLVideoElement&&this.stopVideoElement(e.image);this.videoNodeMap.clear(),this.log.info("localMixVideoTrack close, stop mix")}},Uq=hA();if(typeof navigator<"u"&&navigator.mediaDevices&&"setCaptureHandleConfig"in navigator.mediaDevices)try{navigator.mediaDevices.setCaptureHandleConfig({handle:Uq,exposeOrigin:!0,permittedOrigins:["*"]})}catch{}var teA=function(A){return DA(this,null,function*(){let e=null,o=function(I){let c={preferCurrentTab:I.preferDisplaySurface==="current-tab"||!!I.captureElement,systemAudio:"include",selfBrowserSurface:"include",surfaceSwitching:"include"},u={width:Ma?{max:I.width}:{ideal:I.width,max:I.width},height:Ma?{max:I.height}:{ideal:I.height,max:I.height},frameRate:I.frameRate,displaySurface:I.preferDisplaySurface||"monitor"};if(c.video=u,I.systemAudio){let{echoCancellation:d=!0,noiseSuppression:R=!1,autoGainControl:k=!1}=I;c.audio={echoCancellation:d,noiseSuppression:R,autoGainControl:k,sampleRate:48e3}}return c}(A);nA.info("getDisplayMedia with constraints: ".concat(JSON.stringify(o)));let n=yield navigator.mediaDevices.getDisplayMedia(o);A.systemAudio&&n.getAudioTracks().length===0&&(BM&&tE<74||Ma||Yr)&&nA.warn("Your browser not support capture system audio");let a=n.getVideoTracks()[0];if(a){if(A.frameRate)try{yield a.applyConstraints({frameRate:{min:A.frameRate,ideal:A.frameRate},width:A.width,height:A.height})}catch(I){nA.warn("screen applyConstraints failed: ".concat(I))}A.captureElement&&(yield function(I,c){return DA(this,null,function*(){var u;if("CropTarget"in window&&"fromElement"in CropTarget&&$n(I.cropTo))try{if(((u=I.getCaptureHandle())==null?void 0:u.handle)!==Uq)return;let d=yield CropTarget.fromElement(c);yield I.cropTo(d)}catch(d){nA.warn("cropTo target failed ".concat(d))}})}(a,A.captureElement))}if(A.audio){let I=function(c){let u={echoCancellation:c.echoCancellation,autoGainControl:c.autoGainControl,noiseSuppression:c.noiseSuppression,sampleRate:c.sampleRate,channelCount:c.channelCount};return Ee(c.microphoneId)||(u.deviceId=c.microphoneId),{audio:u,video:!1}}(A);nA.info("getUserMedia with constraints: ".concat(JSON.stringify(I))),e=yield navigator.mediaDevices.getUserMedia(I),n.addTrack(e.getAudioTracks()[0])}return n})},Nm=class extends Ru{constructor(A){super(A,2),G(this,"profile",{width:1920,height:1080,frameRate:5,bitrate:1600}),G(this,"objectFit","contain"),G(this,"isScreen",!0),this._log.id="s-".concat(this._log.id)}get isShareCurrentTab(){var A,e;try{return Uq===((e=(A=this.mediaTrack)==null?void 0:A.getCaptureHandle())==null?void 0:e.handle)}catch{return}}capture(A){return DA(this,arguments,function(e){var o=this;let{systemAudio:n=!1,autoGainControl:a,echoCancellation:I,noiseSuppression:c,audioTrack:u,videoTrack:d,captureElement:R,preferDisplaySurface:k}=e;return function*(){var _;try{let Z,iA=ki();return d||u?(Z=new MediaStream,d&&Z.addTrack(d),u&&Z.addTrack(u)):(Z=yield teA({audio:!1,systemAudio:n,width:o.profile.width,height:o.profile.height,frameRate:o.profile.frameRate,autoGainControl:a,echoCancellation:I,noiseSuppression:c,captureElement:R,preferDisplaySurface:k}),o.sourceTrack=Z.getVideoTracks()[0]),yield o.setInputMediaStreamTrack(Z.getVideoTracks()[0]),S.emit(K.LOCAL_TRACK_CAPTURE_SUCCESS,{track:o,cost:ki()-iA,profile:o.profile,room:(_=o.manager)==null?void 0:_.room}),Z}catch(Z){throw o.log.error("getDisplayMedia error observed ".concat(Z)),Z instanceof Ct?Z:new Ct({code:Ge.INITIALIZE_FAILED,name:Z.name,message:Z.message})}}()})}switchDevice(A){return DA(this,null,function*(){throw new Error("Method not implemented.")})}};vt([wm(function(A){this.setContentHint(A.contentHint||"detail")})],Nm.prototype,"capture");var Oq,xq=class extends vm{constructor(A){super(A),this._log.id="s-".concat(this._log.id),this.isScreen=!0}addAudioProcessor(A,e,o){this.pipeline.silentNode.setNode(o),this.pipeline.mixNode.setNode(e),this.pipeline.aec.setNode(A),this.enableTrackAEC(!1)}removeAudioProcessor(A){this.pipeline.aec.node===A&&(this.pipeline.aec.deleteNode(),this.pipeline.silentNode.deleteNode(),this.pipeline.mixNode.deleteNode(),this.enableTrackAEC(!0))}};function Yq(A){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:48e3,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,n=arguments.length>3?arguments[3]:void 0;return DA(this,null,function*(){let a=tI();Oq||(Oq=Fa(a,URL.createObjectURL(new Blob(['registerProcessor("dumper",class extends AudioWorkletProcessor{constructor(e){super(),this.sourceSampleRate=e.processorOptions.sourceSampleRate||48e3,this.targetSampleRate=e.processorOptions.targetSampleRate||48e3,this.port.onmessage=e=>{this.port2=e.data.port}}process(e){return(this.port2||this.port).postMessage(this.resampleAll(e,this.sourceSampleRate,this.targetSampleRate)),!0}resampleAll(r,s,a){if(s===a)return r;var o=[];for(let t=0;tu.connect(c,0,d)),new ReadableStream({start(u){c.port.onmessage=d=>{u.enqueue(d.data)}},cancel(){A.forEach(u=>u.disconnect(c)),c.port.close()}})})}var ieA=class extends d${constructor(A){super(),this.room=A,G(this,"_localAudioTrack"),G(this,"_localScreenAudioTrack"),G(this,"log"),G(this,"denoiser"),G(this,"voiceChanger"),G(this,"mixChangedDebounce"),G(this,"audioProcessor"),G(this,"encodePipeline",[]),G(this,"decodePipeline",[]),G(this,"getPCMAbortCtrlMap",new Map),G(this,"audioFrameEventConfigMap",new Map),G(this,"audioReferenceMap",new Map),G(this,"isLocalAudioNeedAudioProcess",!1),G(this,"isScreenAudioNeedAudioProcess",!1),this.log=nA.createLogger({parent:A?.getLogger(),id:"am",userId:A?.userId,sdkAppId:A?.sdkAppId}),this.installEvent()}get localAudioTrack(){return this._localAudioTrack}get _localAudioPipline(){var A;return(A=this._localAudioTrack)==null?void 0:A.pipeline}get _localScreenAudioPipeline(){var A;return(A=this._localScreenAudioTrack)==null?void 0:A.pipeline}dump(A){var e,o;if(!this._localAudioTrack)return;let n=[],a=[];(e=this._localAudioPipline)!=null&&e.source.node&&(n.push(this._localAudioPipline.source.node),a.push("mic")),(o=this._localAudioPipline)!=null&&o.denoiser.node&&(n.push(this._localAudioPipline.denoiser.node),a.push("mic-processed")),this.mixWeight>1&&(n.push(this.audioContext.createMediaStreamSource(this._localAudioPipline.stream)),a.push("mix")),this.log.info("dump audio track ".concat(a,", duration: ").concat(A));let I=new AbortController,c=[],u=setTimeout(()=>{this.log.info('dump audio track complete please input "download()" to download.'),I.abort("timeout")},1e3*A),d=()=>{for(let k=0;kk.pipeTo(new WritableStream({write(_){_.forEach((Z,iA)=>c[iA]=c[iA]?c[iA].concat(Z[0]):[Z[0]])}}),I).catch(_=>d));return{then:R.then.bind(R),download:d}}getPCM(A,e){var o,n,a;if(typeof WritableStream>"u")return void this.log.warn("getPCM failed: browser not support WritableStream");let{enable:I,sampleRate:c=48e3,channelCount:u=1,port:d}=(e===""?this.audioFrameEventConfigMap.get(""):this.audioFrameEventConfigMap.get(e)||this.audioFrameEventConfigMap.get("*"))||{};if(!I)return;this.log.info("getPCM ".concat(e||"local"));let R,k,_=Math.floor(.04*c),Z=new Float32Array(_),iA=new Float32Array(_),cA=0,TA=new AbortController,JA=e===""?(o=this._localAudioTrack)==null?void 0:o.mediaTrack:(a=(n=this.room)==null?void 0:n.remotePublishedUserMap.get(e))==null?void 0:a.remoteAudioTrack.mediaTrack;if(JA)return Yq([tI().createMediaStreamSource(new MediaStream([JA]))],c,u,d).then(Ie=>Ie.pipeTo(new WritableStream({write(XA){XA[0][0]&&(cA+XA[0][0].length>_?(Z.set(XA[0][0].subarray(0,_-cA),cA),R=XA[0][0].subarray(_-cA),XA[0][1]&&(iA.set(XA[0][1].subarray(0,_-cA),cA),k=XA[0][1].subarray(_-cA)),cA+=_-cA):(R&&(Z.set(R,cA),cA+=R.length,R=void 0),k&&(iA.set(k,cA),k=void 0),Z.set(XA[0][0],cA),XA[0][1]&&iA.set(XA[0][1],cA),cA+=XA[0][0].length),cA>=_&&(cA=0,A({userId:e,sampleRate:c,channelCount:u,data:u===1?Z:[Z,iA]}),Z=new Float32Array(_),iA=new Float32Array(_)))}}),TA).catch(XA=>this.log.warn("stop getPCM reason:".concat(XA)))),TA;this.log.info("getPCM failed: ".concat(e||"local"," has no audio track"))}get hasScreenAudioTrack(){return!Ee(this._localScreenAudioTrack)}get hasAudioTrack(){return!Ee(this._localAudioTrack)}changeInput(A){var e,o;return A instanceof xq?(this._localScreenAudioTrack=A,this.isScreenAudioNeedAudioProcess&&(e=this.audioProcessor)!=null&&e.screenAudioWorkletNode&&(A.addAudioProcessor(this.audioProcessor.screenAudioWorkletNode,this.audioProcessor.mixNode,this.audioProcessor.silentNode),this.audioReferenceMap.forEach((n,a)=>{A.mixAudioReference(n,a)})),A.pipeline.connect(),this.mixOnChange()):A instanceof vm?(this._localAudioTrack=A,this.denoiser&&A.addDenoiser(this.denoiser),this.isLocalAudioNeedAudioProcess&&(o=this.audioProcessor)!=null&&o.localAudioWorkletNode&&(A.addAudioProcessor(this.audioProcessor.localAudioWorkletNode,this.audioProcessor.mixNode,this.audioProcessor.silentNode),this.audioReferenceMap.forEach((n,a)=>{A.mixAudioReference(n,a)})),A.pipeline.connect(),this.mixOnChange()):A instanceof Dx?A.setOutputMediaStreamTrack(A.mediaTrack):void 0}mixAudioReference(A,e){var o;(o=this._localAudioTrack)==null||o.mixAudioReference(A,e)}unMixAudioReference(A){var e;(e=this._localAudioTrack)==null||e.unMixAudioReference(A)}setAudioReferenceVolume(A,e){var o;(o=this._localAudioTrack)==null||o.setAudioReferenceVolume(A,e)}mixOnChange(){return this.mixChangedDebounce||(this.mixChangedDebounce=Promise.resolve().then(()=>{var A,e;return delete this.mixChangedDebounce,Promise.all([(A=this._localAudioTrack)==null?void 0:A.setOutputMediaStreamTrack(this.mixWeight>1?this.mixTrack:this._localAudioTrack.mediaTrack),(e=this._localScreenAudioTrack)==null?void 0:e.setOutputMediaStreamTrack(this.mixWeight>1?this.mixTrack:this._localScreenAudioTrack.mediaTrack)])})),this.mixChangedDebounce}removeInput(A){A instanceof xq?delete this._localScreenAudioTrack:A instanceof vm&&delete this._localAudioTrack}addDenoiser(A){var e;this.denoiser=A,(e=this._localAudioTrack)==null||e.addDenoiser(A)}addAudioProcessor(A,e,o,n){var a;this.audioProcessor={localAudioWorkletNode:o,mixNode:A,silentNode:e,screenAudioWorkletNode:n},this.isLocalAudioNeedAudioProcess&&this._localAudioTrack&&o&&(this._localAudioTrack.addAudioProcessor(o,A,e),this.audioReferenceMap.forEach((I,c)=>{var u;(u=this._localAudioTrack)==null||u.mixAudioReference(I,c)})),this.isScreenAudioNeedAudioProcess&&this._localScreenAudioTrack&&n&&((a=this._localScreenAudioTrack)==null||a.addAudioProcessor(n,A,e),this.audioReferenceMap.forEach((I,c)=>{var u;(u=this._localScreenAudioTrack)==null||u.mixAudioReference(I,c)}))}removeDenoiser(A){var e;return delete this.denoiser,(e=this._localAudioTrack)==null?void 0:e.removeDenoiser(A)}addVoiceChanger(A,e){var o;this.voiceChanger=[A,e],(o=this._localAudioTrack)==null||o.pipeline.voiceChanger.setNode(A,e)}removeVoiceChanger(){var A;delete this.voiceChanger,(A=this._localAudioTrack)==null||A.pipeline.voiceChanger.deleteNode()}removeAudioProcessor(A,e){var o,n;delete this.audioProcessor,(o=this._localAudioTrack)==null||o.removeAudioProcessor(A),(n=this._localScreenAudioTrack)==null||n.removeAudioProcessor(e)}destroy(){this.close(),this.audioReferenceMap.clear(),this.getPCMAbortCtrlMap.forEach(A=>A?.abort("destroy")),this.getPCMAbortCtrlMap.clear(),this.audioFrameEventConfigMap.clear(),this.uninstallEvent()}addEncodeProcessor(A){let{processor:e,type:o}=A;var n;this.encodePipeline.includes(e)||(this.encodePipeline[o]=e,(n=this.room)==null||n.enableInsertableStreams())}addDecodeProcessor(A){let{processor:e,type:o}=A;var n;this.decodePipeline.includes(e)||(this.decodePipeline[o]=e,(n=this.room)==null||n.enableInsertableStreams())}removeEncodeProcessor(A){let{type:e}=A;this.encodePipeline[e]=void 0}removeDecodeProcessor(A){let{type:e}=A;this.decodePipeline[e]=void 0}handleLocalTrackStarted(A){let{room:e,userId:o}=A;var n;if(e!==this.room||this.getPCMAbortCtrlMap.get(o))return;let a=this.getPCM(I=>{var c;(c=this.room)==null||c.emit("audio-frame",I)},"");this.getPCMAbortCtrlMap.set(o,a),this.getPCMAbortCtrlMap.get(o)&&((n=this._localAudioTrack)==null||n.on("input-media-track-changed",()=>{let I=this.getPCMAbortCtrlMap.get(o);I&&(I.abort("inputMediaTrackChanged"),I=this.getPCM(c=>{var u;(u=this.room)==null||u.emit("audio-frame",c)},""),this.getPCMAbortCtrlMap.set(o,I))}))}handleLocalTrackStopped(A){let{room:e,userId:o}=A;if(e!==this.room)return;let n=this.getPCMAbortCtrlMap.get(o);n&&(n.abort("stopLocalAudio"),this.getPCMAbortCtrlMap.delete(o))}handleRemoteTrackStarted(A){let{room:e,userId:o}=A;if(e===this.room&&!this.getPCMAbortCtrlMap.get(o)){let n=this.room.audioManager.getPCM(a=>{var I;(I=this.room)==null||I.emit("audio-frame",a)},o);this.getPCMAbortCtrlMap.set(o,n)}}handleRemoteTrackStopped(A){let{room:e,userId:o}=A;if(e!==this.room)return;let n=this.getPCMAbortCtrlMap.get(o);n&&(n.abort("stopRemoteAudio"),this.getPCMAbortCtrlMap.delete(o))}installEvent(){S.on("113",this.handleLocalTrackStarted,this),S.on("114",this.handleLocalTrackStopped,this),S.on("115",this.handleRemoteTrackStarted,this),S.on("116",this.handleRemoteTrackStopped,this)}uninstallEvent(){S.off("113",this.handleLocalTrackStarted),S.off("114",this.handleLocalTrackStopped),S.off("115",this.handleRemoteTrackStarted),S.off("116",this.handleRemoteTrackStopped)}updateAudioReference(A){let{type:e,audioReference:o,refId:n,volume:a}=A;if(e==="add"){if(this.audioReferenceMap.get(n)||!o||(this.audioReferenceMap.set(n,o),!this.audioProcessor))return;this.mixAudioReference(o,n)}else if(e==="remove")this.audioReferenceMap.get(n)&&(this.audioReferenceMap.delete(n),this.unMixAudioReference(n));else if(e==="updateVolume"){if(!this.audioProcessor||Ee(a))return;this.setAudioReferenceVolume(n,a)}}};function mx(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:30,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:2;return Dn((o,n)=>function(){for(var a=arguments.length,I=new Array(a),c=0;c{let R=setTimeout(()=>{let k=new Ct({code:Ge.API_CALL_TIMEOUT,message:"checkPendingPromise ".concat(n,"() timeout ").concat(A,"s")});(this.log||this._log||nA).warn(k),e===2?d(k):e===1&&u()},1e3*A);this._checkPendingPromiseSet||(this._checkPendingPromiseSet=new Set),this._checkPendingPromiseSet.add(R),o.apply(this,I).then(u,d).finally(()=>{clearTimeout(R),this._checkPendingPromiseSet&&R&&this._checkPendingPromiseSet.delete(R)})})})}var Tm=class Dj extends yq{constructor(e,o,n){super({userId:o.userId,sdkAppId:e.sdkAppId,mediaType:n,room:e}),this.room=e,this.user=o,G(this,"tinyId"),G(this,"isRemote",!0),G(this,"jitterBufferDelay",0),G(this,"availableState"),G(this,"remotePublishState"),G(this,"_triggerCheckDecodeSubject",yu(Ln(this,Dj.STATE_SUBSCRIBE))),G(this,"ignoreUpdatePlayingState"),this.tinyId=o.tinyId,this.availableState=new Uo("".concat(o.userId,"-").concat(this.mediaType,"-available"),"remote-track-available"),this.remotePublishState=new Uo("".concat(o.userId,"-").concat(this.mediaType,"-remote-publish"),"remote-track-publish"),Jn(Mq(Ln(this,Uo.STATECHANGED),Ln(this.remotePublishState,Uo.STATECHANGED)),Gq(()=>this.isRemotePublished&&(this.isSubscribed||this.isSubscribing)),Ks(u=>{this.availableState.state!==(u?Uo.ON:Uo.OFF)&&(this.availableState.state=u?Uo.ON:Uo.OFF),(!this.isRemotePublished||!this.ignoreUpdatePlayingState)&&this.updatePlayingState(u)}));let a=Jn(Ln(this.player,mi.ERROR),Sm(u=>u.code===MediaError.MEDIA_ERR_DECODE)),I=Jn(vq(5e3),Sm(()=>!!(!this.ignoreDecodeError&&this.isSubscribed&&this.isPlayCalled&&this.stat.bytesReceived&&this.isRemotePublished)&&(!this.player.isPlaying&&!(this.kind===fA.AUDIO?this.getAudioLevel()>0:this.stat.framesDecoded>0)||(this.reportDecodeResult(!0),!1)))),c=Jn(bW(a,I),Qc(Ln(this,Uo.INIT)));Jn(this._triggerCheckDecodeSubject,Sm(()=>!this.ignoreDecodeError),hx(c),Ks(u=>{this.reportDecodeResult(!1,u)}))}setMute(e){this.isRemotePublished&&super.setMute(e)}setInputMediaStreamTrack(e){super.setInputMediaStreamTrack(e),this.isRemotePublished&&this.isSubscribed&&this.player.setTrack(this.outMediaTrack)}checkDecodeResult(){this._triggerCheckDecodeSubject.next(!0)}waitHasMediaTrack(){return new Promise(e=>{this.mediaTrack?e():this.once("input-media-track-changed",e)})}get ignoreDecodeError(){var e,o,n,a;return(a=(n=(o=(e=this.room)==null?void 0:e.networkQuality)==null?void 0:o.hadRecentBadDownlink)==null?void 0:n.call(o,2))!=null&&a||this.player.isInAutoPlayFailedState}get isSubscribing(){return this.state.toString()==="subscribeing"}get isSubscribed(){return this.state===Dj.STATE_SUBSCRIBE}get isAvailable(){return this.availableState.state===Uo.ON}get isNeedPlay(){return this.isAvailable&&this.isPlayCalled}subscribe(e){return e}unsubscribe(){this.streamType==="main"&&this.kind==="video"&&this.room.changeType(!1,this.user)}reportDecodeResult(e,o){var n,a;let I=this.kind===fA.AUDIO;if(ct[e?"addSuccessEvent":"addFailedEvent"]({key:I?504700:514702}),!I){let c=((n=this.room)==null?void 0:n.downlinkVideoCodec.toUpperCase())||"H264";ct[e?"addSuccessEvent":"addFailedEvent"]({key:Yh["DECODE_".concat(c,"_RESULT")]}),e||this.log.warn("".concat((a=this.room)==null?void 0:a.downlinkVideoCodec," decode failed"))}e||(ct.addEnum({key:I?504701:514703,value:_Q()}),Jo.uploadEvent({log:"stat-decode-failed-".concat(this.kind,"-").concat(Qu()||bQ()),userId:this.room.userId}),this._log.warn("decode failed: isPlaying: ".concat(this.player.isPlaying," ").concat(this.kind===fA.AUDIO?"audioLevel: ".concat(this.getAudioLevel()):"framesDecoded: ".concat(this.stat.framesDecoded>0))),this.emit("decode-failed",{error:o}))}updatePlayingState(e){if(this.player.isPlayCalled&&this.player.setTrack(this.playerMediaTrack),this.isPlayCalled&&this.player.isStopped===e){if(e&&(!this.isSubscribed||!this.isRemotePublished||!this.outMediaTrack))return void this.log.info("abort play, isSubscribed: ".concat(this.isSubscribed," isAvailable: ").concat(this.isRemotePublished," hasTrack: ").concat(!!this.outMediaTrack," "));super.updatePlayingState(e)}}close(){super.close(),this.outMediaTrack&&this.uninstallTrackEvent(this.outMediaTrack)}onFlagChanged(){this.remotePublishState.state=this.isRemotePublished?Uo.ON:Uo.OFF,this.emit("remote-publish-changed",this.isRemotePublished)}onTrackMuted(){this.isNeedPlay&&super.onTrackMuted()}onTrackUnmuted(){this.isNeedPlay&&super.onTrackUnmuted()}onTrackEnded(){this.isNeedPlay&&super.onTrackEnded()}};G(Tm,"STATE_SUBSCRIBE","subscribe"),vt([mx(5,1)],Tm.prototype,"waitHasMediaTrack"),vt([is(Uo.INIT,Tm.STATE_SUBSCRIBE,{success(){this.log.info("subscribed"),S.emit(K.REMOTE_TRACK_SUBSCRIBED,{track:this})},ignoreError:!0}),jh(521716,!1)],Tm.prototype,"subscribe"),vt([is(Tm.STATE_SUBSCRIBE,Uo.INIT,{sync:!0,success(){this.log.info("unsubscribed"),S.emit(K.REMOTE_TRACK_UNSUBSCRIBED,{track:this})}})],Tm.prototype,"unsubscribe");var r4=Tm,Dx=class extends r4{constructor(A,e){super(A,e,1),G(this,"volume",0),G(this,"mediaType",1),G(this,"stat",{bytesReceived:0,packetsReceived:0,packetsLost:0,end2EndDelay:0,jitterBufferDelay:0}),this.manager=A.audioManager}get dbVolume(){return gx.isRunning?this.player.pipeline.volumeMeter.getVolumeDb():Math.floor(Math.max(10*Math.log10(this.volume)+100,0))}onPlayerError(A){this.enableDecodeFrame&&(this._log.warn("use audio decoder"),this.room.enableInsertableStreams())}get enableDecodeFrame(){var A,e;return!!this.manager&&(this.manager.decodePipeline.some(o=>o)||((e=(A=this.player.element)==null?void 0:A.error)==null?void 0:e.code)===MediaError.MEDIA_ERR_DECODE&&wM().AudioDecoder&&xQ)}get enableDecryptFrame(){return this.manager&&!!this.manager.decodePipeline[0]}decodeFrame(A){if(!this.manager)return A;let e=A;for(let[o,n]of this.manager.decodePipeline.entries()){if(!n)continue;let a={frame:A,track:this};if(o===1&&this.isAvailable&&this.room.role==="audience"&&(a.onAudioFrameNTPTime=I=>{let{ntp:c,frame:u,hasLeavingTag:d}=I;this.emit("audio-frame-with-ntp",{ntp:c,frame:u,hasLeavingTag:d})}),e=n(a),!e)return}return e}getAudioLevel(){if(!this.isAvailable)return 0;let A=this.volume||super.getAudioLevel();return A>1?1:A}getInternalAudioLevel(){return this.isAvailable?super.getInternalAudioLevel():0}get isRemotePublished(){return this.user.muteState.audioAvailable}},oeA=class extends Il{constructor(A,e,o,n,a){super(A,{useDefaultProgram:!0,useFbo:!0,name:"alpha",create2d:!0,logger:e}),this.setContainer=n,G(this,"initStat",{alphaStitchingType:1}),G(this,"end",yu()),G(this,"minSize",320),G(this,"maxSize",1280),G(this,"draggable",!1),G(this,"startDragX",0),G(this,"startDragY",0),G(this,"left",0),G(this,"top",0),G(this,"baseWidth",320),G(this,"baseRatio"),G(this,"container"),this.initStat=a,this.draggable=o,this.bindDragEvents(),ct.addEnum({key:515700,value:1}),this.draggable&&ct.addEnum({key:515700,value:11})}bindDragEvents(){let A=this.context._canvas;if(A)if(this.draggable){let e=Qc(this.end);Jn(Ln(A,"mousedown"),kq(this.startDrag.bind(this)),Qx(()=>Jn(Ln(window,"mousemove"),Qc(Ln(window,"mouseup")))),e,Ks(this.doDrag.bind(this))),Jn(Ln(A,"dblclick"),e,Ks(this.resetPosition.bind(this))),Jn(Ln(A,"wheel"),e,Ks(this.handleZoom.bind(this))),this.renderCanvas()}else{if(!this.container)return;this.container.style.removeProperty("left"),this.container.style.removeProperty("top"),this.end.next()}}render(A){var e;return!((e=this.input)==null||!e.requestFrame(A))&&(this.useProgram(),this.useBufferFrame(),this.useInputTexture(),this.draw(),!0)}startDrag(A){A.preventDefault(),A.button===0&&(this.startDragX=A.clientX-this.left,this.startDragY=A.clientY-this.top)}renderCanvas(){let{container:A}=this;A||this.setContainer(),A&&this.baseRatio&&this.draggable&&(A.style.setProperty("width","".concat(this.baseWidth,"px")),A.style.setProperty("height","".concat(this.baseWidth/this.baseRatio,"px")),A.style.setProperty("position","fixed"),A.style.setProperty("left","".concat(this.left,"px")),A.style.setProperty("top","".concat(this.top,"px")))}doDrag(A){A.preventDefault(),this.left=A.clientX-this.startDragX,this.top=A.clientY-this.startDragY,this.renderCanvas()}handleZoom(A){A.preventDefault();let e=A.deltaY,o=this.context._canvas;o&&(this.baseWidth||(this.baseWidth=o.offsetWidth),this.baseWidth=e<0?Math.min(1.1*this.baseWidth,this.maxSize):Math.max(.9*this.baseWidth,this.minSize),this.renderCanvas())}resetPosition(){this.left=0,this.top=0,this.renderCanvas()}onRatioReset(){this.renderCanvas()}draw2d(A,e,o,n,a){var I;let{ctx2d:c}=this,u=this.context._canvas;if(!c||!u)return!1;let d=super.draw2d(A,e,o,n,a),R=c.getImageData(0,0,n,a),{data:k}=R,_=!1;if(this.initStat.alphaStitchingType===1){let Z=Math.floor(n/2);for(let iA=0;iA=100;k[TA+3]=XA?255:0}_=super.draw2d(R,0,0,0,0,Z,a),u.width=Z}else if(this.initStat.alphaStitchingType===2){let Z=Math.floor(a/2);for(let iA=0;iA=100;k[TA+3]=XA?255:0}_=super.draw2d(R,0,0,0,0,n,Z),u.height=Z}return(I=this.context.ctx)==null||I.clearRect(0,0,n,a),d&&_}close(){this.baseRatio=void 0,this.end.next(),this.end.complete()}},tG=class extends r4{constructor(A,e){super(A,e,arguments.length>2&&arguments[2]!==void 0?arguments[2]:4),G(this,"mediaType",4),G(this,"source"),G(this,"shouldRenderAlpha",!1),G(this,"alphaNode"),G(this,"shouldBeDraggable",!0),G(this,"stat",{bytesReceived:0,packetsReceived:0,packetsLost:0,framesReceived:0,framesDecoded:0,frameWidth:0,frameHeight:0,end2EndDelay:0,jitterBufferDelay:0,keyFramesDecoded:0}),G(this,"_keyFrameCountLogged",!1),G(this,"_keyFrameStartTimestamp",0),G(this,"_keyFrameStartCount",0),G(this,"_keyFrameIntervals",[]),G(this,"_prevKeyFrameTimestamp",0),this.manager=A.videoManager,this.on("first-video-frame",o=>{this.room.emit("first-video-frame",o)}),this.on("first-frame-render",o=>{this.room.emit("first-frame-render",o)})}isAlphaSei(A){if(this.userId!==A.userId||A.seiPayloadType!==50)return!1;let e=new Uint8Array(A.data);return e.length%3==0&&e[0]===0&&e[1]===1&&e}play(A,e){return e!=null&&e.canvasRender&&!this.source&&this.useCanvasPlayer(),super.play(A,e).then(()=>{this.player.calculateStat(),S.emit("156",{track:this,player:this.player})})}updateAlphaRenderInfo(A){let e=this.isAlphaSei(A);if(e)if(this.alphaNode){let o=e[2];if(this.alphaNode.baseRatio&&this.alphaNode.initStat.alphaStitchingType===o)return;this.alphaNode.initStat={alphaStitchingType:o};let n=this.player.getElement();if(n){let a=n.videoWidth/n.videoHeight;a&&(this.alphaNode.baseRatio=a*(o===1?.5:2),this.alphaNode.onRatioReset())}this.player.canvas&&(this.player.canvas.id=this.generateAlphaCanvasName(o))}else this.shouldRenderAlpha=!0,this.player.shouldRenderAlpha=!0,this.useCanvasPlayer(e[2])}generateAlphaCanvasName(A){let e=Oh[A];return"".concat("alpha","_").concat(e,"_").concat(this.userId)}useCanvasPlayer(A){if(this.log.info("useCanvasPlayer(), has element:".concat(!!this.player.element)),!this.player.element)return;let e=new Mu({frameRate:15,logger:this.log,name:this.shouldRenderAlpha&&A?this.generateAlphaCanvasName(A):this.userId});e.create({alpha:this.shouldRenderAlpha,willReadFrequently:this.shouldRenderAlpha});let o=new bq(e,{name:"remotePlayer",logger:this.log});if(this.source=e.createVideoPlayerSource(this.player),this.player.setCanvas(e._canvas),this.shouldRenderAlpha&&A){let n=()=>{!this.player.container||!this.alphaNode||(this.alphaNode.container=this.player.container,this.alphaNode.renderCanvas())},a=new oeA(e,this.log,this.shouldBeDraggable,n,{alphaStitchingType:A});this.source.connect(a),a.connect(o),this.alphaNode=a}else this.source.connect(o);YQ()||(this.updateCanvasPlayerFPS=this.updateCanvasPlayerFPS.bind(this,e),this.room.on("heartbeat-report",this.updateCanvasPlayerFPS,this))}updateCanvasPlayerFPS(A){let e=this.decodeFPS,o=(n=e,[15,30,45,60].reduce((a,I)=>Math.abs(I-n)a.msg_user_info.str_identifier===this.userId))||{},o=this.mediaType===2?7:this.isSmall?3:2;if(!e||e.length===0)return 0;let n=e.find(a=>a.uint32_video_stream_type===o);return n?.uint32_video_dec_fps||0}stop(){return this.room.off("heartbeat-report",this.updateCanvasPlayerFPS,this),S.emit("157",{track:this,player:this.player}),this.alphaNode&&this.alphaNode.close(),super.stop()}decodeFrame(A){if(!this.manager)return A;for(let e of this.manager.decodePipeline)if(e&&!(A=e({frame:A,track:this})))return;return A}get isBig(){return this.mediaType===4}get isSmall(){return this.mediaType===8}changeType(A){this.room.changeType(A,this.user)}get isRemotePublished(){return this.user.muteState.videoAvailable}setMirror(A){A==="publish"||A==="both"||super.setMirror(A)}setDraggable(A){this.shouldBeDraggable=A,this.alphaNode&&(this.alphaNode.draggable=A,this.alphaNode.bindDragEvents())}onDecodeDowngradeStateChanged(A){this.emit("decode-downgrade-state-changed",A)}updateKeyFramesDecoded(A){let e=this.stat.keyFramesDecoded||0;if(this.stat.keyFramesDecoded=A,this._keyFrameCountLogged)return;let o=Date.now();if(!this._keyFrameStartTimestamp)return this._keyFrameStartTimestamp=o,this._keyFrameStartCount=A,void(this._prevKeyFrameTimestamp=o);if(this._prevKeyFrameTimestamp&&A>e){let a=A-e,I=(o-this._prevKeyFrameTimestamp)/1e3/a;this._keyFrameIntervals.push(I)}this._prevKeyFrameTimestamp=o;let n=o-this._keyFrameStartTimestamp;if(n>=16e3){let a=A-this._keyFrameStartCount,I=a>0?n/1e3/a:0,c="".concat(a," keyframes in 16s ").concat(I," [").concat(this._keyFrameIntervals.map(d=>d.toFixed(1)).join(","),"] keyFramesDecoded ").concat(A),u=I<=2.5?"debug":"info";this.log[u](c),this._keyFrameCountLogged=!0}}},n4=class extends tG{constructor(A,e){super(A,e,2),G(this,"mediaType",2),G(this,"objectFit","contain")}get isRemotePublished(){return this.user.muteState.hasAuxiliary}},UM=new Map;function Ua(A,e){let o=fi(bt({},e),{timestamp:gh()});UM.has(A)?UM.get(A).push(o):UM.set(A,[o])}function a4(){for(var A=arguments.length,e=new Array(A),o=0;ofunction(){for(var I=arguments.length,c=new Array(I),u=0;umh(R)?Yf(R):Sr(R)?R:ya(R))},fnName:a,value:o},link:{className:I,fnName:a}})})}else if(!Ee(e.type)&&ya(o)!==e.type)throw new Ct({code:Ge.INVALID_PARAMETER,message:Wi({key:Mi.INVALID_PARAMETER_TYPE,data:{key:n,rule:e,fnName:a,value:o},link:{className:I,fnName:a}})});if(e.allowEmpty===!1){let d=hr(o)&&(o===0||Number.isNaN(o)),R=Sr(o)&&o.trim()==="";if(d||R)throw new Ct({code:Ge.INVALID_PARAMETER,message:Wi({key:Mi.INVALID_PARAMETER_EMPTY,data:{key:n,rule:e,fnName:a,value:o},link:{className:I,fnName:a}})})}if(e.notLessThanZero&&hr(o)&&o<0)throw new Ct({code:Ge.INVALID_PARAMETER,message:Wi({key:Mi.CANNOT_LESS_THAN_ZERO,data:{key:n,rule:e,fnName:a,value:o},link:{className:I,fnName:a}})});if(!Ee(e.min)&&hr(o)&&oe.max)throw new Ct({code:Ge.INVALID_PARAMETER,message:Wi({key:Mi.INVALID_PARAMETER_MAX,data:{key:n,rule:e,fnName:a,value:o},link:{className:I,fnName:a}})});if(Sr(e.instanceOf)){if(!o||o._name!==e.instanceOf)throw new Ct({code:Ge.INVALID_PARAMETER,message:Wi({key:Mi.INVALID_PARAMETER_INSTANCE,data:{key:n,rule:e,fnName:a,value:o},link:{className:I,fnName:a}})})}else if($n(e.instanceOf)&&!(o instanceof e.instanceOf))throw new Ct({code:Ge.INVALID_PARAMETER,message:Wi({key:Mi.INVALID_PARAMETER_INSTANCE,data:{key:n,rule:e,fnName:a,value:o},link:{className:I,fnName:a}})});if(e.values&&!e.values.includes(o))throw new Ct({code:Ge.INVALID_PARAMETER,message:Wi({key:Mi.INVALID_PARAMETER_RANGE,data:{key:n,rule:e,fnName:a,value:o},link:{className:I,fnName:a}})});let{properties:c}=e;Cc(c)&&Xc(o)&&Object.keys(c).forEach(d=>{yx.call(this,{rule:c[d],value:o&&o[d],key:"".concat(n,".").concat(d),fnName:a,className:I})});let{arrayItem:u}=e;Cc(u)&&Aa(o)&&o.forEach((d,R)=>{yx.call(this,{rule:u,value:d,key:"".concat(n,"[").concat(R,"]"),fnName:a,className:I})}),$n(e.validate)&&e.validate.call(this,o,n,a,I,this)}S.on(K.JOIN_SUCCESS,A=>{let{room:e}=A;Ua(e.userId,{eventId:32788})}),S.on(K.LEAVE_START,A=>{let{room:e}=A;Ua(e.userId,{eventId:32789})}),S.on(K.LOCAL_TRACK_PUBLISHED,A=>{let{track:e}=A;if(e.room){let o=32769;e.mediaType===4?o=32768:e.mediaType===2&&(o=32805),Ua(e.room.userId,{eventId:o})}}),S.on(K.LOCAL_TRACK_UNPUBLISHED,A=>{let{track:e}=A;if(e.room){let o=32771;e.mediaType===4?o=32770:e.mediaType===2&&(o=32806),Ua(e.room.userId,{eventId:o})}}),S.on(K.TRACK_MUTED,A=>{let{track:e}=A;e.room&&(e.kind===fA.AUDIO?Ua(e.room.userId,{eventId:e.isRemote?32785:32772,remoteUserId:e.isRemote?e.userId:void 0}):Ua(e.room.userId,{eventId:e.isRemote?32784:32773,remoteUserId:e.isRemote?e.userId:void 0}))}),S.on(K.TRACK_UNMUTED,A=>{let{track:e}=A;e.room&&(e.kind===fA.AUDIO?Ua(e.room.userId,{eventId:e.isRemote?32787:32774,remoteUserId:e.isRemote?e.userId:void 0}):Ua(e.room.userId,{eventId:e.isRemote?32786:32775,remoteUserId:e.isRemote?e.userId:void 0}))}),S.on(K.REMOTE_TRACK_SUBSCRIBED,A=>{let{track:e}=A;e.room&&(e.mediaType===1&&Ua(e.room.userId,{eventId:32777,remoteUserId:e.userId}),e.mediaType===4&&Ua(e.room.userId,{eventId:32776,remoteUserId:e.userId}),e.mediaType===8&&Ua(e.room.userId,{eventId:32803,remoteUserId:e.userId}))}),S.on(K.REMOTE_TRACK_UNSUBSCRIBED,A=>{let{track:e}=A;e.room&&(e.mediaType===1&&Ua(e.room.userId,{eventId:32779,remoteUserId:e.userId}),e.mediaType===4&&Ua(e.room.userId,{eventId:32778,remoteUserId:e.userId}),e.mediaType===8&&Ua(e.room.userId,{eventId:32804,remoteUserId:e.userId}))}),S.on(K.SWITCH_DEVICE_SUCCESS,A=>{let{track:e}=A;e.room&&Ua(e.room.userId,{eventId:e.kind===fA.VIDEO?32780:32781})}),S.on(K.LOCAL_TRACK_REPLACED,A=>{let{track:e}=A;e.room&&Ua(e.room.userId,{eventId:e.kind===fA.VIDEO?32782:32783})}),S.on(K.SIGNAL_CONNECTION_STATE_CHANGED,A=>{let e,{room:o,prevState:n,state:a}=A;switch(a){case"CONNECTED":e=n==="RECONNECTING"?32795:32791;break;case"DISCONNECTED":e=n==="RECONNECTING"?32796:32790;break;case"RECONNECTING":e=32794}e&&Ua(o.userId,{eventId:e})}),S.on(K.PEER_CONNECTION_STATE_CHANGED,A=>{let e,{room:o,prevState:n,state:a,remoteUserId:I}=A,c=!!I;switch(a){case"CONNECTED":e=n==="RECONNECTING"?c?32801:32798:c?32793:32792;break;case"DISCONNECTED":n==="RECONNECTING"&&(e=c?32802:32799);break;case"RECONNECTING":e=c?32800:32797}e&&Ua(o.userId,{eventId:e,remoteUserId:I})}),S.on(K.VIDEO_CODEC_IMPLEMENTATION_CHANGED,A=>{let{implementation:e,userId:o,remoteUserId:n,codec:a,isHWCodec:I,prevImplementation:c,streamType:u}=A,d=I?1:0;c||(d=I?3:2);let R={H264:0,H265:1,VP8:2}[a.toUpperCase()],k={eventId:4004,param1:d,param2:R,streamType:u||2};n&&(k.remoteUserId=n,k.eventId=4005),Ua(o,k),ct.addEnum({key:n?514701:513701,value:d}),ct.addEnum({key:n?514700:513700,value:R})}),S.on(K.LOCAL_TRACK_RECAPTURE,A=>{let{track:e,error:o}=A;if(e.userId){let n={eventId:2003,param1:0};e.kind===fA.AUDIO?(n.streamType=1,o&&(n.param1=2)):(n.streamType=e.streamType==="auxiliary"?7:2,o&&(n.param1=8)),Ua(e.userId,n)}});var neA=es(hg(),1),aeA=class extends neA.EventEmitter{constructor(A,e){let o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"userId";super(),this.mySelfId=A,this._log=e,this.key=o,G(this,"userMap",new Map),G(this,"remotePublishedUserMap",new Map),G(this,"asrRobotUserMap",new Map)}get hasRobotUser(){return!![...this.remotePublishedUserMap.values()].find(A=>A.isRobot)}getPublishedUser(A){return this.remotePublishedUserMap.get(A)}addUser(A){let e=A[this.key],{userId:o,tinyId:n,role:a,fromType:I}=A;if(I===xR)return void this.addAsrRobotUser(A);if(this.userMap.has(e))return;let c={userId:o,tinyId:n,role:a===20?"anchor":"audience"};this.userMap.set(e,c),this.emit("1",c)}addAsrRobotUser(A){let e=A[this.key],{userId:o,tinyId:n,role:a}=A;if(this.asrRobotUserMap.has(e))return;let I={userId:o,tinyId:n,role:a===20?"anchor":"audience"};this.asrRobotUserMap.set(e,I),this.emit("8",I)}deleteUser(A,e){let o=this.userMap.get(A);if(!o)return;if(this.asrRobotUserMap.has(A))return void this.deleteAsrRobotUser(A);let n="peer leave [".concat(A,"]");Ee(e)||(n+=":".concat(cO[e])),this._log.info(n);let a=this.remotePublishedUserMap.get(A);if(a){let I=a.muteState;a.flag=0,this.emit("5",a.userId),this.deleteRemotePublishedUser(A),this.emit("6",{prevMuteState:I,muteState:a.muteState,flag:0})}this.userMap.delete(A),this.emit("2",{userId:o.userId,reason:e})}deleteAsrRobotUser(A){if(!this.asrRobotUserMap.has(A))return;let e=this.asrRobotUserMap.get(A);e&&(this.asrRobotUserMap.delete(A),this.emit("9",e))}setUserList(A){this.userMap.forEach(e=>{A.findIndex(o=>o[this.key]===e[this.key])<0&&this.deleteUser(e[this.key],0)}),A.forEach(e=>{!this.userMap.has(e[this.key])&&e[this.key]!==this.mySelfId&&this.addUser(e)})}addRemotePublishedUser(A){this.remotePublishedUserMap.has(A[this.key])||this.remotePublishedUserMap.set(A[this.key],A)}deleteRemotePublishedUser(A){this.remotePublishedUserMap.has(A)&&this.remotePublishedUserMap.delete(A)}setRemotePublishedUserList(A){this.remotePublishedUserMap.forEach(e=>{let o=e[this.key];if(A.findIndex(n=>n[this.key]===e[this.key])<0){this._log.info("remote [".concat(o,"] unpublish"));let n=e.muteState;e.flag=0,this.emit("5",e.userId),this.deleteRemotePublishedUser(o),this.emit("6",{prevMuteState:n,muteState:e.muteState,flag:0})}}),A.forEach(e=>{var o;let n=e[this.key];if(n===this.mySelfId)return void this.emit("7",e);let{flag:a,userId:I,tinyId:c,fromType:u}=e,d=mQ(a,I),R=(o=this.remotePublishedUserMap.get(n))==null?void 0:o.muteState;if(R){let k=this.remotePublishedUserMap.get(n);k&&k.flag!==a&&(k.flag=a,this._log.info("remote publish updated: ".concat(JSON.stringify(k.muteState))),this.emit("6",{prevMuteState:R,muteState:d,flag:a}))}else this._log.info("remote publish. state: ".concat(JSON.stringify(d))),this.addUser({userId:I,tinyId:c,role:20,fromType:u}),this.emit("3",e),this.emit("6",{prevMuteState:mQ(0,I),muteState:d,flag:a})})}clear(){this.userMap.clear(),this.remotePublishedUserMap.clear()}},seA=es(hg(),1),geA=class extends seA.default{constructor(){super(...arguments),G(this,"_connectionTimeoutCount",0),G(this,"_isFirewallRestrictionEventEmitted",!1)}increaseTimeoutCount(){this._connectionTimeoutCount+=1,this.checkAndEmitFirewallRestriction()}resetTimeoutCount(){this._connectionTimeoutCount=0}checkAndEmitFirewallRestriction(){this._connectionTimeoutCount>=3&&!this._isFirewallRestrictionEventEmitted&&(this._isFirewallRestrictionEventEmitted=!0,this.emit("firewall-restriction"))}destroy(){this._connectionTimeoutCount=0,this._isFirewallRestrictionEventEmitted=!1,this.removeAllListeners()}};function s4(A){let{timesInSecond:e,maxSizeInSecond:o,getSize:n}=A;return Dn((a,I)=>{let c=new WeakMap;return S.on(K.ROOM_DESTROY,u=>{let{room:d}=u;return c.delete(d)}),function(){let u=c.get(this);for(var d=arguments.length,R=new Array(d),k=0;k1e3&&(u.timestamp=Date.now(),u.callCountInSecond=0,u.totalSizeInSecond=0),n&&(u.totalSizeInSecond+=n(...R)),u.timestamp!==0&&Date.now()-u.timestamp<1e3&&(u.callCountInSecond>=e||u.totalSizeInSecond>o))throw new Ct({code:Ge.INVALID_OPERATION,message:Wi({key:Mi.CALL_FREQUENCY_LIMIT,data:{isTimes:u.callCountInSecond>=e,isSize:u.totalSizeInSecond>o,name:I,timesInSecond:e,maxSizeInSecond:o}})});u.callCountInSecond++,a.call(this,...R)}})}var xe,g4=!0,iG={SCENE_LIVE:"live",SCENE_RTC:"rtc",ROLE_ANCHOR:"anchor",ROLE_AUDIENCE:"audience",STREAM_TYPE_MAIN:"main",STREAM_TYPE_SUB:"sub",AUDIO_PROFILE_STANDARD:"standard",AUDIO_PROFILE_STANDARD_STEREO:"standard-stereo",AUDIO_PROFILE_HIGH:"high",AUDIO_PROFILE_HIGH_STEREO:"high-stereo",QOS_PREFERENCE_SMOOTH:"smooth",QOS_PREFERENCE_CLEAR:"clear",SPEAKER:"Speakerphone",HEADSET:"Headset earpiece"},Si={INVALID_PARAMETER:5e3,INVALID_OPERATION:5100,ENV_NOT_SUPPORTED:5200,DEVICE_ERROR:5300,SERVER_ERROR:5400,OPERATION_FAILED:5500,OPERATION_ABORT:5998,UNKNOWN_ERROR:5999},Rx=((xe=Rx||{})[xe.INVALID_PARAMETER=5e3]="INVALID_PARAMETER",xe[xe.INVALID_PARAMETER_REQUIRED=5001]="INVALID_PARAMETER_REQUIRED",xe[xe.INVALID_PARAMETER_TYPE=5002]="INVALID_PARAMETER_TYPE",xe[xe.INVALID_PARAMETER_EMPTY=5003]="INVALID_PARAMETER_EMPTY",xe[xe.INVALID_PARAMETER_INSTANCE=5004]="INVALID_PARAMETER_INSTANCE",xe[xe.INVALID_PARAMETER_RANGE=5005]="INVALID_PARAMETER_RANGE",xe[xe.INVALID_PARAMETER_LESS_THAN_ZERO=5006]="INVALID_PARAMETER_LESS_THAN_ZERO",xe[xe.INVALID_PARAMETER_MIN=5007]="INVALID_PARAMETER_MIN",xe[xe.INVALID_PARAMETER_MAX=5008]="INVALID_PARAMETER_MAX",xe[xe.INVALID_ELEMENT_ID=5009]="INVALID_ELEMENT_ID",xe[xe.INVALID_ELEMENT_ID_TYPE=5010]="INVALID_ELEMENT_ID_TYPE",xe[xe.INVALID_STREAM_ID=5011]="INVALID_STREAM_ID",xe[xe.INVALID_ROOM_ID_STRING=5012]="INVALID_ROOM_ID_STRING",xe[xe.INVALID_ROOM_ID_INTEGER=5013]="INVALID_ROOM_ID_INTEGER",xe[xe.INVALID_STREAM_TYPE=5014]="INVALID_STREAM_TYPE",xe[xe.INVALID_ROOM_ID_REQUIRED=5015]="INVALID_ROOM_ID_REQUIRED",xe[xe.INVALID_ROOM_ID_INTEGER_STRING=5016]="INVALID_ROOM_ID_INTEGER_STRING",xe[xe.INVALID_BUFFER_EMPTY=5017]="INVALID_BUFFER_EMPTY",xe[xe.INVALID_BUFFER_OVERSIZE=5018]="INVALID_BUFFER_OVERSIZE",xe[xe.INVALID_ROOM_ID_TYPE_MISMATCH=5019]="INVALID_ROOM_ID_TYPE_MISMATCH",xe[xe.INVALID_ROOM_ID_DUPLICATE=5020]="INVALID_ROOM_ID_DUPLICATE",xe[xe.INVALID_OPERATION=5100]="INVALID_OPERATION",xe[xe.INVALID_OPERATION_NOT_JOINED=5101]="INVALID_OPERATION_NOT_JOINED",xe[xe.INVALID_OPERATION_REMOTE_USER_NOT_EXIST=5102]="INVALID_OPERATION_REMOTE_USER_NOT_EXIST",xe[xe.INVALID_OPERATION_STREAM_TYPE_NOT_EXIST=5103]="INVALID_OPERATION_STREAM_TYPE_NOT_EXIST",xe[xe.INVALID_OPERATION_REPEAT_CALL=5104]="INVALID_OPERATION_REPEAT_CALL",xe[xe.INVALID_OPERATION_NEED_VIDEO=5105]="INVALID_OPERATION_NEED_VIDEO",xe[xe.INVALID_OPERATION_NEED_AUDIO=5106]="INVALID_OPERATION_NEED_AUDIO",xe[xe.INVALID_ROLE_AUDIENCE=5107]="INVALID_ROLE_AUDIENCE",xe[xe.INVALID_NOT_ENABLE_SEI=5108]="INVALID_NOT_ENABLE_SEI",xe[xe.INVALID_NEED_CALL_PUBLISHED=5109]="INVALID_NEED_CALL_PUBLISHED",xe[xe.ENV_NOT_SUPPORTED=5200]="ENV_NOT_SUPPORTED",xe[xe.NOT_SUPPORTED_HTTP=5201]="NOT_SUPPORTED_HTTP",xe[xe.NOT_SUPPORTED_WEBRTC=5202]="NOT_SUPPORTED_WEBRTC",xe[xe.NOT_SUPPORTED_H264_ENCODE=5203]="NOT_SUPPORTED_H264_ENCODE",xe[xe.NOT_SUPPORTED_H264_DECODE=5204]="NOT_SUPPORTED_H264_DECODE",xe[xe.NOT_SUPPORTED_SCREEN_SHARE=5205]="NOT_SUPPORTED_SCREEN_SHARE",xe[xe.NOT_SUPPORTED_SMALL_VIDEO=5206]="NOT_SUPPORTED_SMALL_VIDEO",xe[xe.NOT_SUPPORTED_SEI=5207]="NOT_SUPPORTED_SEI",xe[xe.NOT_SUPPORTED_WEBGL=5208]="NOT_SUPPORTED_WEBGL",xe[xe.NOT_SUPPORTED_CHROME_VERSION=5209]="NOT_SUPPORTED_CHROME_VERSION",xe[xe.NOT_SUPPORTED_PLUGIN=5210]="NOT_SUPPORTED_PLUGIN",xe[xe.DEVICE_ERROR=5300]="DEVICE_ERROR",xe[xe.DEVICE_NOT_FOUND_ERROR=5301]="DEVICE_NOT_FOUND_ERROR",xe[xe.DEVICE_NOT_ALLOWED_ERROR=5302]="DEVICE_NOT_ALLOWED_ERROR",xe[xe.DEVICE_NOT_READABLE_ERROR=5303]="DEVICE_NOT_READABLE_ERROR",xe[xe.DEVICE_OVERCONSTRAINED_ERROR=5304]="DEVICE_OVERCONSTRAINED_ERROR",xe[xe.DEVICE_INVALID_STATE_ERROR=5305]="DEVICE_INVALID_STATE_ERROR",xe[xe.DEVICE_SECURITY_ERROR=5306]="DEVICE_SECURITY_ERROR",xe[xe.DEVICE_ABORT_ERROR=5307]="DEVICE_ABORT_ERROR",xe[xe.CAMERA_RECOVER_FAILED=5308]="CAMERA_RECOVER_FAILED",xe[xe.MICROPHONE_RECOVER_FAILED=5309]="MICROPHONE_RECOVER_FAILED",xe[xe.NOT_SUPPORTED_MISMATCH_SAMPLE_RATE_IN_FIREFOX=5310]="NOT_SUPPORTED_MISMATCH_SAMPLE_RATE_IN_FIREFOX",xe[xe.SERVER_ERROR=5400]="SERVER_ERROR",xe[xe.NEED_TO_BUY=5401]="NEED_TO_BUY",xe[xe.ACCOUNT_NO_MONEY=-100013]="ACCOUNT_NO_MONEY",xe[xe.OPERATION_FAILED=5500]="OPERATION_FAILED",xe[xe.FIREWALL_RESTRICTION=5501]="FIREWALL_RESTRICTION",xe[xe.REJOIN_FAILED=5502]="REJOIN_FAILED",xe[xe.EVENT_HANDLER_ERROR=5503]="EVENT_HANDLER_ERROR",xe[xe.VIDEO_CONTEXT_ERROR=5504]="VIDEO_CONTEXT_ERROR",xe[xe.VIDEO_ENCODE_FAILED=5505]="VIDEO_ENCODE_FAILED",xe[xe.AUDIO_ENCODE_FAILED=5506]="AUDIO_ENCODE_FAILED",xe[xe.VIDEO_DECODE_FAILED=5507]="VIDEO_DECODE_FAILED",xe[xe.AUDIO_DECODE_FAILED=5508]="AUDIO_DECODE_FAILED",xe[xe.OPERATION_ABORT=5998]="OPERATION_ABORT",xe[xe.UNKNOWN_ERROR=5999]="UNKNOWN_ERROR",xe),I4=fi(bt({},ts),{INVALID_PARAMETER(A){let{fnName:e}=A;return"the parameters of the '".concat(e,"' you called does not meet the requirements, please check the API documentation.")},INVALID_PARAMETER_REQUIRED(A){let{key:e,rule:o,fnName:n,value:a}=A;return"'".concat(e||o.name,"' is a required param when calling ").concat(n,"(), received: ").concat(a,".")},INVALID_PARAMETER_TYPE(A){let{key:e,rule:o,fnName:n,value:a}=A,I="".concat(e||o.name),c="";return c=Array.isArray(o.type)?o.type.join("|"):o.type,"'".concat(I,"' must be type of ").concat(c," when calling ").concat(n,"(), received type: ").concat(ya(a),".")},INVALID_PARAMETER_EMPTY(A){let{key:e,rule:o,fnName:n,value:a}=A;return"'".concat(e||o.name,"' cannot be '").concat(a,"' when calling ").concat(n,"().")},INVALID_PARAMETER_INSTANCE(A){let{key:e,rule:o,fnName:n,value:a}=A,I="".concat(e||o.name),c="".concat(o.instanceOf.name||o.instanceOf);return"'".concat(I,"' must be instanceof ").concat(c," when calling ").concat(n,"(), received type: ").concat(ya(a),".")},INVALID_PARAMETER_RANGE(A){let{key:e,rule:o,fnName:n,value:a}=A;return"'".concat(e||o.name,"' must be one of ").concat(o.values.join("|")," when calling ").concat(n,"(), received: ").concat(a,".")},INVALID_PARAMETER_LESS_THAN_ZERO(A){let{key:e,rule:o,fnName:n}=A;return"'".concat(e||o.name,"' cannot be less than 0 when calling ").concat(n,"().")},INVALID_PARAMETER_MIN(A){let{key:e,rule:o,value:n}=A;return"the min value of ".concat(e||o.name," is ").concat(o.min,", received: ").concat(n,".")},INVALID_PARAMETER_MAX(A){let{key:e,rule:o,value:n}=A;return"the max value of ".concat(e||o.name," is ").concat(o.max,", received: ").concat(n,".")},INVALID_ELEMENT_ID(A){let{key:e,fnName:o}=A;return"'".concat(e,"' is not found in the document object when calling ").concat(o,"().")},INVALID_ELEMENT_ID_TYPE(A){let{key:e,fnName:o,type:n}=A;return"the element corresponding to '".concat(e,"' must be instanceof HTMLElement when calling ").concat(o,"(), received: ").concat(n,".")},INVALID_STREAM_ID(A){let{key:e}=A;return"'".concat(e,"' can only consist of uppercase and lowercase english letters (a-zA-Z), numbers (0-9), hyphens and underscores.")},INVALID_ROOM_ID_STRING(A){let{key:e}=A;return"'".concat(e,"' must be a valid string.")},INVALID_ROOM_ID_INTEGER(A){let{key:e}=A;return"'".concat(e,"' must be an integer between [1, 4294967294].")},INVALID_ROOM_ID_INTEGER_STRING(A){let{key:e}=A;return"'".concat(e,"' must be an integer but go a string, use 'parseInt' to convert it or use 'strRoomId' instead.")},INVALID_ROOM_ID_REQUIRED:()=>"at least one of 'roomId'(between [1, 4294967294]) and 'strRoomId'(not empty) is required.",INVALID_ROOM_ID_TYPE_MISMATCH(A){let{key:e}=A;return"The type of target roomId must match the current roomId. Current room is using '".concat(e,"', but received '").concat(e==="strRoomId"?"roomId":"strRoomId","'.")},INVALID_ROOM_ID_DUPLICATE(A){let{key:e}=A;return"the target '".concat(e,"' must not be the same as the current '").concat(e,"'.")},INVALID_STREAM_TYPE:A=>{let{fnName:e}=A;return"'streamType' is required when 'userId' is not '*', calling ".concat(e,"()")},INVALID_IMAGE_URL:"The 'src' param must be filled in when the background type is image.",INVALID_OPERATION(A){let{fnName:e}=A;return"the API '".concat(e,"' you called does not meet the requirements, please check the API documentation.")},INVALID_OPERATION_NOT_JOINED(A){let{fnName:e}=A;return"cannot ".concat(e," because you are not enter room yet.")},INVALID_OPERATION_REMOTE_USER_NOT_EXIST(A){let{fnName:e,value:o}=A;return"cannot ".concat(e," because remote user(userId: ").concat(o.userId,") does not publishing stream.")},INVALID_OPERATION_STREAM_TYPE_NOT_EXIST(A){let{fnName:e,value:o}=A;return"cannot ".concat(e," because remote user(userId: ").concat(o.userId,") does not publishing ").concat(o.streamType," video.")},INVALID_OPERATION_REPEAT_CALL(A){let{fnName:e}=A;return"you are already ".concat(e,"(), cannot repeated call '").concat(e,"'.")},INVALID_OPERATION_NEED_VIDEO(A){let{fnName:e}=A;return"cannot call '".concat(e,"' because the camera is not turned on.")},INVALID_OPERATION_NEED_AUDIO(A){let{fnName:e}=A;return"cannot call '".concat(e,"' because the microphone or screen share is not turned on.")},INVALID_BUFFER_EMPTY:A=>{let{key:e}=A;return"the buffer size of paramerter '".concat(e,"' cannot be empty")},INVALID_BUFFER_OVERSIZE:()=>"buffer size is over 1000 Bytes",INVALID_ROLE_AUDIENCE:()=>"role: 'audience' cannot call this api.",INVALID_NOT_ENABLE_SEI:()=>"you need to enable SEI in TRTC.create({ enableSEI: true })",INVALID_NEED_CALL_PUBLISHED:A=>{let{fnName:e}=A;return"you need to call ".concat(e,"() after publish stream.")},ENV_NOT_SUPPORTED(A){let{fnName:e}=A;return"the current browser does not support the capability of the function '".concat(e,"' you are calling, please check the API documentation.")},NOT_SUPPORTED_WEBRTC:"the current browser does not support WebRTC capability, please check the SDK documentation.",NOT_SUPPORTED_H264_ENCODE:"this browser does not support H264 encode.",NOT_SUPPORTED_H264_DECODE:"this browser does not support H264 decode.",NOT_SUPPORTED_SCREEN_SHARE:"this browser does not support screen share, please check the browser version.",NOT_SUPPORTED_SMALL_VIDEO:"this browser does not support small video, please check the browser version.",NOT_SUPPORTED_SEI:"this browser does not support SEI, please check the browser version.",NOT_SUPPORTED_WEBGL:"this browser does not support WebGL, please check the browser version.",NOT_SUPPORTED_CHROME_VERSION(A){let{fnName:e}=A;return"cannot call ".concat(e," because the browser version is too low, please upgrade to the latest version")},DEVICE_ERROR(A){let{fnName:e,error:o}=A;return"'".concat(e,"' got device exception").concat(o?", error: ".concat(o.toString(),"."):".")},DEVICE_NOT_FOUND_ERROR(A){let{fnName:e,deviceType:o=Gm(e),error:n}=A;return"NotFoundError, no ".concat(o," detected, please check your device and the configuration on '").concat(e,"'").concat(n?", error: ".concat(n.toString(),"."):".")},DEVICE_NOT_ALLOWED_ERROR(A){let{fnName:e,deviceType:o=Gm(e),error:n}=A;return"NotAllowedError, you have disabled ".concat(o," access, please allow the current application to use the ").concat(o).concat(n?", error: ".concat(n.toString(),"."):".")},DEVICE_NOT_READABLE_ERROR(A){let{fnName:e,deviceType:o=Gm(e),error:n}=A;return"NotReadableError, the ".concat(o," maybe in use by another APP, please check if the device is pre-occupied by another APP.")},DEVICE_OVERCONSTRAINED_ERROR(A){let{fnName:e,deviceType:o=Gm(e),error:n}=A;return"OverconstrainedError, the device ID is incorrect, please check whether the device ID passed in is correct".concat(n?", error: ".concat(n.toString(),"."):".")},DEVICE_INVALID_STATE_ERROR(A){let{fnName:e,deviceType:o=Gm(e),error:n}=A;return"InvalidStateError, after the user clicks and interacts with the page, turn on the ".concat(o).concat(n?", error: ".concat(n.toString(),"."):".")},DEVICE_SECURITY_ERROR(A){let{fnName:e,deviceType:o=Gm(e),error:n}=A;return"SecurityError, check whether the system security policy restricts the use of the ".concat(o,", and it is recommended to turn on the ").concat(o," after the user interacts with the page").concat(n?", error: ".concat(n.toString(),"."):".")},DEVICE_ABORT_ERROR(A){let{fnName:e,deviceType:o=Gm(e),error:n}=A;return"AbortError, an unknown exception in the system makes the device unusable, recommended to change the device or browser and re-check whether the device is normal".concat(n?" error: ".concat(n.toString(),"."):".")},CAMERA_RECOVER_FAILED(A){let{error:e}=A;return"camera recover capture failed ".concat(e?.name||"",": ").concat(e?.originMessage||e?.message)},MICROPHONE_RECOVER_FAILED(A){let{error:e}=A;return"microphone recover capture failed ".concat(e?.name||"",": ").concat(e?.originMessage||e?.message)},OPERATION_FAILED(A){let{fnName:e,error:o}=A;return"'".concat(e,"' failed, reason: ").concat(o?.toString())},FIREWALL_RESTRICTION:()=>"media connection failure due to firewall restrictions, please try to change your network.",EVENT_HANDLER_ERROR(A){let{eventName:e}=A;return"an error was caught on trtc.on('".concat(e,"', handler), please check your code on 'handler'.")},VIDEO_CONTEXT_ERROR(A){let{reason:e,error:o}=A;return"video context error ".concat(e," ").concat(o?.name||""," ").concat(o?.message||"")},SERVER_ERROR(A){let{fnName:e,error:o}=A;return"'".concat(e,"' got server error: ").concat(o?.toString(),", please check the SDK documentation.")},NEED_TO_BUY(A){let{value:e,url:o}=A;return"You need to buy packages for ".concat(e,". Refer to: ").concat(o)},ACCOUNT_NO_MONEY:A=>{let{fnParams:e}=A;return"your TRTC account run out of credit, please recharge.".concat(e.sdkAppId?" SDKAppId: ".concat(e.sdkAppId):"")},OPERATION_ABORT(A){let{fnName:e}=A;return"'".concat(e,"' abort")},UNKNOWN_ERROR(A){let{fnName:e,error:o}=A;return"'".concat(e,"' throw unknown exception").concat(o?", error: ".concat(o.toString(),"."):".")}});function Gm(A){if(!A)return"camera";let e=A.toLowerCase();return e.includes("screen")?"screen share":e.includes("audio")?"microphone":"camera"}var IeA=class p2 extends Error{constructor(e){let{code:o,extraCode:n,message:a="",messageParams:I,fnName:c="",originError:u,data:d}=e;var R;let k;k=a||function(_){let Z,{code:iA,params:cA,enableDocLink:TA=!1}=_,JA="",Ie=Rx[iA];try{Z=I4[Ie]}catch{Z=I4.UNKNOWN_ERROR}return $n(Z)?JA=Z(cA):Sr(Z)&&(JA=Z),cA.fnName&&!JA.includes(cA.fnName)&&(JA[JA.length-1]!=="."&&(JA+="."),JA+=" thrown from ".concat(cA.fnName,"()")),TA&&(JA+=" doc:"),JA}({code:o===Si.SERVER_ERROR?o:n||o,params:bt({fnName:c,error:u},I)}),super(k),G(this,"name","RtcError"),G(this,"code"),G(this,"extraCode"),G(this,"functionName"),G(this,"message"),G(this,"data"),G(this,"handler"),G(this,"originError"),this.name=Rx[o],this.code=o,this.extraCode=n,this.functionName=c,this.originError=u,this.message=k,this.data=d,this.extraCode===5302&&(R=this.originError)!=null&&R.message.includes("system")&&(this.handler=()=>{let _=document.createElement("a");vh?_.href="ms-settings:privacy-".concat({startLocalVideo:"webcam",startLocalAudio:"microphone"}[this.functionName]):lu&&(_.href="x-apple.systempreferences:com.apple.preference.security?Privacy_".concat({startLocalVideo:"Camera",startLocalAudio:"Microphone",startScreenShare:"ScreenCapture"}[this.functionName])),_.href.length>0&&_.click()})}static convertFrom(e,o,n){let a=e;if(e instanceof Ct){let{stack:I}=e,c={code:Si.UNKNOWN_ERROR,fnName:o,originError:e};switch(e.getCode()){case Ge.INVALID_PARAMETER:c.code=Si.INVALID_PARAMETER,c.message=e.message;break;case Ge.INVALID_OPERATION:c.code=Si.INVALID_OPERATION,c.message=e.message;break;case Ge.NOT_SUPPORTED:case Ge.NOT_SUPPORTED_H264:c.code=Si.ENV_NOT_SUPPORTED,e.getCode()===Ge.NOT_SUPPORTED_H264&&(c.extraCode=e.message.includes(ts.NOT_SUPPORTED_H264ENCODE)?5203:5204);break;case Ge.JOIN_ROOM_FAILED:c.messageParams={fnParams:n};case Ge.SERVER_TIMEOUT:case Ge.SWITCH_ROLE_FAILED:case Ge.SWITCH_ROOM_FAILED:c.code=Si.SERVER_ERROR,c.extraCode=e.getExtraCode();break;case Ge.API_CALL_ABORTED:c.code=Si.OPERATION_ABORT;break;case Ge.DEVICE_NOT_FOUND:case Ge.DEVICE_AUTO_RECOVER_FAILED:case Ge.INITIALIZE_FAILED:c.code=5300,e.name&&(c.extraCode=function(u){let d;switch(u){case"NotFoundError":d=5301;break;case"NotAllowedError":d=5302;break;case"NotReadableError":d=5303;break;case"OverconstrainedError":d=5304;break;case"InvalidStateError":d=5305;break;case"SecurityError":d=5306;break;case"AbortError":d=5307;break;default:d=5300}return d}(e.name));break;case Ge.VIDEO_ENCODE_FAILED:c.extraCode=5505;case Ge.AUDIO_ENCODE_FAILED:c.extraCode=5506,c.code=Si.OPERATION_FAILED;break;case Ge.UNKNOWN:break;default:c.code=Si.OPERATION_FAILED}a=new p2(c),I&&(a.stack+=I.substr(I.indexOf(` +`)))}else{if(e instanceof p2)return e;a=new p2({code:Si.UNKNOWN_ERROR,fnName:o,originError:e})}return a}},vi=IeA;function cl(A){return A==="sub"?"auxiliary":A==="auxiliary"?"sub":"main"}function Mx(A){return A===iG.QOS_PREFERENCE_CLEAR?"detail":A===iG.QOS_PREFERENCE_SMOOTH?"motion":""}function Sx(A,e){let o=e?AO:vf;return TO(A)?bt(bt({},o),A):$l[A]?$l[A]:o}var c4={type:"object",properties:{cameraId:{type:"string"},useFrontCamera:{type:"boolean"},fillMode:{type:"string",values:["contain","cover","fill"]},mirror:{type:["string","boolean"],values:[!0,!1,"view","publish","both"]},small:{type:["string","object","boolean"],properties:{width:{type:"number"},height:{type:"number"},frameRate:{type:"number"},bitrate:{type:"number"}}},videoTrack:{instanceOf:MediaStreamTrack}}},E4={type:"object",properties:{systemAudio:{type:"boolean"},fillMode:{type:"string",values:["contain","cover","fill"]},profile:{type:["string","object"],properties:{width:{type:"number"},height:{type:"number"},frameRate:{type:"number"},bitrate:{type:"number"}}},videoTrack:{instanceOf:MediaStreamTrack},audioTrack:{instanceOf:MediaStreamTrack}}},OM={type:["string",HTMLElement,null,"array"],arrayItem:{instanceOf:HTMLElement},validate(A,e,o){if(Sr(A)&&!document.getElementById(A))throw new vi({code:Si.INVALID_PARAMETER,extraCode:5009,fnName:o,messageParams:{key:e}})}},l4={name:"userId",required:!0,type:"string"},C4={type:"object",properties:{microphoneId:{type:"string"},audioTrack:{instanceOf:MediaStreamTrack},captureVolume:{type:"number",min:0},earMonitorVolume:{type:"number",min:0,max:100},profile:{type:["string","object"],properties:{bitrate:{type:"number"},channelCount:{type:"number"}}},echoCancellation:{values:[!0,!1,"remote-only","all"]},autoGainControl:{type:"boolean"},noiseSuppression:{type:"boolean"}}};function xM(A,e){if(!A)throw new vi({code:Si.INVALID_OPERATION,extraCode:5101,fnName:e})}function B4(A,e,o){if(!A)throw new vi({code:Si.INVALID_OPERATION,extraCode:5102,fnName:e,messageParams:{value:o}})}function u4(A,e,o){if(!(/^[1-9]\d*$/.test(String(A))&&A<4294967295))throw new vi({code:Si.INVALID_PARAMETER,extraCode:5013,fnName:e,messageParams:{key:o}})}function Q4(A,e,o){if(!/^[A-Za-z\d\s!#$%&()+\-:;<=.>?@[\]^_{}|~,]{1,64}$/.test(A))throw new vi({code:Si.INVALID_PARAMETER,extraCode:5012,fnName:e,messageParams:{key:o}})}function d4(A){var e;if((e=A?.option)==null||!e.small)return;if(!um())return nA.warn("small stream is not supported"),void delete A.option.small;let o=Sx(A.option.profile),n=Sx(A.option.small,!0);return((a,I)=>a.width*a.height>=I.width*I.height&&a.frameRate>=I.frameRate&&a.bitrate>=I.bitrate)(o,n)?void 0:(nA.warn("small stream profile must be less than big stream profile. Big: ".concat(JSON.stringify(o),", Small: ").concat(JSON.stringify(n))),void delete A.option.small)}var ceA={create:[{name:"RoomConfig",instanceOf:Function},{name:"CreateConfig",type:"object",properties:{plugins:{type:"array",arrayItem:{instanceOf:Function}}}}],enterRoom:{name:"EnterRoomConfig",type:"object",required:!0,validate(A,e,o){if(this._room.isJoined)throw new vi({code:Si.INVALID_OPERATION,extraCode:5104,fnName:o});if(A.roomId){if(Sr(A.roomId))throw new vi({code:Si.INVALID_PARAMETER,extraCode:5016,fnName:o,messageParams:{key:e}});u4(A.roomId,o,e)}else{if(!A.strRoomId)throw new vi({code:Si.INVALID_PARAMETER,extraCode:5015,fnName:o});Q4(A.strRoomId,o,e)}},properties:{sdkAppId:{required:!0,type:"number",allowEmpty:!1},userId:{required:!0,type:"string",allowEmpty:!1},userSig:{required:!0,type:"string",allowEmpty:!1},scene:{type:"string",values:["live","rtc"]},role:{type:"string",values:["audience","anchor"]},roomId:{type:["string","number"]},strRoomId:{type:"string"},proxy:{type:["object","string"],properties:{websocketProxy:{type:"string"},turnServer:{type:["object","array"],properties:{url:{required:!0,type:"string"},username:{type:"string"},credential:{type:"string"},credentialType:{type:"string",values:["password"]}}},loggerProxy:{type:"string"},webtransportProxy:{type:"string"}}},enableAutoPlayDialog:{type:"boolean"},userDefineRecordId:{type:"string"},latencyLevel:{type:"number"},playoutDelay:{type:"object",properties:{min:{type:"number",min:0,max:1e3},max:{type:"number",min:0,max:1e4}}}}},startLocalVideo:{name:"LocalVideoConfig",type:"object",properties:{view:OM,mute:{type:["boolean","string"]},publish:{type:"boolean"},capture:{required:!1,type:"boolean"},option:c4},validate(A){var e,o;if(((e=A?.option)==null||!e.videoTrack)&&wI())throw new vi({code:Si.ENV_NOT_SUPPORTED,extraCode:5201});(o=A?.option)!=null&&o.small&&d4(A)}},updateLocalVideo:{name:"updateLocalVideoConfig",type:"object",required:!0,properties:{view:fi(bt({},OM),{required:!1}),publish:{type:"boolean"},capture:{required:!1,type:"boolean"},mute:{type:["boolean","string"]},option:c4},validate(A){var e;(e=A?.option)!=null&&e.small&&d4(A)}},startLocalAudio:{name:"LocalAudioConfig",type:"object",properties:{publish:{type:"boolean"},mute:{type:["boolean","string"],values:[!0,!1,"microphone"]},muteKeepVolumeDetection:{type:"boolean"},option:C4},validate(A){var e;if(((e=A?.option)==null||!e.audioTrack)&&wI())throw new vi({code:Si.ENV_NOT_SUPPORTED,extraCode:5201})}},updateLocalAudio:{name:"updateLocalAudioConfig",type:"object",required:!0,properties:{publish:{type:"boolean"},mute:{type:["boolean","string"],values:[!0,!1,"microphone"]},muteKeepVolumeDetection:{type:"boolean"},option:C4}},startScreenShare:{name:"ScreenShareConfig",type:"object",properties:{view:OM,publish:{type:"boolean"},option:E4},validate(A,e,o,n,a){var I;if((I=A?.option)==null||!I.videoTrack){if(wI())throw new vi({code:Si.ENV_NOT_SUPPORTED,extraCode:5201});if(!OQ())throw new vi({code:Si.ENV_NOT_SUPPORTED,fnName:o,extraCode:5205})}}},updateScreenShare:{name:"updateScreenShareConfig",type:"object",required:!0,properties:{view:OM,publish:{type:"boolean"},option:E4}},muteRemoteAudio:[l4,{name:"mute",required:!0,type:"boolean"}],setRemoteAudioVolume:[l4,{name:"volume",required:!0,type:"number",min:0}],startRemoteVideo:{name:"startRemoteVideoConfig",type:"object",required:!0,properties:{view:OM,userId:{type:"string",required:!0},streamType:{values:["main","sub"],required:!0},option:{type:"object",properties:{fillMode:{type:"string",values:["contain","cover","fill"]},mirror:{type:"boolean"}}}},validate(A,e,o){xM(this._room.isJoined,o);let n=this._room.remotePublishedUserMap.get(A.userId);if(B4(!!n,o,A),n&&(A.streamType==="main"&&!n.muteState.videoAvailable||A.streamType==="sub"&&!n.muteState.hasAuxiliary))throw new vi({code:Si.INVALID_OPERATION,extraCode:5103,fnName:o,messageParams:{value:A}})}},updateRemoteVideo:{name:"updateRemoteVideoConfig",type:"object",required:!0,properties:{view:fi(bt({},OM),{required:!1}),userId:{type:"string",required:!0},streamType:{values:["main","sub"],required:!0},option:{type:"object",properties:{fillMode:{type:"string",values:["contain","cover","fill"]},mirror:{type:"boolean"}}}},validate(A,e,o){xM(this._room.isJoined,o);let n=this._room.remotePublishedUserMap.get(A.userId);if(B4(!!n,o,A),n){if(A.streamType==="main"&&!n.muteState.videoAvailable||A.streamType==="sub"&&!n.muteState.hasAuxiliary)throw new vi({code:Si.INVALID_OPERATION,extraCode:5103,fnName:o,messageParams:{value:A}});if(A.option){let a=A.streamType==="main"?n.remoteVideoTrack:n.remoteAuxiliaryTrack;if((A.option.pictureInPicture||A.option.fullScreen||A.option.fullScreen)&&(!a.isSubscribed||!a.player.isPlaying))throw new vi({code:Si.INVALID_OPERATION,message:"cannot set pictureInPicture or fullScreen when remote video is not playing"})}}}},stopRemoteVideo:{name:"stopRemoteVideoConfig",type:"object",required:!0,properties:{userId:{type:"string",required:!0},streamType:{values:["main","sub"]}},validate(A,e,o){if(A.userId!=="*"&&Ee(A.streamType))throw new vi({code:Si.INVALID_PARAMETER,extraCode:5014,fnName:o})}},switchRole:{name:"role",required:!0,values:["anchor","audience"],validate(A,e,o){xM(this._room.isJoining||this._room.isJoined,o)}},enableAudioVolumeEvaluation:[{name:"interval",type:"number"},{name:"enableInBackground",type:"boolean"}],sendSEIMessage:[{name:"buffer",required:!0,instanceOf:ArrayBuffer,validate(A,e,o,n){if(!kT)throw new vi({code:Si.ENV_NOT_SUPPORTED,fnName:o,extraCode:5207});if(!this._room.enableSEI)throw new vi({code:Si.INVALID_OPERATION,fnName:o,extraCode:5108});if(A.byteLength>1e3)throw new vi({code:Si.INVALID_PARAMETER,extraCode:5018,fnName:o});if(A.byteLength===0)throw new vi({code:Si.INVALID_PARAMETER,extraCode:5017,messageParams:{key:e},fnName:o});xM(this._room.isJoined,o)}},{name:"options",type:"object",properties:{seiPayloadType:{type:"number",values:[5,243]},toSubStream:{type:"boolean",validate(A,e,o){if(!A&&!this._room.isMainStreamPublished||A&&!this._room.isAuxStreamPublished)throw new vi({code:Si.INVALID_OPERATION,extraCode:5109,messageParams:{key:e},fnName:o})}}}}],sendCustomMessage:{name:"message",required:!0,type:"object",properties:{cmdId:{type:"number",required:!0,min:1,max:10},data:{instanceOf:ArrayBuffer,required:!0,validate(A,e,o,n){if(A.byteLength>1e3)throw new vi({code:Si.INVALID_PARAMETER,extraCode:5018,fnName:o});if(A.byteLength===0)throw new vi({code:Si.INVALID_PARAMETER,extraCode:5017,fnName:o,messageParams:{key:e}})}}},validate(A,e,o){if(xM(this._room.isJoined,o),this._room.scene==="live"&&this._room.role==="audience")throw new vi({code:Si.INVALID_OPERATION,extraCode:5107,fnName:o,messageParams:{key:e}})}},switchRoom:{name:"switchRoomConfig",type:"object",required:!0,validate(A,e,o){if(xM(this._room.isJoined,o),this._room.useStringRoomId&&A.strRoomId===this._room.roomId||!this._room.useStringRoomId&&A.roomId===Number(this._room.roomId))throw new vi({code:Si.INVALID_PARAMETER,extraCode:5020,fnName:o,messageParams:{key:this._room.useStringRoomId?"strRoomId":"roomId"}});if(A.roomId&&this._room.useStringRoomId||!A.roomId&&A.strRoomId&&!this._room.useStringRoomId)throw new vi({code:Si.INVALID_PARAMETER,extraCode:5019,fnName:o,messageParams:{key:this._room.useStringRoomId?"strRoomId":"roomId"}});if(A.roomId)u4(A.roomId,o,e);else{if(!A.strRoomId)throw new vi({code:Si.INVALID_PARAMETER,extraCode:5015,fnName:o});Q4(A.strRoomId,o,e)}},properties:{roomId:{type:"number"},strRoomId:{type:"string"},privateMapKey:{type:"string"},userSig:{type:"string",required:!0},autoSubscribeCount:{type:"number",min:0,max:50}}}},mg={TRTC:ceA},El=class extends Error{};function EeA(A,e){let o=Dh(A);for(let n=0;n!0),G(this,"mergeUpdate",EeA);let n=Aw.instances.get(e);n?n.set(o,this):Aw.instances.set(e,new Map([[o,this]]))}static get(e,o){if(!o)return;let n=Aw.instances.get(e);return n&&n.get(o)||new Aw(e,o)}static gets(e,o){let n=Aw.instances.get(e),a=[];return n&&n.forEach((I,c)=>{o.test(c)&&a.push(I)}),a}action(e,o,n){let a=u=>{var d;return e===0?this.started=!0:e===3&&(this.started=!1),this.ops.shift(),(d=this.currentOp)==null||d.action(),u},I=u=>{var d,R;throw this.ops.shift(),e===0&&((d=this.currentOp)==null?void 0:d.type)===2&&this.ops.shift().reject(new El("start failed")),(R=this.currentOp)==null||R.action(),u},c={type:e,action:()=>o(...c.args).then(a,I),args:n,resolve:leA,reject:CeA};try{switch(this.state){case 1:if(e===0)throw new El("already started");break;case 4:if(e===2)throw new El("not started");break;default:return this.cacheOp(c)}}catch(u){return Promise.reject(u)}return this.ops.push(c),c.promise=o(...c.args).then(a,I)}cacheOp(e){if(this.ops.length===1)switch(this.state){case 0:case 2:if(e.type===0)throw new El("already start");break;case 3:switch(e.type){case 2:throw new El("update not allowed when stopping");case 3:return this.currentOp.promise}break;default:throw new El("unknown state")}else switch(e.type){case 3:if(this.lastOpType===3)return this.lastOp.promise;{let n=new El("keep stop");if(this.ops.slice(1).forEach(a=>a.reject(n)),this.ops=this.ops.slice(0,1),this.state===3)return this.currentOp.promise}break;case 2:switch(this.lastOpType){case 2:return this.lastOp.args=this.mergeUpdate(this.lastOp.args,e.args),this.lastOp.promise;case 3:throw new El("update not allowed after stop")}break;case 0:switch(this.lastOpType){case 2:throw new El("start not allowed after update");case 0:throw new El("duplicate start");case 3:if(this.startSame(this.currentOp.args,e.args))throw this.ops.pop().reject(new El("keep start")),new El("already start")}}e.promise=new Promise((n,a)=>{e._resolve?e._resolve.then(n):e.resolve=n,e._reject?e._reject.catch(a):e.reject=a});let{action:o}=e;return e.action=()=>o().then(e.resolve,e.reject),this.ops.push(e),e.promise}get lastOp(){return this.ops[this.ops.length-1]}get lastOpType(){return this.lastOp.type}get currentOp(){return this.ops[0]}get state(){return this.currentOp?this.currentOp.type:this.started?1:4}};G(h4,"instances",new WeakMap);var oG=h4,vx=new WeakMap,Nx=(A,e)=>{if(e instanceof El){let{stack:o}=e;e=new vi({code:Si.OPERATION_ABORT,message:"".concat(A," abort: ").concat(e.message),fnName:A}),o&&(e.stack+=o.substr(o.indexOf(` +`)))}throw e};function km(A,e){return Dn((o,n)=>function(){for(var a=arguments.length,I=new Array(a),c=0;cfunction(){for(var c=arguments.length,u=new Array(c),d=0;d{var cA,TA;let JA=(cA=vx.get(this))==null?void 0:cA.get(_(...u));if(JA){let{timeoutId:XA,resolve:Ft}=JA;clearTimeout(XA),Ft()}let Ie=setTimeout(()=>{if(R.state===3||R.state===4)return Z();R.action(2,a.bind(this),u).catch(Nx.bind(null,I)).then(Z,iA)},k);vx.has(this)?(TA=vx.get(this))==null||TA.set(_(...u),{timeoutId:Ie,resolve:Z}):vx.set(this,new Map([[_(...u),{timeoutId:Ie,resolve:Z}]]))})}return R.action(2,a.bind(this),u).catch(Nx.bind(null,I))})}function _m(A){return Dn((e,o)=>function(){for(var n=arguments.length,a=new Array(n),I=0;Id.action(3,()=>Promise.resolve(),a))).then(()=>e.call(this,...a));let u=oG.get(this,c);return u?u.action(3,e.bind(this),a).catch(Nx.bind(null,o)):e.apply(this,a)})}function bm(){return function(A,e,o){return A.prototype[e]=function(){let n=this._log||console,a='"'.concat(e,'" is a static method. Use TRTC.').concat(e,"() instead. See: ").concat($C,"/en/TRTC.html#.").concat(e);n.warn(a)},o}}var Xt={ERROR:"error",AUTOPLAY_FAILED:"autoplay-failed",KICKED_OUT:"kicked-out",REMOTE_USER_ENTER:"remote-user-enter",REMOTE_USER_EXIT:"remote-user-exit",REMOTE_AUDIO_AVAILABLE:"remote-audio-available",REMOTE_AUDIO_UNAVAILABLE:"remote-audio-unavailable",REMOTE_VIDEO_AVAILABLE:"remote-video-available",REMOTE_VIDEO_UNAVAILABLE:"remote-video-unavailable",AUDIO_VOLUME:"audio-volume",AUDIO_FRAME:"audio-frame",NETWORK_QUALITY:"network-quality",CONNECTION_STATE_CHANGED:"connection-state-changed",AUDIO_PLAY_STATE_CHANGED:"audio-play-state-changed",VIDEO_PLAY_STATE_CHANGED:"video-play-state-changed",SCREEN_SHARE_STOPPED:"screen-share-stopped",DEVICE_CHANGED:"device-changed",PUBLISH_STATE_CHANGED:"publish-state-changed",TRACK:"track",STATISTICS:"statistics",SEI_MESSAGE:"sei-message",CUSTOM_MESSAGE:"custom-message",VIDEO_DECODE_DOWNGRADE_STATE_CHANGED:"video-decode-downgrade-state-changed",LAYER_DATA:"layerData",FIRST_VIDEO_FRAME:"first-video-frame",PERMISSION_STATE_CHANGE:"permission-state-change",VIDEO_SIZE_CHANGED:"video-size-changed",REALTIME_TRANSCRIBER_MESSAGE:"realtime-transcriber-message",REALTIME_TRANSCRIBER_STATE_CHANGED:"realtime-transcriber-state-changed",PICTURE_IN_PICTURE_STATE_CHANGED:"picture-in-picture-state-changed",FULL_SCREEN_STATE_CHANGED:"full-screen-state-changed"},BeA=new Set([Xt.AUDIO_VOLUME,Xt.AUDIO_FRAME,Xt.NETWORK_QUALITY,Xt.STATISTICS,Xt.SEI_MESSAGE,Xt.CUSTOM_MESSAGE,Xt.LAYER_DATA]),p4={};XC(p4,{ScheduleRequestType:()=>D4,getAbilityConfig:()=>ueA,getScheduleDomain:()=>Jq,isNeedToSchedule:()=>rG,scheduleProxy:()=>jQ,sendScheduleRequest:()=>m4,setIsNeedToSchedule:()=>wu,setScheduleProxy:()=>Pq});var Tx=null,Gx=0,f4=72e5,kx="trtc_schedule_cache",rG=!0;function wu(A){rn(A)&&A!==rG&&(rG=A,nA.info("setIsNeedToSchedule ".concat(A)),A?function(){if(typeof window<"u"&&typeof localStorage<"u")try{localStorage.removeItem(kx)}catch(e){nA.error("clearScheduleCache error",e)}}():Gx=Date.now()+f4)}function m4(A){return DA(this,arguments,function(e){let{userId:o,sdkAppId:n,useStringRoomId:a,roomId:I,userSig:c,version:u,frameWorkType:d,role:R,latencyLevel:k}=e;return function*(){var _;if(!rG&&Tx&&Gx>Date.now())return{isCached:!0,result:Tx};let Z={delta:0,count:[1,1],msg:[],detail:[]};try{let iA=new FormData;iA.append("userId",String(o)),iA.append("sdkAppId",String(n)),iA.append("isStrGroupId",String(a)),iA.append("groupId",String(I)),iA.append("sdkVersion",u),iA.append("userSig",String(c));let cA=((_=yield nm())==null?void 0:_.model)||cT();cA&&iA.append("model",cA);let TA=bQ();TA&&iA.append("osString",TA);let JA=kQ();JA&&iA.append("gpu",JA),R&&iA.append("role",String(R)),k&&iA.append("latencyLevel",String(k)),d&&iA.append("frameWorkType",String(d));let Ie=ki(),XA=yield function(ie,ke,Nt){return new Promise((Ut,Ui)=>{let Oi=null;Pf([y4(or=>ke.count[0]=or+1,or=>{let{error:xi,retry:yo,retriedCount:Sa,retryFuncArgs:Vn}=or;ke.msg[0]=xi.message,Oi||(Sa>=1&&(Vn[0]=Xh(Nt,"config",fA.MAIN,!0)),yo())})(Xh(Nt,"config",fA.MAIN),ie,{get timeout(){return 1e3*ph(2+ke.count[0])}}),y4(or=>ke.count[1]=or+1,or=>{let{error:xi,retry:yo,retriedCount:Sa,retryFuncArgs:Vn}=or;ke.msg[1]=xi.message,Oi||(Sa>=2&&(Vn[0]=Xh(Nt,"config",fA.BACKUP,!0)),yo())})(Xh(Nt,"config",fA.BACKUP),ie,{get timeout(){return 1e3*ph(2+ke.count[1])}})]).then(or=>{Oi=or,Ut(Oi)}).catch(Ui)})}(iA,Z,n);XA.config&&(XA.config.loggerDomain&&wf(XA.config.loggerDomain),rn(XA.config.scheduleCache)&&wu(!XA.config.scheduleCache)),Z.delta=ki()-Ie;let Ft=function(ie,ke,Nt){let Ut={totalCost:0,local:0,dns:0,tcp:0,tls:0,request:0,response:0};try{let Ui=performance.getEntriesByType("resource"),Oi=Xh(ie,"config",fA.MAIN),or=Xh(ie,"config",fA.BACKUP);for(let xi of Ui)if(xi.startTime>=Nt&&(xi.name===Oi||xi.name===or)&&xi.transferSize>0){let yo=xi.name===Oi?fA.MAIN:fA.BACKUP,Sa=Math.round(xi.duration),Vn=Math.round(xi.domainLookupStart-xi.startTime),NI=xi.redirectStart>0?Math.round(xi.redirectEnd-xi.redirectStart):0,IG=xi.fetchStart>0?Math.round(xi.domainLookupStart-xi.fetchStart):0,qM=Math.round(xi.domainLookupEnd-xi.domainLookupStart),Dz=Math.round(xi.requestStart-xi.secureConnectionStart),yz=Math.round(xi.secureConnectionStart-xi.connectStart),Rz=Math.round(xi.responseStart-xi.requestStart),Mz=Math.round(xi.responseEnd-xi.responseStart),JtA=[qM,Dz,yz,Rz,Mz];Jo.uploadEvent({log:"stat-schedule-net:".concat(Sa,"(").concat(Vn,"(").concat(NI,"->").concat(IG,")->").concat(JtA.join("->"),") ").concat(yo),userId:ke}),Ut=fi(bt({},Ut),{totalCost:Sa,local:Vn,dns:qM,tcp:yz,tls:Dz,request:Rz,response:Mz});break}}catch(Ui){nA.error("getScheduleDetailCost error",Ui)}return Ut}(Number(n),o,Ie);return Tx=XA,function(ie){if(typeof window<"u"&&typeof localStorage<"u")try{let ke=Date.now()+f4;localStorage.setItem(kx,JSON.stringify({result:ie,expireIn:ke})),Gx=ke}catch(ke){nA.error("saveScheduleToLocalStorage error",ke)}}(XA),{isCached:!1,result:XA,detailCost:Ft}}catch(iA){let cA=Aa(iA)?iA[0]:iA,TA=hr(cA.code)?cA.code:0,JA="schedule failed".concat(cA.message?": ".concat(cA.message):""),Ie=new Ct({code:Ge.SCHEDULE_FAILED,extraCode:TA,message:Wi({key:Mi.JOIN_ROOM_FAILED,data:{error:JA,code:TA}})});throw nA.error(JA,TA),Ie}}()})}typeof document<"u"&&document.head.insertAdjacentHTML("beforeend",Object.values(su).map(A=>'')).join(`\r +`)),function(){if(typeof window<"u"&&typeof localStorage<"u")try{let A=localStorage.getItem(kx);if(A){let{result:e,expireIn:o}=JSON.parse(A);o>Date.now()?(Tx=e,Gx=o,rG=!1):localStorage.removeItem(kx)}}catch(A){nA.error("loadScheduleFromLocalStorage error",A)}}(),S.on("28",()=>wu(!0)),S.on("63",()=>wu(!0)),S.on("84",()=>wu(!0)),S.on("201",A=>{A.state==="RECONNECTING"&&wu(!0)}),S.on("202",A=>{A.state==="RECONNECTING"&&wu(!0)});var jQ={main:"",backup:""};function Pq(A){Aa(A)?(jQ.main=A[0],jQ.backup=A[1]):(jQ.main=A,jQ.backup=A)}var D4=(A=>(A.CONFIG="config",A.TRTC_AUTO_CONF="trtcAutoConf",A.AUDIO_AI_AUTH="audioAiAuth",A))(D4||{});function Xh(A,e){let o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:fA.MAIN,n=arguments.length>3&&arguments[3]!==void 0&&arguments[3];return"https://".concat(jQ[o]||Jq(A,o,n),"/api/v1/").concat(e)}function ueA(A,e,o){let n=Xh(A,e),a=Xh(A,e,fA.BACKUP),I=new URLSearchParams(o).toString(),c=fetch("".concat(n,"?").concat(I)).then(d=>d.json()),u=fetch("".concat(a,"?").concat(I)).then(d=>d.json());return Pf([c,u])}function Jq(A){let e,o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:fA.MAIN,n=arguments.length>2&&arguments[2]!==void 0&&arguments[2];return e=ol(A)?n?o===fA.MAIN?su.MAIN_OVERSEA_BACKUP:su.BACKUP_OVERSEA:o===fA.MAIN?su.MAIN_OVERSEA:su.BACKUP_OVERSEA:o===fA.MAIN?su.MAIN:su.BACKUP,e}function QeA(A,e,o){return new Promise((n,a)=>{cu({url:A,body:e,timeout:o.timeout,priority:"high"}).then(I=>{I.data.code===0?n(I.data.data):a({code:I.data.code,message:I.data.msg})}).catch(a)})}var y4=(A,e)=>Kf({retryFunction:QeA,settings:{retries:3,timeout:0},onError:e,onRetrying:A}),Hq=class{constructor(){G(this,"_log"),this._log=nA.createLogger({id:"fd"})}download(A,e){return DA(this,null,function*(){let{type:o="blob"}=e||{};A=xN(A);try{let n,a=ki();if(n=$n(fetch)?yield this.downloadWithFetch(A,o):yield this.downloadWithXHR(A,o),!n||!n.data)throw new Error("data is empty");let I=ki()-a;return this._log.info("downloaded: ".concat(A,", return type: ").concat(o,", cost: ").concat(I,"ms")),ct.addSuccessEvent({key:522700,cost:ki()-a}),n.data}catch(n){throw this._log.error("failed to download: ".concat(A,", error: ").concat(n)),ct.addFailedEvent({key:522700,error:n}),n}})}downloadWithFetch(A,e){return DA(this,null,function*(){this._log.info("download with fetch: ".concat(A,", return type: ").concat(e));try{let o,n=yield fetch(A);if(!n.ok){let a=new Error("network response was not ok: ".concat(n.status));throw a.status=n.status,a}return o=e==="arraybuffer"?yield n.arrayBuffer():yield n.blob(),{data:o}}catch(o){throw o}})}downloadWithXHR(A,e){return this._log.info("download with xhr: ".concat(A,", return type: ").concat(e)),new Promise((o,n)=>{let a=new XMLHttpRequest;a.open("GET",A,!0),a.responseType=e,a.onload=()=>{if(a.status===200||a.status===0&&a.response)o({data:a.response});else{let I=new Error("XHR failed, status: ".concat(a.status));I.status=a.status,n(I)}},a.onerror=n,a.send(null)})}loadWasm(A,e){return DA(this,null,function*(){this._log.info("loadWasm ".concat(A,", importObject: ").concat(JSON.stringify(e)));let o=ki(),n=null,a=null;if($n(WebAssembly.instantiateStreaming)&&!A.startsWith("data:application/octet-stream;base64,")&&!(I=>I.startsWith("file://"))(A)&&$n(fetch))try{let I=fetch(A);n=(yield WebAssembly.instantiateStreaming(I,e)).instance}catch(I){a=I}if(!n)try{let I=yield this.download(A,{type:"arraybuffer"});n=(yield WebAssembly.instantiate(I,e)).instance}catch(I){a=I}if(n){let I=ki()-o;return this._log.info("loadedWasm ".concat(A,", cost: ").concat(I,"ms")),ct.addSuccessEvent({key:522701,cost:I}),n}throw this._log.error("failed to loadWasm ".concat(A,", error: ").concat(a)),ct.addFailedEvent({key:522701,error:a}),a})}loadScript(A){this._log.info("loadScript ".concat(A));let e=ki();return new Promise((o,n)=>{let a=document.createElement("script");a.type="text/javascript",a.onload=()=>{this._log.info("loadedScript ".concat(A,", cost: ").concat(ki()-e,"ms")),ct.addSuccessEvent({key:522702,cost:ki()-e,split:1e3}),o(a)},a.onerror=I=>{this._log.error("failed to loadScript ".concat(A,", error: ").concat(I?.message||JSON.stringify(I))),ct.addFailedEvent({key:522702}),n(I)},a.crossOrigin="anonymous",a.src=A,document.head.append?document.head.append(a):document.getElementsByTagName("head")[0].appendChild(a)})}};vt([nB({settings:{timeout:0,retries:3},onError(A,e,o){var n;A?.status===404||(n=A?.message)!=null&&n.includes("404")?(this._log.warn("download 404, stop retry"),o(A)):e()},onRetrying(A){this._log.warn("download retrying: ".concat(A))}})],Hq.prototype,"download"),vt([nB({settings:{timeout:3e3,retries:3},onRetrying(A){this._log.warn("loadScript retrying: ".concat(A))}})],Hq.prototype,"loadScript");var Vq=new Hq;function R4(A){let[e,o]=A,n=o.byteLength,a=parseInt(String(n/255),10),I=n%255,c=[];c.push(0,0,0,1,6,e);for(let d=0;dk+_.dataView.byteLength,0),c=new ArrayBuffer(I+e.data.byteLength),u=new DataView(c),d=new DataView(e.data),R=0;for(let k=0;ka.isSEI);o?.(n.reverse())}catch{}return e}function T4(A){let{seiMessageList:e,isAudio:o,getNtpTime:n,isMain:a}=A;return new TransformStream({transform(I,c){let u=I;o?audioEncodePipeline.forEach(d=>{u=d({frame:u,ntp:n(),onDump:()=>{self.postMessage({type:"dump",isAudio:o,data:u.data,userId:""})}})}):videoEncodePipeline.forEach(d=>{u=d({frame:u,seiMessageList:e,onDump:()=>{self.postMessage({type:"dump",isAudio:o,data:u.data,userId:"",streamType:a?"main":"auxiliary"})}})}),c.enqueue(u)}})}function G4(A){let{userId:e,streamType:o,isAudio:n}=A;return new TransformStream({transform(a,I){let c=a;n?(audioDecodePipeline.forEach(u=>{c=u({frame:c,onAudioFrameNTPTime:d=>{self.postMessage({type:"audio-ntp",data:d,userId:e,streamType:o})},onDump:()=>{self.postMessage({type:"dump",isAudio:n,data:c.data,userId:e})}})}),I.enqueue(c)):videoDecodePipeline.forEach(u=>{c=u({frame:c,onSEI:d=>{d.forEach(R=>{self.postMessage({type:"sei",seiPayloadType:R.seiPayloadType,data:R.seiPayload.buffer,userId:e,streamType:o})})},onDump:()=>{self.postMessage({type:"dump",isAudio:n,data:c.data,userId:e,streamType:o})}})}),I.enqueue(c)}})}function k4(A){let e=[fx],o=[S4,M4,$W,w4,R4,T4,G4,tM,qf,px],n="const videoEncodePipeline=[".concat(A.videoEncodePipeline.toString(),`]; + const videoDecodePipeline=[`).concat(A.videoDecodePipeline.toString(),`]; + const audioEncodePipeline = [`).concat(A.audioEncodePipeline.toString(),`]; + const audioDecodePipeline = [`).concat(A.audioDecodePipeline.toString(),"];"),a="(()=>{".concat(e.map(d=>"const ".concat(d.name,"=(()=>").concat(d.toString(),")()")).join(` +`),` +`).concat(o.map(d=>d.toString()).join(` +`),";(").concat(()=>{let d=[],R=[],k=[],_=0;self.onmessage=Z=>{switch(Z.data.type){case"sei":Z.data.isMain?(d.push(Z.data.data),Z.data.small&&k.push(Z.data.data)):R.push(Z.data.data);break;case"ntp-offset":_=Z.data.data}},self.onrtctransform=Z=>{let{options:iA}=Z.transformer,cA=iA.isReceiver?G4({userId:iA.userId,streamType:iA.streamType,isAudio:iA.isAudio}):T4({getNtpTime:()=>Date.now()+_,isAudio:iA.isAudio,isMain:iA.isMain,seiMessageList:iA.isMain?iA.small?k:d:R});Z.transformer.readable.pipeThrough(cA).pipeTo(Z.transformer.writable)}},")();").concat(n,"})()"),I=new Blob([a],{type:"text/javascript"}),c=URL.createObjectURL(I),u=new Worker(c);return URL.revokeObjectURL(c),u}var _4,Kq=class{constructor(A){G(this,"audioPlayer"),G(this,"videoPlayer"),G(this,"log"),this.audioPlayer=A.audioPlayer,this.videoPlayer=A.videoPlayer,this.log=A.log.createChild({id:"pip"}),this.videoPlayer.on(mi.USER_RESUME_IN_PIP_OR_FULL_SCREEN,this.handleUserResumeInPIPOrFullScreen,this),this.videoPlayer.on(mi.USER_PAUSE_IN_PIP_OR_FULL_SCREEN,this.handleUserPauseInPIPOrFullScreen,this),this.videoPlayer.on(mi.ENTER_PICTURE_IN_PICTURE,this.handleEnterPIPOrFullScreen,this),this.videoPlayer.on(mi.ENTER_FULL_SCREEN,this.handleEnterPIPOrFullScreen,this),this.videoPlayer.on(mi.LEAVE_PICTURE_IN_PICTURE,this.handleLeavePIP,this),this.videoPlayer.on(mi.LEAVE_FULL_SCREEN,this.handleLeaveFullScreen,this),this.videoPlayer.on(mi.VOLUME_CHANGE,this.handleVolumeChange,this)}handleUserResumeInPIPOrFullScreen(){this.audioPlayer.isPaused&&(this.log.warn("resume audio in ".concat(this.videoPlayer.isPictureInPicture()?"pip":"fullscreen")),this.audioPlayer.doResume()),ra&&Gh&&this.videoPlayer.resetSrcObjectToReplay()}handleUserPauseInPIPOrFullScreen(){this.audioPlayer.isPaused||(this.log.warn("pause audio in ".concat(this.videoPlayer.isPictureInPicture()?"pip":"fullscreen")),this.audioPlayer.doPause())}handleEnterPIPOrFullScreen(){this.videoPlayer.element&&this.audioPlayer.muted!==this.videoPlayer.element.muted&&(this.log.warn("sync video muted to ".concat(this.audioPlayer.muted," when enter ").concat(this.videoPlayer.isPictureInPicture()?"pip":"fullscreen")),this.videoPlayer.element.muted=this.audioPlayer.muted)}handleLeavePIP(){this.audioPlayer.isPaused&&!this.audioPlayer.isPausedByUserCall&&(this.log.warn("resume after leave pip"),this.audioPlayer.doResume()),this.videoPlayer.isPaused&&!this.videoPlayer.isPausedByUserCall&&(this.log.warn("resume video after leave pip"),this.videoPlayer.doResume())}handleLeaveFullScreen(){this.audioPlayer.isPaused&&!this.audioPlayer.isPausedByUserCall&&(this.log.warn("resume audio after leave fullscreen"),this.audioPlayer.doResume()),this.videoPlayer.isPaused&&!this.videoPlayer.isPausedByUserCall&&(this.log.warn("resume video after leave fullscreen"),ra&&Gh?this.videoPlayer.resetSrcObjectToReplay():this.videoPlayer.doResume())}handleVolumeChange(A){A.muted!==void 0&&this.audioPlayer.muted!==A.muted&&(this.log.warn("sync audio muted to ".concat(A.muted," in ").concat(this.videoPlayer.isPictureInPicture()?"pip":"fullscreen")),this.audioPlayer.setMuted(A.muted))}destroy(){this.videoPlayer.off(mi.USER_RESUME_IN_PIP_OR_FULL_SCREEN,this.handleUserResumeInPIPOrFullScreen,this),this.videoPlayer.off(mi.USER_PAUSE_IN_PIP_OR_FULL_SCREEN,this.handleUserPauseInPIPOrFullScreen,this),this.videoPlayer.off(mi.ENTER_PICTURE_IN_PICTURE,this.handleEnterPIPOrFullScreen,this),this.videoPlayer.off(mi.ENTER_FULL_SCREEN,this.handleEnterPIPOrFullScreen,this),this.videoPlayer.off(mi.LEAVE_PICTURE_IN_PICTURE,this.handleLeavePIP,this),this.videoPlayer.off(mi.LEAVE_FULL_SCREEN,this.handleLeaveFullScreen,this),this.videoPlayer.off(mi.VOLUME_CHANGE,this.handleVolumeChange,this)}},b4=!1;function deA(A){var e=this;let{TRTC:o,room:n,errorModule:a,assetsPath:I}=A;return{TRTC:o,LocalMixVideoTrack:Fq,LocalVideoTrack:Ru,LocalScreenTrack:Nm,room:n,assetsPath:I,fileDownloader:Vq,innerEmitter:S,INNER_EVENT:K,constants:WU,environment:GO,utils:e4,eventLogger:Jo,log:this.room.getLogger(),loggerManager:nA,errorModule:a,kvStatManager:ct,rtcDectection:kA,trtc:this,rx:NW,enums:oe,schedule:p4,getDevices:Ix,initVisionTaskRegistry:function(c,u){let d=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"/mediapipe/vision.js";return DA(e,null,function*(){!window.VisionTaskRegistry&&!b4&&(b4=!0,_4=Vq.loadScript("".concat(c,"/").concat(d).replace(/([^:]\/)\/+/g,"$1"))),yield _4,yield(yield window.VisionTaskRegistry.getInstance(c)).preloadModels(u)})},audioContext:tI(),deviceDetector:vs,AudioPlayer:Dq,RemoteAudioPlayer:yW,VideoPlayer:wi,showAutoPlayDialog:nC,Timer:nn,clearStarted:(c,u)=>{let d=c.getAlias(),R=oG.instances.get(this);if(R)if(u){let k=R.get(d+u);if(!k)return;k.started=!1}else R.forEach((k,_)=>{_.startsWith(d)&&(k.started=!1)})},startGetPCM:Yq,createAudioNode:ax,getNetworkTimeOffset:KU,validateSourceNode:()=>{var c;if(Yr&&((c=this.room.audioManager._localAudioPipline)==null||!c.source.node))throw new vi({code:Si.DEVICE_ERROR,extraCode:5310,message:"The audio processing plugin cannot be used due to the microphone's sampling rate is not 48KHz in Firefox. Please switch to another browser such as Chrome."})},createScriptTransformWorker:k4,AVPlayerStateSyncManager:Kq,PlayerEvent:mi}}var PM=new WeakMap,L4="5.15.3-beta.12";function vI(){for(var A=arguments.length,e=new Array(A),o=0;ofunction(){for(var I=arguments.length,c=new Array(I),u=0;ufunction(){for(var I=arguments.length,c=new Array(I),u=0;umh(k)?Yf(k):Sr(k)?k:ya(k))},value:o}})}else if(!Ee(e.type)&&ya(o)!==e.type)throw new vi(c(5002));if(e.allowEmpty===!1){let R=hr(o)&&(o===0||Number.isNaN(o)),k=Sr(o)&&o.trim()==="";if(R||k)throw new vi(c(5003))}if(e.notLessThanZero&&hr(o)&&o<0)throw new vi(c(5006));if(!Ee(e.min)&&hr(o)&&oe.max)throw new vi(c(5008));if(Sr(e.instanceOf)){if(!o||o._name!==e.instanceOf)throw new vi(c(5004))}else if($n(e.instanceOf)&&!(o instanceof e.instanceOf))throw new vi(c(5004));if(Array.isArray(e.values)&&!e.values.includes(o))throw new vi(c(5005));let{properties:u}=e;Cc(u)&&Xc(o)&&Object.keys(u).forEach(R=>{_x.call(this,{rule:u[R],value:o&&o[R],key:"".concat(R),fnName:a,className:I})});let{arrayItem:d}=e;Cc(d)&&Aa(o)&&o.forEach((R,k)=>{_x.call(this,{rule:d,value:R,key:"".concat(n,"[").concat(k,"]"),fnName:a,className:I})}),$n(e.validate)&&e.validate.call(this,o,n,a,I,this)}var heA=0;function Hn(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},{getRemoteId:e=()=>"",replaceArg:o,getKVReportKey:n,ignoreLog:a,ignoreErrorLog:I}=A;return Dn((c,u)=>function(){for(var d=arguments.length,R=new Array(d),k=0;k0?TA.info("".concat(u,"() ").concat(JA," ").concat(JSON.stringify(R,(Ft,ie)=>cA(Ft,ie,["userSig","privateMapKey"])))):TA.info("".concat(u,"() ").concat(JA));let Ie=n?n(...R):KO[u],XA=I?.(...R)||!1;try{let Ft=c.apply(this,R),ie=ki();if(fh(Ft)){let ke="".concat(u.includes("Plugin")?"".concat(((Z=(_=R[0]).getName)==null?void 0:Z.call(_))||""," "):" ");return Ft.then(Nt=>(TA.info("".concat(u,"() success ").concat(JA," ").concat(ke).concat(e.call(this,...R))),ct.addSuccessEvent({key:Ie,cost:ki()-ie}),Nt)).catch(Nt=>{var Ut;let Ui=(Nt=vi.convertFrom.call(this,Nt,u,R.length===1?R[0]:R)).extraCode||Nt.code,Oi=(Ut=Nt.message)!=null&&Ut.includes(Ui)?"":" code:".concat(Ui),or=Nt?.code===Si.OPERATION_ABORT;throw XA||TA[or?"warn":"error"]("".concat(u,"() failed ").concat(JA," ").concat(ke).concat(e.call(this,...R)," ").concat(Nt).concat(Oi," params: ").concat(JSON.stringify(R,cA))),ct.addFailedEvent({key:Ie,error:Nt}),Nt})}return ct.addSuccessEvent({key:Ie}),Ft}catch(Ft){let ie=(Ft=vi.convertFrom.call(this,Ft,u)).extraCode||Ft.code,ke=(iA=Ft.message)!=null&&iA.includes(ie)?"":" code:".concat(ie),Nt=Ft?.code===Si.OPERATION_ABORT;throw XA||TA[Nt?"warn":"error"]("".concat(u,"() failed ").concat(JA," ").concat(Ft).concat(ke," params: ").concat(JSON.stringify(R,cA))),ct.addFailedEvent({key:Ie,error:Ft}),Ft}})}var Wq,zq=A=>Dn((e,o)=>function(n,a){return DA(this,null,function*(){let I=this._plugins.get(n);if(!I)throw this._log.error("plugin ".concat(String(n)," is not found")),new vi({code:Si.OPERATION_ABORT,message:"plugin ".concat(String(n)," is not found"),fnName:o});if($n(I.constructor.isSupported)&&!I.constructor.isSupported())throw this._log.error("plugin ".concat(String(n)," is not supported")),new vi({code:Si.ENV_NOT_SUPPORTED,message:"plugin ".concat(String(n)," is not supported"),extraCode:5210,fnName:o});return jq.call(this,I.getValidateRule(A),[a],o,"TRTC"),e.call(this,I,a)})}),Zq=0,bx=class DG{constructor(e){this.core=e,G(this,"log"),G(this,"customAudioReferenceMap",new Map),G(this,"audioRefId",0),G(this,"audioContext",tI()),G(this,"localAudioWorkletNode"),G(this,"screenAudioWorkletNode"),G(this,"mixNode"),G(this,"silentNode"),Zq+=1,this.log=e.log.createChild({id:"".concat(this.getAlias()).concat(Zq)}),this.log.info("created id=".concat(this.getAlias()).concat(Zq)),this.installEvent()}static getStartValidateRule(e){return{name:"options",required:!0,type:"object",properties:{sdkAppId:{type:"number",required:!0},userId:{type:"string",required:!0},userSig:{type:"string",required:!0}},validate(o,n,a,I){if(!e.room.audioManager.hasAudioTrack&&!e.room.audioManager.hasScreenAudioTrack)throw new vi({code:Si.INVALID_OPERATION,extraCode:5106,fnName:a})}}}preload(e){return Wq||(Wq=this.doPreload(e)),Wq}doPreload(e){return DA(this,null,function*(){let o=yield this.core.fileDownloader.download(e,{type:"blob"}),n=URL.createObjectURL(o);try{yield Fa(this.audioContext,n)}catch(a){this.log.error("preload audioProcessor failed. ".concat(a))}finally{URL.revokeObjectURL(n)}})}getName(){return DG.Name}getAlias(){return"ap"}getGroup(){return"ap"}getValidateRule(e){switch(e){case"start":return DG.getStartValidateRule(this.core);case"update":return DG.updateValidateRule;case"stop":return DG.stopValidateRule}}start(e){return DA(this,null,function*(){var o,n,a,I;let{room:c}=this.core,{sdkAppId:u,userId:d,userSig:R,assetsPath:k=this.core.assetsPath,audioReference:_,processLevel:Z,enableDump:iA,isLocalAudioNeedAudioProcess:cA=!0,isScreenAudioNeedAudioProcess:TA=!1}=e;if(this.core.room.audioManager.isLocalAudioNeedAudioProcess=cA,this.core.room.audioManager.isScreenAudioNeedAudioProcess=TA,!k)throw new vi({code:Si.INVALID_PARAMETER,message:"you need to deploy the assets of the npm package and set assetsPath param in TRTC.create()"});if(this.core.validateSourceNode(),yield this.preload("".concat(k,"/audioProcessor-wasm.js")),cA&&!this.localAudioWorkletNode){let{sign:JA,status:Ie,timestamp:XA}=yield this.getAuthData(u,d,R);this.localAudioWorkletNode=new AudioWorkletNode(this.audioContext,"trtc-audio-processor",{numberOfInputs:2,numberOfOutputs:1}),this.initWorkletNode(this.localAudioWorkletNode,"localAudio",u,d,XA,JA,Ie,c)}if(TA&&!this.screenAudioWorkletNode){let{sign:JA,status:Ie,timestamp:XA}=yield this.getAuthData(u,d,R);this.screenAudioWorkletNode=new AudioWorkletNode(this.audioContext,"trtc-audio-processor",{numberOfInputs:2,numberOfOutputs:1}),this.initWorkletNode(this.screenAudioWorkletNode,"screenAudio",u,d,XA,JA,Ie,c)}this.mixNode||(this.mixNode=this.audioContext.createGain(),this.mixNode.gain.value=1),this.silentNode||(this.silentNode=this.audioContext.createConstantSource(),this.silentNode.offset.setValueAtTime(0,this.audioContext.currentTime),this.silentNode.start()),(o=this.localAudioWorkletNode)==null||o.port.postMessage({type:"enable"}),(n=this.screenAudioWorkletNode)==null||n.port.postMessage({type:"enable"}),c.audioManager.addAudioProcessor(this.mixNode,this.silentNode,this.localAudioWorkletNode,this.screenAudioWorkletNode),Ee(_)||_.forEach(JA=>{this.customAudioReferenceMap.set(JA,"o-".concat(this.audioRefId++)),this.core.room.audioManager.updateAudioReference({type:"add",audioReference:JA,refId:"o-".concat(this.audioRefId++)})}),Ee(Z)||(a=this.localAudioWorkletNode)==null||a.port.postMessage({type:"setConfig",data:{aecEnable:1,aecNlpLevel:Z}}),Ee(iA)||(I=this.localAudioWorkletNode)==null||I.port.postMessage({type:"dump",data:{enable:iA}})})}update(e){return DA(this,null,function*(){var o,n,a;let{audioReference:I,enableDump:c,processLevel:u}=e;Ee(I)||(this.customAudioReferenceMap.forEach((d,R)=>{this.customAudioReferenceMap.delete(R),this.core.room.audioManager.updateAudioReference({type:"remove",refId:d})}),I.forEach(d=>{this.customAudioReferenceMap.set(d,"o-".concat(this.audioRefId++)),this.core.room.audioManager.updateAudioReference({type:"add",audioReference:d,refId:"o-".concat(this.audioRefId++)})})),Ee(u)||(o=this.localAudioWorkletNode)==null||o.port.postMessage({type:"setConfig",data:{aecEnable:1,aecNlpLevel:u}}),Ee(c)||((n=this.localAudioWorkletNode)==null||n.port.postMessage({type:"dump",data:{enable:c}}),(a=this.screenAudioWorkletNode)==null||a.port.postMessage({type:"dump",data:{enable:c}}))})}stop(){return DA(this,null,function*(){var e,o;let{room:n}=this.core;(e=this.localAudioWorkletNode)==null||e.port.postMessage({type:"disable"}),(o=this.screenAudioWorkletNode)==null||o.port.postMessage({type:"disable"}),yield n.audioManager.removeAudioProcessor(this.localAudioWorkletNode,this.screenAudioWorkletNode)})}destroy(){this.localAudioWorkletNode&&(this.localAudioWorkletNode.port.onmessage=null),this.screenAudioWorkletNode&&(this.screenAudioWorkletNode.port.onmessage=null),this.uninstallEvent()}getAuthData(e,o,n){return DA(this,null,function*(){let a=String(Date.now()).slice(0,-3),{auth:I,sign:c,status:u,message:d}=yield function(R){return DA(this,arguments,function(k){let{sdkAppId:_,userId:Z,userSig:iA,timestamp:cA}=k;return function*(){let TA="".concat(function(Ui){let Oi=arguments.length>1&&arguments[1]!==void 0?arguments[1]:fA.MAIN;return"https://".concat(jQ[Oi]||Jq(Ui,Oi),"/api/v1/audioAiAuth")}(_),"?sdkAppId=").concat(_,"&userId=").concat(Z,"&userSig=").concat(iA,"×tamp=").concat(cA),JA=yield fetch(TA),{data:{errCode:Ie,errMsg:XA,sign:Ft,status:ie}}=yield JA.json();if(ie==="1")return{auth:!0,sign:Ft,status:ie,message:XA};let ke=ol(_)?"https://trtc.io/document/42734?platform=web&product=rtcengine&menulabel=coresdk":"https://cloud.tencent.com/document/product/647/44247",Nt="Init RTCAudioProcessor failed.",Ut="";switch(Ie){case 1:Ut="Please check your params.";break;case 2:Ut="You need to buy packages. Refer to: ".concat(ke);break;case 3:Ut="Server is invalid. Please contact our engineer. ";break;case 4:Ut="Your packages is not active. Refer to: ".concat(ke);break;case 5:Ut="Your packages is expired. Refer to: ".concat(ke);break;case 6:Ut="Your version is not supported."}return{auth:!1,status:ie,message:XA?"".concat(Nt," Reason: ").concat(XA,". ").concat(Ut):"".concat(Nt,", ").concat(Ut)}}()})}({sdkAppId:e,userSig:n,userId:o,timestamp:a});if(!I)throw this.log.info("audioProcessor: ".concat(o," auth result: ").concat(I,". Message: ").concat(d)),new vi({code:Si.INVALID_PARAMETER,message:d});return{sign:c,status:u,timestamp:a}})}initWorkletNode(e,o,n,a,I,c,u,d){e.port.postMessage({type:"init",data:{sdkAppId:String(n),userId:a,timestamp:I,sign:c,status:u}}),e.port.onmessage=R=>{var k;let{data:_}=R;switch(_.type){case"cost":let Z=_?.value>10?"info":"debug";return void this.log[Z]("".concat(o==="localAudio"?"":"[".concat(o,"] "),"avg cost: ").concat(_.value," max: ").concat(_?.max,"(").concat(lN(new Date(_?.maxCostTimestamp)),") hist: ").concat((k=_?.hist)==null?void 0:k.join(" ")));case"log":return void this.log[_.logLevel]("".concat(o==="localAudio"?"":"[".concat(o,"] ")).concat(_.value));case"dump":return void S.emit("265",{room:d,data:_.value,type:o==="localAudio"?"dump":"dump-screen-audio"});case"detectEcho":return void this.log.warn("".concat(o==="localAudio"?"":"[".concat(o,"] "),"detect echo: ").concat(QM()?Qu():bQ()))}}}handleLocalAudioStarted(e){return DA(this,null,function*(){var o;if(this.hitTest(e.room)&&((o=this.core.room.scheduleResult.config)==null?void 0:o.audioProcessor)===!0)try{yield this.core.trtc.startPlugin("AudioProcessor",{sdkAppId:this.core.room.sdkAppId,userId:this.core.room.userId,userSig:this.core.room.userSig}),this.log.warn("audio processor auto start success")}catch(n){this.log.warn("audio processor auto start failed, error: ".concat(n))}})}handleLocalAudioStopped(e){return DA(this,null,function*(){var o;!this.hitTest(e.room)||((o=this.core.room.scheduleResult.config)==null?void 0:o.audioProcessor)!==!0||(yield this.core.trtc.stopPlugin("AudioProcessor"))})}installEvent(){this.core.innerEmitter.on("104",this.handleLocalAudioStarted,this),this.core.innerEmitter.on("114",this.handleLocalAudioStopped,this)}uninstallEvent(){this.core.innerEmitter.off("104",this.handleLocalAudioStarted,this),this.core.innerEmitter.off("114",this.handleLocalAudioStopped,this)}hitTest(e){return e===this.core.room}};G(bx,"updateValidateRule",{type:"object"}),G(bx,"stopValidateRule",{type:"object"}),G(bx,"Name","AudioProcessor");var peA=bx,Xq=0,feA=class{constructor(A,e){G(this,"audioObjectURL"),G(this,"player"),G(this,"publisher"),G(this,"mixInput"),this.mixInput=new QW(e),A.url?(this.player=new Audio(A.url),this.player.crossOrigin="anonymous",this.publisher=new Audio(A.url),this.publisher.crossOrigin="anonymous",this.mixInput.replaceSource(this.publisher)):this.mixInput.replaceSource(A.track),this.mixInput.connect()}updateSettings(A){this.player&&(Ee(A.volume)||(this.volume=A.volume),Ee(A.loop)||(this.loop=A.loop),Ee(A.playbackRate)||(this.playbackRate=A.playbackRate))}updateListener(A){if(this.player){if(A.onDurationChange){let{onDurationChange:e}=A;this.player.ondurationchange=o=>{e(o.target.duration)}}if(A.onTimeUpdate){let e=A.onTimeUpdate,{player:o}=this;o.ontimeupdate=()=>{e(o.currentTime,o.duration)}}A.onEnded&&(this.player.onended=A.onEnded)}}reload(A){return DA(this,null,function*(){if(A.url){let e=yield Vq.download(A.url,{retries:3,type:"blob"});this.audioObjectURL&&URL.revokeObjectURL(this.audioObjectURL),this.audioObjectURL=URL.createObjectURL(e),this.player&&this.publisher?(this.player.src=this.audioObjectURL,this.publisher.src=this.audioObjectURL):(this.player=new Audio(this.audioObjectURL),this.player.crossOrigin="anonymous",this.publisher=new Audio(this.audioObjectURL),this.publisher.crossOrigin="anonymous",this.mixInput.replaceSource(this.publisher),this.updateListener(A),this.updateSettings(A))}else this.mixInput.replaceSource(A.track)})}reset(){this.seek(0),this.mixInput.connect()}seek(A){this.player&&(A<0&&A>this.player.duration||(this.player.currentTime=A,this.publisher.currentTime=A))}play(){var A,e;return Promise.all([(A=this.player)==null?void 0:A.play(),(e=this.publisher)==null?void 0:e.play()])}pause(){var A,e;(A=this.player)==null||A.pause(),(e=this.publisher)==null||e.pause()}stop(){var A;(A=this.player)==null||A.pause(),this.mixInput.disconnect()}setOperation(A){A==="pause"&&this.pause(),A==="resume"&&(this.pause(),this.play()),A==="stop"&&(this.pause(),this.seek(0))}set volume(A){!this.player||!this.publisher||(this.player.volume=A,this.publisher.volume=A)}set loop(A){!this.player||!this.publisher||(this.player.loop=A,this.publisher.loop=A)}set playbackRate(A){!this.player||!this.publisher||(this.player.playbackRate=A,this.publisher.playbackRate=A)}};function JM(A,e){if(e&&typeof e!="function")throw new vi({code:Si.INVALID_PARAMETER,message:"start audioMixer plugin: param ".concat(A," should be a function.")})}var nG=class yG{constructor(e){this.core=e,G(this,"log"),G(this,"mixedMusicMap",new Map),G(this,"cacheMusicMap",new Map),Xq+=1,this.log=e.log.createChild({id:"".concat(this.getAlias()).concat(Xq)}),this.log.info("created id=".concat(this.getAlias()).concat(Xq))}getName(){return yG.Name}getAlias(){return"ax"}getGroup(e){return e?.id}getValidateRule(e){switch(e){case"start":return yG.startValidateRule;case"update":return yG.updateValidateRule;case"stop":return yG.stopValidateRule}}start(e){return DA(this,null,function*(){let{room:o}=this.core;this.core.validateSourceNode(),this.log.info("add music source, id: ".concat(e.id," url: ").concat(e.url,", track: ").concat(e.track));let{id:n,url:a}=e;if(this.mixedMusicMap.has(n))return;let I=this.cacheMusicMap.get(n);I?e.url?I.reset():(I.mixInput.replaceSource(e.track),I.mixInput.connect()):(I=new feA(e,o.audioManager),this.cacheMusicMap.set(n,I)),I.updateListener(e),I.updateSettings(e);try{yield I.play()}catch(c){yield this.handleAutoPlayFailed(I,e,c)}this.mixedMusicMap.set(n,I),I.mixInput.source.node&&this.core.room.audioManager.updateAudioReference({type:"add",audioReference:I.mixInput.source.node,refId:"ax-".concat(n)}),this.log.info("start mix audio track ".concat(n," success.")),ct.addEnum({key:502700,value:3}),this.kvUpload(e)})}handleAutoPlayFailed(e,o,n){return DA(this,null,function*(){if(n.name==="NotSupportedError")this.log.error("play failed, try to reload source. error: ".concat(n)),yield e.reload(o),yield e.play();else{if(n.name!=="NotAllowedError")throw n;if(this.core.room.enableAutoPlayDialog){let a=()=>{var I;(I=e.play())==null||I.finally(()=>{S.off("154",a,this)})};S.on("154",a,this),nC()}else this.core.trtc.emit(Xt.AUTOPLAY_FAILED,{userId:"",mediaType:"audio",resume:()=>DA(this,null,function*(){return e.play()})})}})}update(e){return DA(this,null,function*(){let{id:o,operation:n,seekFrom:a,playbackRate:I}=e;this.log.info("update music source, ".concat(JSON.stringify(e)));let c=this.mixedMusicMap.get(o);c?(c.updateSettings(e),c.updateListener(e),Ee(n)||c.setOperation(n),Ee(a)||c.seek(a),this.kvUpload(e)):this.log.warn("update music source failed, music id: ".concat(o," not found."))})}stop(e){return DA(this,arguments,function(o){var n=this;let{id:a}=o;return function*(){if(n.mixedMusicMap.has(a)){n.log.info("remove music source, music id: ".concat(a));let I=n.mixedMusicMap.get(a);I!=null&&I.mixInput.source.node&&n.core.room.audioManager.updateAudioReference({type:"remove",audioReference:I.mixInput.source.node,refId:"ax-".concat(a)}),I?.stop(),n.mixedMusicMap.delete(a)}a==="*"&&n.destroyAllMusic()}()})}kvUpload(e){let{track:o,loop:n,volume:a,playbackRate:I,operation:c,seekFrom:u,onTimeUpdate:d,onDurationChange:R,onEnded:k}=e;o&&ct.addCount({key:502009}),n&&ct.addCount({key:502001}),a&&ct.addCount({key:502002}),I&&ct.addCount({key:502003}),c&&ct.addCount({key:502004}),u&&ct.addCount({key:502005}),typeof d!="function"&&ct.addCount({key:502007}),typeof k!="function"&&ct.addCount({key:502008}),typeof R!="function"&&ct.addCount({key:502006})}destroyAllMusic(){this.log.info("destroy all music source."),this.mixedMusicMap.forEach((e,o)=>{e!=null&&e.mixInput.track&&this.core.room.audioManager.updateAudioReference({type:"remove",audioReference:e.mixInput.track,refId:o}),this.stop({id:o})})}destroyAllCache(){this.log.info("destroy all music cache."),this.cacheMusicMap.clear()}destroy(){this.log.info("destroy audio mixer plugin."),this.destroyAllMusic(),this.destroyAllCache()}};G(nG,"startValidateRule",{name:"options",required:!0,type:"object",properties:{id:{type:"string",required:!0},url:{type:"string",required:!1},track:{required:!1},loop:{type:"boolean"},volume:{type:"number"}},validate(A,e,o){if(A.url&&A.url!=="*"){let n=A.url.split("?")[0],a=["mp3","ogg","wav","flac"],I=n.split(".").pop(),c=a.indexOf(I)>=0,u=n.startsWith("blob"),d=n.startsWith("data");if(!(c||u||d))throw new vi({code:Si.INVALID_PARAMETER,message:"start audioMixer plugin: music url is invalid, please check your file format.",fnName:o})}if(!A.url&&!A.track)throw new vi({code:Si.INVALID_PARAMETER,message:"start audioMixer plugin: param url or track is required.",fnName:o});JM("onTimeUpdate",A.onTimeUpdate),JM("onEnded",A.onEnded),JM("onDurationChange",A.onDurationChange)}}),G(nG,"updateValidateRule",{name:"options",required:!0,type:"object",properties:{id:{type:"string",required:!0},loop:{type:"boolean"},volume:{type:"number"},seekFrom:{type:"number"},operation:{type:"string",values:["pause","resume","stop"]}},validate(A,e,o){JM("onTimeUpdate",A.onTimeUpdate),JM("onEnded",A.onEnded),JM("onDurationChange",A.onDurationChange)}}),G(nG,"stopValidateRule",{name:"options",type:"object",required:!0,properties:{id:{type:"string",required:!0}}}),G(nG,"Name","AudioMixer");var $q,meA=nG,AK=0,Lx=class RG{constructor(e){this.core=e,G(this,"log"),G(this,"audioContext",tI()),G(this,"workletNode"),G(this,"config",{enableFarFieldReduce:!1,farFieldReduceThreshold:.5}),AK+=1,this.log=e.log.createChild({id:"".concat(this.getAlias()).concat(AK)}),this.log.info("created id=".concat(this.getAlias()).concat(AK))}static startValidateRule(e){return{name:"options",required:!0,type:"object",properties:{sdkAppId:{type:"number",required:!0},userId:{type:"string",required:!0},userSig:{type:"string",required:!0},mode:{type:"number",required:!1,values:[0,1]},farFieldReduceThreshold:{type:"number",required:!1,min:0,max:1}},validate(o,n,a,I){if(!e.room.audioManager.hasAudioTrack)throw new vi({code:Si.INVALID_OPERATION,extraCode:5106,fnName:a})}}}preload(e){return $q||($q=this.doPreload(e)),$q}doPreload(e){return DA(this,null,function*(){let o=yield this.core.fileDownloader.download(e,{type:"blob"}),n=URL.createObjectURL(o);try{yield Fa(this.audioContext,n)}catch(a){throw this.log.error("load worklet failed",a),a}finally{URL.revokeObjectURL(n)}})}getName(){return RG.Name}getAlias(){return"ad"}getGroup(){return"AIDenoiser"}getValidateRule(e){switch(e){case"start":return RG.startValidateRule(this.core);case"update":return RG.updateValidateRule;case"stop":return RG.stopValidateRule}}start(e){return DA(this,null,function*(){let{room:o,schedule:n}=this.core,{assetsPath:a=this.core.assetsPath}=e;if(!a)throw new vi({code:Si.INVALID_PARAMETER,message:"you need to deploy the assets of the npm package and set assetsPath param in TRTC.create()"});if(this.core.validateSourceNode(),yield this.preload("".concat(a,"/denoiser-wasm").concat(dm()?"":"-nosimd",".js")),!this.workletNode){let I=String(Date.now()).slice(0,-3),{auth:c,sign:u,status:d,message:R}=yield function(k,_){return DA(this,arguments,function(Z,iA){let{sdkAppId:cA,userId:TA,userSig:JA,timestamp:Ie}=iA;return function*(){try{let{data:{errCode:XA,errMsg:Ft,sign:ie,status:ke}}=yield Z.getAbilityConfig(cA,Z.ScheduleRequestType.AUDIO_AI_AUTH,{sdkAppId:cA,userId:TA,userSig:JA,timestamp:Ie});if(ke==="1")return{auth:!0,sign:ie,status:ke,message:Ft};let Nt=ol(cA)?"https://trtc.io/document/42734?platform=web&product=rtcengine&menulabel=coresdk":"https://cloud.tencent.com/document/product/647/44247",Ut="Init RTCAIDenoiser failed.",Ui="";switch(XA){case 1:Ui="Please check your params.";break;case 2:Ui="You need to buy packages. Refer to: ".concat(Nt);break;case 3:Ui="Server is invalid. Please contact our engineer. ";break;case 4:Ui="Your packages is not active. Refer to: ".concat(Nt);break;case 5:Ui="Your packages is expired. Refer to: ".concat(Nt);break;case 6:Ui="Your version is not supported."}return{auth:!1,status:ke,message:Ft?"".concat(Ut," Reason: ").concat(Ft,". ").concat(Ui):"".concat(Ut,", ").concat(Ui)}}catch(XA){return{auth:!1,status:"0",message:"Init RTCAIDenoiser failed. All requests failed. ".concat(XA)}}}()})}(n,fi(bt({},e),{timestamp:I}));if(!c)throw this.log.info("RTCAIDenoiser: ".concat(e.userId," auth result: ").concat(c,". Message: ").concat(R)),new vi({code:Si.INVALID_PARAMETER,message:R});this.workletNode=new AudioWorkletNode(this.audioContext,"trtc-denoiser-processor",{numberOfInputs:1,numberOfOutputs:1}),this.workletNode.port.postMessage({type:"init",data:{sdkAppId:String(e.sdkAppId),userId:e.userId,timestamp:I,sign:u,status:d}}),this.workletNode.port.onmessage=k=>{var _;let{data:Z}=k;if(Z.type==="cost"){let iA=Z?.max>20?"warn":Z?.max>10?"info":"debug";this.log[iA]("avg cost: ".concat(Z.value," max: ").concat(Z?.max,"(").concat(lN(new Date(Z?.maxCostTimestamp)),") hist: ").concat((_=Z?.hist)==null?void 0:_.join(" ")))}else Z.type==="log"&&this.log[Z.logLevel]("".concat(Z.value))}}this.updateConfig(e),this.workletNode.port.postMessage({type:"enable"}),o.audioManager.addDenoiser(this.workletNode),o.sendAbilityStatus({ai_denoise:1})})}update(e){return DA(this,null,function*(){this.updateConfig(e)})}stop(){return DA(this,null,function*(){if(!this.workletNode)return;let{room:e}=this.core;this.workletNode.port.postMessage({type:"disable"}),yield e.audioManager.removeDenoiser(this.workletNode)})}updateConfig(e){if(!this.workletNode)return;let o=!1;Ee(e.mode)||(e.mode===0?this.config.enableFarFieldReduce=!1:e.mode===1&&(this.config.enableFarFieldReduce=!0),o=!0),Ee(e.farFieldReduceThreshold)||(this.config.farFieldReduceThreshold=e.farFieldReduceThreshold,o=!0),o&&this.workletNode.port.postMessage({type:"setConfig",data:this.config})}destroy(){this.workletNode&&(this.workletNode.port.onmessage=null)}};G(Lx,"updateValidateRule",{type:"object",properties:{mode:{type:"number",required:!1,values:[0,1]},farFieldReduceThreshold:{type:"number",required:!1,min:0,max:1}}}),G(Lx,"stopValidateRule",{type:"object"}),G(Lx,"Name","AIDenoiser");var DeA=Lx,yeA=es(hg(),1),ReA=class extends yeA.EventEmitter{constructor(){super(),G(this,"observer"),G(this,"state","nominal"),this.onPressureChange=this.onPressureChange.bind(this)}get stateNum(){switch(this.state){case"nominal":return 1;case"fair":return 2;case"serious":return 3;case"critical":return 4}}start(){return DA(this,null,function*(){if(!this.observer)try{"PressureObserver"in window&&!ra&&(this.observer=new PressureObserver(this.onPressureChange),yield this.observer.observe("cpu",{sampleInterval:2e3}))}catch(A){Jo.uploadEvent({log:"stat-pressure-detector-start-failed",error:A})}})}onPressureChange(A){let e=this.stateNum,o=A[A.length-1];this.state=o.state,(this.stateNum>3||e>3)&&nA.info("".concat(o.source,": ").concat(o.state)),this.emit("state-changed",{type:o.source,state:this.state})}destroy(){var A;try{(A=this.observer)==null||A.disconnect(),this.observer=null}catch(e){Jo.uploadEvent({log:"stat-pressure-detector-destroy-failed",error:e})}}},U4=new ReA,eK=0,tK=class XZ{constructor(e){this.core=e,G(this,"log"),G(this,"_seiMessageList",[]),G(this,"_smallSeiMessageList",[]),G(this,"_subStreamSeiMessageList",[]),eK++,this.log=e.log.createChild({id:"".concat(this.getAlias()).concat(eK)}),this.log.info("[sei] created id=".concat(this.getAlias()).concat(eK)),this.encode=this.encode.bind(this),this.decode=this.decode.bind(this)}encode(e){let{frame:o,mediaType:n}=e;try{return v4({frame:o,seiMessageList:n===8?this._smallSeiMessageList:n===2?this._subStreamSeiMessageList:this._seiMessageList})}catch(a){this.log.warn(a)}return o}decode(e){let{frame:o,track:n}=e;return N4({frame:o,onSEI:a=>{a.forEach(I=>{n!=null&&n.userId?this.core.trtc.emit(Xt.SEI_MESSAGE,{seiPayloadType:I.seiPayloadType,data:I.seiPayload.buffer,userId:n.userId,streamType:n.mediaType===2?"sub":"main"}):this.core.innerEmitter.emit(this.core.INNER_EVENT.SEI_MESSAGE,{room:this.core.room,nalu:I})})}})}destroy(){this.log.debug("destroy"),this.stop(),delete this.core}getValidateRule(e){switch(e){case"start":case"update":case"stop":return{type:"object"}}}start(){this.core.room.videoManager.addEncodeProcessor({processor:xQ?this.encode:v4,type:2}),this.core.room.videoManager.addDecodeProcessor({processor:xQ?this.decode:N4,type:2})}stop(){this.core.room.videoManager.removeEncodeProcessor({type:2}),this.core.room.videoManager.removeDecodeProcessor({type:2})}update(e){let{buffer:o,options:n}=e;var a;let I=[n.seiPayloadType,o],c=!!n.small;n.toSubStream?this._subStreamSeiMessageList.push(I):(this._seiMessageList.push(I),c&&this._smallSeiMessageList.push(I)),(a=this.core.room.scriptTransformWorker)==null||a.postMessage({type:"sei",data:I,isMain:!n.toSubStream,small:c})}getName(){return XZ.Name}getAlias(){return"sei"}getGroup(){return"sei"}};G(tK,"autoStart",!0),G(tK,"Name","SEI");var Fx,MeA=tK,weA=0,iK=class $Z{constructor(e){this.core=e,G(this,"_core"),G(this,"log"),G(this,"dialog"),this._core=e,this.log=e.log.createChild({id:"".concat(this.getAlias()).concat(++weA)}),this.log.info("created")}getName(){return $Z.Name}getAlias(){return"dm"}getGroup(){return"dm"}getValidateRule(e){switch(e){case"start":return{name:"StartDebugOptions",required:!1};case"update":return{name:"UpdateDebugOptions",required:!1};case"stop":return{name:"StopDebugOptions",required:!1}}}start(){return DA(this,null,function*(){var e;!new URLSearchParams(location.search).has("trtcDebug")&&((e=window.sessionStorage)==null?void 0:e.getItem("TRTC_ENABLE_DEBUG_PLUGIN"))!=="true"||(yield this.openDebugDiaLog())})}update(e){return DA(this,arguments,function(o){var n=this;let{visible:a}=o;return function*(){a?yield n.openDebugDiaLog():n.closeDebugDiaLog()}()})}stop(){this.closeDebugDiaLog()}destroy(){this.stop()}openDebugDiaLog(){return DA(this,null,function*(){var e;if(!this.dialog)try{if(Fx)yield Fx;else{let o=new URLSearchParams(location.search).get("trtcDebugDialogPath")||((e=window.sessionStorage)==null?void 0:e.getItem("TRTC_DEBUG_DIALOG_PATH"))||"https://unpkg.com/".concat("trtc-sdk-v5","@").concat(il,"/assets/debug-dialog.js");Fx=this._core.fileDownloader.loadScript(o),yield Fx}this.dialog=new TRTCDebugDialog(this._core,this.log),this._core.kvStatManager.addSuccessEvent({key:592705})}catch(o){this._core.kvStatManager.addFailedEvent({key:592705}),this.log.error("load debug dialog script failed: ",JSON.stringify(o))}})}closeDebugDiaLog(){this.dialog&&(this.dialog.closeDialog(),this.dialog=null)}};G(iK,"Name","Debug"),G(iK,"autoStart",!0);var SeA=iK,O4=A=>{switch(A){case"webCodecs":return 504703;case"wasm":return 504704}throw new Error("decoder type not supported")},x4=class{constructor(A,e,o){G(this,"trackDoneOB"),G(this,"startOB"),G(this,"stopOB"),G(this,"inputFrameCount",0),G(this,"decodedFrameCount",0),G(this,"type","auto"),G(this,"config"),G(this,"decoder"),G(this,"_decodeSink");let{kvStatManager:n,trtc:a}=A;this.config=o.config,this.trackDoneOB=Ln(e,Uo.INIT),this.stopOB=yu(),this.startOB=yu(),o.type==="auto"?this.type="webCodecs":this.type=o.type;let I=yu();Jn(this.startOB,wq(0),Qx(c=>{let u=this.pipe(e);return I.next("STARTING"),e.log.info("decoder type: ".concat(this.type)),Jn(u,Qc(this.stopOB),Ks(()=>{},d=>{e.log.error(d),n.addFailedEvent({key:O4(this.type),error:d}),c>4?this.startOB.error(d):this.startOB.next(c+1)})),Jn(u,LM(1),XW(Nq))}),Qc(this.stopOB),Ks(()=>{e.player.setOutput(),I.next("STARTED")},c=>{I.next("FAILED")},()=>{n.addSuccessEvent({key:O4(this.type)}),n.addSuccessEvent({key:504702})}))}mock(A){this._decodeSink?this._decodeSink.error(A):this.startOB.next(0)}close(A){this.stopOB.next(A)}pipe(A){return qT()(e=>DA(this,null,function*(){this._decodeSink=e,e.defer(()=>{var n;(n=this.decoder)==null||n.close()});let{type:o}=this;try{o==="webCodecs"&&(this.decoder=new AudioDecoder({error:n=>{A.log.error(n),e.error(4)},output:n=>{this.decodedFrameCount++,e.next(n),A.player.write(n)}})),this.decoder.configure(this.config)}catch(n){A.log.error(n),e.error(o==="webCodecs"?2:6)}}))}decodeFrame(A){var e;this.inputFrameCount++,((e=this.decoder)==null?void 0:e.state)==="configured"&&this.decoder.decode(new EncodedAudioChunk({data:A.data,timestamp:A.timestamp,type:"key"}))}},veA={type:"object"},Y4=class yj{constructor(e){this.core=e,G(this,"log"),G(this,"contextMap",new Map),G(this,"decodeProcessorMap",new WeakMap),this.log=e.log.createChild({id:"".concat(this.getAlias())})}getAlias(){return yj.Name}getGroup(e){return e.track.userId+e.track.streamType}getName(){return yj.Name}getValidateRule(e){return veA}start(e){let{track:o}=e;this.decodeProcessorMap.set(o,this.decode(e)),this.core.room.audioManager.addDecodeProcessor({processor:n=>{let{frame:a,track:I}=n;return this.decodeProcessorMap.has(I)?this.decodeProcessorMap.get(I)({frame:a,track:I}):a},type:3})}decode(e){return o=>{let{frame:n,track:a}=o;if(a!==e.track)return n;if(this.contextMap.has(a))return this.contextMap.get(a).decodeFrame(n);let I=new x4(this.core,a,e);return Jn(I.trackDoneOB,LM(1),Ks(()=>{this.core.clearStarted(this,this.getGroup(e)),this.stop({track:a})})),this.contextMap.set(a,I),I.decodeFrame(n)}}stop(e){let{track:o}=e,n=this.contextMap.get(o);n&&(n.close("stop"),this.contextMap.delete(o),this.contextMap.size===0&&this.core.room.audioManager.removeDecodeProcessor({type:3}))}update(e){let o=this.contextMap.get(e.track);if(o){if(e.type==="mock")return void o.mock(10);o.close("update"),this.contextMap.set(e.track,new x4(this.core,e.track,e))}}};G(Y4,"Name","TRTCAudioDecoder");var P4=Y4,NeA={rttPoorLimit:150,lossPoorLimit:20,rttGoodLimit:100,lossGoodLimit:10,fpsPoorLimit:5,cooldownTime:1e4,poorCount:3,goodCount:5,maxUpgradeFailCount:3},TeA=class{constructor(){G(this,"log"),G(this,"autoMode",{enabled:!1,instance:null,config:NeA,sortedStreamList:[],currentQualityIndex:0}),G(this,"switchControl",{isInternal:!1,isSwitching:!1,lastSwitchTime:0,boundOnStatistics:null}),G(this,"networkMetrics",{frameRate:0,rtt:0,loss:0}),G(this,"counters",{rttUnder:0,lossUnder:0,downgradeCondition:0,upgradeFail:0}),G(this,"onStatistics",A=>{var e,o;if(!this.autoMode.instance)return;let{config:n}=this.autoMode;if(this.networkMetrics.rtt=A.rtt,this.networkMetrics.loss=A.downLoss,this.counters.rttUnder=A.rttk.userId===I);if((o=u?.video)==null||!o.length)return;let d=c==="sub"?"sub":"big",R=u.video.find(k=>k.videoType===d);R?(this.networkMetrics.frameRate=R.frameRate||0,this.checkAndSwitchQuality()):this.log.warn("onStatistics: videoStat not found for userId=".concat(I,", streamType=").concat(c))}),this.log=nA.createLogger({id:"pqs"})}getCurrentPlayingStream(A){var e,o;let n=A,a=n._playbackQualityList;if(!a||a.length===0)return this.log.warn("getCurrentPlayingStream: streamList is empty"),null;for(let I of a){let c=A.room.remotePublishedUserMap.get(I.userId);if(!c)continue;let u=(e=I.streamType)!=null?e:"main";if((u==="sub"?c.remoteAuxiliaryTrack:c.remoteVideoTrack).isPlayCalled){let d=(o=n._remoteVideoConfigMap.get("".concat(I.userId,"_").concat(u)))==null?void 0:o.config;if(d)return{userId:I.userId,streamType:u,config:d}}}return null}switchPlaybackQuality(A){return DA(this,null,function*(){var e;let{trtcInstance:o,streamList:n,quality:a}=A;this.log.info("switchPlaybackQuality quality: ".concat(a,", streamList: ").concat(JSON.stringify(n)));let I=o;if(n&&n.length>0&&(I._playbackQualityList=n.map(cA=>{var TA;return fi(bt({},cA),{streamType:(TA=cA.streamType)!=null?TA:"main"})})),a==="auto")return void(yield this.startAutoMode(o));if(this.autoMode.enabled&&a&&!this.switchControl.isInternal&&this.stopAutoMode(),!a)return;if(!I._playbackQualityList||I._playbackQualityList.length<=0)return void this.log.warn("switchPlaybackQuality: streamList is empty, please call with streamList first");let c=I._playbackQualityList.find(cA=>cA.name===a);if(!c)return void this.log.warn('switchPlaybackQuality: quality "'.concat(a,'" not found in streamList'));let u=this.getCurrentPlayingStream(o);if(this.log.info("currentPlaying userId: ".concat(u?.userId,", streamType: ").concat(u?.streamType)),!u)return;let d=(e=c.streamType)!=null?e:"main";if(u.userId===c.userId&&u.streamType===d)return void this.log.info("switchPlaybackQuality: already playing target stream");let R=bt({},u.config);R.streamType==="main"&&d==="main"&&(yield o.muteRemoteAudio(R.userId,!0));let k,_=new Promise(cA=>{k=cA}),Z=cA=>{cA.userId===c.userId&&cA.streamType===d&&cA.state==="PLAYING"&&cA.reason==="playing"&&k("success")};o.on(Xt.VIDEO_PLAY_STATE_CHANGED,Z);let iA=new Promise(cA=>setTimeout(()=>cA("timeout"),1e4));try{if(yield o.startRemoteVideo(fi(bt({},u.config),{userId:c.userId,streamType:d,option:fi(bt({},u.config.option),{isLiveStream:!0})})),(yield Promise.race([_,iA]))==="timeout"){this.log.error("switchPlaybackQuality: VIDEO_PLAY_STATE_CHANGED timeout, rollback");try{yield o.stopRemoteVideo({userId:c.userId,streamType:d})}catch(TA){this.log.warn("switchPlaybackQuality: rollback stopRemoteVideo failed",TA)}throw R.streamType==="main"&&d==="main"&&(yield o.muteRemoteAudio(R.userId,!1).catch(TA=>{this.log.warn("switchPlaybackQuality: rollback muteRemoteAudio failed",TA)})),new Ct({code:Ge.SUBSCRIPTION_TIMEOUT,message:Wi({key:Mi.SWITCH_PLAYBACK_QUALITY_TIMEOUT,data:{userId:c.userId}})})}let cA=o.stopRemoteVideo(R);R.streamType==="main"&&d==="main"?yield Promise.all([o.muteRemoteAudio(c.userId,!1).catch(TA=>{this.log.warn("muteRemoteAudio(new, false) failed",TA)}),cA]):yield cA,I._currentLiveUserId=c.userId,I._currentLiveStreamType=d}finally{o.off(Xt.VIDEO_PLAY_STATE_CHANGED,Z)}})}startAutoMode(A){return DA(this,null,function*(){if(this.autoMode.enabled)return void this.log.info("auto mode already enabled");let e=A;if(!e._playbackQualityList||e._playbackQualityList.length<=1)return void this.log.warn("startAutoMode: need at least 2 streams in streamList for auto mode");this.autoMode.enabled=!0,this.autoMode.instance=A,this.counters.rttUnder=0,this.counters.lossUnder=0,this.counters.downgradeCondition=0,this.counters.upgradeFail=0,this.switchControl.lastSwitchTime=0;let o=e._playbackQualityList||[];this.autoMode.sortedStreamList=[...o].sort((a,I)=>I.bitrate-a.bitrate),this.log.info("auto mode streams: ".concat(this.autoMode.sortedStreamList.map(a=>"".concat(a.name,"(").concat(a.bitrate,"kbps)")).join(" > ")));let n=this.getCurrentPlayingStream(A);if(n){let{userId:a,streamType:I}=n,c=this.autoMode.sortedStreamList.findIndex(u=>{var d;return u.userId===a&&((d=u.streamType)!=null?d:"main")===I});this.autoMode.currentQualityIndex=c>=0?c:0}else this.autoMode.currentQualityIndex=0;this.switchControl.boundOnStatistics=this.onStatistics,A.on(Xt.STATISTICS,this.switchControl.boundOnStatistics),this.log.info("auto mode started")})}stopAutoMode(){this.autoMode.enabled&&(this.autoMode.instance&&this.switchControl.boundOnStatistics&&this.autoMode.instance.off(Xt.STATISTICS,this.switchControl.boundOnStatistics),this.switchControl.boundOnStatistics=null,this.autoMode.enabled=!1,this.autoMode.instance=null,this.autoMode.sortedStreamList=[],this.autoMode.currentQualityIndex=0,this.counters.rttUnder=0,this.counters.lossUnder=0,this.counters.downgradeCondition=0,this.counters.upgradeFail=0,this.networkMetrics.frameRate=0,this.networkMetrics.rtt=0,this.networkMetrics.loss=0,this.switchControl.isSwitching=!1,this.log.info("auto mode stopped"))}checkAndSwitchQuality(){var A;if(!this.autoMode.enabled||!this.autoMode.instance||this.switchControl.isSwitching)return;let{config:e}=this.autoMode,o=Date.now()-this.switchControl.lastSwitchTime0,c=this.networkMetrics.frameRate<=e.fpsPoorLimit,u=this.networkMetrics.loss>=e.lossPoorLimit||this.networkMetrics.rtt>=e.rttPoorLimit,d=c&&u;this.counters.downgradeCondition=d?this.counters.downgradeCondition+1:0;let R=this.counters.rttUnder>=e.goodCount&&this.counters.lossUnder>=e.goodCount,k=this.counters.upgradeFail{if(k.remoteAudioTrack.isAvailable){if(d.get(k.userId))return;let _=u.getPCM(Z=>{e.emit(Xt.AUDIO_FRAME,Z)},k.userId);d.set(k.userId,_)}});else{if(d.get(n))return;let k=u.getPCM(_=>{e.emit(Xt.AUDIO_FRAME,_)},n);d.set(n,k)}else if(n==="*")e.room.remotePublishedUserMap.forEach(k=>{if(k.remoteAudioTrack.isSubscribed){let{userId:_}=k,Z=d.get(_);Z?.abort("disable"),d.delete(_)}});else{let k=d.get(n);k?.abort("disable"),d.delete(n)}})}resumeRemotePlayer(A){return DA(this,null,function*(){if(A.userId==="*"){let o=[];return A.trtcInstance.room.remotePublishedUserMap.forEach(n=>{let{remoteAudioTrack:a,remoteVideoTrack:I,remoteAuxiliaryTrack:c}=n;A.streamType?A.streamType==="main"?(a.isAvailable&&o.push(a.player.resume()),I.isAvailable&&o.push(I.player.resume())):c.isAvailable&&o.push(c.player.resume()):(a.isAvailable&&o.push(a.player.resume()),I.isAvailable&&o.push(I.player.resume()),c.isAvailable&&o.push(c.player.resume()))}),Promise.all(o)}let e=A.trtcInstance.room.remotePublishedUserMap.get(A.userId);if(e)return A.streamType==="main"?Promise.all([e.remoteAudioTrack.player.resume(),e.remoteVideoTrack.player.resume()]):e.remoteAuxiliaryTrack.player.resume()})}pauseRemotePlayer(A){if(A.userId==="*")A.trtcInstance.room.remotePublishedUserMap.forEach(e=>{let{remoteAudioTrack:o,remoteVideoTrack:n,remoteAuxiliaryTrack:a}=e;A.streamType?A.streamType==="main"?(o.isAvailable&&o.player.pause(),n.isAvailable&&n.player.pause(!1)):a.isAvailable&&a.player.pause(!1):(o.isAvailable&&o.player.pause(),n.isAvailable&&n.player.pause(!1),a.isAvailable&&a.player.pause(!1))});else{let e=A.trtcInstance.room.remotePublishedUserMap.get(A.userId);e&&(A.streamType==="main"?(e.remoteAudioTrack.player.pause(),e.remoteVideoTrack.player.pause(!1)):e.remoteAuxiliaryTrack.player.pause(!1))}}requestPictureInPicture(A){let e=[...A.trtcInstance.room.remotePublishedUserMap.values()].find(o=>o.remoteVideoTrack.isAvailable);return e?A.enable?e.remoteVideoTrack.player.enterPictureInPicture():e.remoteVideoTrack.player.exitPictureInPicture():Promise.reject(new Ct({code:Ge.INVALID_OPERATION,message:"no available remote video"}))}requestFullScreen(A){let e=[...A.trtcInstance.room.remotePublishedUserMap.values()].find(o=>o.remoteVideoTrack.isAvailable);return e?A.enable?e.remoteVideoTrack.player.enterFullscreen():e.remoteVideoTrack.player.exitFullscreen():Promise.reject(new Ct({code:Ge.INVALID_OPERATION,message:"no available remote video"}))}switchPlaybackQuality(A){return DA(this,null,function*(){let e=A.trtcInstance;return e._playbackQualitySwitcher||(e._playbackQualitySwitcher=new TeA),e._playbackQualitySwitcher.switchPlaybackQuality(A)})}prelink(A){return DA(this,null,function*(){let{trtcInstance:e}=A;return A.enable?e.room.prelink(A.sdkAppId,A.userId,A.userSig,sG.frameWorkType,A.roomId,A.strRoomId):e.room.closePrelink()})}};vt([a4({name:"options",type:"object",required:!0,properties:{enable:{required:!0,type:"boolean"},userId:{required:!0,type:"string"},sampleRate:{type:"number",values:[8e3,16e3,32e3,44100,48e3]},channelCount:{type:"number",values:[1,2]},port:{type:"messageport"}}})],oK.prototype,"enableAudioFrameEvent"),vt([a4({name:"options",type:"object",required:!0,properties:{enable:{required:!0,type:"boolean"},userId:{required:!1,type:"string"},sdkAppId:{required:!1,type:"number"},userSig:{required:!1,type:"string"},roomId:{required:!1,type:"number"},strRoomId:{required:!1,type:"string"}}})],oK.prototype,"prelink");var GeA=new oK,keA=es(hg(),1),_eA=class extends keA.EventEmitter{constructor(){super(),G(this,"states",{}),G(this,"permissionChangeHandler"),G(this,"log"),this.log=nA.createLogger({id:"pm"}),this.permissionChangeHandler=()=>{var A,e;this.emit("permission-state-change",{camera:(A=this.states.camera)==null?void 0:A.state,microphone:(e=this.states.microphone)==null?void 0:e.state})}}request(A){return DA(this,null,function*(){if(this.log.info("request ".concat(A.join(", "))),A.length===0)return Promise.resolve();(yield navigator.mediaDevices.getUserMedia({video:A.includes("camera"),audio:A.includes("microphone")})).getTracks().forEach(e=>e.stop())})}get(A){return DA(this,null,function*(){try{return this.states[A]||(this.states[A]=yield navigator.permissions.query({name:A}),this.states[A].addEventListener("change",this.permissionChangeHandler)),this.log.info("get ".concat(A," permission state: ").concat(this.states[A].state)),this.states[A].state}catch(e){return this.log.error("get ".concat(A," permission failed, error: ").concat(e instanceof Error?e.message:e)),null}})}destroy(){Object.values(this.states).forEach(A=>{A?.removeEventListener("change",this.permissionChangeHandler)}),this.states={}}},Ux=new _eA,J4=0,aG=new Set,Dg=null;zU(L4),yA.checkStorage();var Qo=class $Q extends qV.EventEmitter{constructor(e,o){super(),G(this,"_room"),G(this,"_eventListened",new Set),G(this,"_localVideoTrack",null),G(this,"_localAudioTrack",null),G(this,"_localScreenTrack",null),G(this,"_localScreenAudioTrack",null),G(this,"_localVideoConfig",null),G(this,"_localScreenConfig",null),G(this,"_localAudioConfig",null),G(this,"_remoteVideoConfigMap",new Map),G(this,"_remoteAudioConfigMap",new Map),G(this,"_remoteAudioVolumeMap",new Map),G(this,"_remoteAudioMuteMap",new Map),G(this,"_mediaTrackMap",new WeakMap),G(this,"_log",nA.createLogger({id:"t".concat(++J4)})),G(this,"_plugins",new Map),G(this,"_networkQuality",null),G(this,"_speakerId"),G(this,"enterRoomParams"),G(this,"_enableAutoSwitchWhenRecapturing",!0),G(this,"_autoSubscribeDataChannel",!1),G(this,"_playbackQualityList",[]),this._room=new e(bt({logger:this._log,frameWorkType:$Q.frameWorkType},o)),this._room.videoDecodeFallbackType=o.videoDecodeFallback,rn(o.enableAutoSwitchWhenRecapturing)&&(this._enableAutoSwitchWhenRecapturing=o.enableAutoSwitchWhenRecapturing),this._log.info("create() ".concat(JSON.stringify(o,(n,a)=>n==="plugins"?a.map(I=>I.Name):a))),Object.defineProperties(this,{dumpAudio:{enumerable:!1,value(n){return this._room.audioManager.dump(n)}}}),o.plugins&&o.plugins.forEach(n=>{this._use(n,o.assetsPath)}),this._use(meA,o.assetsPath),this._use(peA,o.assetsPath),this._use(DeA,o.assetsPath),this._use(P4,o.assetsPath),this._use(SeA),o.enableSEI&&kT&&this._use(MeA),this._room.on("audio-volume",n=>{var a,I;!n.find(c=>c.userId==="")&&this._localAudioTrack&&n.push({userId:"",volume:Math.floor(100*((a=this._localAudioTrack.getInternalAudioLevelAfter3A())!=null?a:this._localAudioTrack.getAudioLevel())),floatVolume:(I=this._localAudioTrack.getInternalAudioLevelAfter3A())!=null?I:this._localAudioTrack.getInternalAudioLevel()}),o.volumeType===1&&n.forEach(c=>{var u;let d=c.userId===""?this._localAudioTrack:(u=this.room.remotePublishedUserMap.get(c.userId))==null?void 0:u.remoteAudioTrack;d&&(c.volume=d.dbVolume)}),o.enableDbVolume&&n.forEach(c=>{var u;let d=c.userId===""?this._localAudioTrack:(u=this.room.remotePublishedUserMap.get(c.userId))==null?void 0:u.remoteAudioTrack;d&&(c.volume=d.dbVolume)}),this.emit(Xt.AUDIO_VOLUME,{result:n.sort((c,u)=>u.volume-c.volume)})}),this._room.videoManager.on("error",n=>{this._log.error(new vi({code:Si.OPERATION_FAILED,extraCode:5504,message:n.message,originError:n}))}),this._listenEvents(),this._initActiveSpeaker(),((n,a)=>{let{emit:I}=n;n.emit=function(){for(var c=arguments.length,u=new Array(c),d=0;d{u&&nA.info(eC)})}})();let n=new $Q(e,o||{});return aG.add(n),n.__v_skip=!0,n}get room(){return this._room}_listenEvents(){nE(this,this._room).add("peer-join",e=>{let{userId:o}=e;this.emit(Xt.REMOTE_USER_ENTER,{userId:o})}).add("peer-leave",e=>{let{userId:o,reason:n}=e;this.emit(Xt.REMOTE_USER_EXIT,{userId:o,reason:n})}).add("banned",e=>{wu(!0),this._exitRoom().finally(()=>{this.emit(Xt.KICKED_OUT,{reason:e.reason})})}).add("error",e=>{this._exitRoom().finally(()=>{this.emit(Xt.ERROR,vi.convertFrom(e))})}).add("signal-connection-state-changed",e=>{this.emit(Xt.CONNECTION_STATE_CHANGED,e)}).add("network-quality",e=>{this._networkQuality=e;let o=fi(bt({},e),{uplinkRTT:Math.min(e.uplinkRTT,OR),downlinkRTT:Math.min(e.downlinkRTT,OR)});this.emit(Xt.NETWORK_QUALITY,o)}).add("remote-published",e=>{[e.remoteAudioTrack,e.remoteVideoTrack,e.remoteAuxiliaryTrack].forEach(o=>{nE(o,o).add("player-state-changed",n=>{let a=fi(bt({},n),{userId:e.userId});o.kind===fA.VIDEO&&(a.streamType=cl(o.streamType)),this.emit(o.kind===fA.AUDIO?Xt.AUDIO_PLAY_STATE_CHANGED:Xt.VIDEO_PLAY_STATE_CHANGED,a)}).add("error",n=>{n.getCode()===Ge.PLAY_NOT_ALLOWED&&this.emit(Xt.AUTOPLAY_FAILED,{userId:o.userId,mediaType:o.strMediaType,resume:()=>o.player.resume()})})})}).add("remote-unpublished",e=>{[e.remoteAudioTrack,e.remoteVideoTrack,e.remoteAuxiliaryTrack].forEach(o=>{pr(o)})}).add("remote-publish-state-changed",e=>{let{prevMuteState:o,muteState:n}=e,{userId:a}=n,I=o.audioAvailable,c=o.videoAvailable,{audioAvailable:u,videoAvailable:d}=n;u||this._remoteAudioConfigMap.delete(a),d||this._removeRemoteVideoConfig(a,"main"),n.hasAuxiliary||this._removeRemoteVideoConfig(a,"sub"),c!==d&&(d?this._onVideoAvailable({userId:a,streamType:"main"}):this._onVideoUnavailable({userId:a,streamType:"main"}),this.emit(d?Xt.REMOTE_VIDEO_AVAILABLE:Xt.REMOTE_VIDEO_UNAVAILABLE,{userId:a,streamType:"main"})),I!==u&&(u?this._onAudioAvailable({userId:a}):this._onAudioUnavailable({userId:a,muteState:n}),this.emit(u?Xt.REMOTE_AUDIO_AVAILABLE:Xt.REMOTE_AUDIO_UNAVAILABLE,{userId:a})),o.hasAuxiliary!==n.hasAuxiliary&&(n.hasAuxiliary?this._onVideoAvailable({userId:a,streamType:"sub"}):this._onVideoUnavailable({userId:a,streamType:"sub"}),this.emit(n.hasAuxiliary?Xt.REMOTE_VIDEO_AVAILABLE:Xt.REMOTE_VIDEO_UNAVAILABLE,{userId:a,streamType:"sub"})),o.hasDatachannel!==n.hasDatachannel&&n.hasDatachannel&&this._onDataChannelAvailable()}).add("sei-message",e=>{this.emit(Xt.SEI_MESSAGE,fi(bt({},e),{streamType:cl(e.streamType)}))}).add("firewall-restriction",()=>{this.emit(Xt.ERROR,new vi({code:Si.OPERATION_FAILED,extraCode:5501}))}).add("heartbeat-report",e=>{var o,n,a,I,c,u,d;let R={2:"big",3:"small",7:"sub"},k={rtt:Math.min(e.msg_up_stream_info.msg_network_status.uint32_rtt||((o=e.msg_down_stream_info[0])==null?void 0:o.msg_network_status.uint32_rtt)||((n=this._networkQuality)==null?void 0:n.uplinkRTT)||((a=this._networkQuality)==null?void 0:a.downlinkRTT)||0,OR),upLoss:((I=this._networkQuality)==null?void 0:I.uplinkLoss)||0,downLoss:((c=this._networkQuality)==null?void 0:c.downlinkLoss)||0,bytesSent:e.bytes_sent||0,bytesReceived:e.bytes_received||0,localStatistics:{audio:{bitrate:(((u=e.msg_up_stream_info.msg_audio_status)==null?void 0:u.uint32_audio_codec_bitrate)||0)/1e3,audioLevel:(((d=e.msg_up_stream_info.msg_audio_status)==null?void 0:d.uint32_audio_level)||0)/iE},video:e.msg_up_stream_info.msg_video_status.filter(_=>R[_.uint32_video_stream_type]).map(_=>({bitrate:(_.uint32_video_codec_bitrate||0)/1e3,width:_.uint32_video_width,height:_.uint32_video_height,frameRate:_.uint32_video_enc_fps,videoType:R[_.uint32_video_stream_type]}))},remoteStatistics:e.msg_down_stream_info.map(_=>({userId:_.msg_user_info.str_identifier,audio:{bitrate:(_.msg_audio_status.uint32_audio_codec_bitrate||0)/1e3,audioLevel:(_.msg_audio_status.uint32_audio_level||0)/iE,point2pointDelay:(_.msg_audio_status.uint32_audio_p2p_delay||0)+(_.msg_audio_status.uint32_audio_cache_ms||0),jitterBufferDelay:_.msg_audio_status.uint32_audio_cache_ms||0},video:_.msg_video_status.map(Z=>({bitrate:(Z.uint32_video_codec_bitrate||0)/1e3,width:Z.uint32_video_width,height:Z.uint32_video_height,frameRate:Z.uint32_video_dec_fps,videoType:R[Z.uint32_video_stream_type],point2pointDelay:(Z.uint32_video_p2p_delay||0)+(Z.uint32_video_cache_ms||0),jitterBufferDelay:Z.uint32_video_cache_ms||0,codec:Z.uint32_video_codec}))}))};this.emit(Xt.STATISTICS,k)}).add("custom-message",e=>{this.emit(Xt.CUSTOM_MESSAGE,e)}).add("layerData",e=>this.emit(Xt.LAYER_DATA,e)).add("first-video-frame",e=>{this.emit(Xt.FIRST_VIDEO_FRAME,fi(bt({},e),{streamType:cl(e.streamType)}))}).add("audio-frame",e=>{this.emit(Xt.AUDIO_FRAME,e)}).add("data-channel-message",e=>{var o,n,a,I,c;let{data:u}=e;if(u.sender==="")return;let d={segmentId:(o=u.payload)==null?void 0:o.roundid,speakerUserId:u.sender,sourceText:(n=u.payload)==null?void 0:n.text,translationTexts:(a=u.payload)==null?void 0:a.translate_msg,timestamp:(I=u.payload)==null?void 0:I.start_utc_ms,isCompleted:(c=u.payload)==null?void 0:c.end,robotId:u.robotid};d.sourceText!==""&&this.emit(Xt.REALTIME_TRANSCRIBER_MESSAGE,d)}).add("asr-robot-peer-join",e=>{this.emit(Xt.REALTIME_TRANSCRIBER_STATE_CHANGED,{state:"started",roomId:this.room.roomId,transcriberRobotId:e.userId})}).add("asr-robot-peer-leave",e=>{this.emit(Xt.REALTIME_TRANSCRIBER_STATE_CHANGED,{state:"stopped",roomId:this.room.roomId,transcriberRobotId:e.userId})}),nE(this,vs).add("audioInputAdded",e=>{this.emit(Xt.DEVICE_CHANGED,{type:"microphone",action:"add",device:e})}).add("audioInputRemoved",e=>{this.emit(Xt.DEVICE_CHANGED,{type:"microphone",action:"remove",device:e})}).add("videoInputAdded",e=>{this.emit(Xt.DEVICE_CHANGED,{type:"camera",action:"add",device:e})}).add("videoInputRemoved",e=>{this.emit(Xt.DEVICE_CHANGED,{type:"camera",action:"remove",device:e})}).add("audioOutputAdded",e=>DA(this,null,function*(){if(this.emit(Xt.DEVICE_CHANGED,{type:"speaker",action:"add",device:e}),Dg&&Dg.deviceId===UR){let o=(yield Mm()).find(n=>n.deviceId===UR);o&&Dg.groupId!==o.groupId&&(Dg=o,this.emit(Xt.DEVICE_CHANGED,{type:"speaker",action:"active",device:o}))}})).add("audioOutputRemoved",e=>DA(this,null,function*(){this.emit(Xt.DEVICE_CHANGED,{type:"speaker",action:"remove",device:e});let o=(yield Mm())[0];if(!o||!Dg||Dg.groupId===o.groupId)return;let n=Dg.deviceId===e.deviceId,a=Dg.deviceId===UR&&Dg.deviceId===o.deviceId;(n||a)&&(Dg=o,this.emit(Xt.DEVICE_CHANGED,{type:"speaker",action:"active",device:o}))})),nE(this,Ux).add("permission-state-change",e=>{this.emit(Xt.PERMISSION_STATE_CHANGE,e)}),this.room.enableSEI&&this.on(Xt.SEI_MESSAGE,e=>{var o;let n=(o=this.room.remotePublishedUserMap.get(e.userId))==null?void 0:o.remoteVideoTrack;n&&n.updateAlphaRenderInfo(e)})}getNetworkTime(){return gh()}use(e){let o,n;return"plugin"in e?(o=e.plugin,n=e.assetsPath):o=e,o.Name==="Chorus"&&(this.room.enableChorus=!0),this._use(o,n)}_use(e,o){let n=this._plugins.get(e.Name);if(n)return this._log.warn("duplicate install plugin",e.Name),n;let a=new e(deA.call(this,{TRTC:$Q,room:this._room,assetsPath:o,errorModule:{RtcError:vi,ErrorCode:Si,CoreErrorCode:Ge,ErrorCodeDictionary:Rx}}));return this._plugins.set(e.Name,a),a.__v_skip=!0,e.autoStart&&this.startPlugin(e.Name),a}enterRoom(e){return DA(this,null,function*(){var o,n;this.enterRoomParams=e;let{scene:a="rtc",enableAutoPlayDialog:I=!0,autoReceiveAudio:c=!0,autoReceiveVideo:u=!1}=e;e.proxy&&(this._room.setProxyServer(e.proxy),!Sr(e.proxy)&&e.proxy.turnServer&&((n=(o=this._room).setTurnServer)==null||n.call(o,e.proxy.turnServer,e.proxy.iceTransportPolicy))),this._room.enableAutoPlayDialog=I,this._room.autoReceiveAudio=c,this._room.autoReceiveVideo=u,rn(e.preferHW)&&(this._room.preferHW=e.preferHW),e.playoutDelay&&(this._room.playoutDelay=e.playoutDelay),e.jitterBufferDelay&&(this._room.jitterBufferDelay=e.jitterBufferDelay);let d={sdkAppId:e.sdkAppId,userId:e.userId,userSig:e.userSig,privateMapKey:e.privateMapKey||null,latencyLevel:e.latencyLevel,role:e.role==="audience"?21:20,roomId:e.roomId||0,strRoomId:e.strRoomId||"",businessInfo:e.businessInfo||null,streamId:null,userDefineRecordId:e.userDefineRecordId||null,enableDataChannel:this._plugins.has("RealtimeTranscriber"),frameWorkType:e.frameWorkType,component:e.component,language:e.language,priority:e.priority,useVp8:e.useVp8,useH265:e.useH265||!1,keepAlive:e.keepAlive};e.strRoomId&&!e.roomId?this._room.useStringRoomId=!0:this._room.useStringRoomId=!1,yield this._room.join(d,a,$Q.frameWorkType),this._checkTrackToPublish(),U4.start()})}exitRoom(){return DA(this,null,function*(){return yield this._exitRoom()})}switchRoom(e){return DA(this,null,function*(){if(this.room.isSwitchRoomSupported())try{this._clearRemoteTracks(),yield this._room.switchRoom(e)}catch(o){if(!(o instanceof VU)||o.code!==Ge.API_CALL_TIMEOUT&&o.code!==Ge.SWITCH_ROOM_FAILED)throw o;this._log.warn("switchRoom ".concat(o.code===Ge.API_CALL_TIMEOUT?"timeout":"failed",", fallback to exitRoom() and enterRoom()")),yield this._rejoinRoom(e)}else yield this._rejoinRoom(e)})}_rejoinRoom(e){return DA(this,null,function*(){yield this.exitRoom();let o=bt(bt({},this.enterRoomParams),e);yield this.enterRoom(o)})}_clearRemoteTracks(){new Set([...this._remoteAudioConfigMap.keys(),...this._remoteAudioMuteMap.keys()]).forEach(e=>{this._stopRemoteAudio({userId:e}).catch(()=>{})}),[...this._remoteVideoConfigMap.keys()].forEach(e=>{let o=e.includes("main")?"main":"sub",n=e.split("_".concat(o))[0];n&&this._stopRemoteVideo({userId:n,streamType:o}).catch(()=>{})}),this._remoteVideoConfigMap.clear(),this._remoteAudioConfigMap.clear(),this._remoteAudioMuteMap.clear(),function(e){let o=PM.get(e);o&&(o.forEach(n=>clearTimeout(n)),PM.delete(e))}(this),this._room.remotePublishedUserMap.forEach(e=>{pr(e.remoteAudioTrack),pr(e.remoteVideoTrack),pr(e.remoteAuxiliaryTrack)})}switchRole(e,o){return DA(this,null,function*(){o!=null&&o.privateMapKey&&(this._room.privateMapKey=o.privateMapKey),o!=null&&o.latencyLevel&&(this._room.latencyLevel=o.latencyLevel),yield this._room.switchRole(e),e==="anchor"&&this._checkTrackToPublish()})}destroy(){this._plugins.forEach(e=>{var o;return(o=e.destroy)==null?void 0:o.call(e)}),this._plugins.clear(),pr(this),this.removeAllListeners(),this._room.destroy(),aG.delete(this),aG.size===0&&U4.destroy(),this._localAudioTrack&&this.stopLocalAudio(),this._localVideoTrack&&this.stopLocalVideo(),this._localScreenTrack&&this.stopScreenShare(),S.off("102",this._onLocalTrackCaptured,this)}startLocalAudio(){return DA(this,arguments,function(){var e=this;let o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{publish:!0};return function*(){if(e._localAudioTrack)return void e._log.warn("local audio is already started");let{publish:n=!0,mute:a,muteKeepVolumeDetection:I,option:c}=o,u=new vm(e._room.audioManager),d={},R={muted:!0};c&&(Ee(c.microphoneId)?Ee(c.audioTrack)||(d.customSource=c.audioTrack):d.deviceId=c.microphoneId,c&&hr(c.captureVolume)&&u.setCaptureVolume(c.captureVolume),Ee(c.profile)||(Sr(c.profile)?dQ[c.profile]&&u.setProfile(dQ[c.profile]):u.setProfile(c.profile)),hr(c.earMonitorVolume)&&(R.muted=!(c.earMonitorVolume>0),R.volume=c.earMonitorVolume),Ee(c.echoCancellation)||(u.profile.echoCancellation=c.echoCancellation),Ee(c.noiseSuppression)||(u.profile.noiseSuppression=c.noiseSuppression),Ee(c.autoGainControl)||(u.profile.autoGainControl=c.autoGainControl),rn(e._enableAutoSwitchWhenRecapturing)&&(u.enableAutoSwitchWhenRecapturing=e._enableAutoSwitchWhenRecapturing)),u.on("5",k=>{e.emit(Xt.ERROR,new vi({code:Si.DEVICE_ERROR,extraCode:5309,messageParams:{error:k}}))}),u.on("2",k=>{e.emit(Xt.DEVICE_CHANGED,{type:"microphone",action:"active",device:k})}),u.on("4",k=>{let _;k.error&&(_=vi.convertFrom(k.error)),e.emit(Xt.PUBLISH_STATE_CHANGED,fi(bt({},k),{error:_}))}),u.on("6",()=>{}),e._listenOutputTrackChanged(u),e._speakerId&&u.setAudioOutput(e._speakerId),yield u.capture(d),Ee(a)||u.setMute(a,I),nE(u,u).add("player-state-changed",k=>{e.emit(Xt.AUDIO_PLAY_STATE_CHANGED,fi(bt({},k),{userId:""}))}),n&&e._room.isJoined&&e._room.publish(u).catch(()=>{}),e._localAudioTrack=u,e._room.capturedLocalMainAudioTrack=u,e._localAudioConfig=fi(bt({},o),{publish:n}),yield e._updateAudioPlayOption({playOption:R,track:u}),S.emit("113",{userId:"",room:e.room})}()})}updateLocalAudio(e){return DA(this,null,function*(){if(!this._localAudioTrack||!this._localAudioConfig)return;let{publish:o,mute:n,muteKeepVolumeDetection:a,option:I}=e,c={};I&&(I.microphoneId?yield this._localAudioTrack.switchDevice(I.microphoneId):Ee(I.audioTrack)||(yield this._localAudioTrack.setInputMediaStreamTrack(I.audioTrack)),Ee(I.captureVolume)||this._localAudioTrack.setCaptureVolume(I.captureVolume),Ee(I.earMonitorVolume)||(c.muted=!(I.earMonitorVolume>0),c.volume=I.earMonitorVolume),yield this._localAudioTrack.update3A(I)),this._room.isJoined&&!Ee(o)&&(o&&!this._localAudioConfig.publish&&this._room.publish(this._localAudioTrack).catch(()=>{}),this._localAudioConfig.publish&&!o&&this._room.unpublish(this._localAudioTrack).catch(()=>{})),Ee(n)||this._localAudioTrack.setMute(n,a),yield this._updateAudioPlayOption({playOption:c,track:this._localAudioTrack,prevConfig:this._localAudioConfig}),tB(this._localAudioConfig,e)})}stopLocalAudio(){return DA(this,null,function*(){this._localAudioTrack&&(this._room.isJoined&&(yield this._room.unpublish(this._localAudioTrack).catch(()=>{})),S.emit("114",{userId:"",room:this.room}),this._localAudioTrack.stop(),this._localAudioTrack.close(),this._room.audioManager.removeInput(this._localAudioTrack),pr(this._localAudioTrack),this._localAudioTrack=null,this._localAudioConfig=null,delete this._room.capturedLocalMainAudioTrack)})}startLocalVideo(){return DA(this,arguments,function(){var e=this;let o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{publish:!0,view:null,capture:!0};return function*(){var n,a,I;if(e._localVideoTrack)return void e._log.warn("local video is already started");let{view:c,publish:u=!0,capture:d=!0,mute:R,option:k,forcePublish:_=!1}=o,Z=u||_,iA=d,cA=new Ru(e._room.videoManager),TA={},JA={};if(k&&(rn(k.avoidCropping)&&(cA.avoidCropping=k.avoidCropping),k.cameraId?TA.deviceId=k.cameraId:Ee(k.useFrontCamera)?Ee(k.videoTrack)||(TA.customSource=k.videoTrack):TA.facingMode=k.useFrontCamera?fA.FACING_MODE_USER:fA.FACING_MODE_ENVIRONMENT,Ee(k.retryWhenExactFailed)||(TA.retryWhenExactFailed=k.retryWhenExactFailed),k.qosPreference&&(TA.contentHint=Mx(k.qosPreference)),Ee(k.profile)||(Sr(k.profile)?$l[k.profile]&&cA.setProfile($l[k.profile]):cA.setProfile(k.profile)),Ee(k.fillMode)||(JA.objectFit=k.fillMode),Ee(k.mirror)||(JA.mirror=k.mirror),Ee(k.small)||(Ee(k.smallMode)||(e._room.smallMode=k.smallMode),rn(k.small)&&k.small===!1?cA.stopSmall():cA.updateSmallConfig(Sx(k.small,!0))),Ee(k.rotation)||cA.setRotation(k.rotation),rn(e._enableAutoSwitchWhenRecapturing)&&(cA.enableAutoSwitchWhenRecapturing=e._enableAutoSwitchWhenRecapturing)),cA.once("first-video-frame",Ie=>{e.emit(Xt.FIRST_VIDEO_FRAME,fi(bt({},Ie),{streamType:cl(Ie.streamType)}))}),cA.on("5",Ie=>{e.emit(Xt.ERROR,new vi({code:Si.DEVICE_ERROR,extraCode:5308,messageParams:{error:Ie}}))}),cA.on("2",Ie=>{e.emit(Xt.DEVICE_CHANGED,{type:"camera",action:"active",device:Ie})}),cA.on("4",Ie=>{let XA;Ie.error&&(XA=vi.convertFrom(Ie.error)),e.emit(Xt.PUBLISH_STATE_CHANGED,fi(bt({},Ie),{error:XA}))}),cA.on("6",()=>{}),e._listenOutputTrackChanged(cA),TA.customSource&&DQ(TA.customSource)?(cA.setOutputMediaStreamTrack(TA.customSource),iA=!1):iA?yield cA.capture(TA):(n=cA.manager)==null||n.changeInput(cA),Ee(R)||(yield cA.setMute(R)),nE(cA,cA).add("player-state-changed",Ie=>{e.emit(Xt.VIDEO_PLAY_STATE_CHANGED,fi(bt({},Ie),{userId:"",streamType:"main"}))}).add("video-size-changed",Ie=>{e.emit(Xt.VIDEO_SIZE_CHANGED,fi(bt({},Ie),{streamType:cl(Ie.streamType)}))}),Z){let Ie=e._localScreenTrack&&((a=e._localScreenConfig)==null?void 0:a.publish)&&e._localScreenConfig.streamType==="main";e._room.isJoined?!Ie||_?(e._room.publish(cA).catch(()=>{}),((I=e._localScreenConfig)==null?void 0:I.streamType)==="main"&&e._localScreenConfig&&(e._localScreenConfig.publish=!1)):(Z=!1,e._log.warn("main stream is already published, local video track will not publish")):Ie&&(Z=!1)}e._localVideoTrack=cA,e._room.capturedLocalMainVideoTrack=cA,e._localVideoConfig=fi(bt({},o),{view:c,publish:Z,capture:iA}),yield e._updateVideoPlayOption({view:c,playOption:JA,track:cA})}()})}updateLocalVideo(e){return DA(this,null,function*(){var o,n,a,I,c,u,d;if(!this._localVideoTrack||!this._localVideoConfig)return;let{view:R,publish:k=!0,mute:_,capture:Z,option:iA,forcePublish:cA=!1}=e,TA=k||cA,JA=Z,Ie={};if(!this._localVideoConfig.capture&&DQ((o=this.localVideoTrack)==null?void 0:o.outMediaTrack)&&(iA!=null&&iA.cameraId||iA!=null&&iA.videoTrack)&&this._localVideoTrack.outMediaTrack!==iA?.videoTrack&&(JA=!0),this._localVideoConfig.capture)JA!==!1?iA!=null&&iA.cameraId?yield this._localVideoTrack.switchDevice(iA?.cameraId):Ee(iA?.useFrontCamera)?Ee(iA?.videoTrack)||(DQ(iA?.videoTrack)?iA?.videoTrack!==((n=this.localVideoTrack)==null?void 0:n.outMediaTrack)&&(yield this._localVideoTrack.setOutputMediaStreamTrack(iA?.videoTrack)):yield this._localVideoTrack.setInputMediaStreamTrack(iA?.videoTrack)):yield this._localVideoTrack.switchDevice(iA!=null&&iA.useFrontCamera?fA.FACING_MODE_USER:fA.FACING_MODE_ENVIRONMENT):this._localVideoTrack.stopCapture();else if(JA){let XA={};XA.deviceId=iA?.cameraId||((a=this._localVideoConfig.option)==null?void 0:a.cameraId),XA.facingMode=iA!=null&&iA.useFrontCamera||(I=this._localVideoConfig.option)!=null&&I.useFrontCamera?fA.FACING_MODE_USER:fA.FACING_MODE_ENVIRONMENT,XA.customSource=iA!=null&&iA.videoTrack||!XA.deviceId?(c=this._localVideoConfig.option)==null?void 0:c.videoTrack:void 0,yield this._localVideoTrack.capture(XA)}iA&&(Ee(iA.profile)||(Sr(iA.profile)?$l[iA.profile]&&this._localVideoTrack.setProfile($l[iA.profile]):this._localVideoTrack.setProfile(iA.profile),(!iA.cameraId||!this._localVideoTrack.isNeedToSwitchDevice(iA.cameraId||iA.useFrontCamera?fA.FACING_MODE_USER:fA.FACING_MODE_ENVIRONMENT))&&(yield this._localVideoTrack.applyProfile())),Ee(iA.fillMode)||(Ie.objectFit=iA.fillMode),Ee(iA.mirror)||(Ie.mirror=iA.mirror),Ee(iA.rotation)||this._localVideoTrack.setRotation(iA.rotation),iA.qosPreference&&this._localVideoTrack.mediaTrack&&this._localVideoTrack.setContentHint(Mx(iA.qosPreference)),Ee(iA.small)||(rn(iA.small)&&!iA.small?this._localVideoTrack.stopSmall():this._localVideoTrack.updateSmallConfig(Sx(iA.small,!0)))),this._room.isJoined&&Ee(TA)&&this._localVideoConfig.publish&&JA&&!this._localVideoConfig.capture&&this._room.publish(this._localVideoTrack).catch(()=>{}),this._room.isJoined&&((TA??this._localVideoConfig.publish)||cA?this._localScreenTrack&&((u=this._localScreenConfig)!=null&&u.publish)&&this._localScreenConfig.streamType==="main"&&!cA?(TA=!1,this._log.warn("main stream is already published, local video track will not publish")):(this._room.publish(this._localVideoTrack).catch(()=>{}),((d=this._localScreenConfig)==null?void 0:d.streamType)==="main"&&this._localScreenConfig&&(this._localScreenConfig.publish=!1)):this._room.unpublish(this._localVideoTrack).catch(()=>{})),Ee(_)||(yield this._localVideoTrack.setMute(_)),yield this._updateVideoPlayOption({view:R,playOption:Ie,track:this._localVideoTrack,prevConfig:this._localVideoConfig}),tB(this._localVideoConfig,fi(bt({},e),{publish:TA,capture:JA}))})}stopLocalVideo(){return DA(this,null,function*(){var e;this._localVideoTrack&&(this._room.isJoined&&(e=this._localVideoConfig)!=null&&e.publish&&(yield this._room.unpublish(this._localVideoTrack).catch(()=>{})),this._localVideoTrack.stop(),this._localVideoTrack.close(),pr(this._localVideoTrack),this._localVideoTrack=null,delete this._room.capturedLocalMainVideoTrack,this._localVideoConfig=null)})}startScreenShare(){return DA(this,arguments,function(){var e=this;let o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{publish:!0,view:null};return function*(){var n,a,I;if(e._localScreenTrack)return void e._log.warn("screen share is already started");let{view:c=null,publish:u=!0,muteSystemAudio:d,option:R}=o,k=u,_=new Nm(e._room.videoManager);_.on("4",JA=>{let Ie;JA.error&&(Ie=vi.convertFrom(JA.error)),e.emit(Xt.PUBLISH_STATE_CHANGED,fi(bt({},JA),{error:Ie}))}),_.once("first-video-frame",JA=>{e.emit(Xt.FIRST_VIDEO_FRAME,fi(bt({},JA),{streamType:cl(JA.streamType)}))}),e._listenOutputTrackChanged(_),o.streamType==="main"&&(_.mediaType=4);let Z=null,iA={},cA={};R&&(Ee(R.profile)||(Sr(R.profile)?QN[R.profile]&&_.setProfile(QN[R.profile]):_.setProfile(R.profile)),R.systemAudio&&(iA.systemAudio=!0,iA.echoCancellation=R.echoCancellation,iA.noiseSuppression=R.noiseSuppression,iA.autoGainControl=R.autoGainControl),Ee(R.fillMode)||(cA.objectFit=R.fillMode),R.videoTrack&&(iA.videoTrack=R.videoTrack),R.audioTrack&&(iA.audioTrack=R.audioTrack),R.captureElement&&(iA.captureElement=R.captureElement),R.preferDisplaySurface&&(iA.preferDisplaySurface=R.preferDisplaySurface),R.qosPreference&&(iA.contentHint=Mx(R.qosPreference)));let TA=yield _.capture(iA);if(_.mediaTrack.addEventListener(fA.ENDED,()=>{e._stopScreenShare(),e.emit(Xt.SCREEN_SHARE_STOPPED)}),TA.getAudioTracks()[0]){Z=new xq(e._room.audioManager);let JA=TA.getAudioTracks()[0];(n=o.option)!=null&&n.systemAudio&&!((a=o.option)!=null&&a.audioTrack)&&(Z.sourceTrack=JA),yield Z.setInputMediaStreamTrack(JA),rn(d)&&Z.mediaTrack&&(Z.mediaTrack.enabled=!d),e._speakerId&&Z.setAudioOutput(e._speakerId)}if(nE(_,_).add("player-state-changed",JA=>{e.emit(Xt.VIDEO_PLAY_STATE_CHANGED,fi(bt({},JA),{userId:"",streamType:"sub"}))}),k){let JA=e._localVideoTrack&&((I=e._localVideoConfig)==null?void 0:I.publish),Ie=!(o.streamType==="main"&&JA);e._room.isJoined?(Ie?e._room.publish(_).catch(()=>{}):(k=!1,e._log.warn("main stream is already published, screen share main will not publish")),Z&&(e._checkScreenAudioEchoCancellation(_,Z),e._room.publish(Z).catch(()=>{}))):Ie||(k=!1)}e._localScreenTrack=_,e._room.capturedLocalAuxVideoTrack=_,e._localScreenAudioTrack=Z,e._localScreenConfig=fi(bt({},o),{view:c,publish:k}),yield e._updateVideoPlayOption({view:c,playOption:cA,track:_})}()})}updateScreenShare(e){return DA(this,null,function*(){var o,n;if(!this._localScreenTrack||!this._localScreenConfig)return;let{view:a,publish:I,muteSystemAudio:c,option:u}=e,d=I,R={};if(u){if(Ee(u.fillMode)||(R.objectFit=u.fillMode),u.qosPreference){let k=Mx(u.qosPreference);this._localScreenTrack.setContentHint(k)}u.videoTrack&&this._localScreenTrack.setInputMediaStreamTrack(u.videoTrack),u.audioTrack&&this._localScreenAudioTrack&&this._localScreenAudioTrack.setInputMediaStreamTrack(u.audioTrack)}if(this._room.isJoined&&!Ee(d)){if(d&&!this._localScreenConfig.publish){let k=this._localVideoTrack&&((o=this._localVideoConfig)==null?void 0:o.publish);this._localScreenConfig.streamType==="main"&&k?(d=!1,this._log.warn("main stream is already published, screen share main will not publish")):this._room.publish(this._localScreenTrack).catch(()=>{}),this._localScreenAudioTrack&&this._room.publish(this._localScreenAudioTrack).catch(()=>{})}if(this._localScreenConfig.publish&&!d){let k=[this._localScreenTrack];this._localScreenAudioTrack&&k.push(this._localScreenAudioTrack),k.forEach(_=>this._room.unpublish(_).catch(()=>{}))}}(n=this._localScreenAudioTrack)!=null&&n.mediaTrack&&rn(c)&&(this._localScreenAudioTrack.mediaTrack.enabled=!c),yield this._updateVideoPlayOption({view:a,playOption:R,track:this._localScreenTrack,prevConfig:this._localScreenConfig}),tB(this._localScreenConfig,fi(bt({},e),{publish:d}))})}stopScreenShare(){return DA(this,null,function*(){return yield this._stopScreenShare()})}startRemoteVideo(e){return DA(this,null,function*(){let{view:o,userId:n,streamType:a,option:I}=e,c="".concat(n,"_").concat(a);if(this._remoteVideoConfigMap.has(c))return void this._log.warn("remote video has already started. userId:".concat(n,", streamType:").concat(a));let u=this._room.remotePublishedUserMap.get(n);if(!u)return;let d={},R=a==="main"?u.remoteVideoTrack:u.remoteAuxiliaryTrack,k=this._bindRemoteVideoTrackEvents(R);this._listenOutputTrackChanged(R),I&&(Ee(I.fillMode)||(d.objectFit=I.fillMode),Ee(I.mirror)||(d.mirror=I.mirror),Ee(I.poster)||(d.poster=I.poster),d.canvasRender=I.canvasRender,a==="main"&&!Ee(I.small)&&(!u.remoteVideoTrack.isSubscribing&&!u.remoteVideoTrack.isSubscribed&&u.remoteVideoTrack.setMediaType(I.small?8:4),this._room.changeType(I.small,R.user)),Ee(I.draggable)||R.setDraggable(I.draggable)),d.isLiveStream=!!this._playbackQualityList.find(_=>_.userId===n&&_.streamType===a),yield this._room.subscribe(R),yield this._enableVideoDecodeFallback(R,a),yield this._updateVideoPlayOption({view:o,playOption:d,track:R}),this._emitTrackEvent(R),this._remoteVideoConfigMap.set(c,{config:e,handlers:k}),I&&!Ee(I.receiveWhenViewVisible)&&this._observeView({remoteTrack:R,view:o,receiveWhenViewVisible:I.receiveWhenViewVisible,viewRoot:I?.viewRoot})})}updateRemoteVideo(e){return DA(this,null,function*(){var o,n;let{view:a,userId:I,streamType:c,option:u,mute:d}=e,R="".concat(I,"_").concat(c),k=this._remoteVideoConfigMap.get(R);if(!k||!this._room.remotePublishedUserMap.has(I))return;let _={};u&&(Ee(u.fillMode)||(_.objectFit=u.fillMode),Ee(u.mirror)||(_.mirror=u.mirror));let Z=null,iA=this._room.remotePublishedUserMap.get(I);if(c==="main"&&iA!=null&&iA.muteState.hasVideo&&(Z=iA.remoteVideoTrack),c==="sub"&&iA!=null&&iA.muteState.hasAuxiliary&&(Z=iA.remoteAuxiliaryTrack),!Z)return;let{config:cA}=k;c==="main"&&u&&!Ee(u.small)&&this._room.changeType(u.small,Z.user),u&&!Ee(u.draggable)&&Z.setDraggable(u.draggable),u&&(rn(u.pictureInPicture)&&(u.pictureInPicture?yield Z.player.enterPictureInPicture():yield Z.player.exitPictureInPicture()),rn(u.fullScreen)&&(u.fullScreen?yield Z.player.enterFullscreen():yield Z.player.exitFullscreen())),rn(d)&&(Z.ignoreUpdatePlayingState=!0,d?(yield Z.player.pause(),yield this.room.unsubscribe(Z)):(yield this.room.subscribe(Z),yield Z.player.resume(!0))),yield this._updateVideoPlayOption({view:a,playOption:_,track:Z,prevConfig:cA}),tB(cA,e);let TA=Ee(u?.receiveWhenViewVisible)?(o=cA.option)==null?void 0:o.receiveWhenViewVisible:u.receiveWhenViewVisible,JA=Ee(a)?cA.view:a,Ie=Ee(u?.viewRoot)?(n=cA.option)==null?void 0:n.viewRoot:u.viewRoot;this._observeView({remoteTrack:Z,view:JA,receiveWhenViewVisible:TA,viewRoot:Ie})})}stopRemoteVideo(e){return DA(this,null,function*(){return this._stopRemoteVideo(e)})}_stopRemoteVideo(e){let o=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1];return DA(this,null,function*(){let n=[],a=this._room.remotePublishedUserMap.get(e.userId);if(a){let{muteState:I,remoteVideoTrack:c,remoteAuxiliaryTrack:u}=a;e.streamType==="main"&&(c.stop(),I.hasVideo&&n.push(c)),e.streamType==="sub"&&(u.stop(),I.hasAuxiliary&&n.push(u))}for(let I of n)o&&(delete I.ignoreUpdatePlayingState,yield this._room.unsubscribe(I),this._mediaTrackMap.delete(I.outMediaTrack));this._removeRemoteVideoConfig(e.userId,e.streamType)})}_removeRemoteVideoConfig(e,o){let n="".concat(e,"_").concat(o),a=this._remoteVideoConfigMap.get(n);if(a&&(a.observer&&a.observer.disconnect(),a.handlers)){let I=this._room.remotePublishedUserMap.get(e);if(I){let c=o==="main"?I.remoteVideoTrack:I.remoteAuxiliaryTrack;this._unbindRemoteVideoTrackEvents(c,a.handlers)}}this._remoteVideoConfigMap.delete(n)}_bindRemoteVideoTrackEvents(e){let o={onEnterPIP:()=>DA(this,null,function*(){yield e.player.enterPIPPromise,this.emit(Xt.PICTURE_IN_PICTURE_STATE_CHANGED,{streamType:cl(e.streamType),userId:e.userId,isPictureInPicture:!0,pictureInPictureWindow:e.player.pipWindow})}),onLeavePIP:()=>{this.emit(Xt.PICTURE_IN_PICTURE_STATE_CHANGED,{streamType:cl(e.streamType),userId:e.userId,isPictureInPicture:!1})},onEnterFullScreen:()=>{this.emit(Xt.FULL_SCREEN_STATE_CHANGED,{streamType:cl(e.streamType),userId:e.userId,isFullScreen:!0})},onLeaveFullScreen:()=>{this.emit(Xt.FULL_SCREEN_STATE_CHANGED,{streamType:cl(e.streamType),userId:e.userId,isFullScreen:!1})},onDecodeFailed:()=>{this.emit(Xt.ERROR,new vi({code:Si.OPERATION_FAILED,extraCode:5507,message:"video decode failed"}))},onVideoSizeChanged:n=>{this.emit(Xt.VIDEO_SIZE_CHANGED,fi(bt({},n),{streamType:cl(n.streamType)}))}};return e.player.on(mi.ENTER_PICTURE_IN_PICTURE,o.onEnterPIP),e.player.on(mi.LEAVE_PICTURE_IN_PICTURE,o.onLeavePIP),e.player.on(mi.ENTER_FULL_SCREEN,o.onEnterFullScreen),e.player.on(mi.LEAVE_FULL_SCREEN,o.onLeaveFullScreen),e.on("decode-failed",o.onDecodeFailed),e.on("video-size-changed",o.onVideoSizeChanged),o}_unbindRemoteVideoTrackEvents(e,o){e.player.off(mi.ENTER_PICTURE_IN_PICTURE,o.onEnterPIP),e.player.off(mi.LEAVE_PICTURE_IN_PICTURE,o.onLeavePIP),e.player.off(mi.ENTER_FULL_SCREEN,o.onEnterFullScreen),e.player.off(mi.LEAVE_FULL_SCREEN,o.onLeaveFullScreen),e.off("decode-failed",o.onDecodeFailed),e.off("video-size-changed",o.onVideoSizeChanged)}muteRemoteAudio(e,o){return DA(this,null,function*(){this._remoteAudioMuteMap.set(e,o);try{if(e==="*")if(o)yield this._stopRemoteAudio({userId:e});else{let n=[...this._room.remotePublishedUserMap.values()];for(let a of n)a.muteState.hasAudio&&!this._remoteAudioConfigMap.has(a.userId)&&this.room.isJoined&&(yield this._startRemoteAudio({userId:a.userId}))}else o?yield this._stopRemoteAudio({userId:e}):!this._remoteAudioConfigMap.has(e)&&this.room.isJoined&&(yield this._startRemoteAudio({userId:e}))}catch(n){throw n.code!==Si.OPERATION_ABORT&&this._remoteAudioMuteMap.delete(e),n}})}setRemoteAudioVolume(e,o){if(e==="*"){this._remoteAudioVolumeMap.set("*",o),this._remoteAudioVolumeMap.forEach((a,I)=>this._remoteAudioVolumeMap.set(I,o));let n=[...this._room.remotePublishedUserMap.values()];for(let a of n)this._remoteAudioVolumeMap.set(a.userId,o),a.remoteAudioTrack.isSubscribed&&this._updateAudioPlayOption({playOption:{volume:o},track:a.remoteAudioTrack})}else if(e){let n=this._room.remotePublishedUserMap.get(e);this._remoteAudioVolumeMap.set(e,o),n&&n.remoteAudioTrack.isSubscribed&&this._updateAudioPlayOption({playOption:{volume:o},track:n.remoteAudioTrack})}}startPlugin(e,o){return DA(this,null,function*(){return e.start(o)})}updatePlugin(e,o){return DA(this,null,function*(){return e.update(o)})}stopPlugin(e,o){return DA(this,null,function*(){return e.stop(o)})}enableAudioVolumeEvaluation(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:2e3,o=arguments.length>1&&arguments[1]!==void 0&&arguments[1];this._room.enableAudioVolumeEvaluation(e,o)}on(e,o,n){if(this.listeners(e).includes(o))return this;if(this._log.debug("on",e),super.on(e,o,n),this._eventListened.add(e),this.listeners(Xt.AUDIO_FRAME).length>0){let{audioFrameEventConfigMap:a}=this.room.audioManager;a.get("")||a.set("",{enable:!0}),this._localAudioTrack&&this.room.audioManager.handleLocalTrackStarted({userId:"",room:this.room})}return e==="realtime-transcriber-message"&&this._room.subscribeDataChannel(),this}emit(e){for(var o=arguments.length,n=new Array(o>1?o-1:0),a=1;a{I?.abort("off")}),a.clear()}return this}getAudioTrack(){let e,o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{userId:"",streamType:"main"},n=null,a="main",I=!1;if(Sr(o)?e=o:(e=o.userId,I=o.processed===!0,o.streamType&&(a=o.streamType)),e){let c=this._room.remotePublishedUserMap.get(e);c&&(n=c.remoteAudioTrack)}else n=a==="sub"?this._localScreenAudioTrack:this._localAudioTrack;return n?I&&n.outMediaTrack&&n.outMediaTrack!==n.mediaTrack?n.outMediaTrack.clone():n.mediaTrack:null}getVideoTrack(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{userId:"",streamType:"main"},{userId:o="",streamType:n="main",processed:a=!1}=e,I=null;if(o==="")n==="main"&&this._localVideoTrack&&(I=this._localVideoTrack),n==="sub"&&this._localScreenTrack&&(I=this._localScreenTrack);else{let c=this._room.remotePublishedUserMap.get(o);c&&(I=n==="main"?c.remoteVideoTrack:c.remoteAuxiliaryTrack)}return I?a&&I.outMediaTrack&&I.outMediaTrack!==I.mediaTrack?I.outMediaTrack.clone():I.mediaTrack:null}getVideoSnapshot(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},{userId:o,streamType:n="main"}=e;if(o){let a=this._room.remotePublishedUserMap.get(o);if(n==="main"&&a!=null&&a.muteState.hasVideo)return a.remoteVideoTrack.getVideoFrame();if(n==="sub"&&a!=null&&a.muteState.hasAuxiliary)return a.remoteAuxiliaryTrack.getVideoFrame()}else{if(n==="main"&&this._localVideoTrack)return this._localVideoTrack.getVideoFrame();if(n==="sub"&&this._localScreenTrack)return this._localScreenTrack.getVideoFrame()}return""}_setCurrentSpeaker(e){var o,n;this._speakerId=e,(o=this._localAudioTrack)==null||o.setAudioOutput(e),(n=this._localScreenAudioTrack)==null||n.setAudioOutput(e),this._room.remotePublishedUserMap.forEach(a=>a.remoteAudioTrack.setAudioOutput(e))}setCurrentSpeaker(e){return DA(this,null,function*(){(yield Mm()).forEach(o=>{o.deviceId===e&&(this._setCurrentSpeaker(e),this.emit(Xt.DEVICE_CHANGED,{type:"speaker",action:"active",device:o}),Dg=o)}),this._log.warn('the "setCurrentSpeaker" method of the instance will be deprecated in the future, please use "TRTC.setCurrentSpeaker" instead. For more information, please visit: '.concat($C,"/en/TRTC.html#.setCurrentSpeaker"))})}_startRemoteAudio(e){return this._doStartRemoteAudio(e)}_doStartRemoteAudio(e){return DA(this,null,function*(){var o;let{userId:n}=e;if(this._remoteAudioConfigMap.has(n))return void this._log.warn("remote audio has already started. userId:".concat(n));let a=this._room.remotePublishedUserMap.get(n);if(!a)return;let I={},c=a.remoteAudioTrack;c.on("decode-failed",u=>{this.emit(Xt.ERROR,new vi({code:Si.OPERATION_FAILED,extraCode:5508,message:"audio decode failed"}))}),this._listenOutputTrackChanged(c),this._speakerId&&c.setAudioOutput(this._speakerId);try{let u=(o=this._remoteAudioVolumeMap.get(n))!=null?o:this._remoteAudioVolumeMap.get("*"),d=hr(u)?u:100;I.volume=d,this._remoteAudioConfigMap.set(n,e),yield this._room.subscribe(c),Jn(Ln(c,"decode-failed"),Qc(Ln(c,Uo.INIT)),Ks(()=>{this.startPlugin(P4.Name,{track:c,type:"auto",config:{codec:"opus",sampleRate:48e3,numberOfChannels:1}})})),yield this._updateAudioPlayOption({playOption:I,track:c}),S.emit("115",{userId:n,room:this.room}),c.outMediaTrack&&this.room.audioManager.updateAudioReference({type:"add",audioReference:c.outMediaTrack,refId:"ra-".concat(n)})}catch(u){throw this._remoteAudioConfigMap.delete(n),u}this._emitTrackEvent(c)})}_stopRemoteAudio(e){let o=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1];return DA(this,null,function*(){let n=this._room.remotePublishedUserMap.get(e.userId);n&&(n.remoteAudioTrack.stop(),n.muteState.hasAudio&&o&&(yield this._room.unsubscribe(n.remoteAudioTrack)),this._mediaTrackMap.delete(n.remoteAudioTrack.outMediaTrack)),this._remoteAudioConfigMap.delete("".concat(e.userId)),S.emit("116",{userId:e.userId,room:this.room}),this.room.audioManager.updateAudioReference({type:"remove",refId:"ra-".concat(e.userId)})})}_enableVideoDecodeFallback(e,o){let n,a=this._room.videoDecodeFallbackType;a&&this._plugins.has("TRTCVideoDecoder")&&(e.log.debug("remote video will fall back when decode failed",e.id),Jn(Ln(e,"decode-failed"),Qc(Ln(e,Uo.INIT)),kq(()=>{this._room.downlinkVideoCodec!=="h265"&&this.startPlugin("TRTCVideoDecoder",{type:"auto",renderer:"videoFrame",track:e,config:{codec:"avc1.420028"},fallback:a})}),hx(Ln(e,"decode-downgrade-state-changed")),Ks(I=>{n=I.state,this.emit(Xt.VIDEO_DECODE_DOWNGRADE_STATE_CHANGED,fi(bt({},I),{streamType:o,userId:e.userId}))},I=>{e.log.error("fallback",I)},()=>{n==="STARTED"&&e.log.info("fallback complete")})))}_updateVideoPlayOption(e){return DA(this,arguments,function(o){let{view:n,playOption:a,track:I,prevConfig:c}=o;return function*(){if(I.setMirror(a.mirror),Ee(n)&&c&&c.view&&!zR(a)){let u=Hf(c.view);u.length>0&&(yield I.play(u,a))}if(!Ee(n)){let u=Hf(n);u.length>0?yield I.play(u,a):I.stop()}}()})}_updateAudioPlayOption(e){return DA(this,arguments,function(o){var n=this;let{playOption:a={},track:I,prevConfig:c}=o;return function*(){if(!I.isPlayCalled)try{yield I.play(null,a)}catch{}if(Ee(a.muted)||I.setPlayerMute(a.muted),Ee(a.volume)||I.setAudioVolume(a.volume/100),I instanceof vm&&I.mediaTrack){let u=a.muted===!1&&!Ee(a.volume)&&a.volume>0?"add":"remove";n.room.audioManager.updateAudioReference({type:u,audioReference:I.mediaTrack,refId:"em"})}else if(I instanceof Dx){let u=a.muted?0:a.volume;if(Ee(u))return;n.room.audioManager.updateAudioReference({type:"updateVolume",refId:"ra-".concat(I.userId),volume:a.volume})}}()})}_listenOutputTrackChanged(e){e.listeners("output-media-track-changed").length===0&&e.on("output-media-track-changed",()=>this._emitTrackEvent(e,!1))}_emitTrackEvent(e){let o=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],n=e.isRemote?e.userId:"";e.outMediaTrack&&(o&&this._mediaTrackMap.get(e.outMediaTrack)===n||(this._mediaTrackMap.set(e.outMediaTrack,n),this.emit(Xt.TRACK,{userId:n,streamType:cl(e.streamType),track:e.outMediaTrack,sourceTrack:e.mediaTrack})))}_checkTrackToPublish(){var e,o,n;let a=[];if((e=this._localAudioConfig)!=null&&e.publish&&this._localAudioTrack&&a.push(this._localAudioTrack),(o=this._localVideoConfig)!=null&&o.publish&&this._localVideoTrack&&a.push(this._localVideoTrack),(n=this._localScreenConfig)!=null&&n.publish&&(this._localScreenTrack&&a.push(this._localScreenTrack),this._localScreenAudioTrack&&a.push(this._localScreenAudioTrack),this._checkScreenAudioEchoCancellation(this._localScreenTrack,this._localScreenAudioTrack)),a.length!==0)return Promise.all(a.map(I=>this._room.publish(I).catch(()=>{})))}_observeView(e){let{remoteTrack:o,view:n,receiveWhenViewVisible:a,viewRoot:I}=e;if(Ee(n)||Ee(a))return;let c=this._remoteVideoConfigMap.get("".concat(o.userId,"_").concat(cl(o.streamType)));if(!c)return;let u=c.observer||void 0;if(n===null||Aa(n)&&n.length===0||!a)return u?.disconnect(),void(o.isSubscribed||(this._log.info("_observeView observer disconnect, resubscribe",o.userId,o.strMediaType),this._room.subscribe(o).catch(()=>{})));let d=c.visibleViewMap||new Map,R=-1;(!u||u.root!==I)&&(u?.disconnect(),d.clear(),u=new IntersectionObserver(_=>{_.forEach(Z=>{d.set(Z.target,Z.isIntersecting),o.log.info("view ".concat(Z.target.id," is").concat(Z.isIntersecting?"":" not"," visible"))}),clearTimeout(R),R=window.setTimeout(()=>{[...d.values()].find(Z=>Z)?o.isSubscribed||this._room.subscribe(o).catch(()=>{}):o.isSubscribed&&this._room.unsubscribe(o).catch(()=>{})},200)},{root:I}));let k=new Set(Hf(n));d.forEach((_,Z)=>{k.has(Z)||(u.unobserve(Z),d.delete(Z))}),k.forEach(_=>{d.set(_,!0),u.observe(_)}),u.takeRecords().forEach(_=>{d.set(_.target,_.isIntersecting)}),c.visibleViewMap=d,c.observer=u}_exitRoom(){return DA(this,null,function*(){this._room.isJoined&&(yield this._room.leave()),this._clearRemoteTracks()})}_stopScreenShare(){return DA(this,null,function*(){var e,o;if(this._localScreenTrack){if(this._room.isJoined){let n=[];(e=this._localScreenConfig)!=null&&e.publish&&n.push(this._localScreenTrack),this._localScreenAudioTrack&&n.push(this._localScreenAudioTrack),yield Promise.all(n.map(a=>this._room.unpublish(a).catch(()=>{})))}this._localScreenTrack.stop(),this._localScreenTrack.close(),this._localScreenAudioTrack&&(((o=this._localScreenAudioTrack.trackSettings)==null?void 0:o.echoCancellation)===!1&&this.stopPlugin("AudioProcessor"),this._localScreenAudioTrack.stop(),this._localScreenAudioTrack.close(),this._room.audioManager.removeInput(this._localScreenAudioTrack),this._localScreenAudioTrack=null),pr(this._localScreenTrack),this._localScreenTrack=null,delete this._room.capturedLocalAuxVideoTrack,this._localScreenConfig=null}})}_checkScreenAudioEchoCancellation(e,o){return DA(this,null,function*(){var n,a;if(!e||!o)return;let I=(n=e.trackSettings)==null?void 0:n.displaySurface;if(((a=o.trackSettings)==null?void 0:a.echoCancellation)===!1&&(I==="monitor"||I==="browser"&&e.isShareCurrentTab)){this._log.warn("echoCancellation of screen audio track is disable. Try starting audioProcessor plugin");try{yield this.startPlugin("AudioProcessor",{sdkAppId:Number(this.room.sdkAppId),userId:this._room.userId,userSig:this.room.userSig,isScreenAudioNeedAudioProcess:!0,isLocalAudioNeedAudioProcess:!1})}catch(c){this._log.warn("start audioProcessor plugin failed: ",c)}}})}_onLocalTrackCaptured(e){let{track:o}=e;o.kind==="audio"&&(!Dg||HT(Dg))&&(this._initActiveSpeaker(),S.off("102",this._onLocalTrackCaptured,this))}_initActiveSpeaker(){return DA(this,null,function*(){if(Dg&&!HT(Dg))this.emit(Xt.DEVICE_CHANGED,{type:"speaker",action:"active",device:Dg});else{let e=yield Mm();e[0]&&!HT(e[0])?(Dg=e[0],this.emit(Xt.DEVICE_CHANGED,{type:"speaker",action:"active",device:e[0]})):S.on("102",this._onLocalTrackCaptured,this)}})}_onAudioAvailable(e){let{userId:o}=e,n=this._remoteAudioMuteMap.has(o)?this._remoteAudioMuteMap.get(o):this._remoteAudioMuteMap.get("*");(n===!1||this._room.autoReceiveAudio&&!n)&&this._doStartRemoteAudio({userId:o}).catch(()=>{})}_onVideoAvailable(e){let{userId:o,streamType:n}=e;if(!this._room.autoReceiveVideo)return;let a=this._room.remotePublishedUserMap.get(o);if(a){let I=n==="main"?a.remoteVideoTrack:a.remoteAuxiliaryTrack,c=[I];this._room.autoReceiveAudio&&a.remoteAudioTrack.isAvailable&&c.push(a.remoteAudioTrack),this._room.subscribe(...c).then(()=>{this._emitTrackEvent(I)}).catch(()=>{})}}_onAudioUnavailable(e){let{userId:o,muteState:n}=e;n.hasAudio&&n.audioMuted||this._stopRemoteAudio({userId:o},!1).catch(()=>{})}_onVideoUnavailable(e){let{userId:o,streamType:n}=e;this._stopRemoteVideo({userId:o,streamType:n},!1).catch(()=>{})}_onDataChannelAvailable(){if(this.listeners("realtime-transcriber-message").length>0)return this._room.subscribeDataChannel()}sendSEIMessage(e,o){var n;let a=this._plugins.get("SEI");a&&(a.update({buffer:e,options:fi(bt({seiPayloadType:243},o),{small:!((n=this._localVideoTrack)==null||!n.small)})}),ct.addCount({key:5e5,useUV:!0}))}sendCustomMessage(e){var o,n;(n=(o=this._room).sendCustomMessage)==null||n.call(o,e),ct.addCount({key:500001,useUV:!0})}callExperimentalAPI(e,o){return DA(this,null,function*(){return this._log.info("callExperimentalAPI(".concat(e,", ").concat(JSON.stringify(o),")")),GeA.call(e,bt({trtcInstance:this},o))})}static setLogLevel(e,o){nA.setLogLevel(e),Ee(o)||(o?nA.enableUploadLog():nA.disableUploadLog())}static isSupported(){return yT($Q.frameWorkType)}static getPermissions(e){return DA(this,arguments,function(o){let{request:n=!0,types:a=["camera","microphone"]}=o;return function*(){n&&(yield Ux.request(a).catch(u=>{var d;return nA.error("getPermissions request failed, error: ".concat((d=u?.message)!=null?d:u))}));let[I,c]=yield Promise.all([Ux.get("camera"),Ux.get("microphone")]);return{camera:I,microphone:c}}()})}static getCameraList(){return qQ(!(arguments.length>0&&arguments[0]!==void 0)||arguments[0])}static getMicrophoneList(){return VQ(!(arguments.length>0&&arguments[0]!==void 0)||arguments[0])}static getSpeakerList(){return Mm(!(arguments.length>0&&arguments[0]!==void 0)||arguments[0])}static setCurrentSpeaker(e){return DA(this,null,function*(){if(ra&&(e===iG.SPEAKER||e===iG.HEADSET)){let o=yield $Q.getMicrophoneList(),n="";return o.forEach(a=>{a.label===e&&(n=a.deviceId)}),n?void aG.forEach(a=>DA(null,null,function*(){a._localAudioTrack&&(yield a.updateLocalAudio({option:{microphoneId:n}}))})):void 0}(yield Mm()).forEach(o=>{o.deviceId===e&&(aG.forEach(n=>{n._setCurrentSpeaker(e),n.emit(Xt.DEVICE_CHANGED,{type:"speaker",action:"active",device:o})}),Dg=o)})})}static _addKVStat(e){let{type:o,key:n,value:a,base:I,useUV:c,version:u,max:d}=e;switch(u&&(oB.version=u),o){case"count":oB.addCount({key:n,useUV:c});break;case"enum":oB.addEnum({key:n,value:a,useUV:c});break;case"number":oB.addNumber({key:n,value:a,split:I,max:d})}}get localVideoTrack(){return this._localVideoTrack}get localScreenTrack(){return this._localScreenTrack}get localScreenAudioTrack(){return this._localScreenAudioTrack}};G(Qo,"VERSION",L4),G(Qo,"_loggerManager",nA),G(Qo,"EVENT",Xt),G(Qo,"ERROR_CODE",Si),G(Qo,"TYPE",iG),G(Qo,"frameWorkType",30),vt([Hn({replaceArg:A=>({argIndex:0,value:{name:"plugin"in A?A.plugin.Name:A.Name,assetsPath:"assetsPath"in A?A?.assetsPath:"default"}})})],Qo.prototype,"use"),vt([vI(mg.TRTC.enterRoom),km("room",(A,e)=>{let[o]=A,[n]=e;return(o.roomId||o.strRoomId)===(n.roomId||n.strRoomId)&&o.userId===n.userId&&o.sdkAppId===n.sdkAppId}),Dn(A=>function(e){return this._log.setUserId(e.userId),this._log.setSdkAppId(e.sdkAppId),A.call(this,e)}),Hn()],Qo.prototype,"enterRoom"),vt([Hn()],Qo.prototype,"exitRoom"),vt([vI(mg.TRTC.switchRoom),Hn(),VT()],Qo.prototype,"switchRoom"),vt([vI(mg.TRTC.switchRole),YM("room",{merge:(A,e)=>e}),Hn()],Qo.prototype,"switchRole"),vt([Hn()],Qo.prototype,"destroy"),vt([vI(mg.TRTC.startLocalAudio),km("audio",(A,e)=>{let[o]=A,[n]=e;var a,I;return((a=o?.option)==null?void 0:a.microphoneId)===((I=n?.option)==null?void 0:I.microphoneId)}),Hn()],Qo.prototype,"startLocalAudio"),vt([vI(mg.TRTC.updateLocalAudio),YM("audio",{debounce:{delay:200,getKey:()=>"".concat(J4,"-localAudio"),isNeedToDebounce:A=>{var e;return!Ee((e=A.option)==null?void 0:e.captureVolume)}}}),Hn()],Qo.prototype,"updateLocalAudio"),vt([_m("audio"),Hn()],Qo.prototype,"stopLocalAudio"),vt([vI(mg.TRTC.startLocalVideo),km("video",(A,e)=>{let[o]=A,[n]=e;var a,I;return((a=o?.option)==null?void 0:a.cameraId)===((I=n?.option)==null?void 0:I.cameraId)}),Hn()],Qo.prototype,"startLocalVideo"),vt([vI(mg.TRTC.updateLocalVideo),YM("video"),Hn()],Qo.prototype,"updateLocalVideo"),vt([_m("video"),Hn()],Qo.prototype,"stopLocalVideo"),vt([vI(mg.TRTC.startScreenShare),km("screen",()=>!0),Hn()],Qo.prototype,"startScreenShare"),vt([vI(mg.TRTC.updateScreenShare),YM("screen"),Hn()],Qo.prototype,"updateScreenShare"),vt([Hn()],Qo.prototype,"stopScreenShare"),vt([vI(mg.TRTC.startRemoteVideo),km(A=>"v".concat(A.userId).concat(A.streamType),()=>!0),Hn({getRemoteId:A=>"".concat(A.userId,"_").concat(A.streamType)})],Qo.prototype,"startRemoteVideo"),vt([vI(mg.TRTC.updateRemoteVideo),YM(A=>"v".concat(A.userId).concat(A.streamType)),Hn({getRemoteId:A=>"".concat(A.userId,"_").concat(A.streamType)})],Qo.prototype,"updateRemoteVideo"),vt([vI(mg.TRTC.stopRemoteVideo),Dn(A=>function(e){return DA(this,null,function*(){if(e.userId==="*"){let o=[];return this._room.remotePublishedUserMap.forEach(n=>{this._remoteVideoConfigMap.has("".concat(n.userId,"_main"))&&o.push(this.stopRemoteVideo({streamType:"main",userId:n.userId}).catch(()=>{})),this._remoteVideoConfigMap.has("".concat(n.userId,"_sub"))&&o.push(this.stopRemoteVideo({streamType:"sub",userId:n.userId}).catch(()=>{}))}),Promise.all(o)}return A.call(this,e)})}),Hn({getRemoteId:A=>"".concat(A.userId,"_").concat(A.streamType)})],Qo.prototype,"stopRemoteVideo"),vt([_m(A=>"v".concat(A.userId).concat(A.streamType))],Qo.prototype,"_stopRemoteVideo"),vt([vI(...mg.TRTC.muteRemoteAudio),Hn({getRemoteId:A=>A})],Qo.prototype,"muteRemoteAudio"),vt([F4(...mg.TRTC.setRemoteAudioVolume),function(A,e){return Dn((o,n)=>function(){for(var a=arguments.length,I=new Array(a),c=0;c{var _;(_=PM.get(this))==null||_.delete(d)},A);u.set(d,k)}else{clearTimeout(R);let k=window.setTimeout(()=>{var _;o.apply(this,I),(_=PM.get(this))==null||_.delete(d)},A);u.set(d,k)}})}(200,A=>A),Hn({getRemoteId:A=>A})],Qo.prototype,"setRemoteAudioVolume"),vt([zq("start"),wm(A=>{var e;return(e=A.afterStart)==null?void 0:e.call(A)}),km((A,e)=>A.disableRandomCall?null:A.getAlias()+A.getGroup(e)),Hn({replaceArg:A=>({argIndex:0,value:A.getName()}),getKVReportKey:A=>jO[A.getName()],ignoreLog:A=>A.getName()==="Debug",ignoreErrorLog:A=>A.getName()==="AudioProcessor"})],Qo.prototype,"startPlugin"),vt([zq("update"),YM((A,e)=>A.disableRandomCall?null:A.getAlias()+A.getGroup(e),{merge:(A,e)=>(tB(A[1],e[1]),A)}),Hn({replaceArg:A=>({argIndex:0,value:A.getName()}),getKVReportKey:A=>xh[A.getName()]})],Qo.prototype,"updatePlugin"),vt([zq("stop"),_m((A,e)=>{if(A.disableRandomCall)return null;let o=A.getGroup(e),n=A.getAlias();return o==="*"?new RegExp("".concat(n,".*")):n+o}),Hn({replaceArg:A=>({argIndex:0,value:A.getName()}),getKVReportKey:A=>DM[A.getName()]})],Qo.prototype,"stopPlugin"),vt([F4(...mg.TRTC.enableAudioVolumeEvaluation)],Qo.prototype,"enableAudioVolumeEvaluation"),vt([Hn()],Qo.prototype,"getVideoSnapshot"),vt([Hn()],Qo.prototype,"_setCurrentSpeaker"),vt([km(A=>"a".concat(A.userId),()=>!0)],Qo.prototype,"_startRemoteAudio"),vt([Dn(A=>function(e){return DA(this,null,function*(){return e.userId==="*"?Promise.all([...this._room.remotePublishedUserMap.values()].map(o=>this._stopRemoteAudio(fi(bt({},e),{userId:o.userId})).catch(()=>{}))):A.call(this,e)})}),_m(A=>"a".concat(A.userId))],Qo.prototype,"_stopRemoteAudio"),vt([_m("room")],Qo.prototype,"_exitRoom"),vt([_m("screen")],Qo.prototype,"_stopScreenShare"),vt([vI(...mg.TRTC.sendSEIMessage),s4({timesInSecond:30,maxSizeInSecond:8e3,getSize:function(){for(var A=arguments.length,e=new Array(A),o=0;oA.data.byteLength})],Qo.prototype,"sendCustomMessage"),vt([Hn()],Qo.prototype,"callExperimentalAPI"),vt([bm()],Qo,"create"),vt([vI(mg.TRTC.create)],Qo,"_create"),vt([bm()],Qo,"setLogLevel"),vt([bm()],Qo,"isSupported"),vt([bm(),Hn()],Qo,"getPermissions"),vt([bm()],Qo,"getCameraList"),vt([bm()],Qo,"getMicrophoneList"),vt([bm()],Qo,"getSpeakerList");var sG=Qo,beA=class{constructor(){G(this,"_set",new Set),S.on(K.LEAVE_SUCCESS,this.delete,this),S.on(K.SWITCH_ROOM_SUCCESS,this.handleSwitchRoomSuccess,this)}add(A){let{room:e,roomId:o}=A;if(e.scene==="rtc")return;let n=this.getKey(e.userId,o||e.roomId,e.sdkAppId,e.useStringRoomId);this._set.add(n)}delete(A){let{room:e,roomId:o}=A;if(e.scene==="rtc")return;let n=this.getKey(e.userId,e.roomId||o,e.sdkAppId,e.useStringRoomId);this._set.delete(n)}getKey(A,e,o,n){return"".concat(o,"_").concat(e,"_").concat(A,"_").concat(n)}isJoined(A){let{userId:e,roomId:o,sdkAppId:n,room:a}=A;return a.scene!=="rtc"&&this._set.has(this.getKey(e,o,n,a.useStringRoomId))}handleSwitchRoomSuccess(A){let{room:e,currentRoomId:o,targetRoomId:n}=A;e.scene!=="rtc"&&(this._set.delete(this.getKey(e.userId,o,e.sdkAppId,e.useStringRoomId)),this._set.add(this.getKey(e.userId,n,e.sdkAppId,e.useStringRoomId)))}};function LeA(){return DA(this,null,function*(){let A,e;try{let iA=yield VQ();A=iA&&iA.length}catch{}try{let iA=yield qQ();e=iA&&iA.length}catch{}let o={microphone:A,camera:e},{isH264EncodeSupported:n,isVp8EncodeSupported:a,isH264DecodeSupported:I,isVp8DecodeSupported:c,isH265EncodeSupported:u,isH265DecodeSupported:d}=this.checkSystemResult.detail,R=kA.basis(),k={webRTC:R.isWebRTCSupported,getUserMedia:R.isGetUserMediaSupported,webSocket:R.isWebSocketsSupported,screenShare:R.isScreenShareSupported,webAudio:R.isWebAudioSupported,h264Encode:n,h264Decode:I,vp8Encode:a,vp8Decode:c,h265Encode:u,h265Decode:d},_={browser:R.browser,os:R.os,trtc:k,devices:o},Z={isWebCodecSupported:R.isWebCodecSupported,isMediaSessionSupported:R.isMediaSessionSupported,isWebTransportSupported:R.isWebTransportSupported};Jo.uploadEvent({log:"trtcstats-".concat(JSON.stringify(_)),userId:this.userId}),this._log.info("TrtcStats-".concat(JSON.stringify(_))),Jo.uploadEvent({log:"trtcadvancedstats-".concat(JSON.stringify(Z)),userId:this.userId}),hm()})}var FeA=es(hg()),H4="1",rK="2",gG="3",UeA="4",Ox="5",OeA="6",xx="7",V4="8",sB={CLIENT_BANNED:9,CHANNEL_SETUP_RESULT:19,CHANNEL_RECONNECT_RESULT:514,JOIN_ROOM_RESULT:20,PEER_JOIN:4134,PEER_LEAVE:4135,STREAM_ADDED:16,STREAM_REMOVED:18,UPLINK_NETWORK_STATS:22,UPDATE_REMOTE_MUTE_STAT:23,PUBLISH_RESULT:4098,PUBLISH_STATE_CHANGE_RESULT:4112,UNPUBLISH_RESULT:4100,SUBSCRIBE_RESULT:4102,UNSUBSCRIBE_RESULT:4104,SUBSCRIBE_CHANGE_RESULT:4106,MUTE_RESULT:4108,UPDATE_OFFER_RESULT:4128,START_PUBLISH_TENCENT_CDN_RES:1286,STOP_PUBLISH_TENCENT_CDN_RES:1288,START_PUBLISH_GIVEN_CDN_RES:777,STOP_PUBLISH_GIVEN_CDN_RES:779,START_MIX_TRANSCODE_RES:781,STOP_MIX_TRANSCODE_RES:783,START_PUBLISH_CDN_STREAM_RES:8196,UPDATE_PUBLISH_CDN_STREAM_RES:8198,STOP_PUBLISH_CDN_STREAM_RES:8200,USER_LIST_RES:4137,SWITCH_ROLE_RES:4110,UPDATE_CONSTRAINT_CONFIG_RES:772,REBUILD_PEER_CONNECTION_RES:4150,SPC_PUBLISH_RESULT:4146,SPC_SUBSCRIBE_RESULT:4156,ABILITY_STATUS_REPORT_RESULT:4158,SERVER_FIRST_PACKAGE_RECEIVED:5e3,RECEIVE_CUSTOM_MSG:4140,FALLBACK_CODEC:66,SEND_SWITCH_ROOM_RES:4160,SEND_SWITCH_ROOM_SUBED_REQ:4161,UPDATE_NETWORK_TIME_RESULT:5001,CUSTOM_CMD_RES:8220},xeA=[sB.UPDATE_REMOTE_MUTE_STAT,sB.UPLINK_NETWORK_STATS,sB.USER_LIST_RES,sB.MUTE_RESULT,sB.SERVER_FIRST_PACKAGE_RECEIVED,sB.RECEIVE_CUSTOM_MSG,sB.UPDATE_NETWORK_TIME_RESULT],io={CLIENT_BANNED:"client-banned",CHANNEL_SETUP_RESULT:"channel-setup-result",CHANNEL_RECONNECT_RESULT:"channel-reconnect-result",JOIN_ROOM_RESULT:"join-room-result",PEER_JOIN:"peer-join",PEER_LEAVE:"peer-leave",STREAM_ADDED:"stream-added",STREAM_REMOVED:"stream-removed",UPLINK_NETWORK_STATS:"uplink-network-stats",UPDATE_REMOTE_MUTE_STAT:"update-remote-mute-stat",PUBLISH_RESULT:"publish-result",PUBLISH_STATE_CHANGE_RESULT:"publish-state-change-result",UNPUBLISH_RESULT:"unpublish-result",SUBSCRIBE_RESULT:"subscribe-result",SUBSCRIBE_CHANGE_RESULT:"subscribe-change-result",UNSUBSCRIBE_RESULT:"unsubscribe-result",UPDATE_OFFER_RESULT:"update-offer-result",START_PUBLISH_TENCENT_CDN_RES:"start-publish-tencent-cdn-res",STOP_PUBLISH_TENCENT_CDN_RES:"stop-publish-tencent-cdn-res",START_PUBLISH_GIVEN_CDN_RES:"start-publish-given-cdn-res",STOP_PUBLISH_GIVEN_CDN_RES:"stop-publish-given-cdn-res",START_MIX_TRANSCODE_RES:"start-mix-transcode-res",STOP_MIX_TRANSCODE_RES:"stop-mix-transcode-res",START_PUBLISH_CDN_STREAM_RES:"start-publish-cdn-stream-res",UPDATE_PUBLISH_CDN_STREAM_RES:"update-publish-cdn-stream-res",STOP_PUBLISH_CDN_STREAM_RES:"stop-publish-cdn-stream-res",USER_LIST_RES:"user-list-res",SWITCH_ROLE_RES:"switch_role_res",MUTE_RESULT:"mute-result",UPDATE_CONSTRAINT_CONFIG_RES:"update-contraint-config-res",REBUILD_PEER_CONNECTION_RES:"rebuild-pc-res",SPC_PUBLISH_RESULT:"spc-publish-result",SPC_SUBSCRIBE_RESULT:"spc-subscribe-result",ABILITY_STATUS_REPORT_RESULT:"ability-status-report",SERVER_FIRST_PACKAGE_RECEIVED:"first-pkg-received",RECEIVE_CUSTOM_MSG:"receive-custom-msg",FALLBACK_CODEC:"fallback-codec",SEND_SWITCH_ROOM_RES:"send-switch-room-res",SEND_SWITCH_ROOM_SUBED_REQ:"send-switch-room-subed-res",UPDATE_NETWORK_TIME_RESULT:"update_network_time_result",CUSTOM_CMD_RES:"custom-cmd-res"},q4="publish_change",YeA="join",PeA="leave",JeA="quality_report",K4="mute_uplink",j4="publish",nK="publish_state_change",Yx="unpublish",W4="subscribe",aK="unsubscribe",sK="subscribe_change",HeA="start_publishing",VeA="stop_publishing",qeA="start_push_user_cdn",KeA="stop_push_user_cdn",jeA="start_mcu_mix",WeA="stop_mcu_mix",zeA="start_publish_cdn_stream",ZeA="update_publish_cdn_stream",XeA="stop_publish_cdn_stream",$eA="get_user_list",AtA="change_role",gK="update_constraint_config",etA="rebuild_pc",ttA="join/v2",z4="publish/v2",Z4="subscribe/v3",itA="ability_status_report",otA="reconnect",rtA="channel_msg",ntA="switch_room",atA="update_network_time",stA=new Set([j4,q4,nK,Yx,W4,sK,aK,z4,Z4]),Px=new Set,gtA=["autoTest","relayInnerIp","relayOuterIp","mcd","newRelay","clientIp"],ItA=0,X4=class extends FeA.default{constructor(A){var e,o,n;super(),G(this,"room"),G(this,"sdkAppId"),G(this,"userId"),G(this,"userSig"),G(this,"url"),G(this,"backupUrl"),G(this,"destroyed",!1),G(this,"_socketInUse"),G(this,"_socket"),G(this,"_backupSocket"),G(this,"_signalInfo",{tinyId:void 0,clientIp:"",signalIp:"",relayIp:"",relayInnerIp:"",relayPort:0,endReportExtend:void 0,bakRelayIps:[],reportToken:void 0}),G(this,"_currentState","DISCONNECTED"),G(this,"_isReconnecting",!1),G(this,"_seq",0),G(this,"_log"),G(this,"_lastMessageTime",-1),G(this,"_connectStartTime",-1),G(this,"_stopConnectRetry"),G(this,"_isFirstConnect",!0),G(this,"bytesSent",0),G(this,"bytesReceived",0),G(this,"keepAlive",!1),G(this,"signalDomainWhenUnifiedProxy"),G(this,"stopKeepAliveTimeout"),G(this,"stopPrelinkTimeout"),G(this,"rtt",0),G(this,"prelink",!1),G(this,"_prelinkConfig"),this.room=A.room,this.sdkAppId=A.sdkAppId,this.userId=A.userId,this.userSig=A.userSig,this.signalDomainWhenUnifiedProxy=A.signalDomainWhenUnifiedProxy,this.prelink=A.prelink||!1;let a=((o=(e=this.room.scheduleResult)==null?void 0:e.config)==null?void 0:o.keepAliveClient)||0;(n=this.room.joinParams)!=null&&n.keepAlive&&!a&&(a=1),a-Px.size>0&&this.room.enableSPC&&(this.keepAlive=!0,Px.add(this)),this.url=A.url,this.backupUrl=A.backupUrl,this._seq=0,this._log=nA.createLogger({parent:this.room.getLogger(),id:"ws".concat(++ItA),userId:this.userId,sdkAppId:this.sdkAppId}),this.onmessage=this.onmessage.bind(this),this.onerror=this.onerror.bind(this),this.onclose=this.onclose.bind(this)}get race(){return this.room.enableSPC&&!this.room.proxy_ws}get urlParam(){let A="?sdkAppId=".concat(encodeURIComponent(this.sdkAppId),"&userId=").concat(encodeURIComponent(this.userId),"&userSig=").concat(encodeURIComponent(this.userSig),"&keepAlive=").concat(encodeURIComponent(Number(this.keepAlive)));this.signalDomainWhenUnifiedProxy&&(A+="&signalDomain=".concat(encodeURIComponent(this.signalDomainWhenUnifiedProxy))),this.prelink&&(A+="&prelink=1");let e=new URLSearchParams(location.search);return gtA.forEach(o=>{let n=e.get("trtc_".concat(o));n&&(A+="&".concat(o,"=").concat(encodeURIComponent(n)))}),this.race?"".concat(A,"&race=1"):A}get _urlWithParam(){return"".concat(this.url).concat(this.race?"/v2/ws":"").concat(this.urlParam)}get _backupUrlWithParam(){return"".concat(this.backupUrl).concat(this.race?"/v2/ws":"").concat(this.urlParam)}get isConnected(){return this._currentState==="CONNECTED"}get isConnecting(){return this._currentState==="CONNECTING"}get isOnline(){return this._currentState==="CONNECTED"&&Date.now()-this._lastMessageTime<12e3}connect(){return DA(this,arguments,function(){var A=this;let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:1e4;return function*(){if(A.isConnected)return Promise.resolve();A._log.info("connect to [".concat(A.url,", ").concat(A.backupUrl,"] ").concat(A.race?"race":"").concat(e?" timeout: ".concat(e):""," keepAlive: ").concat(Number(A.keepAlive))),A.emitConnectionStateChanged("CONNECTING"),A._connectStartTime=ki();let o=[A.connectWS({url:A._urlWithParam,isMain:!0,timeout:e})];A.race&&A._backupUrlWithParam!==A._urlWithParam&&o.push(A.connectWS({url:A._backupUrlWithParam,isMain:!1,timeout:e})),A._socketInUse=yield Pf(o),A.unbindAndCloseSocket(A._socketInUse===A._socket?fA.BACKUP:fA.MAIN),A._isFirstConnect&&(ct.addSuccessEvent({key:521720}),A._isFirstConnect=!1),A.emitConnectionStateChanged("CONNECTED")}()})}connectWS(A){let{url:e,timeout:o,isMain:n}=A,a=new WebSocket(e);this.bindSocket(a),n?this._socket=a:this._backupSocket=a;let I=-1;return new Promise((c,u)=>{a.onclose=u,a.onerror=u,a.onopen=()=>c(a),o&&(I=setTimeout(()=>{this.unbindAndCloseSocket(n?fA.MAIN:fA.BACKUP),u(new Ct({code:Ge.SIGNAL_CHANNEL_SETUP_FAILED,message:"ws connect timeout"}))},o))}).finally(()=>{a.onclose=null,a.onerror=null,a.onopen=null,clearTimeout(I)})}bindSocket(A){A.addEventListener("close",this.onclose),A.addEventListener("error",this.onerror),A.addEventListener("message",this.onmessage)}unbindSocket(A){A.removeEventListener("close",this.onclose),A.removeEventListener("error",this.onerror),A.removeEventListener("message",this.onmessage)}unbindAndCloseSocket(A){if(A===fA.MAIN){if(this._socket){this.unbindSocket(this._socket);try{this._socket.close(1e3)}catch{}this._socket=null}}else if(this._backupSocket){this.unbindSocket(this._backupSocket);try{this._backupSocket.close(1e3)}catch{}this._backupSocket=null}}onclose(A){A.target===this._socketInUse&&(this._log.warn("".concat(A.target===this._socket?"main":"backup"," is closed code:").concat(A.code," ").concat(A.reason)),this.emitConnectionStateChanged("DISCONNECTED"),(!A.wasClean||A.code!==1e3&&A.code!==4013)&&this.startReconnection(),this.prelink&&A.code===4013&&this.room.clearNetworkQuality(),this.room.isJoining&&this.emit(Ox,new Ct({code:Ge.SIGNAL_CHANNEL_SETUP_FAILED,message:"websocket onclose"})))}onerror(A){this._log.error("".concat(A.target===this._socket?"main":"backup"," error observed")),this.emitConnectionStateChanged("DISCONNECTED"),A.target===this._socketInUse&&(this.unbindAndCloseSocket(fA.MAIN),this.unbindAndCloseSocket(fA.BACKUP),this._socketInUse=null,this.reconnect()),this.room.isJoining&&this.emit(Ox,new Ct({code:Ge.SIGNAL_CHANNEL_SETUP_FAILED,message:"websocket onerror"}))}onmessage(A){if(!this.isConnected)return;let{isOnline:e}=this;this._lastMessageTime=Date.now(),e||this.emit(V4),this.bytesReceived+=XR(A.data);let o=JSON.parse(A.data),{cmd:n,data:a}=o,I=Object.values(sB),c=Object.keys(sB)[I.indexOf(n)],u=io[c]||n;switch(xeA.includes(n)||(this._log.debug("received ".concat(n," msg: ").concat(A.data)),u&&this._log.info("Received event: [ ".concat(u," ]"))),n){case sB.CHANNEL_SETUP_RESULT:if(o.code===0)this._signalInfo.clientIp=a.clientIp,this._signalInfo.signalIp=a.signalInnerIp,a.svrTime&&iu(a.svrTime-new Date().getTime()),this._log.info("ChannelSetup Success ".concat(ki()-this._connectStartTime)),ct.addSuccessEvent({key:521701,cost:ki()-this._connectStartTime}),this._connectStartTime=-1,this.room.firewallDetector.resetTimeoutCount(),this.emit(H4,{signalInfo:this._signalInfo});else{let d=new Ct({code:Ge.SIGNAL_CHANNEL_SETUP_FAILED,extraCode:o.code,message:Wi({key:Mi.SIGNAL_CHANNEL_SETUP_FAILED,data:{errorCode:o.code,errorMsg:o.message}})});this._log.error("".concat(o.code,", ").concat(o.message)),this.close(),ct.addFailedEvent({key:521701,error:d}),this.emit(Ox,d)}break;case sB.JOIN_ROOM_RESULT:o.code===0&&(this._signalInfo.relayIp=a.relayOuterIp,this._signalInfo.relayInnerIp=a.relayInnerIp,this._signalInfo.bakRelayIps=a.bakRelayIps,this._signalInfo.relayPort=a.relayPort,this._signalInfo.tinyId=o.tinyId,this._signalInfo.endReportExtend=a.endReportExtend,this._signalInfo.reportToken=a.reportToken,this._log.info("signalIp:".concat(this._signalInfo.signalIp," clientIp:").concat(this._signalInfo.clientIp," relayIp: ").concat(this._signalInfo.relayIp))),this.emit(u,{data:o});break;default:this.emit(String(u),{data:o})}}reGetSignalChannelUrl(){return DA(this,null,function*(){try{if(!this.room.joinParams)return;wu(!0),yield this.room.schedule(this.room.joinParams);let{mainUrl:A,backupUrl:e}=this.room.getSignalChannelUrl();this.url=A,this.backupUrl=e}catch{}})}startReconnection(){if(!this._socketInUse)return;this._socketInUse.onclose=null,this._socketInUse.close(4011);let A=this._socketInUse===this._socket;this.unbindAndCloseSocket(A?fA.MAIN:fA.BACKUP),this._socketInUse=null,this.emitConnectionStateChanged("DISCONNECTED"),this.reconnect()}reconnect(){return DA(this,null,function*(){if(!this._isReconnecting){if(!this.room.isJoined&&this.keepAlive)return void this.close();this._isReconnecting=!0;try{this._log.warn("reconnect"),yield this.connect();let{roomId:A,useStringRoomId:e}=this.room,{relayIp:o,relayInnerIp:n,relayPort:a}=this._signalInfo,{data:I}=yield this.sendWaitForResponse({command:otA,data:{roomId:A,useStringRoomId:e,relayInnerIp:n,relayOuterIp:o,relayPort:a},responseCommand:io.CHANNEL_RECONNECT_RESULT});I.code===0?(this._log.warn("reconnect success"),this.stopReconnection(),ct.addSuccessEvent({key:521702,cost:ki()-this._connectStartTime}),this._connectStartTime=-1,this.room.syncUserList(),this.room.checkConnectionsToReconnect()):(ct.addFailedEvent({key:521702,error:I.code}),this._log.warn("reconnect failed, ".concat(I.code," ").concat(I.message)),this.room.reJoin())}catch(A){this._log.error(A),this.room.reJoin()}}})}send(A){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(this.isConnected&&!this.room.isLeft){let o={cmd:A,data:e,userId:this.userId,tinyId:this._signalInfo.tinyId,seq:++this._seq},n=JSON.stringify(o);return this._socketInUse.send(n),stA.has(A)&&this._log.info("send",A,e),this.bytesSent+=XR(n),o.seq}}sendWaitForResponse(A){let{command:e,data:o,timeout:n=5e3,responseCommand:a,commandDesc:I,enableLog:c=!0,addReceiveTime:u=!1}=A;return new Promise((d,R)=>{let k=()=>{clearTimeout(_),R(new Ct({code:Ge.API_CALL_ABORTED,message:"".concat(e," aborted due to connection closed")}))};this.once(xx,k);let _=setTimeout(()=>{this.off(a,Z),this.off(xx,k);let cA=new Ct({code:Ge.API_CALL_TIMEOUT,message:Wi({key:Mi.API_CALL_TIMEOUT,data:{commandDesc:I,command:e}})});c&&this._log.warn(cA),R(cA)},n),Z=cA=>{cA.data.seq===iA&&(clearTimeout(_),this.off(a,Z),this.off(xx,k),u&&(cA.data.receiveTime=Date.now()),d(cA))};this.on(a,Z);let iA=this.send(e,o)})}sendWaitForResponseWithRetry(A){let{commandDesc:e,command:o,retries:n=0,retryTimeout:a=0}=A;return Kf({retryFunction:this.sendWaitForResponse,onError:I=>{let{retry:c,reject:u,error:d}=I;!this.room.isJoined||this.destroyed||d.code===Ge.API_CALL_ABORTED?u(d):this.isOnline?c():(this._log.warn("retry ".concat(o," when connected")),this.once(V4,c))},onRetrying:I=>{this._log.warn("".concat(e||o," timeout observed, retrying [").concat(I,"/").concat(n,"]"))},settings:{retries:n,timeout:a},context:this})(A)}getCurrentState(){return this._currentState}getSignalInfo(){return this._signalInfo}stopReconnection(){this._isReconnecting=!1,this._stopConnectRetry&&this._stopConnectRetry()}close(){this._log.info("closed"),clearTimeout(this.stopKeepAliveTimeout),clearTimeout(this.stopPrelinkTimeout),Px.delete(this),this.stopReconnection(),this._signalInfo={tinyId:void 0,clientIp:"",signalIp:"",relayIp:"",relayInnerIp:"",relayPort:0,bakRelayIps:[],endReportExtend:void 0,reportToken:void 0},this._socketInUse=null,this.bytesSent=0,this.bytesReceived=0,this._stopConnectRetry&&this._stopConnectRetry(),this.unbindAndCloseSocket(fA.MAIN),this.unbindAndCloseSocket(fA.BACKUP),this.emitConnectionStateChanged("DISCONNECTED"),this.emit(xx)}destroy(){this.close(),this.destroyed=!0}getBackupRelayIpPair(){var A;let e=(A=this._signalInfo.bakRelayIps)==null?void 0:A.shift();return e&&(e.relayPort=e.relayPort||this._signalInfo.relayPort),e}clearBakRelayIps(){this._signalInfo.bakRelayIps=[]}stopKeepAliveIn(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:3600;if(this.keepAlive){this._log.info("stopKeepAlive in ".concat(A,"s")),this.stopKeepAliveTimeout=setTimeout(()=>{this.keepAlive=!1,this._log.info("close due to not used ".concat(A,"s")),this.close(),this.off(io.JOIN_ROOM_RESULT,e)},1e3*A);let e=o=>{o.data.code===0&&(this._log.info("stopKeepAlive clear timeout"),clearTimeout(this.stopKeepAliveTimeout),this.off(io.JOIN_ROOM_RESULT,e))};this.on(io.JOIN_ROOM_RESULT,e)}}stopPrelinkIn(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:300;if(this.keepAlive)return;this._log.info("stopPrelink in ".concat(A,"s")),this.stopPrelinkTimeout=setTimeout(()=>{this._log.info("close prelink due to not used in ".concat(A,"s")),this.close(),this.room.clearNetworkQuality(),this.off(io.JOIN_ROOM_RESULT,e)},1e3*A);let e=o=>{o.data.code===0&&(this._log.info("stopPrelink clear timeout"),clearTimeout(this.stopPrelinkTimeout),this.off(io.JOIN_ROOM_RESULT,e))};this.on(io.JOIN_ROOM_RESULT,e)}markPrelinkConnected(A){this._prelinkConfig=fi(bt({},A),{linkedTime:Date.now()})}isPrelinkValid(A,e,o){return!(!this.prelink||!this._prelinkConfig)&&(A!==this._prelinkConfig.sdkAppId||e!==this._prelinkConfig.userId||o!==this._prelinkConfig.userSig?(this._log.warn("prelink params not match"),!1):!!this.isConnected||(this._log.warn("prelink is not connected"),!1))}consumePrelink(){this.prelink=!1,this._prelinkConfig=void 0}emitConnectionStateChanged(A){if(A===this._currentState)return;this._log.info("".concat(this._currentState," -> ").concat(A));let e={prevState:this._currentState,state:A};A==="CONNECTING"&&(e.isReconnecting=this._isReconnecting),this.emit(rK,e),this._currentState=A,A==="CONNECTED"?this.emit(gG):A==="DISCONNECTED"&&this.emit(OeA)}};vt([nB({settings:{retries:1/0,timeout:2e3},onError(A,e){!this.room.isDestroyed&&!this.destroyed&&(this._isFirstConnect&&(ct.addFailedEvent({key:521720,error:A}),this._isFirstConnect=!1),this.room.firewallDetector.increaseTimeoutCount(),e())},onRetrying(A,e){this._log.warn("retrying to connect ".concat(A)),A>=3&&A%3==0&&this.reGetSignalChannelUrl(),e&&(this._stopConnectRetry=e,(this.room.isDestroyed||this.destroyed)&&e())}})],X4.prototype,"connect");var ctA=es(hg()),$4=!1,WQ=class{constructor(A){G(this,"userId"),G(this,"tinyId"),G(this,"_sdpSemantics"),G(this,"_isUplink"),G(this,"_room"),G(this,"_log"),G(this,"_signalChannel"),G(this,"_isErrorObserved",!1),G(this,"_waitForPeerConnectionConnectedPromise"),G(this,"_waitForPeerConnectionConnectedPromiseReject",null),G(this,"_peerConnection",null),G(this,"_emitter",new ctA.default),G(this,"_currentState","DISCONNECTED"),G(this,"_isReconnecting",!1),G(this,"_reconnectionCount",0),G(this,"_reconnectionTimer",-1),G(this,"_isFirstConnection",!0),G(this,"_prevTime",-1),G(this,"_localAddress"),G(this,"_remoteAddress"),G(this,"isDestoyed",!1),this.userId=A.userId,this.tinyId=A.tinyId,this._room=A.room,this._sdpSemantics=A.room.sdpSemantics,this._isUplink=A.isUplink,this._log=A.room.getLogger().createChild({id:"n-mpc",userId:this._room.userId,remoteUserId:this.userId,sdkAppId:this._room.sdkAppId,isLocal:this._isUplink}),this._signalChannel=A.signalChannel}beforeConnect(){this._prevTime<0&&(this._prevTime=ki())}afterConnect(){try{this._isFirstConnection?(this._isFirstConnection=!1,ct.addSuccessEvent({key:521705,cost:Math.min(ki()-this._prevTime,3e4)})):this._isReconnecting&&ct.addSuccessEvent({key:521706,cost:ki()-this._prevTime}),this._prevTime=-1}catch(A){throw this._isFirstConnection?(this._isFirstConnection=!1,ct.addFailedEvent({key:521705,error:A})):this._isReconnecting&&this._reconnectionCount>=3&&ct.addFailedEvent({key:521706,error:A}),A}}initialize(){let A={iceServers:this._room.getIceServers(),iceTransportPolicy:this._room.getIceTransportPolicy(),sdpSemantics:this._sdpSemantics,bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",tcpCandidatePolicy:"disable",IceTransportsType:"nohost"};this._peerConnection=new RTCPeerConnection(A),this._peerConnection.onconnectionstatechange=this.onConnectionStateChange.bind(this)}close(A){this._log.info("close connection"),this._emitter.emit("closed",A),this._isReconnecting&&this.stopReconnection(),this.closePeerConnection()}destroy(){this.isDestoyed=!0}closePeerConnection(){let A=arguments.length>0&&arguments[0]!==void 0&&arguments[0];this._peerConnection&&(this._log.info("close pc"),this._peerConnection.onconnectionstatechange=null,this._peerConnection.close(),this._peerConnection=null,A&&this.emitConnectionStateChangedEvent("DISCONNECTED")),this._waitForPeerConnectionConnectedPromiseReject&&this._waitForPeerConnectionConnectedPromiseReject(new Ct({code:Ge.API_CALL_ABORTED,message:"connection closed"}))}getDTLSTransportState(){if(!this._peerConnection)return AB;let A=null;if(this._isUplink){if(!AI()||this._peerConnection.getSenders().length===0)return AB;A=this._peerConnection.getSenders()[0].transport}else{if(!Ph()||this._peerConnection.getReceivers().length===0)return AB;A=this._peerConnection.getReceivers()[0].transport}return A?A.state:AB}onConnectionStateChange(A){let e=this._peerConnection.iceConnectionState,o=this.getDTLSTransportState();if(this._log.info("connectionState: ".concat(A.target.connectionState,", ICE: ").concat(e,", DTLS: ").concat(o)),A.target.connectionState===hi.CONNECTING&&this.emitConnectionStateChangedEvent("CONNECTING"),A.target.connectionState===hi.FAILED||A.target.connectionState===hi.CLOSED){let n="connection ".concat(A.target.connectionState,". ICE Transport state: ").concat(e,", DTLS Transport state: ").concat(o),a=new Ct({message:n,code:Ge.ICE_TRANSPORT_ERROR});this.emitConnectionStateChangedEvent("DISCONNECTED"),this.startReconnection(),this._isErrorObserved||this._emitter.emit("error",a)}(A.target.connectionState===hi.CONNECTED||A.target.connectionState===hi.COMPLETED)&&(this.logSelectedCandidate(),Jo.logSuccessEvent({userId:this._room.userId,eventType:oa.ICE_CONNECTION_STATE}),this.emitConnectionStateChangedEvent("CONNECTED"))}emitConnectionStateChangedEvent(A){return A!==this._currentState&&(A==="CONNECTED"&&(this._room.firewallDetector.resetTimeoutCount(),$4=!0),S.emit(K.PEER_CONNECTION_STATE_CHANGED,{room:this._room,prevState:this._currentState,state:A,remoteUserId:this._isUplink?void 0:this.userId}),this._emitter.emit("connection-state-changed",{prevState:this._currentState,state:A}),this._currentState=A,!0)}getPeerConnection(){return this._peerConnection}getRoom(){return this._room}getUserId(){return this.userId}getTinyId(){return this.tinyId}logSelectedCandidate(){return DA(this,null,function*(){if(!this._peerConnection)return;let A=yield this._peerConnection.getStats();for(let[,e]of A)if(Cm(e)){let o=A.get(e.localCandidateId),n=A.get(e.remoteCandidateId);o&&(this._log.info("local candidate: ".concat(o.candidateType," ").concat(o.protocol,":").concat(o.ip||o.address,":").concat(o.port," ").concat(o.networkType||""," ").concat(o.candidateType==="relay"?"relayProtocol:".concat(o.relayProtocol):"")),this._localAddress="".concat(o.ip||o.address,":").concat(o.port)),n&&(this._log.info("remote candidate: ".concat(n.candidateType," ").concat(n.protocol,":").concat(n.ip||n.address,":").concat(n.port)),this._remoteAddress="".concat(n.protocol,":").concat(n.ip||n.address));break}})}getCurrentState(){return this._currentState}waitForPeerConnectionConnected(){return this._waitForPeerConnectionConnectedPromise||(this._waitForPeerConnectionConnectedPromise=new Promise((A,e)=>{if(this._currentState==="CONNECTED")return A();this._waitForPeerConnectionConnectedPromiseReject=e;let o=c=>{c.state==="CONNECTED"&&(clearTimeout(I),a(),A())},n=c=>{let{room:u}=c;u===this._room&&(clearTimeout(I),a(),e(new Ct({code:Ge.API_CALL_ABORTED,message:Wi({key:Mi.CONNECTION_ABORTED,data:"leave room"})})))},a=()=>{S.off(K.LEAVE_SUCCESS,n,this),this._emitter.off("connection-state-changed",o,this)},I=setTimeout(()=>{a();let c=new Ct({code:Ge.API_CALL_TIMEOUT,message:"connection timeout"});this._room.firewallDetector.increaseTimeoutCount(),e(c)},yN);S.on(K.LEAVE_SUCCESS,n,this),this._emitter.on("connection-state-changed",o,this)}),this._waitForPeerConnectionConnectedPromise=this._waitForPeerConnectionConnectedPromise.finally(()=>{this._waitForPeerConnectionConnectedPromise=null,this._waitForPeerConnectionConnectedPromiseReject=null})),this._waitForPeerConnectionConnectedPromise}getReconnectionCount(){return this._reconnectionCount}startReconnection(){this._isReconnecting=!0,this.reconnect()}clearReconnectionTimer(){this._reconnectionTimer!==-1&&(clearTimeout(this._reconnectionTimer),this._reconnectionTimer=-1)}stopReconnection(){this._log.info("stop reconnection"),this._isReconnecting=!1,this._reconnectionCount=0,this.clearReconnectionTimer(),this._signalChannel.off(gG,this.reconnect,this)}beforeReconnect(){if(this._reconnectionTimer!==-1)return this._log.warn("reconnect() is reconnecting, ignore"),-1;if(this._reconnectionCount>=Ch()){this._log.warn("SDK has tried reconnect for ".concat(this._reconnectionCount," times, but all failed, please check your network")),this.stopReconnection();let A=new Ct({code:this._isUplink?Ge.UPLINK_RECONNECTION_FAILED:Ge.DOWNLINK_RECONNECTION_FAILED,message:Wi({key:this._isUplink?Mi.UPLINK_RECONNECTION_FAILED:Mi.DOWNLINK_RECONNECTION_FAILED})});return this.emitConnectionStateChangedEvent("DISCONNECTED"),this._emitter.emit("error",A),-1}return this._signalChannel.isConnected?(this._reconnectionCount+=1,this._log.warn("reconnect() trying [".concat(this._reconnectionCount,"]")),1):(this._log.warn("reconnect() signal channel is not connected, suspend reconnection until signal is connected"),this._signalChannel.once(gG,this.reconnect,this),-1)}on(A,e,o){this._emitter.on(A,e,o)}off(A,e,o){this._emitter.off(A,e,o)}getIsReconnecting(){return this._isReconnecting}get isH264(){var A,e;return!((e=(A=this._peerConnection)==null?void 0:A.remoteDescription)==null||!e.sdp.includes("H264"))}setOffer(A){var e;return(e=this._peerConnection)==null?void 0:e.setLocalDescription(A)}setAnswer(A){var e;return(e=this._peerConnection)==null?void 0:e.setRemoteDescription(A)}};vt([jh(521712,!1)],WQ.prototype,"setOffer"),vt([jh(521713,!1)],WQ.prototype,"setAnswer");var Az=es(cN()),rs=function(A){return Az.default.parse(A)},$h=function(A){return Az.default.write(A)};function IK(A){return Object.keys(A).filter(e=>A[e])}var Jx=class A6 extends WQ{constructor(e){super(fi(bt({},e),{isUplink:!1})),G(this,"_flag",0),G(this,"isRobot",!1),G(this,"role","anchor"),G(this,"remoteAudioTrack"),G(this,"remoteVideoTrack"),G(this,"remoteAuxiliaryTrack"),G(this,"avPlayerStateSyncManager"),G(this,"ssrc",{audio:0,video:0,auxiliary:0}),G(this,"_isSDPExchanging",!1),G(this,"_videoCodec"),G(this,"fromType"),this.flag=e.flag,this.isRobot=e.isRobot||!1,this.remoteAudioTrack=e.remoteAudioTrack||new Dx(this._room,this),this.remoteVideoTrack=e.remoteVideoTrack||new tG(this._room,this),this.remoteAuxiliaryTrack=e.remoteAuxiliaryTrack||new n4(this._room,this),this.avPlayerStateSyncManager=new Kq({log:this._log,audioPlayer:this.remoteAudioTrack.player,videoPlayer:this.remoteVideoTrack.player})}get videoCodec(){var e,o;let n=(o=(e=this._peerConnection)==null?void 0:e.remoteDescription)==null?void 0:o.sdp;return n?n.includes("H264")?"h264":"vp8":this._videoCodec||"h264"}set videoCodec(e){this._videoCodec=e}get subscribeState(){let e={audio:!1,video:!1,auxiliary:!1,smallVideo:!1};return this.remoteVideoTrack.isSubscribed&&(8&this.remoteVideoTrack.mediaType?e.smallVideo=!0:e.video=!0),this.remoteAudioTrack.isSubscribed&&(e.audio=!0),this.remoteAuxiliaryTrack.isSubscribed&&(e.auxiliary=!0),e}get muteState(){return mQ(this.flag,this.userId)}get flag(){return this._flag}set flag(e){var o,n,a;e!==this._flag&&(this._flag=e,(o=this.remoteAudioTrack)==null||o.onFlagChanged(),(n=this.remoteVideoTrack)==null||n.onFlagChanged(),(a=this.remoteAuxiliaryTrack)==null||a.onFlagChanged())}get hasMainStream(){return this.muteState.hasAudio||this.muteState.hasVideo||this.muteState.hasSmall}get hasAuxStream(){return this.muteState.hasAuxiliary}get isMainStreamSubscribed(){return(this.subscribeState.audio||this.subscribeState.video||this.subscribeState.smallVideo)&&(this.muteState.hasAudio||this.muteState.hasVideo||this.muteState.hasSmall)}get isAuxStreamSubscribed(){return this.subscribeState.auxiliary&&this.muteState.hasAuxiliary}get isSmallStreamSubscribed(){return this.subscribeState.smallVideo&&this.muteState.hasSmall}get isBigStreamSubscribed(){return this.subscribeState.video&&this.muteState.hasVideo}isStreamUnpublished(e){return e===fA.MAIN?!this.muteState.hasAudio&&!this.muteState.hasVideo:!this.muteState.hasAuxiliary}initialize(){super.initialize(),this.installEvents(),this._peerConnection.ontrack=this.onTrack.bind(this)}close(e){super.close(e),this.emitConnectionStateChangedEvent("DISCONNECTED"),this.remoteAudioTrack.close(),this.remoteVideoTrack.close(),this.remoteAuxiliaryTrack.close(),this.avPlayerStateSyncManager.destroy(),this.uninstallEvents()}installEvents(){}uninstallEvents(){this._emitter.removeAllListeners()}emitConnectionStateChangedEvent(e){var o,n;let a=this._currentState,I=super.emitConnectionStateChangedEvent(e);return I&&a!==e&&((o=this.remoteVideoTrack)==null||o.emit("connection-state-changed",{prevState:a,state:e}),(n=this.remoteAuxiliaryTrack)==null||n.emit("connection-state-changed",{prevState:a,state:e})),I}onTrack(e){let o=e.streams[0],{track:n}=e,a=o.id===RI?fA.MAIN:fA.AUXILIARY;this._log.debug("ontrack ".concat(a," ").concat(n.kind));let I=fA.AUDIO;n.kind===fA.VIDEO&&(I=a===fA.MAIN?fA.VIDEO:fA.AUXILIARY);let c=this.remoteAudioTrack;I===fA.VIDEO?c=this.remoteVideoTrack:I===fA.AUXILIARY&&(c=this.remoteAuxiliaryTrack),c.setInputMediaStreamTrack(n)}addRRTRLine(e){let o=e.split(`\r +`),n=new Map;o.forEach((I,c)=>{/^a=rtcp-fb:/.test(I)&&o[c+1]&&!/^a=rtcp-fb:/.test(o[c+1])&&n.set(c+1,"".concat(I.match(/^a=rtcp-fb:\d+/)[0]," rrtr"))});let a=[...n];for(let I=0;I{n.type===fA.VIDEO&&n.fmtp.forEach(a=>{a.config+=";sps-pps-idr-in-keyframe=1"})}),$h(o)}removeSDESDescription(e){let o=["urn:ietf:params:rtp-hdrext:sdes:mid","urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id","urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id"],n=rs(e);return n.media.forEach(a=>{a.ext&&(a.ext=a.ext.filter(I=>!o.includes(I.uri)))}),$h(n)}isSubscriptionStateNotChanged(e){return JSON.stringify(e)===JSON.stringify(this.subscribeState)}subscribe(e,o){return DA(this,null,function*(){var n,a;try{if((((n=this._peerConnection)==null?void 0:n.connectionState)===hi.NEW||((a=this._peerConnection)==null?void 0:a.connectionState)===hi.CONNECTING)&&(yield this.waitForPeerConnectionConnected()),this.isSubscriptionStateNotChanged(e))return void(this._peerConnection||(this.initialize(),yield this.connect(e)));if(this._log.info("subscribe ".concat(o," ").concat(JSON.stringify(e))),this._peerConnection||this._isSDPExchanging){let I="subscribe_change";Object.values(e).find(c=>c===!0)||(I="unsubscribe"),yield this.sendSubscription(I,e)}else this.initialize(),yield this.connect(e)}catch(I){throw this._room.isJoined&&this.isStreamUnpublished(o)?(this._log.warn("".concat(I.message," ").concat(JSON.stringify(this.muteState))),new Ct({code:Ge.REMOTE_STREAM_NOT_EXIST,message:"remote user ".concat(this.userId," unpublished stream")})):I}})}unsubscribe(e){return DA(this,arguments,function(o){var n=this;let{remoteTracks:a,streamType:I}=o;return function*(){if(n._currentState==="CONNECTED"&&(I==="main"&&!n.isMainStreamSubscribed||I==="auxiliary"&&!n.isAuxStreamSubscribed))return void n._log.info("".concat(I," stream already unsubscribed"));let c=bt({},n.subscribeState);a.forEach(d=>{switch(d.mediaType){case 1:c.audio=!1;break;case 4:c.video=!1;break;case 8:c.smallVideo=!1;break;case 2:c.auxiliary=!1}});let u="subscribe_change";Object.values(c).find(d=>d===!0)||(u="unsubscribe"),n._log.info("".concat(u==="unsubscribe"?u:"subscribe"," ").concat(I," [").concat(IK(c),"]")),yield n.sendSubscription(u,c),u==="unsubscribe"&&(n.closePeerConnection(),n.emitConnectionStateChangedEvent("DISCONNECTED"))}()})}unsubscribeDataChannel(){return DA(this,null,function*(){})}sendSubscription(e){let o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.subscribeState,n={srcTinyId:this.tinyId,srcUserId:this.userId},a=aK,I=io.UNSUBSCRIBE_RESULT;return e==="subscribe_change"&&(n={audio:o.audio,bigVideo:o.video,auxVideo:o.auxiliary,smallVideo:o.smallVideo,srcTinyId:this.tinyId},a=sK,I=io.SUBSCRIBE_CHANGE_RESULT),this._signalChannel.sendWaitForResponse({command:a,data:n,responseCommand:I,timeout:1e4}).then(c=>{let{data:u}=c;if(u.code!==0){let d=new Ct({code:u.code,message:Wi({key:Mi.ERROR_MESSAGE,data:{type:e,message:u.message}})});throw this._log.error(d),d}})}connect(){return DA(this,arguments,function(){var e=this;let o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.subscribeState;return function*(){try{yield e.exchangeSDP(o),yield e.waitForPeerConnectionConnected()}catch(n){throw e.closePeerConnection(!0),n}}()})}exchangeSDP(e){return DA(this,null,function*(){try{this._isSDPExchanging=!0,yield this.createOffer(),this._log.info("createOffer success, sending offer");let{type:o,sdp:n}=this._peerConnection.localDescription,a={type:o,sdp:n,srcUserId:this.userId,srcTinyId:this.tinyId,audio:e.audio,bigVideo:e.video,auxVideo:e.auxiliary,smallVideo:e.smallVideo},I=yield this._signalChannel.sendWaitForResponse({command:W4,commandDesc:"exchange sdp",data:a,responseCommand:io.SUBSCRIBE_RESULT,timeout:aO});if(!this._peerConnection){let c=new Ct({code:Ge.INVALID_OPERATION,message:Wi({key:Mi.CONNECTION_CLOSED})});throw this._log.warn(c),c}yield this.onSubscribeResult(I),this._isSDPExchanging=!1}catch(o){throw this._isSDPExchanging=!1,o}})}createOffer(){return DA(this,null,function*(){let e={voiceActivityDetection:!1};sl()&&this._sdpSemantics===_f?(this._peerConnection.addTransceiver(fA.AUDIO,{direction:_r.RECVONLY}),this._peerConnection.addTransceiver(fA.VIDEO,{direction:_r.RECVONLY}),this._peerConnection.addTransceiver(fA.VIDEO,{direction:_r.RECVONLY})):(e.offerToReceiveAudio=!0,e.offerToReceiveVideo=!0);let o=yield this._peerConnection.createOffer(e);if(o.sdp){let{isH264DecodeSupported:n}=yield DT();n||(this._log.warn("remove h264 desc from sdp"),o.sdp=function(a){let I=rs(a);return I.media.forEach(c=>{var u,d;if(c.type===fA.VIDEO){let R=new Set;c.rtp.forEach(_=>{let{payload:Z,codec:iA}=_;return iA==="H264"&&R.add(Z)}),c.fmtp.forEach(_=>{let{payload:Z,config:iA}=_,cA=iA.match(/apt=(\d+)/);cA&&cA[1]&&R.has(Number(cA[1]))&&R.add(Z)});let k=_=>{let{payload:Z}=_;return!R.has(Z)};c.rtp=c.rtp.filter(k),c.rtcpFb=(u=c.rtcpFb)==null?void 0:u.filter(k),c.fmtp=c.fmtp.filter(k),c.payloads=(d=c.payloads)==null?void 0:d.split(" ").filter(_=>!R.has(Number(_))).join(" ")}}),$h(I)}(o.sdp)),o.sdp=this.addRRTRLine(o.sdp),o.sdp=this.addSPSDescription(o.sdp),o.sdp=function(a){let I=rs(a);return I.media.forEach(c=>{c.type===fA.AUDIO&&c.fmtp.forEach(u=>{u.config+=";sprop-stereo=1;stereo=1"})}),$h(I)}(o.sdp),this._sdpSemantics===_f&&(o.sdp=this.removeSDESDescription(o.sdp))}yield this.setOffer(o)})}onSubscribeResult(e){return DA(this,null,function*(){let{code:o,message:n=""}=e&&e.data||{},{type:a,sdp:I}=e&&e.data&&e.data.data||{};if(o===FR)throw new Ct({code:Ge.NOT_SUPPORTED_H264,message:Wi({key:Mi.NOT_SUPPORTED_H264DECODE})});try{if(o!==0)throw new Ct({code:o,message:Wi({key:Mi.EXCHANGE_SDP_FAILED,data:{errMsg:n}})});this._log.debug("accept remote answer: ".concat(I)),yield this.setAnswer({type:a,sdp:I}),this.updateSSRC(I)}catch(c){throw this._log.error(c),c}})}updateSSRC(e){try{rs(e).media.forEach(o=>{if(o.ssrcs)if(o.type===fA.AUDIO){let n=o.ssrcs.find(a=>{var I;return(I=a.value)==null?void 0:I.includes(RI)});n&&(this.ssrc.audio=Number(n.id))}else{let n=o.ssrcs.find(I=>{var c;return(c=I.value)==null?void 0:c.includes(RI)}),a=o.ssrcs.find(I=>{var c;return(c=I.value)==null?void 0:c.includes(tO)});n&&(this.ssrc.video=Number(n.id)),a&&(this.ssrc.auxiliary=Number(a.id))}})}catch{}}getMainStreamVideoTrackId(){return this.remoteVideoTrack&&this.remoteVideoTrack.mediaTrack?this.remoteVideoTrack.mediaTrack.id:""}getAuxStreamVideoTrackId(){return this.remoteAuxiliaryTrack&&this.remoteAuxiliaryTrack.mediaTrack?this.remoteAuxiliaryTrack.mediaTrack.id:""}reconnect(){return DA(this,null,function*(){if(!(zg(A6.prototype,this,"beforeReconnect").call(this)<0))try{this.closePeerConnection(),this.initialize(),yield this.connect(),this.stopReconnection(),this._log.warn("reconnect() success")}catch{let o=fQ(this._reconnectionCount);this._log.warn("reconnect() timeout, try again after ".concat(o/1e3,"s")),this._reconnectionTimer=setTimeout(()=>{this.clearReconnectionTimer(),this.reconnect()},o)}})}getIsReconnecting(){return this._isReconnecting}clearReconnectionTimer(){this._reconnectionTimer!==-1&&(clearTimeout(this._reconnectionTimer),this._reconnectionTimer=-1)}getCurrentState(){return this._currentState}setDelay(e){let{audioDelay:o,videoDelay:n}=e;this.remoteAudioTrack.stat.end2EndDelay=o,this.remoteVideoTrack.stat.end2EndDelay=n}get audioReceiver(){var e;return((e=this._peerConnection)==null?void 0:e.getReceivers()[0])||null}};vt([Dn(A=>function(){for(var e=arguments.length,o=new Array(e),n=0;n{let c=u=>{this._emitter.off("closed",c),I(new Ct({code:Ge.API_CALL_ABORTED,message:Wi({key:Mi.CONNECTION_ABORTED,data:u})}))};this._emitter.on("closed",c),A.apply(this,o).then(a,I).finally(()=>{this._emitter.off("closed",c)})})})],Jx.prototype,"subscribe"),vt([jh(521717,!1)],Jx.prototype,"unsubscribe"),vt([wm(WQ.prototype.afterConnect),MW(WQ.prototype.beforeConnect)],Jx.prototype,"connect");var ez=Jx,tz={voiceActivityDetection:!1},Hx=class e6 extends WQ{constructor(e){super(fi(bt({},e),{isUplink:!0})),G(this,"localMainAudioTrack",null),G(this,"localMainVideoTrack",null),G(this,"localAuxAudioTrack",null),G(this,"localAuxVideoTrack",null),G(this,"ssrc",{audio:0,video:0,small:0,auxiliary:0}),G(this,"_isPublishingAux",!1),G(this,"_publishingLocalAudioTrack"),G(this,"_publishingLocalVideoTrack"),G(this,"_mediaSettings",{videoCodec:"",videoWidth:0,videoHeight:0,videoBps:0,videoFps:0,audioCodec:"opus",audioFs:0,audioChannel:0,audioBps:0,smallVideoWidth:0,smallVideoHeight:0,smallVideoFps:0,smallVideoBps:0,auxVideoWidth:0,auxVideoHeight:0,auxVideoFps:0,auxVideoBps:0}),G(this,"flag",0)}get videoCodec(){return this._mediaSettings.videoCodec.toLowerCase()||"h264"}get isMainStreamPublished(){return!(!this.localMainAudioTrack&&!this.localMainVideoTrack)}get isAuxStreamPublished(){return!(!this.localAuxVideoTrack&&!this.localAuxAudioTrack)}initialize(){super.initialize(),this.installEvents()}reset(){this._isReconnecting&&this.stopReconnection(),this.closePeerConnection(),this.uninstallEvents()}close(e){super.close(e),this.reset(),this.emitConnectionStateChangedEvent("DISCONNECTED")}installEvents(){this._emitter.listeners("connection-state-changed").includes(this.handleConnectionStateChange)||this._emitter.on("connection-state-changed",this.handleConnectionStateChange,this)}uninstallEvents(){this._emitter.off("connection-state-changed",this.handleConnectionStateChange,this)}emitConnectionStateChangedEvent(e,o){var n,a,I;let c=this._currentState,u=super.emitConnectionStateChangedEvent(e);return u&&c!==e&&(o?o.emit("connection-state-changed",{prevState:c,state:e}):((n=this.localMainVideoTrack)==null||n.emit("connection-state-changed",{prevState:c,state:e}),(a=this.localAuxVideoTrack)==null||a.emit("connection-state-changed",{prevState:c,state:e}),(I=this._publishingLocalVideoTrack)==null||I.emit("connection-state-changed",{prevState:c,state:e}))),u}publish(e){return DA(this,arguments,function(o){var n=this;let{localAudioTrack:a,localVideoTrack:I,isAuxiliary:c}=o;return function*(){let u;n._peerConnection||n.initialize(),a&&(n._publishingLocalAudioTrack=a),I&&(n._publishingLocalVideoTrack=I),n._isPublishingAux=c,I&&!c&&I.small&&(u=n._room.videoManager.smallTrack),n.sendMediaSettings(),sl()?yield n.publishByTransceiver({localAudioTrack:a,localVideoTrack:I,smallTrack:u,isAuxiliary:c}):yield n.publishByAddTrack({localAudioTrack:a,localVideoTrack:I,smallTrack:u}),n._publishingLocalAudioTrack=null,n._publishingLocalVideoTrack=null,n._isPublishingAux=!1,c?(I&&(n.localAuxVideoTrack=I),a&&(n.localAuxAudioTrack=a)):(I&&(n.localMainVideoTrack=I),a&&(n.localMainAudioTrack=a)),n.installTrackMuteEvents(a,I),n.sendMutedFlag()}()})}publishByTransceiver(e){return DA(this,arguments,function(o){var n=this;let{localAudioTrack:a,localVideoTrack:I,smallTrack:c,isAuxiliary:u}=o;return function*(){n._log.info("publish by transceiver");let d=new MediaStream,R=I?.outMediaTrack,k=a?.outMediaTrack;k&&d.addTrack(k),R&&d.addTrack(R);let _=n._peerConnection.getTransceivers();if(_.length===0)n._peerConnection.addTransceiver(k||fA.AUDIO,{direction:_r.SENDONLY,streams:[d]}),n._peerConnection.addTransceiver(u?fA.VIDEO:R||fA.VIDEO,{direction:_r.SENDONLY,streams:[d]}),n._peerConnection.addTransceiver(c||fA.VIDEO,{direction:_r.SENDONLY,streams:[d]}),n._peerConnection.addTransceiver(u&&R||fA.VIDEO,{direction:_r.SENDONLY,streams:[d]}),yield n.connect();else{let Z=[];if(k&&(_[0].sender.track||Z.push(0),yield _[0].sender.replaceTrack(k),yield n.setBandwidth({bandwidth:a?.profile.bitrate||40,type:fA.AUDIO})),R){let iA=u?3:1;yield _[iA].sender.replaceTrack(R),yield n.setBandwidth({bandwidth:I.profile.bitrate,type:fA.VIDEO,videoType:u?fA.AUXILIARY:fA.BIG}),Z.push(iA),c&&(yield _[2].sender.replaceTrack(c),yield n.setBandwidth({bandwidth:I.small.bitrate,type:fA.VIDEO,videoType:fA.SMALL}),Z.push(2))}yield n.setTransceiverDirection(_r.SENDONLY,Z),yield n.doPublishChange(),I?.emit("connection-state-changed",{prevState:"DISCONNECTED",state:"CONNECTING"}),I?.emit("connection-state-changed",{prevState:"CONNECTING",state:"CONNECTED"})}}()})}publishByAddTrack(e){return DA(this,arguments,function(o){var n=this;let{localAudioTrack:a,localVideoTrack:I,smallTrack:c}=o;return function*(){n._log.info("publish by addtrack");let u=I?.outMediaTrack,d=a?.outMediaTrack;if(n._peerConnection&&n._peerConnection.connectionState!=="new")return a&&d&&(yield n.addTrack(a)),void(u&&(yield n.addTrack(I)));let R=new MediaStream;if(d&&R.addTrack(d),u&&R.addTrack(u),d&&n._peerConnection.addTrack(d,R),u&&(n._peerConnection.addTrack(u,R),c)){let k=new MediaStream;k.addTrack(c),n._peerConnection.addTrack(c,k)}yield n.connect()}()})}enableSmall(e){return DA(this,null,function*(){let o=this._peerConnection.getTransceivers();e?this._room.videoManager.smallTrack&&(yield o[2].sender.replaceTrack(this._room.videoManager.smallTrack),yield this.setTransceiverDirection(_r.SENDONLY,[2])):(yield o[2].sender.replaceTrack(null),yield this.setTransceiverDirection(_r.INACTIVE,[2])),this.updateMediaSettings(),yield this.doPublishChange()})}installTrackMuteEvents(){for(var e=arguments.length,o=new Array(e),n=0;n{a&&(a?.on("mute",this.sendMutedFlag,this),a?.on("unmute",this.sendMutedFlag,this))})}uninstallTrackMuteEvents(){for(var e=arguments.length,o=new Array(e),n=0;n{a&&(a?.off("mute",this.sendMutedFlag,this),a?.off("unmute",this.sendMutedFlag,this))})}unpublish(e){return DA(this,arguments,function(o){var n=this;let{localAudioTrack:a,localVideoTrack:I}=o;return function*(){if(!mu())return a&&a.outMediaTrack&&!I&&n.localMainVideoTrack?(yield n.removeTrack(a),void(n.localMainAudioTrack=null)):I&&I.outMediaTrack&&!a&&n.localMainAudioTrack?(yield n.removeTrack(I),void(n.localMainVideoTrack=null)):(yield n.doUnpublish(),n.uninstallTrackMuteEvents(a,I),void n.emitConnectionStateChangedEvent("DISCONNECTED",I));let c=I&&I===n.localAuxVideoTrack,u=I?.outMediaTrack,d=n._peerConnection.getSenders(),R=[];a&&(c?n.localAuxAudioTrack=null:n.localMainAudioTrack=null,!n.localAuxAudioTrack&&!n.localMainAudioTrack&&(yield d[0].replaceTrack(null),R.push(0))),u&&(c?(yield d[3].replaceTrack(null),n.localAuxVideoTrack=null,n._mediaSettings=fi(bt({},n._mediaSettings),{auxVideoBps:0,auxVideoFps:0,auxVideoWidth:0,auxVideoHeight:0}),R.push(3)):(yield d[1].replaceTrack(null),yield d[2].replaceTrack(null),n.localMainVideoTrack=null,n._mediaSettings=fi(bt({},n._mediaSettings),{videoWidth:0,videoHeight:0,videoBps:0,videoFps:0,audioFs:0,audioChannel:0,audioBps:0,smallVideoWidth:0,smallVideoHeight:0,smallVideoFps:0,smallVideoBps:0}),R.push(1,2))),n.isMainStreamPublished||n.isAuxStreamPublished?(yield n.setTransceiverDirection(_r.INACTIVE,R),yield n.doPublishChange(!1)):yield n.doUnpublish(),n.uninstallTrackMuteEvents(a,I),I?.emit("connection-state-changed",{prevState:n._currentState,state:"DISCONNECTED"})}()})}doPublishChange(){let e=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];return DA(this,null,function*(){let o={state:this._room.publishState,constraintConfig:this._mediaSettings},n=yield this._signalChannel.sendWaitForResponse({command:nK,data:o,responseCommand:io.PUBLISH_STATE_CHANGE_RESULT,enableLog:e});this.checkPublishResultCode(n.data.code,n.data.message)})}doUnpublish(){let e=arguments.length>0&&arguments[0]!==void 0&&arguments[0];return this._signalChannel.sendWaitForResponse({command:Yx,commandDesc:"unpublish",responseCommand:io.UNPUBLISH_RESULT,enableLog:e}).catch(o=>{if(o.getCode()===Ge.API_CALL_TIMEOUT)return Promise.resolve();throw o})}updateMediaSettings(){let{detail:{isH264EncodeSupported:e,isVp8EncodeSupported:o}}=this._room.checkSystemResult;e?this._mediaSettings.videoCodec="H264":o&&(this._mediaSettings.videoCodec="VP8");let n=this._publishingLocalAudioTrack||this.localMainAudioTrack||this.localAuxAudioTrack,{localMainVideoTrack:a,localAuxVideoTrack:I}=this;if(this._publishingLocalVideoTrack&&(this._isPublishingAux?I=this._publishingLocalVideoTrack:a=this._publishingLocalVideoTrack),Jh){if(n&&n.outMediaTrack){let c=n.outMediaTrack.getSettings();this._mediaSettings.audioChannel=c.channelCount||1,this._mediaSettings.audioBps=1e3*n.profile.bitrate,this._mediaSettings.audioFs=c.sampleRate||0}if(a&&a.outMediaTrack){let c=a.outMediaTrack.getSettings();this._mediaSettings.videoWidth=c.width||0,this._mediaSettings.videoHeight=c.height||0,this._mediaSettings.videoFps=c.frameRate||0,this._mediaSettings.videoBps=1e3*a.profile.bitrate,a.small&&(this._mediaSettings.smallVideoWidth=a.small.width,this._mediaSettings.smallVideoHeight=a.small.height,this._mediaSettings.smallVideoFps=a.small.frameRate,this._mediaSettings.smallVideoBps=1e3*a.small.bitrate)}if(I&&I.outMediaTrack){let c=I.outMediaTrack.getSettings();this._mediaSettings.auxVideoWidth=c.width||0,this._mediaSettings.auxVideoHeight=c.height||0,this._mediaSettings.auxVideoFps=c.frameRate||0,this._mediaSettings.auxVideoBps=1e3*I.profile.bitrate}}else n&&n.outMediaTrack&&(this._mediaSettings.audioChannel=n.profile.channelCount,this._mediaSettings.audioBps=1e3*n.profile.bitrate,this._mediaSettings.audioFs=n.profile.sampleRate),a&&a.outMediaTrack&&(this._mediaSettings.videoWidth=a.profile.width,this._mediaSettings.videoHeight=a.profile.height,this._mediaSettings.videoFps=a.profile.frameRate,this._mediaSettings.videoBps=1e3*a.profile.bitrate);this._log.info("updateMediaSettings: ".concat(JSON.stringify(this._mediaSettings)))}sendMediaSettings(){this.updateMediaSettings(),this._signalChannel.sendWaitForResponse({command:gK,data:this._mediaSettings,responseCommand:io.UPDATE_CONSTRAINT_CONFIG_RES}).then(e=>{e.data.code!==0&&this._log.warn(e.data.message)}).catch(()=>{})}addTrack(e){return DA(this,null,function*(){if(!this._peerConnection)return;let o=e===this.localAuxAudioTrack||e===this.localAuxVideoTrack;this._log.info("is adding ".concat(e.kind," track to current published local ").concat(o?fA.AUXILIARY:fA.MAIN," stream")),sl()?yield this.addTrackByTransceiver(e,o):yield this.addTrackBySender(e)})}addTrackByTransceiver(e,o){return DA(this,null,function*(){var n;if(!e.mediaTrack)return;let a=this._peerConnection.getTransceivers();if(e.kind===fA.AUDIO)yield a[0].sender.replaceTrack(e.outMediaTrack);else{let I=o?3:1;yield a[I].sender.replaceTrack(e.outMediaTrack),I===1&&(n=this.localMainVideoTrack)!=null&&n.small&&(yield a[2].sender.replaceTrack(this._room.videoManager.smallTrack)),a[I].direction===_r.INACTIVE&&(yield this.setTransceiverDirection(_r.SENDONLY,[I]))}this.updateMediaSettings(),yield this.doPublishChange()})}addTrackBySender(e){return DA(this,null,function*(){if(!e.outMediaTrack)return;let o=e.outMediaTrack;mu()&&this._peerConnection.getTransceivers().findIndex(a=>a.direction==="stopped")>=0&&(this._log.warn("transceiver is stopping, negotiate sdp first"),yield this.updateOffer("remove",o));let n=this._peerConnection.getSenders().find(a=>a.track&&a.track.kind===o.kind);if(n&&n.track){this._log.warn("sender already exists, remove sender first");let a=n.track;this.removeSender(n),yield this.updateOffer("remove",a)}if(o&&this._peerConnection.addTrack(o,new MediaStream([o])),o.kind===fA.VIDEO&&e instanceof Ru&&e.small){let a=new MediaStream,{smallTrack:I}=this._room.videoManager;a.addTrack(I),this._peerConnection.addTrack(I,a)}yield this.updateOffer("add",o)})}isNeedToResetOfferOrder(){if(this._sdpSemantics===LR||!this._peerConnection||!this._peerConnection.localDescription)return!1;let{sdp:e}=this._peerConnection.localDescription,o=rs(e);for(let n=0;nn.sender&&n.sender.track===e.track)),this._peerConnection.removeTrack(e),o&&$n(o.stop)&&(this._log.info("stop transceiver"),o.stop())}removeTrack(e){return DA(this,null,function*(){if(!this._peerConnection)return;let o=e===this.localAuxAudioTrack||e===this.localAuxVideoTrack;this._log.info("is removing ".concat(e.kind," track from current published local ").concat(o?fA.AUXILIARY:fA.MAIN," stream")),sl()?yield this.removeTrackByTransceiver(e,o):yield this.removeTrackBySender(e)})}removeTrackByTransceiver(e,o){return DA(this,null,function*(){if(!e.outMediaTrack)return;let n=this._peerConnection.getTransceivers();if(e.kind===fA.AUDIO)yield n[0].sender.replaceTrack(null);else{let a=o?3:1;yield n[a].sender.replaceTrack(null),a===1&&e.small&&(yield n[2].sender.replaceTrack(null)),yield this.setTransceiverDirection(_r.INACTIVE,[a])}this.updateMediaSettings(),yield this.doPublishChange()})}setTransceiverDirection(e,o){return DA(this,null,function*(){if(!Yr)return;let n=!1,a=!1;this._log.info("setting transceiver ".concat(o.join(",")," direction to ").concat(e));let I=this._peerConnection.getTransceivers();if(o.forEach(d=>{I[d].direction!==e&&(I[d].direction=e,n=!0)}),n){this._log.info("updating offer");let d=yield this._peerConnection.createOffer();yield this.setOffer(d)}let c=-1,u=this._peerConnection.remoteDescription.sdp.split(`\r +`).map(d=>{if(d.match(new RegExp("a=(".concat(_r.INACTIVE,"|").concat(_r.RECVONLY,"|").concat(_r.SENDONLY,")")))&&c++,o.includes(c)){if(e===_r.INACTIVE&&d.includes("a=".concat(_r.RECVONLY)))return a=!0,"a=".concat(e);if(e===_r.SENDONLY&&d.includes("a=".concat(_r.INACTIVE)))return a=!0,"a=".concat(_r.RECVONLY)}return d}).join(`\r +`);a&&(this._log.info("updating answer"),yield this.setAnswer({type:"answer",sdp:u}))})}removeTrackBySender(e){return DA(this,null,function*(){if(!e.outMediaTrack)return;if(e.kind===fA.VIDEO&&this.isNeedToResetOfferOrder()&&this.localMainAudioTrack)return this.reset(),this.initialize(),void(yield this.publish({localAudioTrack:this.localMainAudioTrack,isAuxiliary:!1}));let o=this._peerConnection.getSenders().find(n=>n.track===e.outMediaTrack);o&&(this.removeSender(o),e.kind===fA.VIDEO&&e.small&&this._peerConnection.getSenders().forEach(n=>{n.track&&n.track.kind===fA.VIDEO&&this.removeSender(n)})),yield this.updateOffer("remove",e.outMediaTrack)})}replaceTrack(e){return DA(this,null,function*(){var o;let n,a=(o=this._peerConnection)==null?void 0:o.getSenders();if(!a||a.length===0||!e.mediaTrack||(n=sl()?e.kind===fA.AUDIO?a[0]:a[1]:a.find(c=>c.track&&c.track.kind===e.kind),!n))return!1;let I=e===this.localAuxAudioTrack||e===this.localAuxVideoTrack;return this._log.info("is replacing ".concat(e.kind," track on ").concat(I?fA.AUXILIARY:fA.MAIN," stream")),e.kind===fA.AUDIO?yield n.replaceTrack(e.outMediaTrack):e.kind===fA.VIDEO&&(I?a[3]&&(yield a[3].replaceTrack(e.outMediaTrack)):yield n.replaceTrack(e.outMediaTrack)),!0})}updateOffer(e,o){return DA(this,null,function*(){try{let n=yield this._peerConnection.createOffer(tz);Yr&&n.sdp&&(n.sdp=this.setSDPDirection(n.sdp,"sendrecv")),yield this.setOffer(n);let a=this.updateMediaSettings(),I={action:e,trackId:o.id,kind:o.kind===fA.VIDEO?"bigVideo":o.kind,type:"offer",sdp:this._peerConnection.localDescription.sdp,constraintConfig:a,state:this._room.publishState};this._log.info("createOffer success, sending updated offer to remote server"),this._log.debug("updatedOffer: ".concat(I.sdp));let c=yield this._signalChannel.sendWaitForResponse({command:q4,data:I,responseCommand:io.UPDATE_OFFER_RESULT,timeout:nO,commandDesc:"update offer"}),{code:u,message:d}=c.data;u!==0&&this.checkPublishResultCode(u,d),yield this.acceptAnswer(c.data.data),n.sdp&&this.updateSSRC(n.sdp)}catch(n){throw this._log.error(n),n}})}setBandwidth(e){return DA(this,arguments,function(o){var n=this;let{bandwidth:a,type:I,videoType:c,sdp:u}=o;return function*(){if(!TT())return u?I===fA.VIDEO?n.updateVideoBandwidthRestriction(u,a,c):n.updateAudioBandwidthRestriction(u,a):void 0;let d,R=n._peerConnection.getSenders();if(sl()){let k=0;I===fA.VIDEO&&(k=c===fA.SMALL?2:c===fA.AUXILIARY?3:1),d=R[k]}else d=R.find(k=>k.track&&k.track.kind===I);if(d){let k=d.getParameters();(!k.encodings||k.encodings.length===0)&&(k.encodings=[{}]),k.encodings[0].maxBitrate=1e3*a;try{return yield d.setParameters(k),n._log.info("".concat(c||"").concat(I," bandwidth ").concat(a," kbps")),u}catch(_){if(n._log.info("failed to set bandwidth by setting maxBitrate: ".concat(_)),u)return I===fA.VIDEO?n.updateVideoBandwidthRestriction(u,a,c):n.updateAudioBandwidthRestriction(u,a)}}return u}()})}updateVideoBandwidthRestriction(e,o,n){let a="AS";Yr&&(a="TIAS",o*=1e3);let I=0,c=-1;return n===fA.SMALL?I=1:n===fA.AUXILIARY&&(I=2),e=e.replace(/m=video (.*)\r\nc=IN (.*)\r\n/g,u=>(c+=1,c===I?"".concat(u,"b=").concat(a,":").concat(o,`\r +`):u)),e}updateAudioBandwidthRestriction(e,o){let n="AS";return Yr&&(n="TIAS",o*=1e3),e=e.replace(/m=audio (.*)\r\nc=IN (.*)\r\n/,`m=audio $1\r +c=IN $2\r +b=`.concat(n,":").concat(o,`\r +`))}removeBandwidthRestriction(e){return e.replace(/b=AS:.*\r\n/,"").replace(/b=TIAS:.*\r\n/,"")}removeVideoOrientation(e){return e.replace(/urn:3gpp:video-orientation/,"")}connect(){return DA(this,null,function*(){try{yield this.exchangeSDP(),yield this.waitForPeerConnectionConnected()}catch(e){throw this.closePeerConnection(!0),this.uninstallEvents(),e}})}exchangeSDP(){return DA(this,null,function*(){try{yield this.createOffer(),this._log.info("createOffer success, sending offer to remote server"),yield this.doExchangeSDP()}catch(e){throw e}})}createOffer(){return DA(this,null,function*(){try{let e=yield this._peerConnection.createOffer(tz);yield this.setOffer(e),e.sdp&&this.updateSSRC(e.sdp)}catch(e){throw e}})}doExchangeSDP(){let e={command:j4,responseCommand:io.PUBLISH_RESULT,data:{type:this._peerConnection.localDescription.type,sdp:this.removeVideoOrientation(this._peerConnection.localDescription.sdp),screen:this.localMainVideoTrack instanceof Nm||this.localAuxVideoTrack instanceof Nm,state:this._room.publishState,constraintConfig:this._mediaSettings},enableLog:!1};return this._log.debug("sending sdp offer: ".concat(e.data.sdp)),this._signalChannel.sendWaitForResponse(e).then(o=>{let{code:n,message:a,data:I}=o.data;return n===0?this.acceptAnswer(I):this.checkPublishResultCode(n,a)})}setSDPDirection(e,o){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"all",a=rs(e);return a.media.forEach(I=>{(n==="all"||I.type===n)&&(I.direction=o)}),$h(a)}acceptAnswer(e){return DA(this,null,function*(){var o,n,a,I,c;try{let u;if(this._publishingLocalAudioTrack||this._publishingLocalVideoTrack||this.isMainStreamPublished){let R=((o=this._publishingLocalVideoTrack)==null?void 0:o.profile.bitrate)||((n=this.localMainVideoTrack)==null?void 0:n.profile.bitrate),k=((a=this._publishingLocalAudioTrack)==null?void 0:a.profile.bitrate)||((I=this.localMainAudioTrack)==null?void 0:I.profile.bitrate);if(R){let _=this._isPublishingAux?fA.AUXILIARY:fA.BIG;u=yield this.setBandwidth({bandwidth:R,type:fA.VIDEO,sdp:u,videoType:_})}k&&(u=yield this.setBandwidth({bandwidth:k,type:fA.AUDIO,sdp:u}))}if(u=this.removeVideoOrientation(e.sdp),(c=this._publishingLocalVideoTrack)!=null&&c.small){let{smallStreamConfig:R}=this._room;u=yield this.setBandwidth({bandwidth:this._publishingLocalVideoTrack.small.bitrate||R.bitrate,type:fA.VIDEO,videoType:fA.SMALL,sdp:u})}let d={type:e.type,sdp:u};yield this.setAnswer(d),this._log.debug("accepted answer: ".concat(u))}catch(u){throw this._log.error("failed to accept remote answer ".concat(u)),u}})}sendMutedFlag(e){e===this.localAuxAudioTrack||e===this.localAuxVideoTrack||(this._log.info("send muted state: ".concat(JSON.stringify(this._room.muteState))),this._signalChannel.send(K4,this._room.muteState))}getIsReconnecting(){return this._isReconnecting}reconnect(){return DA(this,null,function*(){if(!(zg(e6.prototype,this,"beforeReconnect").call(this)<0))try{yield this._signalChannel.sendWaitForResponse({command:Yx,responseCommand:io.UNPUBLISH_RESULT,enableLog:!1}),this.closePeerConnection(),this.initialize(),this.isMainStreamPublished&&(yield this.publish({localAudioTrack:this.localMainAudioTrack,localVideoTrack:this.localMainVideoTrack,isAuxiliary:!1})),this.isAuxStreamPublished&&(yield this.publish({localAudioTrack:this.localAuxAudioTrack,localVideoTrack:this.localAuxVideoTrack,isAuxiliary:!0})),this._log.warn("reconnect() uplink reconnect successfully"),this.stopReconnection()}catch{let o=fQ(this._reconnectionCount);this._log.warn("reconnect() timeout, try again after ".concat(o/1e3,"s")),this._reconnectionTimer=setTimeout(()=>{this.clearReconnectionTimer(),this.reconnect()},o)}})}handleConnectionStateChange(e){e.state==="CONNECTED"&&(this.localMainVideoTrack||this._publishingLocalVideoTrack&&!this._isPublishingAux)&&S.emit(K.SEND_FIRST_VIDEO_FRAME,{room:this._room})}updateSSRC(e){try{rs(e).media.forEach((o,n)=>{if(o.type===fA.AUDIO){let a=o.ssrcs&&o.ssrcs[0];a&&(this.ssrc.audio=Number(a.id))}else{if(this._sdpSemantics===LR&&o.ssrcGroups)return void o.ssrcGroups.forEach((I,c)=>{let u=Number(I.ssrcs.split(" ")[0]);c===0?this.ssrc.video=u:c===1&&(this.ssrc.small=u)});let a=o.ssrcs&&o.ssrcs[0];if(!a)return;switch(n){case 1:this.ssrc.video=Number(a.id);break;case 2:this.ssrc.small=Number(a.id);break;case 3:this.ssrc.auxiliary=Number(a.id)}}})}catch{}}getVideoTrackId(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:fA.VIDEO;if(this._peerConnection){let o=this._peerConnection.getSenders();if(e===fA.AUXILIARY&&o[3]&&o[3].track)return o[3].track.id;if(e===fA.VIDEO&&o[1]&&o[1].track)return o[1].track.id}if(this.localMainVideoTrack&&e===fA.VIDEO){let o=this.localMainVideoTrack.mediaTrack;if(o)return o.id}if(this.localAuxVideoTrack&&e===fA.AUXILIARY){let o=this.localAuxVideoTrack.mediaTrack;if(o)return o.id}return""}getSSRC(){return this.ssrc}checkPublishResultCode(e,o){if(e!==0)throw e===FR?(this._log.error(ts.NOT_SUPPORTED_H264ENCODE),new Ct({code:Ge.NOT_SUPPORTED_H264,message:Wi({key:Mi.NOT_SUPPORTED_H264ENCODE})})):new Ct({code:Ge.UNKNOWN,message:Wi({key:Mi.SIGNAL_RESPONSE_FAILED,data:{signalResponse:io.PUBLISH_RESULT,code:e,message:o}})})}};vt([Dn(A=>function(){for(var e=arguments.length,o=new Array(e),n=0;n{let c=u=>{this._emitter.off("closed",c),I(new Ct({code:Ge.API_CALL_ABORTED,message:Wi({key:Mi.CONNECTION_ABORTED,data:u})}))};this._emitter.on("closed",c),A.apply(this,o).then(a,I).finally(()=>{this._emitter.off("closed",c)})})})],Hx.prototype,"publish"),vt([jh(521715,!1)],Hx.prototype,"unpublish"),vt([wm(WQ.prototype.afterConnect),MW(WQ.prototype.beforeConnect)],Hx.prototype,"connect");var Vx=Hx,EtA=class{constructor(A,e){this.room=A,G(this,"_log"),G(this,"_prevReportTime",0),G(this,"_prevReport",{}),G(this,"_prevStats",null),G(this,"_prevEncoderImplementation",""),G(this,"_prevAuxEncoderImpl",""),G(this,"_prevQualityLimitationReason",""),G(this,"_prevAuxQualityLimitationReason",""),G(this,"_prevDecoderImplementationMap",new Map),G(this,"_decodeMap",new Map),G(this,"_prevQpSum",0),G(this,"_prevAuxQpSum",0),G(this,"totalBytesSent",0),G(this,"totalBytesReceived",0),G(this,"_spcStats",null),this._log=e}get statInterval(){return this._prevReportTime===0?2:(Date.now()-this._prevReportTime)/1e3}getSenderStats(A){return DA(this,null,function*(){var e,o,n,a,I,c,u;let d={audio:{bytesSent:0,packetsSent:0,audioLevel:0,totalAudioEnergy:0},video:{bytesSent:0,packetsSent:0,framesEncoded:0,frameWidth:0,frameHeight:0,framesSent:0,fpsCapture:0},small:{bytesSent:0,packetsSent:0,framesEncoded:0,frameWidth:0,frameHeight:0,framesSent:0,fpsCapture:0},auxiliary:{bytesSent:0,packetsSent:0,framesEncoded:0,frameWidth:0,frameHeight:0,framesSent:0,fpsCapture:0},rtt:0},R=A.getPeerConnection(),k=A.getSSRC();if(R)try{if((this._spcStats||(yield R.getStats())).forEach(_=>{var Z,iA,cA,TA,JA,Ie,XA,Ft,ie,ke,Nt,Ut,Ui;let Oi,or;if(_.type==="outbound-rtp")if((_.mediaType||_.kind)===fA.VIDEO){if(_.ssrc===k.video?(Oi=fA.VIDEO,or=A.localMainVideoTrack):_.ssrc===k.small?Oi=fA.SMALL:_.ssrc===k.auxiliary&&(or=A.localAuxVideoTrack,Oi=fA.AUXILIARY),!Oi)return;d[Oi].bytesSent=_.bytesSent,d[Oi].packetsSent=_.packetsSent,d[Oi].framesEncoded=_.framesEncoded,Ee(_.keyFramesEncoded)||(d[Oi].keyFramesEncoded=_.keyFramesEncoded),Ee(_.nackCount)||(d[Oi].nackCount=_.nackCount),Ee(_.pliCount)||(d[Oi].pliCount=_.pliCount),Ee(_.retransmittedPacketsSent)||(d[Oi].retransmittedPacketsSent=_.retransmittedPacketsSent),Ee(_.totalEncodeTime)||(d[Oi].totalEncodeTime=_.totalEncodeTime),Ee(_.totalPacketSendDelay)||(d[Oi].totalPacketSendDelay=_.totalPacketSendDelay);let xi=0;if(!Ee(_.qpSum)&&!Ee(_.framesEncoded)&&_.framesEncoded>0){let yo=_.qpSum,Sa=_.framesEncoded,Vn=Oi===fA.VIDEO?this._prevQpSum:this._prevAuxQpSum,NI=Oi===fA.VIDEO?((iA=(Z=A.localMainVideoTrack)==null?void 0:Z.stat)==null?void 0:iA.framesEncoded)||0:((TA=(cA=A.localAuxVideoTrack)==null?void 0:cA.stat)==null?void 0:TA.framesEncoded)||0;if(Sa>NI&&yo>Vn){let IG=yo-Vn,qM=Sa-NI;xi=Math.round(IG/qM),xi>35&&A.videoCodec==="h264"&&this._log.warn("".concat(Oi===fA.AUXILIARY?"aux ":"","video encoder QP is high: ").concat(xi,", resolution: ").concat(_.frameWidth,"x").concat(_.frameHeight,", codec: ").concat(A.videoCodec,", "))}Oi===fA.VIDEO?this._prevQpSum=yo:Oi===fA.AUXILIARY&&(this._prevAuxQpSum=yo)}if(!Ee(_.encoderImplementation)&&(Oi===fA.VIDEO&&this._prevEncoderImplementation!==_.encoderImplementation||Oi===fA.AUXILIARY&&this._prevAuxEncoderImpl!==_.encoderImplementation)){let yo=2,Sa=this._prevEncoderImplementation;Oi===fA.AUXILIARY&&(yo=7,Sa=this._prevAuxEncoderImpl),S.emit("262",{userId:A.userId,streamType:yo,prevImplementation:Sa,implementation:_.encoderImplementation,codec:A.videoCodec,isHWCodec:_.powerEfficientEncoder}),this[Oi===fA.VIDEO?"_prevEncoderImplementation":"_prevAuxEncoderImpl"]=_.encoderImplementation,or?.log.info("encoderImplementation change to ".concat(_.encoderImplementation,"(").concat(A.videoCodec,") HWEncoder: ").concat(_.powerEfficientEncoder))}_.ssrc===k.video?!Ee(_.qualityLimitationReason)&&_.bytesSent!==0&&this._prevQualityLimitationReason!==_.qualityLimitationReason&&(or?.log.info("qualityLimitationReason change to ".concat(_.qualityLimitationReason)),S.emit("263",{userId:A.userId,reason:_.qualityLimitationReason,prevReason:this._prevQualityLimitationReason,streamType:2,isQosClearFirst:(JA=A.localMainVideoTrack)==null?void 0:JA.isQosClearFirst}),this._prevQualityLimitationReason=_.qualityLimitationReason):_.ssrc===k.auxiliary&&!Ee(_.qualityLimitationReason)&&_.bytesSent!==0&&this._prevAuxQualityLimitationReason!==_.qualityLimitationReason&&(this._log.info("aux qualityLimitationReason change to ".concat(_.qualityLimitationReason)),S.emit("263",{userId:A.userId,reason:_.qualityLimitationReason,prevReason:this._prevAuxQualityLimitationReason,streamType:7,isQosClearFirst:(Ie=A.localAuxVideoTrack)==null?void 0:Ie.isQosClearFirst}),this._prevAuxQualityLimitationReason=_.qualityLimitationReason)}else d.audio.bytesSent=_.bytesSent,d.audio.packetsSent=_.packetsSent;else if(_.type==="candidate-pair")Cm(_)&&(this.totalBytesSent=_.bytesSent,hr(_.currentRoundTripTime)&&(d.rtt=Math.floor(1e3*_.currentRoundTripTime)));else if(_.type==="media-source"){if(_.kind===fA.AUDIO)d.audio.audioLevel=_.audioLevel||0,d.audio.totalAudioEnergy=_.totalAudioEnergy||0,_.echoReturnLoss,Ee((ie=(Ft=(XA=A.localMainAudioTrack)==null?void 0:XA.sourceTrack)==null?void 0:Ft.stats)==null?void 0:ie.deliveredFramesDuration)?_.totalSamplesDuration&&(d.audio.totalSamplesDuration=_.totalSamplesDuration):d.audio.totalSamplesDuration=A.localMainAudioTrack.sourceTrack.stats.deliveredFramesDuration/1e3;else if(_.kind===fA.VIDEO)if(_.trackIdentifier===A.getVideoTrackId(fA.VIDEO))if((Ut=(Nt=(ke=A.localMainVideoTrack)==null?void 0:ke.sourceTrack)==null?void 0:Nt.stats)!=null&&Ut.deliveredFrames){let{deliveredFrames:xi}=A.localMainVideoTrack.sourceTrack.stats;d.video.framesCaptured=xi,A.localMainVideoTrack.stat.framesCaptured&&A.localMainVideoTrack.stat.framesCaptured>0&&xi>=A.localMainVideoTrack.stat.framesCaptured?d.video.fpsCapture=Math.floor((xi-A.localMainVideoTrack.stat.framesCaptured)/this.statInterval):d.video.fpsCapture=_.framesPerSecond}else d.video.fpsCapture=_.framesPerSecond;else _.trackIdentifier===A.getVideoTrackId(fA.AUXILIARY)?d.auxiliary.fpsCapture=_.framesPerSecond:d.small.fpsCapture=_.framesPerSecond}if(!Ee(_.audioLevel)&&(Ui=A.localMainAudioTrack)!=null&&Ui.mediaTrack&&_.trackIdentifier===A.localMainAudioTrack.mediaTrack.id&&(d.audio.audioLevel=_.audioLevel||0),!Ee(_.frameWidth)){let xi=fA.SMALL;_.trackIdentifier===A.getVideoTrackId(fA.VIDEO)||_.ssrc===k.video?xi=fA.VIDEO:(_.trackIdentifier===A.getVideoTrackId(fA.AUXILIARY)||_.ssrc===k.auxiliary)&&(xi=fA.AUXILIARY),d[xi].frameWidth=_.frameWidth,d[xi].frameHeight=_.frameHeight,d[xi].framesSent=_.framesSent}}),A.localMainAudioTrack||A.getRoom().capturedLocalMainAudioTrack){let _=A.localMainAudioTrack||A.getRoom().capturedLocalMainAudioTrack;if(_){let Z=_.getInternalAudioLevel(),iA=_.getInternalAudioLevelAfter3A();d.audio.audioCaptureEnergyAfter3a=iA,d.audio.micAudioLevel=Z,d.audio.audioLevel===0&&A.localMainAudioTrack&&(d.audio.audioLevel=iA??Z),!A.localMainAudioTrack&&!Ee((o=(e=_.sourceTrack)==null?void 0:e.stats)==null?void 0:o.deliveredFramesDuration)&&(d.audio.totalSamplesDuration=_.sourceTrack.stats.deliveredFramesDuration/1e3)}}if(!A.localMainVideoTrack&&A.getRoom().capturedLocalMainVideoTrack){let _=A.getRoom().capturedLocalMainVideoTrack;if((a=(n=_?.sourceTrack)==null?void 0:n.stats)!=null&&a.deliveredFrames){let{deliveredFrames:Z}=_.sourceTrack.stats;d.video.framesCaptured=Z,_.stat.framesCaptured&&_.stat.framesCaptured>0&&Z>=_.stat.framesCaptured&&(d.video.fpsCapture=Math.floor((Z-_.stat.framesCaptured)/this.statInterval)),_.stat.framesCaptured=Z}}if(!A.localAuxVideoTrack&&A.getRoom().capturedLocalAuxVideoTrack){let _=A.getRoom().capturedLocalAuxVideoTrack;if((c=(I=_?.sourceTrack)==null?void 0:I.stats)!=null&&c.deliveredFrames){let{deliveredFrames:Z}=_.sourceTrack.stats;d.auxiliary.framesCaptured=Z,_.stat.framesCaptured&&_.stat.framesCaptured>0&&Z>=_.stat.framesCaptured&&(d.auxiliary.fpsCapture=Math.floor((Z-_.stat.framesCaptured)/this.statInterval)),_.stat.framesCaptured=Z}}this.totalBytesSent||(this.totalBytesSent+=d.audio.bytesSent+d.video.bytesSent+d.auxiliary.bytesSent),Object.keys(d).forEach(_=>{_===fA.AUDIO?(A.localMainAudioTrack&&(A.localMainAudioTrack.stat=d[_]),A.localAuxAudioTrack&&(A.localAuxAudioTrack.stat=d[_])):_===fA.VIDEO?A.localMainVideoTrack&&(A.localMainVideoTrack.stat=d[_]):_===fA.AUXILIARY&&A.localAuxVideoTrack&&(A.localAuxVideoTrack.stat=d[_])})}catch(_){this._log.warn("failed to getStats on sender connection ".concat(_))}return d.rtt===0&&(d.rtt=((u=this.room.networkQuality)==null?void 0:u.uplinkRTT)||0),d})}getReceiverStats(A){return DA(this,null,function*(){var e,o,n;let a={tinyId:A.tinyId,userId:A.userId,rtt:0,hasAudio:!1,hasVideo:!1,hasAuxiliary:!1,isSmallSubscribed:!1,avSyncDelay:0,audio:{bytesReceived:0,packetsReceived:0,packetsLost:0,p2pDelay:0,totalJitter:0,totalJitterCount:0,audioLevel:0,totalAudioEnergy:0,insertedSamplesForDeceleration:0,removedSamplesForAcceleration:0},video:{bytesReceived:0,packetsReceived:0,packetsLost:0,framesReceived:0,framesDecoded:0,frameWidth:0,frameHeight:0,fpsDecoded:0,freezeCount:0,totalFreezesDuration:0,totalJitter:0,totalJitterCount:0,p2pDelay:0,codec:""},auxiliary:{bytesReceived:0,packetsReceived:0,packetsLost:0,framesReceived:0,framesDecoded:0,frameWidth:0,frameHeight:0,fpsDecoded:0,totalJitter:0,totalJitterCount:0,p2pDelay:0,codec:""}},I=A.getPeerConnection();if(I)try{let{ssrc:c}=A,{muteState:u,subscribeState:d}=A;(this._spcStats||(yield I.getStats())).forEach(_=>{var Z,iA;if(_.type==="codec"&&this._decodeMap.set(_.id,_),_.type==="inbound-rtp"){let cA=(_.mediaType||_.kind)===fA.AUDIO;if(cA){if(_.ssrc!==c.audio||!u.hasAudio)return;a.audio.packetsReceived=_.packetsReceived,a.audio.bytesReceived=_.bytesReceived,a.audio.packetsLost=_.packetsLost,_.insertedSamplesForDeceleration&&(a.audio.insertedSamplesForDeceleration=_.insertedSamplesForDeceleration),_.removedSamplesForAcceleration&&(a.audio.removedSamplesForAcceleration=_.removedSamplesForAcceleration),_.totalSamplesDuration&&(a.audio.totalSamplesDuration=_.totalSamplesDuration),_.totalSamplesReceived&&(a.audio.totalSamplesReceived=_.totalSamplesReceived),_.concealedSamples&&(a.audio.concealedSamples=_.concealedSamples),_.silentConcealedSamples&&(a.audio.silentConcealedSamples=_.silentConcealedSamples);let{remoteAudioTrack:TA}=A;TA.stat.packetsReceived=_.packetsReceived,TA.stat.bytesReceived=_.bytesReceived,TA.stat.packetsLost=_.packetsLost,a.audio.p2pDelay=TA.stat.end2EndDelay,a.hasAudio=!0}else{if(Yr&&_.bytesReceived===0)return;let TA;_.ssrc===c.video&&u.hasVideo&&(a.video.packetsReceived=_.packetsReceived,a.video.bytesReceived=_.bytesReceived,a.video.packetsLost=_.packetsLost,a.video.framesReceived=_.framesReceived,a.video.framesDecoded=_.framesDecoded,a.video.fpsDecoded=_.framesPerSecond,a.hasVideo=!0,A.videoCodec=Vs[(Z=this._decodeMap.get(_.codecId))==null?void 0:Z.mimeType.split("/")[1]]||"h264",a.video.codec=A.videoCodec,TA=A.remoteVideoTrack,u.hasSmall&&d.smallVideo&&(a.isSmallSubscribed=!0),_.decoderImplementation&&(!this._prevDecoderImplementationMap.has(a.userId)||this._prevDecoderImplementationMap.get(a.userId)!==_.decoderImplementation)&&(TA.log.info("decoderImplementation change to ".concat(_.decoderImplementation,"(").concat(A.videoCodec,") HWDecoder: ").concat(_.powerEfficientDecoder)),S.emit("262",{userId:this.room.userId,remoteUserId:a.userId,prevImplementation:this._prevDecoderImplementationMap.get(a.userId),implementation:_.decoderImplementation,codec:A.videoCodec,isHWCodec:_.powerEfficientDecoder}),this._prevDecoderImplementationMap.set(a.userId,_.decoderImplementation)),Ee(_.keyFramesDecoded)||TA.updateKeyFramesDecoded(_.keyFramesDecoded)),_.ssrc===c.auxiliary&&u.hasAuxiliary&&(a.auxiliary.packetsReceived=_.packetsReceived,a.auxiliary.bytesReceived=_.bytesReceived,a.auxiliary.packetsLost=_.packetsLost,a.auxiliary.framesReceived=_.framesReceived,a.auxiliary.framesDecoded=_.framesDecoded,a.auxiliary.fpsDecoded=_.framesPerSecond,TA=A.remoteAuxiliaryTrack,a.auxiliary.p2pDelay=TA.stat.end2EndDelay,a.hasAuxiliary=!0,a.video.codec=((iA=this._decodeMap.get(_.codecId))==null?void 0:iA.mimeType.split("/")[1].toLowerCase())||"h264",Ee(_.keyFramesDecoded)||TA.updateKeyFramesDecoded(_.keyFramesDecoded)),TA&&(TA.stat.packetsReceived=_.packetsReceived,TA.stat.bytesReceived=_.bytesReceived,TA.stat.packetsLost=_.packetsLost,TA.stat.framesReceived=_.framesReceived,TA.stat.framesDecoded=_.framesDecoded,_.jitterBufferDelay&&(TA.stat.jitterBufferDelay=Math.floor(_.jitterBufferDelay/_.jitterBufferEmittedCount*1e3)),a.video.p2pDelay=TA.stat.end2EndDelay)}_.jitterBufferDelay&&(cA?(a.audio.totalJitter=_.jitterBufferDelay,a.audio.totalJitterCount=_.jitterBufferEmittedCount,a.audio.estimatedPlayoutTimestamp=_.estimatedPlayoutTimestamp):_.ssrc===c.video&&u.hasVideo?(a.video.totalJitter=_.jitterBufferDelay,a.video.totalJitterCount=_.jitterBufferEmittedCount,a.video.estimatedPlayoutTimestamp=_.estimatedPlayoutTimestamp):_.ssrc===c.auxiliary&&u.hasAuxiliary&&(a.auxiliary.totalJitter=_.jitterBufferDelay,a.auxiliary.totalJitterCount=_.jitterBufferEmittedCount))}else _.type==="candidate-pair"&&Cm(_)&&(this.totalBytesReceived=_.bytesReceived,hr(_.currentRoundTripTime)&&(a.rtt=Math.floor(1e3*_.currentRoundTripTime)));Ee(_.frameWidth)||((_.trackIdentifier===A.getMainStreamVideoTrackId()||_.ssrc===c.video)&&(a.video.frameWidth=_.frameWidth,a.video.frameHeight=_.frameHeight,A.remoteVideoTrack.stat.frameWidth=_.frameWidth,A.remoteVideoTrack.stat.frameHeight=_.frameHeight),(_.trackIdentifier===A.getAuxStreamVideoTrackId()||_.ssrc===c.auxiliary)&&(a.auxiliary.frameWidth=_.frameWidth,a.auxiliary.frameHeight=_.frameHeight,A.remoteAuxiliaryTrack.stat.frameWidth=_.frameWidth,A.remoteAuxiliaryTrack.stat.frameHeight=_.frameHeight)),!Ee(_.audioLevel)&&A.muteState.audioAvailable&&A.remoteAudioTrack.mediaTrack&&_.trackIdentifier===A.remoteAudioTrack.mediaTrack.id&&(a.audio.audioLevel=_.audioLevel||0,a.audio.totalAudioEnergy=_.totalAudioEnergy||0)}),a.audio.audioLevel===0&&A.muteState.audioAvailable&&(a.audio.audioLevel=A.remoteAudioTrack.getInternalAudioLevel()||0),this.totalBytesReceived||(this.totalBytesReceived+=a.audio.bytesReceived+a.video.bytesReceived+a.auxiliary.bytesReceived),Ee((e=A.remoteVideoTrack.player.stat)==null?void 0:e.fps)||(a.video.fpsRender=A.remoteVideoTrack.player.stat.fps),Ee((o=A.remoteAuxiliaryTrack.player.stat)==null?void 0:o.fps)||(a.auxiliary.fpsRender=A.remoteAuxiliaryTrack.player.stat.fps);let R=a.audio.estimatedPlayoutTimestamp,k=a.video.estimatedPlayoutTimestamp;if(R&&k&&A.remoteAudioTrack.isAvailable&&A.remoteVideoTrack.isAvailable){let _=k-R;Math.abs(_)<=1e4&&(a.avSyncDelay=_,Math.abs(_)>150&&this._log.warn("av sync delay",_))}}catch(c){this._log.warn("failed to getStats on receiver connection ".concat(c))}return a.rtt===0&&(a.rtt=((n=this.room.networkQuality)==null?void 0:n.uplinkRTT)||0),a})}getStats(A,e){return DA(this,null,function*(){let o,n={},a=[];if(this.room.singlePC){let I=this.room.singlePC.getPeerConnection();if(!I)return{senderStats:n,receiverStats:a};let c=ki(),u=yield I.getStats(),d=ki();d-c>2e3&&this._log.warn("getStats cost ".concat(d-c,"ms"));let R=[],k=new Set(["inbound-rtp","outbound-rtp","track","candidate-pair","media-source","codec","media-playout"]);u.forEach(_=>k.has(_.type)&&R.push(_)),this._spcStats=R}A&&(n=yield this.getSenderStats(A));for(let[I,c]of e){let u=yield this.getReceiverStats(c);u&&a.push(u)}return e.size&&(o=this.getMediaPlayoutStats(this._spcStats)),{senderStats:n,receiverStats:a,mediaPlayoutStats:o}})}getDifferenceValue(A,e){if(KQ(A))return e;let o=e-A;return o<0?0:o}prepareReport(A){let{stats:e,report:o,freezeMap:n,uplinkConnection:a}=A;var I,c,u,d,R,k,_,Z,iA;if(!KQ(e.senderStats)){let ie={uint32_audio_level:e.senderStats.audio.audioLevel*iE,uint32_audio_energy:1e6*(e.senderStats.audio.totalAudioEnergy||0),uint32_audio_codec_bitrate:e.senderStats.audio.bytesSent};e.senderStats.audio.micAudioLevel&&(ie.uint32_mic_audio_level=e.senderStats.audio.micAudioLevel*iE),Ee(e.senderStats.audio.audioCaptureEnergyAfter3a)||(ie.uint32_audio_capture_energy_after3a=e.senderStats.audio.audioCaptureEnergyAfter3a*iE),e.senderStats.audio.totalSamplesDuration&&(o.msg_device_info.uint32_audio_capture_cost=e.senderStats.audio.totalSamplesDuration);let ke=[];if(e.senderStats.video.bytesSent){let Ut={uint32_video_stream_type:2,uint32_video_codec_fps:e.senderStats.video.framesSent,uint32_video_capture_fps:e.senderStats.video.fpsCapture,uint32_video_width:e.senderStats.video.frameWidth,uint32_video_height:e.senderStats.video.frameHeight,uint32_video_codec_bitrate:e.senderStats.video.bytesSent,uint32_video_enc_fps:e.senderStats.video.framesEncoded,uint32_key_frame_count:e.senderStats.video.keyFramesEncoded,uint32_nack_count:e.senderStats.video.nackCount,uint32_pli_count:e.senderStats.video.pliCount,uint32_encode_cost:1e3*(e.senderStats.video.totalEncodeTime||0),uint32_send_packet_cost:1e3*(e.senderStats.video.totalPacketSendDelay||0),uint32_video_arq_packets:e.senderStats.video.retransmittedPacketsSent};ke.push(Ut)}if(e.senderStats.small.bytesSent){let Ut={uint32_video_stream_type:3,uint32_video_codec_fps:e.senderStats.small.framesSent||0,uint32_video_capture_fps:e.senderStats.small.fpsCapture||0,uint32_video_width:e.senderStats.small.frameWidth||0,uint32_video_height:e.senderStats.small.frameHeight||0,uint32_video_codec_bitrate:e.senderStats.small.bytesSent,uint32_video_enc_fps:e.senderStats.small.framesEncoded||0,uint32_key_frame_count:e.senderStats.small.keyFramesEncoded,uint32_nack_count:e.senderStats.small.nackCount,uint32_pli_count:e.senderStats.small.pliCount,uint32_encode_cost:1e3*(e.senderStats.small.totalEncodeTime||0),uint32_send_packet_cost:1e3*(e.senderStats.small.totalPacketSendDelay||0),uint32_video_arq_packets:e.senderStats.small.retransmittedPacketsSent};ke.push(Ut)}if(e.senderStats.auxiliary.bytesSent){let Ut={uint32_video_stream_type:7,uint32_video_codec_fps:e.senderStats.auxiliary.framesSent||0,uint32_video_capture_fps:e.senderStats.auxiliary.fpsCapture||0,uint32_video_width:e.senderStats.auxiliary.frameWidth||0,uint32_video_height:e.senderStats.auxiliary.frameHeight||0,uint32_video_codec_bitrate:e.senderStats.auxiliary.bytesSent,uint32_video_enc_fps:e.senderStats.auxiliary.framesEncoded||0,uint32_key_frame_count:e.senderStats.auxiliary.keyFramesEncoded,uint32_nack_count:e.senderStats.auxiliary.nackCount,uint32_pli_count:e.senderStats.auxiliary.pliCount,uint32_encode_cost:1e3*(e.senderStats.auxiliary.totalEncodeTime||0),uint32_send_packet_cost:1e3*(e.senderStats.auxiliary.totalPacketSendDelay||0),uint32_video_arq_packets:e.senderStats.auxiliary.retransmittedPacketsSent};ke.push(Ut)}let Nt={uint32_bitrate:0,uint32_lost:0,uint32_rtt:e.senderStats.rtt};o.msg_up_stream_info={msg_audio_status:ie,msg_video_status:ke,msg_network_status:Nt}}let{statInterval:cA}=this;o.msg_down_stream_info=[],e.receiverStats.forEach(ie=>{let ke={msg_user_info:{str_identifier:ie.userId,uint64_tinyid:ie.tinyId},msg_network_status:{uint32_rtt:ie.rtt,uint32_bitrate:0,uint32_lost:0},msg_audio_status:{},msg_video_status:[]};if(ie.hasAudio){let Nt={uint32_audio_p2p_delay:ie.audio.p2pDelay,uint32_audio_cache_ms:ie.audio.totalJitter,uint32_audio_cache_ms_count:ie.audio.totalJitterCount,uint32_audio_codec_bitrate:ie.audio.bytesReceived,uint32_audio_total_bitrate:ie.audio.bytesReceived,uint32_audio_level:1e8*ie.audio.audioLevel,uint32_audio_energy:1e6*ie.audio.totalAudioEnergy,uint32_audio_receive:ie.audio.packetsReceived,uint32_audio_origin_lost:ie.audio.packetsLost};ke.msg_audio_status=Nt}if(ie.hasVideo){let Nt=n.get("".concat(ie.userId,"_").concat(kR)),Ut=Nt?Nt.duration:0,Ui={uint32_video_stream_type:ie.isSmallSubscribed?3:2,uint32_video_receive_fps:ie.video.framesReceived,uint32_video_width:ie.video.frameWidth,uint32_video_height:ie.video.frameHeight,uint32_video_codec_bitrate:ie.video.bytesReceived,uint32_video_receive:ie.video.packetsReceived,uint32_video_origin_lost:ie.video.packetsLost,uint32_video_block_time:Ut,uint32_video_dec_fps:ie.video.framesDecoded,uint32_video_codec_fps:ie.video.fpsRender,uint32_video_cache_ms:ie.video.totalJitter,uint32_video_cache_ms_count:ie.video.totalJitterCount,uint32_video_p2p_delay:ie.video.p2pDelay,uint32_video_codec:ie.video.codec,int32_video_audio_relative_delay:ie.avSyncDelay+5e3};ke.msg_video_status.push(Ui)}if(ie.hasAuxiliary){let Nt=n.get("".concat(ie.userId,"_").concat(pN)),Ut=Nt?Nt.duration:0,Ui={uint32_video_stream_type:7,uint32_video_receive_fps:ie.auxiliary.framesReceived,uint32_video_width:ie.auxiliary.frameWidth,uint32_video_height:ie.auxiliary.frameHeight,uint32_video_codec_bitrate:ie.auxiliary.bytesReceived,uint32_video_receive:ie.auxiliary.packetsReceived+ie.auxiliary.packetsLost,uint32_video_origin_lost:ie.auxiliary.packetsLost,uint32_video_block_time:Ut,uint32_video_dec_fps:ie.auxiliary.framesDecoded,uint32_video_codec_fps:ie.video.fpsRender,uint32_video_cache_ms:ie.auxiliary.totalJitter,uint32_video_cache_ms_count:ie.auxiliary.totalJitterCount,uint32_video_p2p_delay:ie.auxiliary.p2pDelay,uint32_video_codec:ie.video.codec};ke.msg_video_status.push(Ui)}o.msg_down_stream_info.push(ke)}),e.mediaPlayoutStats&&!KQ(e.mediaPlayoutStats)&&(e.mediaPlayoutStats.synthesizedSamplesDuration*=1e3,e.mediaPlayoutStats.totalSamplesDuration*=1e3);let TA=this._prevReport,JA=this._prevStats;if(this._prevReport=JSON.parse(JSON.stringify(o)),this._prevStats=JSON.parse(JSON.stringify(e)),o.msg_up_stream_info.msg_audio_status&&TA.msg_up_stream_info.msg_audio_status){let ie=TA.msg_up_stream_info.msg_audio_status,ke=o.msg_up_stream_info.msg_audio_status;if(ie.uint32_audio_codec_bitrate===0)ke.uint32_audio_codec_bitrate=0;else{let Nt=this.getDifferenceValue(ie.uint32_audio_codec_bitrate,ke.uint32_audio_codec_bitrate);ke.uint32_audio_codec_bitrate=Math.round(8*Nt/cA),o.msg_up_stream_info.msg_network_status.uint32_bitrate+=ke.uint32_audio_codec_bitrate}(I=TA.msg_device_info)!=null&&I.uint32_audio_capture_cost?(o.msg_device_info.uint32_audio_capture_cost=2*Math.floor(1e3*this.getDifferenceValue(TA.msg_device_info.uint32_audio_capture_cost,o.msg_device_info.uint32_audio_capture_cost)/cA),o.msg_device_info.uint32_audio_capture_cost>0&&((u=a?.localMainAudioTrack)==null||u.updateAfter3aSilenceStartTime((c=e.senderStats.audio.audioCaptureEnergyAfter3a)!=null?c:e.senderStats.audio.micAudioLevel))):delete o.msg_device_info.uint32_audio_capture_cost}let Ie=TA.msg_up_stream_info.msg_video_status;o.msg_up_stream_info.msg_video_status.forEach(ie=>{let ke=Ie.find(or=>or.uint32_video_stream_type===ie.uint32_video_stream_type);if(!ke||ke.uint32_video_codec_bitrate===0)return ie.uint32_video_codec_bitrate=0,ie.uint32_video_enc_fps=0,void(ie.uint32_video_codec_fps=0);let Nt=0,Ut=0,Ui=0;ke&&ie.uint32_video_codec_bitrate>=ke.uint32_video_codec_bitrate&&(Nt=ke.uint32_video_codec_bitrate,Ut=ke.uint32_video_enc_fps,Ui=ke.uint32_video_codec_fps);let Oi=this.getDifferenceValue(Nt,ie.uint32_video_codec_bitrate);ie.uint32_video_codec_bitrate=Math.round(8*Oi/cA),o.msg_up_stream_info.msg_network_status.uint32_bitrate+=ie.uint32_video_codec_bitrate,ie.uint32_video_enc_fps=Math.round(this.getDifferenceValue(Ut,ie.uint32_video_enc_fps)/cA),ie.uint32_video_codec_fps=Math.round(this.getDifferenceValue(Ui,ie.uint32_video_codec_fps)/cA),ke.uint32_video_width===0&&ke.uint32_video_height===0&&ke.uint32_video_codec_fps===0&&(ie.uint32_video_codec_fps=ie.uint32_video_enc_fps),Ee(ke.uint32_key_frame_count)||(ie.uint32_key_frame_count=Math.round(this.getDifferenceValue(ke.uint32_key_frame_count,ie.uint32_key_frame_count))),Ee(ke.uint32_nack_count)||(ie.uint32_nack_count=Math.round(this.getDifferenceValue(ke.uint32_nack_count,ie.uint32_nack_count))),Ee(ke.uint32_pli_count)||(ie.uint32_pli_count=Math.round(this.getDifferenceValue(ke.uint32_pli_count,ie.uint32_pli_count))),Ee(ke.uint32_video_arq_packets)||(ie.uint32_video_arq_packets=Math.round(this.getDifferenceValue(ke.uint32_video_arq_packets,ie.uint32_video_arq_packets))),Ee(ke.uint32_encode_cost)||(ie.uint32_encode_cost=Math.round(this.getDifferenceValue(ke.uint32_encode_cost,ie.uint32_encode_cost)/cA)),Ee(ke.uint32_send_packet_cost)||(ie.uint32_send_packet_cost=Math.round(this.getDifferenceValue(ke.uint32_send_packet_cost,ie.uint32_send_packet_cost)/cA))});let XA=TA.msg_down_stream_info;o.msg_down_stream_info=o.msg_down_stream_info.filter(ie=>XA.find(ke=>ke.msg_user_info.uint64_tinyid===ie.msg_user_info.uint64_tinyid));let Ft=o.msg_down_stream_info;if(Ft.forEach(ie=>{let ke=XA.find(Nt=>Nt.msg_user_info.uint64_tinyid===ie.msg_user_info.uint64_tinyid);if(KQ(ie.msg_audio_status)||KQ(ke.msg_audio_status))ie.msg_audio_status={};else{let Nt=ie.msg_audio_status,Ut=ke.msg_audio_status,Ui=this.getDifferenceValue(Ut.uint32_audio_cache_ms_count,Nt.uint32_audio_cache_ms_count);delete Nt.uint32_audio_cache_ms_count,Nt.uint32_audio_cache_ms=Math.floor(1e3*this.getDifferenceValue(Ut.uint32_audio_cache_ms,Nt.uint32_audio_cache_ms)/Ui)||0;let Oi=this.room.remotePublishedUserMap.get(ie.msg_user_info.str_identifier);Oi&&(Oi.remoteAudioTrack.stat.jitterBufferDelay=Nt.uint32_audio_cache_ms),Nt.uint32_audio_origin_lost=this.getDifferenceValue(Ut.uint32_audio_origin_lost,Nt.uint32_audio_origin_lost),Nt.uint32_audio_receive=this.getDifferenceValue(Ut.uint32_audio_receive,Nt.uint32_audio_receive),Nt.uint32_audio_receive+=Nt.uint32_audio_origin_lost;let or=this.getDifferenceValue(Ut.uint32_audio_codec_bitrate,Nt.uint32_audio_codec_bitrate);Nt.uint32_audio_codec_bitrate=Math.round(8*or/cA),Nt.uint32_audio_total_bitrate=Math.round(8*or/cA)}if(ie.msg_video_status&&ke.msg_video_status){let Nt=ke.msg_video_status;ie.msg_video_status=ie.msg_video_status.filter(Ut=>Nt.find(Ui=>Ui.uint32_video_stream_type===Ut.uint32_video_stream_type)),ie.msg_video_status.forEach(Ut=>{let Ui=Nt.find(qM=>qM.uint32_video_stream_type===Ut.uint32_video_stream_type),Oi=Ui.uint32_video_receive,or=Ui.uint32_video_origin_lost,xi=Ui.uint32_video_codec_bitrate,yo=Ui.uint32_video_receive_fps,Sa=Ui.uint32_video_dec_fps;Ut.uint32_video_origin_lost=this.getDifferenceValue(or,Ut.uint32_video_origin_lost),Ut.uint32_video_receive=this.getDifferenceValue(Oi,Ut.uint32_video_receive)+Ut.uint32_video_origin_lost;let Vn=this.getDifferenceValue(xi,Ut.uint32_video_codec_bitrate);Ut.uint32_video_codec_bitrate=Math.round(8*Vn/cA);let NI=this.getDifferenceValue(yo,Ut.uint32_video_receive_fps);Ut.uint32_video_receive_fps=Math.round(NI/cA),Ut.uint32_video_dec_fps=Math.round(this.getDifferenceValue(Sa,Ut.uint32_video_dec_fps)/cA);let IG=this.getDifferenceValue(Ui.uint32_video_cache_ms_count,Ut.uint32_video_cache_ms_count);delete Ut.uint32_video_cache_ms_count,Ut.uint32_video_cache_ms=Math.floor(1e3*this.getDifferenceValue(Ui.uint32_video_cache_ms,Ut.uint32_video_cache_ms)/IG)||0})}}),!Ee((d=JA?.mediaPlayoutStats)==null?void 0:d.totalSamplesDuration)&&!Ee((R=e.mediaPlayoutStats)==null?void 0:R.totalSamplesDuration)){let ie=2*Math.floor(this.getDifferenceValue((k=JA?.mediaPlayoutStats)==null?void 0:k.synthesizedSamplesDuration,(_=e.mediaPlayoutStats)==null?void 0:_.synthesizedSamplesDuration)/cA),ke=2*Math.floor(this.getDifferenceValue((Z=JA?.mediaPlayoutStats)==null?void 0:Z.totalSamplesDuration,(iA=e.mediaPlayoutStats)==null?void 0:iA.totalSamplesDuration)/cA);o.msg_device_info.uint32_audio_play_cost=ke-ie}return JA&&e.receiverStats.forEach(ie=>{if(ie.audio.concealedSamples&&ie.audio.totalSamplesReceived){let ke=JA.receiverStats.find(Nt=>Nt.userId===ie.userId);if(ke&&ke.audio.concealedSamples&&ke.audio.totalSamplesReceived){let Nt=(ie.audio.silentConcealedSamples||0)-(ke.audio.silentConcealedSamples||0),Ut=ie.audio.concealedSamples-ke.audio.concealedSamples,Ui=ie.audio.totalSamplesReceived-ke.audio.totalSamplesReceived,Oi=Math.floor((Ut-Nt)/Ui*1e3*cA);if(Oi>1e3*cA/5){let or=Ft.find(xi=>xi.msg_user_info.str_identifier===ie.userId);or&&(or.msg_audio_status.uint32_audio_block_time=Oi)}}}}),o.msg_down_stream_info.forEach(ie=>{ie.msg_video_status.forEach(ke=>{ke.uint32_video_codec_bitrate===0&&ke.uint32_video_receive_fps===0&&(ke.uint32_video_width=0,ke.uint32_video_height=0)})}),o}getStatsReport(A){return DA(this,arguments,function(e){var o=this;let{uplinkConnection:n,downlinkConnections:a,freezeMap:I}=e;return function*(){let c={msg_device_info:{},msg_up_stream_info:{msg_audio_status:{uint32_audio_format:11,uint32_audio_sample_rate:0,uint32_audio_codec_bitrate:0,uint32_audio_receive:0,uint32_audio_origin_lost:0,uint32_audio_level:0,uint32_audio_energy:0,uint32_audio_capture_energy_after3a:0},msg_video_status:[],msg_network_status:{uint32_bitrate:0,uint32_rtt:0,uint32_lost:0}},msg_down_stream_info:[{msg_user_info:{str_identifier:"",uint64_tinyid:0},msg_audio_status:{uint32_audio_cache_ms:0,uint32_audio_format:11,uint32_audio_sample_rate:0,uint32_audio_codec_bitrate:0,uint32_audio_total_bitrate:0,uint32_audio_level:0,uint32_audio_energy:0,uint32_audio_receive:0,uint32_audio_origin_lost:0,uint32_audio_final_lost:0},msg_video_status:[{uint32_video_cache_ms:0,uint32_video_stream_type:0,uint32_video_receive_fps:0,uint32_video_width:0,uint32_video_height:0,uint32_video_codec_bitrate:0,uint32_video_receive:0,uint32_video_origin_lost:0,uint32_video_block_time:0,uint32_video_dec_fps:0,uint32_video_codec_fps:0}],msg_network_status:{uint32_bitrate:0,uint32_rtt:0,uint32_lost:0}}]},u=yield o.getStats(n,a);return JSON.stringify(o._prevReport)==="{}"&&(o._prevReport=JSON.parse(JSON.stringify(c))),o.prepareReport({stats:u,report:c,freezeMap:I,uplinkConnection:n}),o._prevReportTime=Date.now(),c}()})}getMediaPlayoutStats(A){let e;if(Aa(A)){for(let o of A)if(o.type==="media-playout"){let{synthesizedSamplesDuration:n,totalSamplesDuration:a}=o;e={synthesizedSamplesDuration:n,totalSamplesDuration:a};break}return e}}reset(){this._prevReportTime=0,this._prevReport={},this._prevEncoderImplementation="",this._prevQualityLimitationReason="",this._prevDecoderImplementationMap=new Map,[this.room.localMainVideoTrack,this.room.capturedLocalMainVideoTrack,this.room.localAuxVideoTrack,this.room.capturedLocalAuxVideoTrack].forEach(A=>{A!=null&&A.stat&&(A.stat.framesCaptured=0)})}},ltA=es(hg());function CtA(A){return new Promise(e=>DA(null,null,function*(){let o=setTimeout(()=>{e({totalCost:1e4,local:0,dns:0,tcp:0,tls:0,request:0,response:0})},1e4),n=Date.now(),a="https://".concat(A,"/?t=").concat(n);try{yield fetch(a)}catch{}clearTimeout(o);let I=function(c){let u={totalCost:0,local:0,redirect:0,httpCache:0,dns:0,tcp:0,tls:0,request:0,response:0};try{let d=performance.getEntriesByType("resource").reverse();for(let R of d)if(R.name===c){let k=Math.round(R.duration),_=Math.max(Math.round(R.domainLookupStart-R.startTime),0),Z=R.redirectStart>0?Math.max(Math.round(R.redirectEnd-R.redirectStart),0):0,iA=R.fetchStart>0?Math.max(Math.round(R.domainLookupStart-R.fetchStart),0):0,cA=Math.round(R.domainLookupEnd-R.domainLookupStart),TA=Math.round(R.requestStart-R.secureConnectionStart),JA=Math.round(R.secureConnectionStart-R.connectStart),Ie=Math.round(R.responseStart-R.requestStart),XA=Math.round(R.responseEnd-(R.responseStart||R.startTime));u=fi(bt({},u),{totalCost:k,local:_,redirect:Z,httpCache:iA,dns:cA,tcp:JA,tls:TA,request:Ie,response:XA});break}}catch{}return u}(a);I.totalCost===0&&(I.totalCost=Date.now()-n),e(I)}))}var qx=class ew extends ltA.default{constructor(e){let{signalChannel:o,room:n}=e;super(),G(this,"_room"),G(this,"_signalChannel"),G(this,"_log"),G(this,"uplinkRTT",0),G(this,"uplinkLoss",0),G(this,"downlinkRTT",0),G(this,"downlinkLoss",0),G(this,"pingResults",{}),G(this,"_downlinkPrevStatMap",new Map),G(this,"_downlinkLossAndRTTMap",new Map),G(this,"_interval",-1),G(this,"_uplinkNetworkQuality",0),G(this,"_downlinkNetworkQuality",0),G(this,"_uplinkQualityHistory",[]),G(this,"_downlinkQualityHistory",[]),this._room=n,this._signalChannel=o,this._log=nA.createLogger({parent:n.getLogger(),id:"q",userId:this._room.userId,sdkAppId:this._room.sdkAppId}),this.initialize()}get uplinkNetworkQuality(){return this._uplinkNetworkQuality}set uplinkNetworkQuality(e){e!==this._uplinkNetworkQuality&&this._log.info("uplink ".concat(this.uplinkNetworkQuality," -> ").concat(e,", rtt: ").concat(this.uplinkRTT,", loss: ").concat(this.uplinkLoss," ws-rtt: ").concat(this._signalChannel.rtt)),this._uplinkNetworkQuality=e,this._uplinkQualityHistory.push(e),this._uplinkQualityHistory.length>ew.HISTORY_SIZE&&this._uplinkQualityHistory.shift()}get downlinkNetworkQuality(){return this._downlinkNetworkQuality}set downlinkNetworkQuality(e){if(e!==this._downlinkNetworkQuality){let{rtt:o,loss:n}=this.getAverageLossAndRTT([...this._downlinkLossAndRTTMap.values()]);this._log.info("downlink ".concat(this.downlinkNetworkQuality," -> ").concat(e,", rtt: ").concat(o,", loss: ").concat(n," ws-rtt: ").concat(this._signalChannel.rtt))}this._downlinkNetworkQuality=e,this._downlinkQualityHistory.push(e),this._downlinkQualityHistory.length>ew.HISTORY_SIZE&&this._downlinkQualityHistory.shift()}initialize(){this._signalChannel.on(io.UPLINK_NETWORK_STATS,e=>{this.handleUplinkNetworkQuality(e)}),this._signalChannel.on(rK,this.handleSignalConnectionStateChange.bind(this)),this.start()}handleUplinkNetworkQuality(e){var o,n;if(e.data.code!==0)return;let a=e.data.data;if(a.delay&&this.updateDelay(a.delay),this._room.signalChannel&&a.wsRtt&&(this._room.signalChannel.rtt=a.wsRtt),!this._room.uplinkConnection)return this.uplinkNetworkQuality=0,this.uplinkLoss=0,void(this.uplinkRTT=0);let I=(n=(o=this._room)==null?void 0:o.uplinkConnection)==null?void 0:n.getPeerConnection();if(I&&this.isPeerConnectionDisconnected(I))return this.uplinkNetworkQuality=6,this.uplinkLoss=0,void(this.uplinkRTT=0);let c=a.expectAudPkg+a.expectVidPkg,u=a.recvAudPkg+a.recvVidPkg,d=c-u;c===0&&u===0||(this.uplinkLoss=d<=0?0:Math.round(d/c*100),this.uplinkRTT=a.rtt,this.uplinkNetworkQuality=this.getNetworkQuality(this.uplinkLoss,this.uplinkRTT))}handleDownlinkNetworkQuality(){return DA(this,null,function*(){if(this._room.remotePublishedUserMap.size===0)return void(this.downlinkNetworkQuality=0);let e=[...this._room.remotePublishedUserMap.values()],o=new Set,n=e.filter(u=>{let d=u.getPeerConnection();return!(!d||o.has(d))&&(o.add(d),!0)}),a=n.filter(u=>{var d;return((d=u.getPeerConnection())==null?void 0:d.connectionState)===hi.CONNECTED});if(n.filter(u=>this.isPeerConnectionDisconnected(u.getPeerConnection())).length===e.length)return void(this.downlinkNetworkQuality=6);for(let u=0;u{this.isPeerConnectionDisconnected(u)&&(this._downlinkPrevStatMap.delete(u),this._downlinkLossAndRTTMap.delete(u))}),this._downlinkLossAndRTTMap.size===0)return this.downlinkRTT=0,this.downlinkLoss=0,void(this.downlinkNetworkQuality=0);let{rtt:I,loss:c}=this.getAverageLossAndRTT([...this._downlinkLossAndRTTMap.values()]);this.downlinkRTT=I,this.downlinkLoss=c,this.downlinkNetworkQuality=this.getNetworkQuality(c,I)})}getStat(e){return DA(this,null,function*(){let o={rtt:0,totalPacketsLost:0,totalPacketsReceived:0};if(!e||!Ph())return o;let n=e.getReceivers();try{for(let a=0;a{I.type==="candidate-pair"&&hr(I.currentRoundTripTime)&&(o.rtt=Math.round(1e3*I.currentRoundTripTime)),I.type==="inbound-rtp"&&(I.mediaType===fA.AUDIO||I.mediaType===fA.VIDEO)&&(o.totalPacketsLost+=I.packetsLost,o.totalPacketsReceived+=I.packetsReceived)});return o.rtt===0&&(o.rtt=this.uplinkRTT),o}catch{return o}})}getAverageLossAndRTT(e){let o={rtt:0,loss:0};return Array.isArray(e)&&e.length>0&&(e.forEach(n=>{o.rtt+=n.rtt,o.loss+=n.loss}),Object.keys(o).forEach(n=>{o[n]=Math.round(o[n]/e.length)})),o}getNetworkQuality(e,o){return e>50||o>500?5:e>30||o>350?4:e>20||o>200?3:e>10||o>100?2:e>=0||o>=0?1:0}handleSignalConnectionStateChange(e){e.state==="DISCONNECTED"?(this.uplinkRTT=0,this.uplinkLoss=0,this.uplinkNetworkQuality=6):e.state==="CONNECTED"&&this.uplinkNetworkQuality===6&&(this.uplinkNetworkQuality=1)}handleUplinkConnectionStateChange(e){let{state:o}=e;o==="DISCONNECTED"?(this.uplinkLoss=0,this.uplinkRTT=0,this.uplinkNetworkQuality=6):o==="CONNECTED"&&this.uplinkNetworkQuality===6&&(this.uplinkNetworkQuality=5)}isPeerConnectionDisconnected(e){return!(!e||e.connectionState!==hi.DISCONNECTED&&e.connectionState!==hi.FAILED&&e.connectionState!==hi.CLOSED)}setUplinkConnection(e){this._room.uplinkConnection=e,this._room.uplinkConnection?this._room.uplinkConnection.on("connection-state-changed",this.handleUplinkConnectionStateChange.bind(this)):(this.uplinkNetworkQuality=0,this.uplinkRTT=0,this.uplinkLoss=0)}start(){this._interval===-1?(this._log.debug("start network quality calculating"),this._interval=nn.run("ric",()=>{var e;this.handleDownlinkNetworkQuality();let o=[...this._downlinkLossAndRTTMap.values()];S.emit(K.NETWORK_QUALITY,{room:this._room,uplink:{rtt:this.uplinkRTT,loss:this.uplinkLoss},downlinks:o});let n=(e=this._room.scheduleResult.config)==null?void 0:e.pingDomainInfo,a={uplinkNetworkQuality:this.uplinkNetworkQuality,downlinkNetworkQuality:this.downlinkNetworkQuality,uplinkRTT:this.uplinkRTT,uplinkLoss:this.uplinkLoss,downlinkRTT:this.downlinkRTT,downlinkLoss:this.downlinkLoss};n&&(a=fi(bt({},a),{pingResults:this.uplinkRTT>n.rttThreshold||this.downlinkRTT>n.rttThreshold?this.pingResults:{}})),this.emit(ew.EVENT_NETWORK_QUALITY,a);let I=Date.now();if(n&&(this.uplinkRTT>n.rttThreshold||this.downlinkRTT>n.rttThreshold)&&I-ew.lastPingTime>1e3*n.interval){ew.lastPingTime=Date.now();let c=n.domain.map(u=>CtA(u).then(d=>({domain:u,cost:d.totalCost})));Promise.all(c).then(u=>{this.pingResults.isPoorNetwork=u.some(d=>d.cost>700),this.pingResults.timestamp=I,this.pingResults.data=u,u.forEach(d=>{ct.addSuccessEvent({key:521718,cost:d.cost})}),this._log.warn("All ping results: ".concat(JSON.stringify(u)))}).catch(u=>{this._log.warn("Error during pinging domains: ".concat(u))})}},{delay:2e3})):this._log.info("network quality calculating is already started")}hadRecentBadUplink(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:2;return this._uplinkQualityHistory.some(o=>o>e)}hadRecentBadDownlink(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:2;return this._downlinkQualityHistory.some(o=>o>e)}stop(){this._log.debug("stopped"),this._interval!==-1&&(nn.clearTask(this._interval),this._interval=-1),this._downlinkLossAndRTTMap.clear(),this._downlinkPrevStatMap.clear()}updateDelay(e){let{tinyIdToUserIdMap:o}=this._room;e.forEach(n=>{let{srcTinyId:a,videoDelay:I,audioDelay:c}=n,u=o.get(a);if(u){let d=this._room.remotePublishedUserMap.get(u);d?.setDelay({videoDelay:I,audioDelay:c})}})}};G(qx,"HISTORY_SIZE",10),G(qx,"EVENT_NETWORK_QUALITY","0"),G(qx,"lastPingTime",0);var iz=qx,oz=class{constructor(A){G(this,"_frameWorkType"),G(this,"_component"),G(this,"_language"),G(this,"connectionType"),G(this,"_room"),G(this,"_signalInfo",{tinyId:void 0,clientIp:"",signalIp:"",relayIp:"",relayInnerIp:"",relayPort:0,endReportExtend:void 0,reportToken:void 0}),G(this,"_keyPrefix"),G(this,"_log"),G(this,"_intervalId"),G(this,"_firstPublishedUserList"),G(this,"_networkQuality"),G(this,"_basicInfo"),G(this,"_pathJoinRoom"),G(this,"_pathLeaveRoom"),G(this,"_pathMainVideoMap"),G(this,"_pathMainAudioMap"),G(this,"_pathAuxiliaryMap"),G(this,"_remoteStreamStatMap"),G(this,"_localStreamStat"),G(this,"_eventMap",new Map),G(this,"_captureCostSum",0),G(this,"_captureCostCount",0),G(this,"isDestroyed",!1),this._frameWorkType=A.frameWorkType||30,this._component=A.component||0,this.connectionType=A.connectionType||1,this._language=A.language||0,this._room=A.room,this._keyPrefix="key_point",this._log=nA.createLogger({parent:this._room.getLogger(),id:"kpm",userId:this._room.userId,sdkAppId:this._room.sdkAppId}),Object.getOwnPropertyNames(this.__proto__).forEach(e=>{e.startsWith("handle")&&$n(this[e])&&(this[e]=function(o){let{fn:n,context:a}=o;return function(){try{for(var I=arguments.length,c=new Array(I),u=0;unA.error("".concat(n.name,"() error observed ").concat(R))):d}catch(d){nA.error("".concat(n.name,"() error observed ").concat(d))}}}({fn:this[e],context:this}))}),this.initData(),this.installEvents()}initData(){this._firstPublishedUserList=[],this._networkQuality={totalUplinkRTT:0,totalUplinkLoss:0,count:0,totalDownlinkRTTAndLossMap:new Map},this._basicInfo={string_sdk_version:il,uint32_os_type:15,string_device_name:"",string_http_user_agent:navigator.userAgent,string_os_version:"",uint32_avg_rtt:0,uint32_avg_up_loss:0,uint32_scene:this._room.scene==="live"?1:0,uint32_joining_duration:0,uint32_networkType:0,uint32_framework:this._frameWorkType,uint32_component:this._component,uint32_connection_type:this.connectionType,uint32_caller_coding_language:this._language,string_domain:location.hostname},this._pathJoinRoom={uint64_start_time:0,uint64_send_request_acc_ip_cmd_start_time:0,uint64_send_request_acc_ip_cmd_end_time:0,uint64_send_request_enter_room_cmd_start_time:0,uint64_send_request_enter_room_cmd_end_time:0,uint64_send_first_video_frame_time:0,uint64_recv_userlist_time:0,uint64_end_time:0,int32_send_request_acc_ip_cmd_ret:0,int32_send_request_enter_room_cmd_ret:0,int32_end_ret:0},this._pathLeaveRoom={uint64_start_time:0,uint64_send_request_exit_room_cmd_start_time:0,uint64_send_request_exit_room_cmd_end_time:0,uint64_end_time:0,int32_send_request_exit_room_cmd_ret:0,int32_end_ret:0},this._localStreamStat={totalVideoBitrate:0,totalVideoFPS:0,totalVideoHeight:0,totalVideoWidth:0,totalAudioLevel:0,videoCount:0,audioLevelCount:0,publishStartTime:0,statsToReport:{uint32_audio_capture_db:0,uint32_video_big_capture_fps:0,uint32_video_big_bitrate:0,uint32_video_big_resolution:0,uint32_audio_capture_thread_health_zero_cnt:0,uint32_after3a_silence_duration:0}},this._pathMainVideoMap=new Map,this._pathMainAudioMap=new Map,this._pathAuxiliaryMap=new Map,this._remoteStreamStatMap=new Map,nm().then(()=>{this._basicInfo.string_os_version=bQ(),this._basicInfo.string_device_name=Qu()||this._basicInfo.string_os_version})}addEvent(A,e){return this._eventMap.set(A,e),S.on(A,e),this}installEvents(){this.handleUnload=this.handleUnload.bind(this),window.addEventListener("pagehide",this.handleUnload),this._room.once("banned",()=>this.handleLeaveSuccess({room:this._room,roomId:this._room.roomId})),this.addEvent(K.JOIN_START,this.handleJoinStart).addEvent(K.JOIN_SCHEDULE_SUCCESS,this.handleJoinScheduleSuccess).addEvent(K.JOIN_SIGNAL_CONNECTION_START,this.handleSignalConnectionStart).addEvent(K.JOIN_SIGNAL_CONNECTION_END,this.handleSignalConnectionEnd).addEvent(K.JOIN_SEND_CMD,this.handleJoinSendCMD).addEvent(K.JOIN_RECEIVED_CMD_RES,this.handleJoinReceivedCMDResponce).addEvent(K.JOIN_SUCCESS,this.handleJoinSuccess).addEvent(K.JOIN_FAILED,this.handleJoinFailed).addEvent(K.LEAVE_START,this.handleLeaveStart).addEvent(K.LEAVE_SUCCESS,this.handleLeaveSuccess).addEvent(K.LEAVE_SEND_CMD,this.handleLeaveSendCMD).addEvent(K.LOCAL_TRACK_CAPTURE_START,this.handleTrackCaptureStart).addEvent(K.LOCAL_TRACK_CAPTURE_SUCCESS,this.handleTrackCaptureSuccess).addEvent(K.LOCAL_TRACK_CAPTURE_FAILED,this.handleTrackCaptureFailed).addEvent(K.PUBLISH_START,this.handlePublishStart).addEvent(K.SEND_FIRST_VIDEO_FRAME,this.handleSendFirstVideoFrame).addEvent(K.SUBSCRIBE_START,this.handleSubscribeStart).addEvent(K.SUBSCRIBE_SUCCESS,this.handleSubscribed).addEvent(K.PLAY_TRACK_START,this.handlePlayStart).addEvent(K.VIDEO_LOADED_DATA,this.handleVideoLoadedData).addEvent(K.PLAYER_STATE_CHANGED,A=>{let{track:e,state:o,type:n}=A;!e.isRemote||!this.hitTest(e.room)||o==="PLAYING"&&(n===fA.AUDIO?this.handleAudioPlaying(e):this.handleVideoPlaying(e))}).addEvent(K.SWITCH_ROOM_START,this.handleSwitchRoomStart).addEvent(K.SWITCH_ROOM_SUCCESS,this.handleSwitchRoomSuccess).addEvent(K.SWITCH_ROOM_FAILED,this.handleSwitchRoomFailed).addEvent(K.NETWORK_QUALITY,this.handleNetworkQuality).addEvent(K.HEARTBEAT_REPORT,this.handleHeartbeatStats).addEvent(K.RECEIVED_PUBLISHED_USER_LIST,this.handleReceivedPublishUserList).addEvent(K.REMOTE_PUBLISH_STATE_CHANGED,A=>{let{room:e,prevMuteState:o,muteState:n}=A;if(!this.hitTest(e))return;let a=o.hasAudio||o.hasVideo||o.hasSmall,I=o.hasAuxiliary,c=n.hasAudio||n.hasVideo||n.hasSmall,u=n.hasAuxiliary;!a&&c&&this.handleRemoteStreamAdded(n.userId,"main"),!I&&u&&this.handleRemoteStreamAdded(n.userId,"auxiliary")}).addEvent(K.SINGLE_CONNECTION_STAT,A=>{let{room:e,stat:o}=A;this.hitTest(e)&&(this._pathJoinRoom.int32_ice_cost=o.ice,this._pathJoinRoom.int32_dtls_cost=o.dtls,this._pathJoinRoom.int32_peer_connection_cost=o.peerConnection)})}uninstallEvents(){window.removeEventListener("pagehide",this.handleUnload),this._eventMap.forEach((A,e)=>S.off(e,A)),this._eventMap.clear()}destroy(){this.uninstallEvents(),nn.clearTask(this._intervalId),this._pathJoinRoom.uint64_start_time===0&&(this._room=null),this.isDestroyed=!0}handleUnload(){this._room.isJoined&&this.handleLeaveSuccess({room:this._room,roomId:this._room.roomId})}handleJoinStart(A){this.hitTest(A.room)&&(this._pathJoinRoom.uint64_start_time===0&&(this._pathJoinRoom.uint64_start_time=Date.now()),A.params&&(Ee(A.params.frameWorkType)||(this._frameWorkType=A.params.frameWorkType,this._basicInfo.uint32_framework=this._frameWorkType),Ee(A.params.component)||(this._component=A.params.component,this._basicInfo.uint32_component=this._component),Ee(A.params.language)||(this._language=A.params.language,this._basicInfo.uint32_caller_coding_language=this._language)))}handleJoinScheduleSuccess(A){let{room:e,detailCost:o}=A;if(this.hitTest(e)&&o){let{totalCost:n,local:a,dns:I,tcp:c,tls:u,request:d,response:R}=o;this._pathJoinRoom.int32_schedule_cost=n,this._pathJoinRoom.int32_schedule_local=a,this._pathJoinRoom.int32_schedule_dns=I,this._pathJoinRoom.int32_schedule_tcp=c,this._pathJoinRoom.int32_schedule_tls=u,this._pathJoinRoom.int32_schedule_request=d,this._pathJoinRoom.int32_schedule_response=R}}handleSignalConnectionStart(A){let{room:e}=A;this.hitTest(e)&&this._pathJoinRoom.uint64_send_request_acc_ip_cmd_start_time===0&&(this._pathJoinRoom.uint64_send_request_acc_ip_cmd_start_time=Date.now())}handleSignalConnectionEnd(A){let{room:e,error:o}=A;this.hitTest(e)&&this._pathJoinRoom.uint64_send_request_acc_ip_cmd_end_time===0&&(this._pathJoinRoom.uint64_send_request_acc_ip_cmd_end_time=Date.now(),o&&(this._pathJoinRoom.int32_send_request_acc_ip_cmd_ret=o instanceof Ct?Number(o.getExtraCode()||o.getCode()):Ge.UNKNOWN,this._pathJoinRoom.int32_end_ret=this._pathJoinRoom.int32_send_request_acc_ip_cmd_ret))}handleJoinSendCMD(A){this.hitTest(A.room)&&this._pathJoinRoom.uint64_send_request_enter_room_cmd_start_time===0&&(this._pathJoinRoom.uint64_send_request_enter_room_cmd_start_time=Date.now())}handleJoinReceivedCMDResponce(A){this.hitTest(A.room)&&this._pathJoinRoom.uint64_send_request_enter_room_cmd_end_time===0&&(this._pathJoinRoom.uint64_send_request_enter_room_cmd_end_time=Date.now(),this._pathJoinRoom.int32_send_request_enter_room_cmd_ret=A.code,A.code!==0&&(this._pathJoinRoom.int32_end_ret=this._pathJoinRoom.int32_send_request_enter_room_cmd_ret))}handleJoinSuccess(A){this.hitTest(A.room)&&this._pathJoinRoom.uint64_end_time===0&&(this._pathJoinRoom.uint64_end_time=Date.now(),this._pathJoinRoom.int32_end_ret=0,this._signalInfo=A.room.getSignalInfo())}handleJoinFailed(A){let{room:e,error:o}=A;this.hitTest(e)&&(this._pathJoinRoom.uint64_end_time=Date.now(),this._pathJoinRoom.int32_end_ret===0&&(this._pathJoinRoom.int32_end_ret=o.code||this._pathJoinRoom.int32_send_request_enter_room_cmd_ret||this._pathJoinRoom.int32_send_request_acc_ip_cmd_ret),setTimeout(()=>{this.report()}))}handleReceivedPublishUserList(A){this.hitTest(A.room)&&this._pathJoinRoom.uint64_recv_userlist_time===0&&(this._pathJoinRoom.uint64_recv_userlist_time=Date.now(),this._firstPublishedUserList=A.publishedUserList||[])}handleSendFirstVideoFrame(A){let{room:e}=A;this.hitTest(e)&&this._pathJoinRoom.uint64_send_first_video_frame_time===0&&this._pathJoinRoom.uint64_start_time!==0&&(this._pathJoinRoom.uint64_send_first_video_frame_time=Date.now())}handleLeaveStart(A){this.hitTest(A.room)&&(this._pathLeaveRoom.uint64_start_time=Date.now())}handleLeaveSuccess(A){var e;if(this.hitTest(A.room)&&this._pathLeaveRoom.uint64_end_time===0){if(this._pathLeaveRoom.uint64_end_time=Date.now(),this._pathJoinRoom.uint64_end_time!==0){this._basicInfo.uint32_joining_duration=this._pathLeaveRoom.uint64_end_time-this._pathJoinRoom.uint64_end_time;let o=(e=this._room.audioManager.localAudioTrack)==null?void 0:e.after3aSilenceStartTime;o&&(this._localStreamStat.statsToReport.uint32_after3a_silence_duration=ki()-o)}else this._log.warn("pathJoinRoom endTime is 0");this.report()}}handleLeaveSendCMD(A){this.hitTest(A.room)&&(this._pathLeaveRoom.uint64_send_request_exit_room_cmd_start_time=Date.now(),this._pathLeaveRoom.uint64_send_request_exit_room_cmd_end_time=Date.now())}handleSwitchRoomStart(A){if(this.hitTest(A.room)){let e=Date.now();this.report().then(()=>{this._pathJoinRoom.uint64_start_time=e,this._pathJoinRoom.uint64_send_request_enter_room_cmd_start_time=e})}}handleSwitchRoomSuccess(A){let{room:e}=A;if(this.hitTest(e)&&this._pathJoinRoom.uint64_end_time===0){let o=Date.now();this._pathJoinRoom.uint64_send_request_enter_room_cmd_end_time=o,this._pathJoinRoom.uint64_end_time=o,this._pathJoinRoom.int32_end_ret}}handleSwitchRoomFailed(A){let{room:e,error:o}=A;if(this.hitTest(e)){let n=Date.now();this._pathJoinRoom.uint64_send_request_enter_room_cmd_end_time=n,this._pathJoinRoom.uint64_end_time=n,o&&(this._pathJoinRoom.int32_end_ret=o instanceof Ct?Number(o.getExtraCode()||o.getCode()):Ge.UNKNOWN)}}handleRemoteStreamAdded(A,e){var o;let n="".concat(A,"_").concat(e);if(!this._remoteStreamStatMap.has(n)){let a={userId:A,totalVideoFPS:0,totalVideoBitrate:0,totalAudioLevel:0,totalAudioBitrate:0,totalLoss:0,audioCount:0,audioLevelCount:0,videoCount:0,networkQualityCount:0,streamAddedTime:Date.now(),subscribeStartTime:0,subscribedTime:0,playStreamTime:0,statsToReport:fi(bt({},BtA),{msg_user_info:new cK({userId:A,tinyId:(o=this._room.remotePublishedUserMap.get(A))==null?void 0:o.tinyId,role:20})})};a.statsToReport.uint32_stream_type=e==="main"?2:7,this._remoteStreamStatMap.set(n,a)}}handleSubscribeStart(A){let{room:e,remotePublishedUser:o,streamType:n,subscribeState:a}=A;if(!this.hitTest(e))return;let{userId:I,tinyId:c,role:u}=o,d=new cK({userId:I,tinyId:c,role:u==="anchor"?20:21}),R=Date.now(),k="".concat(I,"_").concat(n),_=this._remoteStreamStatMap.get(k);_&&_.subscribeStartTime===0&&(_.subscribeStartTime=R),n==="main"?(o.muteState.hasVideo&&(a.video||a.smallVideo)&&!this._pathMainVideoMap.has(k)&&this._pathMainVideoMap.set(k,{statsToReport:{msg_user_info:d,uint64_start_enter_time:this._pathJoinRoom.uint64_start_time,uint64_render_first_frame_time:0,uint64_combine_first_frame_time:0},userId:I,sendSubscribeCMDTime:R}),o.muteState.hasAudio&&a.audio&&!this._pathMainAudioMap.has(k)&&this._pathMainAudioMap.set(k,{statsToReport:{msg_user_info:d,uint64_start_enter_time:this._pathJoinRoom.uint64_start_time,uint64_play_first_frame_time:0},userId:I,sendSubscribeCMDTime:R})):o.muteState.hasAuxiliary&&a.auxiliary&&!this._pathAuxiliaryMap.has(k)&&this._pathAuxiliaryMap.set(k,{sendSubscribeCMDTime:R})}handleSubscribed(A){let{room:e,remotePublishedUser:o,streamType:n}=A;if(this.hitTest(e)){let a="".concat(o.userId,"_").concat(n),I=this._remoteStreamStatMap.get(a);I&&I.subscribedTime===0&&(I.subscribedTime=Date.now())}}handlePlayStart(A){let{track:e}=A;if(!e.isRemote||!this.hitTest(e.room))return;let o="".concat(e.userId,"_").concat(e.streamType),n=this._remoteStreamStatMap.get(o);n?.playStreamTime===0&&(n.playStreamTime=Date.now())}handleVideoLoadedData(A){let{track:e}=A;if(!e.isRemote||!this.hitTest(e.room))return;let o="".concat(e.userId,"_").concat(e.streamType),n=this._pathMainVideoMap.get(o);n&&n.statsToReport.uint64_combine_first_frame_time===0&&(n.statsToReport.uint64_combine_first_frame_time=Date.now())}handleVideoPlaying(A){let e="".concat(A.userId,"_").concat(A.streamType),o=Date.now(),n=this._pathMainVideoMap.get(e),a=this._remoteStreamStatMap.get(e);if(a){let{statsToReport:I}=a;if(I.uint32_video_render_first||A.streamType!=="main"?this.hasAuxFlag(A.userId):this.hasVideoFlag(A.userId)){let c=o-this._pathJoinRoom.uint64_start_time;I.uint32_video_render_first=c,ct.addNumber({key:516820,value:c})}}n?.statsToReport.uint64_render_first_frame_time===0&&(n.statsToReport.uint64_render_first_frame_time=o)}handleAudioPlaying(A){let e="".concat(A.userId,"_").concat(A.streamType),o=this._pathMainAudioMap.get(e);o&&o.statsToReport.uint64_play_first_frame_time===0&&(o.statsToReport.uint64_play_first_frame_time=Date.now())}handleNetworkQuality(A){this.hitTest(A.room)&&(this._networkQuality.totalUplinkLoss+=A.uplink.loss,this._networkQuality.totalUplinkRTT+=A.uplink.rtt,this._networkQuality.count++,A.downlinks.forEach(e=>{let{rtt:o,loss:n,userId:a,videoDelay:I,audioDelay:c}=e,u=this._networkQuality.totalDownlinkRTTAndLossMap.get(a);if(u)u.totalRTT+=o,u.totalLoss+=n,I&&(u.totalVideoDelay=(u.totalVideoDelay||0)+I,u.videoDelayCount=(u.videoDelayCount||0)+1),c&&(u.totalAudioDelay=(u.totalAudioDelay||0)+c,u.audioDelayCount=(u.audioDelayCount||0)+1),u.count++;else{let d,R,k,_;I&&(R=I,k=1),c&&(d=c,_=1),this._networkQuality.totalDownlinkRTTAndLossMap.set(a,{totalRTT:o,totalLoss:n,count:1,totalAudioDelay:d,totalVideoDelay:R,audioDelayCount:_,videoDelayCount:k})}}))}handleHeartbeatStats(A){var e;if(this.hitTest(A.room)){let{msg_device_info:o,msg_up_stream_info:n,msg_down_stream_info:a}=A.report;if(n.msg_video_status[0]){let{uint32_video_codec_bitrate:I,uint32_video_enc_fps:c,uint32_video_width:u,uint32_video_height:d}=n.msg_video_status[0];this._localStreamStat.totalVideoBitrate+=I,this._localStreamStat.totalVideoFPS+=c,this._localStreamStat.totalVideoWidth+=u,this._localStreamStat.totalVideoHeight+=d,this._localStreamStat.videoCount++}if(n.msg_audio_status){let{uint32_audio_level:I}=n.msg_audio_status;Math.floor(I/iE*100)>0&&(this._localStreamStat.totalAudioLevel+=I/iE,this._localStreamStat.audioLevelCount++)}a.forEach(I=>{let{msg_user_info:c,msg_audio_status:u,msg_video_status:d}=I,R=c.str_identifier,k=this._room.remotePublishedUserMap.get(R);if(d.forEach(_=>{let Z=_.uint32_video_stream_type===2,iA=_.uint32_video_stream_type===7,cA="".concat(R,"_").concat(Z?"main":"auxiliary"),TA=this._remoteStreamStatMap.get(cA);if(TA&&(Z&&k!=null&&k.remoteVideoTrack.isSubscribed||iA&&k!=null&&k.remoteAuxiliaryTrack)){TA.totalVideoFPS+=_.uint32_video_receive_fps,TA.totalVideoBitrate+=_.uint32_video_codec_bitrate,TA.videoCount++,TA.statsToReport.uint32_video_width===0&&(TA.statsToReport.uint32_video_width=_.uint32_video_width),TA.statsToReport.uint32_video_height===0&&(TA.statsToReport.uint32_video_height=_.uint32_video_height);let JA=Z?k.remoteVideoTrack:k.remoteAuxiliaryTrack;JA.stat.jitterBufferDelay&&(TA.videoJitterBufferDelay=JA.stat.jitterBufferDelay),JA.stat.framesReceived&&(TA.statsToReport.uint32_video_consume_render_rate=Math.floor(JA.stat.framesDecoded/JA.stat.framesReceived*Rf(10,6)))}}),!zR(u)){let _="".concat(R,"_main"),Z=this._remoteStreamStatMap.get(_);this._remoteStreamStatMap.has(_)&&Z&&k!=null&&k.remoteAudioTrack.isSubscribed&&(Z.totalAudioBitrate+=u.uint32_audio_codec_bitrate,Z.audioCount++,k.remoteAudioTrack.stat.jitterBufferDelay&&(Z.audioJitterBufferDelay=k.remoteAudioTrack.stat.jitterBufferDelay),Math.floor(u.uint32_audio_level/iE*100)>0&&(Z.totalAudioLevel+=u.uint32_audio_level/iE,Z.audioLevelCount++),u.uint32_audio_block_time&&(Z.statsToReport.uint32_audio_block_time+=u.uint32_audio_block_time))}}),o.uint32_audio_capture_cost&&(this._captureCostSum+=o.uint32_audio_capture_cost,this._captureCostCount+=1,this._captureCostCount>=100&&(this._basicInfo.uint32_audio_capture_cost=Math.floor(this._captureCostSum/this._captureCostCount),this._captureCostSum=0,this._captureCostCount=0)),o.uint32_audio_capture_cost===0&&((e=this._room.audioManager.localAudioTrack)==null?void 0:e.muted)===!1&&(this._localStreamStat.statsToReport.uint32_audio_capture_thread_health_zero_cnt+=1)}}handlePublishStart(A){let{room:e}=A;this.hitTest(e)&&this._localStreamStat.publishStartTime===0&&(this._localStreamStat.publishStartTime=Date.now())}handleTrackCaptureStart(A){let{track:e}=A;e.mediaType===1&&!this._pathJoinRoom.uint64_init_audio_start_time&&(this._pathJoinRoom.uint64_init_audio_start_time=Date.now()),e.mediaType===4&&!this._pathJoinRoom.uint64_init_camera_start_time&&(this._pathJoinRoom.uint64_init_camera_start_time=Date.now())}handleTrackCaptureSuccess(A){let{track:e}=A;e.mediaType===1&&!this._pathJoinRoom.uint64_init_audio_end_time&&(this._pathJoinRoom.int32_init_audio_ret=0,this._pathJoinRoom.uint64_init_audio_end_time=Date.now()),e.mediaType===4&&!this._pathJoinRoom.uint64_init_camera_end_time&&(this._pathJoinRoom.int32_init_camera_ret=0,this._pathJoinRoom.uint64_init_camera_end_time=Date.now())}handleTrackCaptureFailed(A){let{track:e,error:o}=A,n={NotFoundError:1,NotAllowedError:2,NotReadableError:3,OverConstrainedError:4,AbortError:5,InvalidStateError:6,SecurityError:7,TypeError:8}[o.name]||(o instanceof Ct?o.getExtraCode()||o.getCode():Ge.UNKNOWN);e.mediaType===1&&!this._pathJoinRoom.uint64_init_audio_end_time&&(this._pathJoinRoom.int32_init_audio_ret=n,this._pathJoinRoom.uint64_init_audio_end_time=Date.now()),e.mediaType===4&&!this._pathJoinRoom.uint64_init_camera_end_time&&(this._pathJoinRoom.int32_init_camera_ret=n,this._pathJoinRoom.uint64_init_camera_end_time=Date.now())}hasVideoFlag(A){return this._firstPublishedUserList.findIndex(e=>e.userId===A&&e.flag&Nf)>=0}hasAudioFlag(A){return this._firstPublishedUserList.findIndex(e=>e.userId===A&&e.flag&Gf)>=0}hasAuxFlag(A){return this._firstPublishedUserList.findIndex(e=>e.userId===A&&e.flag&Tf)>=0}hitTest(A){return A===this._room}prepareReport(){if(this._captureCostCount>0&&!this._basicInfo.uint32_audio_capture_cost&&(this._basicInfo.uint32_audio_capture_cost=Math.floor(this._captureCostSum/this._captureCostCount),this._captureCostSum=0,this._captureCostCount=0),this._networkQuality.count>0&&(this._basicInfo.uint32_avg_rtt=Math.floor(this._networkQuality.totalUplinkRTT/this._networkQuality.count),this._basicInfo.uint32_avg_up_loss=Math.floor(this._networkQuality.totalUplinkLoss/this._networkQuality.count)),this._localStreamStat.videoCount>0){this._localStreamStat.statsToReport.uint32_video_big_capture_fps=Math.floor(this._localStreamStat.totalVideoFPS/this._localStreamStat.videoCount),this._localStreamStat.statsToReport.uint32_video_big_bitrate=Math.floor(this._localStreamStat.totalVideoBitrate/this._localStreamStat.videoCount);let A=Math.floor(this._localStreamStat.totalVideoWidth/this._localStreamStat.videoCount),e=Math.floor(this._localStreamStat.totalVideoHeight/this._localStreamStat.videoCount);this._localStreamStat.statsToReport.uint32_video_big_resolution=A<<16|e}this._localStreamStat.audioLevelCount>0&&(this._localStreamStat.statsToReport.uint32_audio_capture_db=Math.floor(this._localStreamStat.totalAudioLevel/this._localStreamStat.audioLevelCount*100)),this._remoteStreamStatMap.forEach((A,e)=>{let{userId:o}=A,n=this._networkQuality.totalDownlinkRTTAndLossMap.get(o);if(n){let{totalLoss:R,count:k,audioDelayCount:_,videoDelayCount:Z,totalAudioDelay:iA,totalVideoDelay:cA}=n;A.statsToReport.uint32_avg_down_loss=Math.floor(R/k),_&&iA&&(A.statsToReport.uint32_audio_network_p2p_delay=Math.floor(iA/_),A.audioJitterBufferDelay&&(A.statsToReport.uint32_p2p_delay=Math.floor(A.statsToReport.uint32_audio_network_p2p_delay+A.audioJitterBufferDelay))),Z&&cA&&(A.statsToReport.uint32_video_network_p2p_delay=Math.floor(cA/Z))}A.videoCount>0&&(A.statsToReport.uint32_video_avg_fps=Math.floor(A.totalVideoFPS/A.videoCount),A.statsToReport.uint32_video_avg_bitrate=Math.floor(A.totalVideoBitrate/A.videoCount)),A.audioCount>0&&(A.statsToReport.uint32_audio_recv_bitrate=A.statsToReport.uint32_audio_bitrate=Math.floor(A.totalAudioBitrate/A.audioCount)),A.audioLevelCount>0&&(A.statsToReport.uint32_audio_play_db=Math.floor(A.totalAudioLevel/A.audioLevelCount*100));let{callDurationCalculator:a}=this._room;a&&(A.statsToReport.uint32_audio_play_time=a.getDuration(e,fA.AUDIO),A.statsToReport.uint32_video_play_time=a.getDuration(e,fA.VIDEO)),A.statsToReport.uint32_video_render_first&&(A.statsToReport.uint32_video_render_first=Math.min(A.statsToReport.uint32_video_render_first,Lm));let{badCaseDetector:I}=this._room,{dataFreeze:c,count:u}=I.getDataFreezeDuration(e),{renderFreeze:d}=I.getRenderFreezeDuration(e);A.statsToReport.uint32_video_block_count=u,A.statsToReport.uint32_video_block_time=Math.min(c,A.statsToReport.uint32_video_play_time),A.statsToReport.uint32_video_external_block_time=Math.min(d,A.statsToReport.uint32_video_play_time),A.statsToReport.uint32_audio_block_time=Math.min(A.statsToReport.uint32_audio_block_time,A.statsToReport.uint32_audio_play_time),I.isBlackStream(e)&&A.statsToReport.uint32_video_avg_fps===0?A.statsToReport.uint32_video_black_screen_subjective=1:A.statsToReport.uint32_video_black_screen_subjective=0}),this._pathMainAudioMap.forEach((A,e)=>{this.hasAudioFlag(A.userId)?A.statsToReport.uint64_play_first_frame_time-A.statsToReport.uint64_start_enter_time>Lm&&(A.statsToReport.uint64_play_first_frame_time=A.statsToReport.uint64_start_enter_time+Lm):this._pathMainAudioMap.delete(e)}),this._pathMainVideoMap.forEach((A,e)=>{this.hasVideoFlag(A.userId)?A.statsToReport.uint64_render_first_frame_time-A.statsToReport.uint64_start_enter_time>Lm&&(A.statsToReport.uint64_render_first_frame_time=A.statsToReport.uint64_start_enter_time+Lm):this._pathMainVideoMap.delete(e)}),this._pathJoinRoom.uint64_end_time-this._pathJoinRoom.uint64_start_time>Lm&&(this._pathJoinRoom.uint64_end_time=this._pathJoinRoom.uint64_start_time+Lm)}getReportData(){this._basicInfo.uint32_networkType=hh();let A={uint32_sdk_app_id:Number(this._room.sdkAppId),msg_user_info:new cK({userId:this._room.userId,tinyId:this._room.tinyId,role:this._room.role==="anchor"?20:21}),msg_basic_info:this._basicInfo,uint32_acc_ip:Jf(this._signalInfo.relayIp),uint32_client_ip:Jf(this._signalInfo.clientIp,!1),uint32_acc_port:this._signalInfo.relayPort||0,uint64_timestamp:Date.now(),uint32_seq:Math.floor(Math.random()*Rf(2,31)),msg_path_enter_room:this._pathJoinRoom,msg_path_exit_room:this._pathLeaveRoom,msg_path_recv_video:[...this._pathMainVideoMap.values()].map(e=>e.statsToReport),msg_quality_statistics:[...this._remoteStreamStatMap.values()].map(e=>e.statsToReport),str_room_name:String(this._room.roomId||0),msg_path_recv_audio:[...this._pathMainAudioMap.values()].map(e=>e.statsToReport),uint32_info_client_ip:Jf(this._signalInfo.clientIp,!1),error_code:[],msg_local_statistics:this._localStreamStat.statsToReport,bytes_report_buf_from_0x1:this._signalInfo.endReportExtend,str_user_sig:this._room.userSig,bytes_report_token:this._signalInfo.reportToken};return $R(A),A}report(){return DA(this,null,function*(){try{this.prepareReport();let A=this.getReportData();yield this.upload(A),this.initData()}catch(A){this._log.warn(A)}finally{this.isDestroyed&&(this._room=null)}})}upload(A){return DA(this,null,function*(){if(A.msg_path_enter_room.uint64_start_time===0)return;let e=Number(this._room.sdkAppId),o=lA.enable?Iu(A,2001,e):yield PN(A),n=o instanceof ArrayBuffer,a="".concat(dh(e,Xg.KEY_POINT),"&gzip=").concat(+n),I=!1;navigator.sendBeacon&&(I=navigator.sendBeacon(a,o));let c=[this.uploadKVStat(ct),this.uploadKVStat(oB)];I||c.push(cu({url:a,body:o,priority:"low"})),yield Promise.all(c)})}setConnectionType(A){this.connectionType=A,this._basicInfo.uint32_connection_type=A}uploadKVStat(A){return DA(this,arguments,function(e){var o=this;let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this._room.sdkAppId;return function*(){var a,I;let c=e.getReportData((a=o._room)==null?void 0:a.userSig,(I=o._signalInfo)==null?void 0:I.reportToken);if(c.stats_count.length===0&&c.stats_distribution.length===0)return;c.msg_sdk_basic_info=fi(bt({},c.msg_sdk_basic_info),{bytes_device_name:o._basicInfo.string_device_name||"",bytes_os_version:o._basicInfo.string_os_version||"",uint32_framework:o._frameWorkType,uint32_network_type:o._basicInfo.uint32_networkType||0}),o._log.debug(c);let u=lA.enable?Iu(c,2003,n):yield PN(c),d=u instanceof ArrayBuffer,R="".concat(dh(+n,Xg.KV_STAT),"&gzip=").concat(+d),k=!1;navigator.sendBeacon&&(k=navigator.sendBeacon(R,u)),k||cu({url:R,body:u})}()})}};vt([nB({settings:{timeout:500,retries:3}})],oz.prototype,"upload");var Lm=5e3,BtA={msg_user_info:null,uint32_video_avg_fps:0,uint32_video_width:0,uint32_video_height:0,uint32_video_avg_bitrate:0,uint32_video_block_time:0,uint32_video_play_time:0,uint32_audio_block_time:0,uint32_audio_play_time:0,uint32_audio_play_db:0,uint32_avg_down_loss:0,uint32_stream_type:0,uint32_video_block_count:0,uint32_audio_block_count:0,uint32_audio_bitrate:0,uint32_video_black_screen_subjective:0,uint32_audio_recv_bitrate:0,uint32_video_external_block_time:0,uint32_video_consume_render_rate:0},cK=class{constructor(A){G(this,"str_identifier"),G(this,"str_tinyid"),G(this,"uint32_role"),this.str_identifier=String(A.userId),this.str_tinyid=String(A.tinyId||0),this.uint32_role=A.role}},utA=oz,rz=class{constructor(){G(this,"_startTime"),G(this,"_endTime"),this._startTime=0,this._endTime=0,this.start()}start(){this._startTime===0&&(this._startTime=ki())}stop(){this._endTime===0&&(this._endTime=ki())}getDuration(){return this._endTime===0?ki()-this._startTime:this._endTime-this._startTime}get startTime(){return this._startTime}get endTime(){return this._endTime}},QtA=class{constructor(A){G(this,"_room",null),G(this,"_durationMap"),G(this,"_eventMap",new Map),this._room=A.room,this._durationMap=new Map,this.installEvents()}installEvents(){this._eventMap.set(K.REMOTE_TRACK_SUBSCRIBED,this.handleSubscribed).set(K.REMOTE_TRACK_UNSUBSCRIBED,this.handleUnsubscribed).set(K.REMOTE_PUBLISH_STATE_CHANGED,A=>{let{room:e,prevMuteState:o,muteState:n}=A;var a;let{userId:I}=n;if(!this.hitTest(e))return;o.hasAudio&&!n.hasAudio&&this.stopDurationItem("".concat(I,"_main"),fA.AUDIO),o.hasVideo&&!n.hasVideo&&this.stopDurationItem("".concat(I,"_main"),fA.VIDEO),o.hasAuxiliary&&!n.hasAuxiliary&&this.stopDurationItem("".concat(I,"_auxiliary"),fA.VIDEO);let c=(a=this._room)==null?void 0:a.remotePublishedUserMap.get(I);c&&(!o.hasAudio&&n.hasAudio&&c.remoteAudioTrack.isSubscribed&&this.addDuractionItem(I,fA.AUDIO,"main"),!o.hasVideo&&n.hasVideo&&c.remoteVideoTrack.isSubscribed&&this.addDuractionItem(I,fA.VIDEO,"main"),!o.hasAuxiliary&&n.hasAuxiliary&&c.remoteAuxiliaryTrack.isSubscribed&&this.addDuractionItem(I,fA.VIDEO,"auxiliary"))}),this._eventMap.forEach((A,e)=>S.on(e,A,this))}uninstallEvents(){this._eventMap.forEach((A,e)=>S.off(e,A,this)),this._eventMap.clear()}handleSubscribed(A){let{track:e}=A;if(!this.hitTest(e.room))return;let{userId:o,streamType:n,kind:a}=e;e.isSubscribed?this.addDuractionItem(o,a,n):this.stopDurationItem("".concat(o,"_").concat(n),a)}handleUnsubscribed(A){let{track:e}=A;this.hitTest(e.room)&&this.stopDurationItem("".concat(e.userId,"_").concat(e.streamType),e.kind)}isRecording(A){return A.findIndex(e=>e.endTime===0)>=0}addDuractionItem(A,e,o){let n="".concat(A,"_").concat(o),a=new rz,I=this._durationMap.get(n);I?this.isRecording(I[e])||I[e].push(a):this._durationMap.set(n,{userId:A,type:o,audio:e===fA.AUDIO?[a]:[],video:e===fA.AUDIO?[]:[a]})}stopDurationItem(A,e){if(this._durationMap.has(A)){let o=this._durationMap.get(A)[e].find(n=>n.endTime===0);o&&o.stop()}}hitTest(A){return this._room===A}getDuration(A,e){return this._durationMap.has(A)?this._durationMap.get(A)[e].reduce((o,n)=>o+n.getDuration(),0):0}getDurationMap(){return this._durationMap}reset(){this._durationMap.clear()}destroy(){this._room=null,this.uninstallEvents()}},dtA=class{constructor(){G(this,"renderFreezeMap",new Map),G(this,"dataFreezeMap",new Map)}get(A,e){let o=this.renderFreezeMap.get(A),n=this.dataFreezeMap.get(A);return e?e==="data"?n:o:(Ma||Yr)&&o&&n&&o.duration>n.duration?o:n}set(A,e,o){o==="data"?this.dataFreezeMap.set(A,e):this.renderFreezeMap.set(A,e)}clear(){this.renderFreezeMap.clear(),this.dataFreezeMap.clear()}},htA=class{constructor(A){G(this,"_room"),G(this,"_renderFreezeMap",new Map),G(this,"_isVideoPlayingEventFiredMap",new Map),G(this,"_dataFreezeMap",new Map),G(this,"_monitorFreezeData",new dtA),G(this,"_eventMap",new Map),G(this,"_videoEncodeFailedCount",0),G(this,"_audioEncodeFailedCount",0),G(this,"_encodeFailedThreshold",3),G(this,"ABNORMAL_TIME_LOWER_LIMIT",3e3),G(this,"ABNORMAL_TIME_UPPER_LIMIT",5e3),G(this,"_videoAbnormalTimestampMap",new Map),G(this,"_remoteVideoAbnormalTimestampMap",new Map),G(this,"_audioAbnormalTimestampMap",new Map),G(this,"eventListenerMap",new Map),this._room=A.room,this.installEvents()}getRenderFreezeMap(){return this._renderFreezeMap}getDataFreezeMap(){return this._dataFreezeMap}installEvents(){this._eventMap.set(K.LEAVE_SUCCESS,A=>{let{room:e}=A;this.hitTest(e)&&this.stop()}).set(K.PLAY_TRACK_START,this.onPlayTrackStart).set(K.UNSUBSCRIBE_SUCCESS,A=>{let{room:e,streamType:o,remotePublishedUser:n}=A;if(!this.hitTest(e))return;let{userId:a}=n,I="".concat(a,"_").concat(o);this.stopDataFreeze({key:I,userId:a,type:o})}).set(K.REMOTE_PUBLISH_STATE_CHANGED,A=>{let{room:e,prevMuteState:o,muteState:n}=A;if(!this.hitTest(e))return;let{userId:a}=n;if(o.hasVideo&&!n.hasVideo){let I="main",c="".concat(n.userId,"_").concat(I);this.stopDataFreeze({key:c,userId:a,type:I})}if(o.hasAuxiliary&&!n.hasAuxiliary){let I="auxiliary",c="".concat(n.userId,"_").concat(I);this.stopDataFreeze({key:c,userId:a,type:I})}}).set(K.PLAYER_STATE_CHANGED,A=>{let{track:e,state:o,reason:n,type:a}=A;if(e.isRemote&&e.room&&this.hitTest(e.room)&&a===fA.VIDEO){if(o==="PLAYING"){let I="".concat(e.userId,"_").concat(e.streamType);this._isVideoPlayingEventFiredMap.set(I,!0)}n===fA.MUTE?this.onVideoTrackMuted(e):n===fA.UNMUTE&&this.onVideoTrackUnmuted(e)}}).set(K.HEARTBEAT_REPORT,this.onHearBeatReport).set(K.REMOTE_VIDEO_PLAY_START,this.onRemoteVideoPlayStart).set(K.REMOTE_VIDEO_PLAY_FINISH,this.onRemoteVideoPlayEnd),this._eventMap.forEach((A,e)=>S.on(e,A,this))}uninstallEvents(){this._eventMap.forEach((A,e)=>S.off(e,A,this)),this._eventMap.clear()}stop(){this._renderFreezeMap.clear(),this._dataFreezeMap.clear(),this._isVideoPlayingEventFiredMap.clear()}onVideoTrackMuted(A){if(!A.isSubscribed)return;let{userId:e,streamType:o}=A,n="".concat(e,"_").concat(o),a=this._dataFreezeMap.get(n),I=new rz;a?a.durationItemList.push(I):this._dataFreezeMap.set(n,{userId:e,type:o,durationItemList:[I],isFreezing(){let c=this.durationItemList[this.durationItemList.length-1];return c&&c.endTime===0}})}onVideoTrackUnmuted(A){if(!A.isSubscribed)return;let{userId:e,streamType:o}=A,n="".concat(e,"_").concat(o);this.stopDataFreeze({key:n,userId:e,type:o})}onHearBeatReport(A){let{room:e,report:o}=A;this.hitTest(e)&&(this.localMediaTrackDetector(o),this.remoteMediaTrackDetector(o))}remoteMediaTrackDetector(A){A.msg_down_stream_info.length>0&&A.msg_down_stream_info.forEach(e=>{var o;if(e.msg_video_status.length===0)return;let n=e.msg_user_info.str_identifier,a=(o=this._room.remotePublishedUserMap.get(n))==null?void 0:o.remoteVideoTrack;e.msg_video_status.forEach(I=>{let c=ki();if(I.uint32_video_codec_bitrate!==void 0&&I.uint32_video_codec_bitrate>0&&I.uint32_video_receive_fps===0&&a!=null&&a.muted)if(this._remoteVideoAbnormalTimestampMap.has("".concat(n,"-decode"))){let u=this._remoteVideoAbnormalTimestampMap.get("".concat(n,"-decode"));u&&c-u>this.ABNORMAL_TIME_LOWER_LIMIT&&c-u=this.ABNORMAL_TIME_UPPER_LIMIT&&(Jo.uploadEvent({userId:this._room.userId,log:"stat-".concat(oa.VIDEO_DECODE_RESUME_DURING_CALL)}),this._remoteVideoAbnormalTimestampMap.delete("".concat(n,"-decode")))}if(I.uint32_video_codec_bitrate!==void 0&&I.uint32_video_codec_bitrate>5e5&&I.uint32_video_dec_fps!==void 0&&I.uint32_video_dec_fps<=5)if(this._remoteVideoAbnormalTimestampMap.has("".concat(n,"-hardware"))){let u=this._remoteVideoAbnormalTimestampMap.get("".concat(n,"-hardware"));if(u&&c-u>this.ABNORMAL_TIME_LOWER_LIMIT/2&&c-u<2*this.ABNORMAL_TIME_UPPER_LIMIT){Jo.uploadEvent({userId:this._room.userId,log:"stat-".concat(oa.VIDEO_HARDWARE_DECODE_FAILED)});let d=this._room.remotePublishedUserMap.get(n);if(d){let R=I.uint32_video_stream_type===2?d.remoteVideoTrack:d.remoteAuxiliaryTrack;R&&(R.log.warn("decode failed during call"),R.emit("decode-failed-during-call"))}}}else this._remoteVideoAbnormalTimestampMap.set("".concat(n,"-hardware"),c);else{let u=this._remoteVideoAbnormalTimestampMap.get("".concat(n,"-hardware"));u&&c-u>=2*this.ABNORMAL_TIME_UPPER_LIMIT&&(Jo.uploadEvent({userId:this._room.userId,log:"stat-".concat(oa.VIDEO_HARDWARE_DECODE_RESUME)}),this._remoteVideoAbnormalTimestampMap.delete("".concat(n,"-hardware")))}})})}localMediaTrackDetector(A){if(A.msg_up_stream_info.msg_video_status){let e=A.msg_up_stream_info.msg_video_status,o=Array.from(this._room.localTracks).find(a=>a.kind==="video"&&!a.isScreen),n=o?.stat.bytesSent||0;if(o?.isMediaTrackActive===!1||n<=0||o!=null&&o.isUseCustomSource)return;e.forEach(a=>{let I=ki();if(a.uint32_video_stream_type===2)if(a.uint32_video_capture_fps!==0&&a.uint32_video_codec_bitrate===0&&a.uint32_video_enc_fps===0&&o!=null&&o.isPublished)if(this._videoAbnormalTimestampMap.has("local-encode")){let c=this._videoAbnormalTimestampMap.get("local-encode");c&&I-c>this.ABNORMAL_TIME_LOWER_LIMIT&&I-c=this.ABNORMAL_TIME_UPPER_LIMIT&&Jo.uploadEvent({userId:this._room.userId,log:"stat-".concat(oa.VIDEO_ENCODE_RESUME_DURING_CALL)}),this._videoAbnormalTimestampMap.delete("local-encode")}})}if(A.msg_up_stream_info.msg_audio_status){let e=A.msg_up_stream_info.msg_audio_status,o=Array.from(this._room.localTracks).find(I=>I.kind==="audio"),n=o?.stat.bytesSent||0;if(o?.isMediaTrackActive===!1||n<=0||o!=null&&o.isUseCustomSource)return;let a=ki();if(e.uint32_audio_codec_bitrate===0&&o!=null&&o.isPublished)if(this._audioAbnormalTimestampMap.has("local-encode")){let I=this._audioAbnormalTimestampMap.get("local-encode");I&&a-I>this.ABNORMAL_TIME_LOWER_LIMIT&&a-I=this.ABNORMAL_TIME_UPPER_LIMIT&&Jo.uploadEvent({userId:this._room.userId,log:"stat-".concat(oa.AUDIO_ENCODE_RESUME_DURING_CALL)}),this._audioAbnormalTimestampMap.delete("local-encode")}}}stopDataFreeze(A){let{key:e,userId:o,type:n}=A,a=this._dataFreezeMap.get(e);if(!a||!a.isFreezing())return;let I=a.durationItemList[a.durationItemList.length-1];I.stop();let c=I.getDuration();if(c>DN){let u=this._monitorFreezeData.get(e,"data");this._monitorFreezeData.set(e,{userId:o,type:n,duration:u?u.duration+c:c},"data")}else a.durationItemList.pop()}getTotalDuration(A){return A.reduce((e,o)=>{let n=o.getDuration();return e+Math.min(n,5e3)},0)}onPlayTrackStart(A){let{track:e}=A;if(!e.isRemote||!this.hitTest(e.room)||e.kind!==fA.VIDEO||!e.isRemotePublished)return;let o="".concat(e.userId,"_").concat(e.streamType);this._isVideoPlayingEventFiredMap.has(o)||this._isVideoPlayingEventFiredMap.set(o,!1)}getDataFreezeDuration(A){let e={dataFreeze:0,count:0},o=this._dataFreezeMap.get(A);if(o){if(o.isFreezing()){let n=o.durationItemList[o.durationItemList.length-1];n.stop(),n.getDuration(){document.hidden||(a=0)};document.addEventListener("visibilitychange",I);let c=(u,d)=>{var R;if(a){let k=e.decodeFPS,_=k>0&&k<=5?600+1e3/k:600,Z=d.presentationTime-a;if(Z>_){Z=Math.min(Z,5e3);let iA="".concat(e.userId,"_").concat(e.streamType),cA=this._monitorFreezeData.get(iA,"render");cA?cA.duration+=Z:this._monitorFreezeData.set(iA,{userId:e.userId,type:e.streamType,duration:Z},"render");let TA=this._renderFreezeMap.get(iA);TA?(TA.totalDuration+=Z,TA.count+=1):this._renderFreezeMap.set(iA,{userId:e.userId,type:e.streamType,totalDuration:Z,count:1})}}a=d.presentationTime,(R=o.element)==null||R.requestVideoFrameCallback(c)};(n=o.element)==null||n.requestVideoFrameCallback(c),this.eventListenerMap.set("".concat(e.userId,"_").concat(e.streamType),{onVisibilityChange:I})}onRemoteVideoPlayEnd(A){let{track:e,player:o}=A,n="".concat(e.userId,"_").concat(e.streamType),a=this.eventListenerMap.get(n);a&&document.removeEventListener("visibilitychange",a.onVisibilityChange)}resetMonitor(){this._monitorFreezeData.clear()}hitTest(A){return A===this._room}destroy(){this.uninstallEvents()}},ptA=es(hg(),1),ftA=class{constructor(A,e,o,n,a){let I=arguments.length>5&&arguments[5]!==void 0?arguments[5]:1.3333333333333333;this.vbMode=A,this.faceDetectorHash=o,this.visionTaskRegistry=n,this.logger=a,G(this,"animationState"),G(this,"originalAspect"),G(this,"totalOffsetX",0),G(this,"totalOffsetY",0),G(this,"defaultScaleRatio",.1),G(this,"isRecovering",!1),G(this,"boundaryY",280),G(this,"lastActionTime",0),G(this,"restTime",400),this.animationState={current:null,target:null,animating:!1,debounceTimer:null,startTime:0,duration:3e3,debounceTime:150,movementThreshold:30,debounceThreshold:15},this.addEvent(this.vbMode,!!this.faceDetectorHash),this.originalAspect=I||4/3,this.visionTaskRegistry.setVideo(this.faceDetectorHash,e)}addEvent(A,e,o){let n=[{key:570704,error:o??(e?void 0:11)},{key:570705,error:o??(e?void 0:22)}][A-1];n&&(e?ct.addSuccessEvent({key:n.key}):ct.addFailedEvent({key:n.key,error:n.error}))}actionCentering(A){let e=Date.now();if(this.animation(),!this.faceDetectorHash||e-this.lastActionTimee/2?(a=e-o-n,I=o-a):(a=o,I=0),{min:a,offset:I}}calculateTargetPosition(A,e,o,n,a,I){let c,u,d=arguments.length>6&&arguments[6]!==void 0?arguments[6]:.4,R=A+o/2,k=e+n/2,{min:_,offset:Z}=this.calculateBoundary(R,a,A,o),{min:iA,offset:cA}=this.calculateBoundary(k,I,e,n);return c=2*_+o,u=2*iA+n,c/u>this.originalAspect?(c=u*this.originalAspect,Z=R-c/2):(u=c/this.originalAspect,cA=k-u/2),o/a>d&&(Z=0,cA=0,c=a,u=I),Z=Math.max(0,Math.min(Z,a-c)),cA=Math.max(0,Math.min(cA,I-u)),{sx:Z,sy:cA,cropWidth:c,cropHeight:u,timestamp:Date.now()}}processFacePositionCrop(A,e,o){if(!this.animationState.current||!this.animationState.target){let c={sx:0,sy:0,cropWidth:e,cropHeight:o,timestamp:Date.now()};return this.animationState.current=c,void(this.animationState.target=c)}let n=this.positionDistance(this.animationState.target,A),a=this.positionDistance(this.animationState.current,A),I=this.animationState.current.cropWidth/e;n>this.animationState.debounceThreshold*I&&(clearTimeout(this.animationState.debounceTimer),this.animationState.animating=!1),!this.animationState.animating&&a>this.animationState.movementThreshold*I&&(this.animationState.target=A,this.animationState.debounceTimer=setTimeout(()=>{this.animationState.startTime=Date.now(),this.animationState.animating=!0},this.animationState.debounceTime))}processFacePositionPortrait(A){if(!this.animationState.current||!this.animationState.target)return this.animationState.current=bt({},A),void(this.animationState.target=bt({},A));let e=this.positionDistance(this.animationState.current,A),o=this.positionDistance(this.animationState.target,A);e>this.animationState.debounceThreshold&&(clearTimeout(this.animationState.debounceTimer),this.animationState.animating=!1),!this.animationState.animating&&o>this.animationState.movementThreshold&&(this.animationState.current=A,this.animationState.debounceTimer=setTimeout(()=>{this.animationState.startTime=Date.now(),this.animationState.animating=!0},this.animationState.debounceTime))}animation(){if(!this.animationState.animating)return;let A=Date.now()-this.animationState.startTime,e=Math.min(A/this.animationState.duration,1),o=n=>n<.5?2*n*n:(4-2*n)*n-1;if(this.animationState.current&&this.animationState.target){let n=(this.animationState.target.sx-this.animationState.current.sx)*o(e);this.animationState.current.sx+=n,this.totalOffsetX+=n;let a=(this.animationState.target.sy-this.animationState.current.sy)*o(e);if(this.animationState.current.sy+=a,this.totalOffsetY+=a,this.animationState.current.cropWidth+=(this.animationState.target.cropWidth-this.animationState.current.cropWidth)*o(e),this.animationState.current.cropHeight+=(this.animationState.target.cropHeight-this.animationState.current.cropHeight)*o(e),this.animationState.current.scaleRatio&&this.animationState.target.scaleRatio&&(this.animationState.current.scaleRatio+=(this.animationState.target.scaleRatio-this.animationState.current.scaleRatio)*o(e)),hr(this.animationState.current.scaleOffsetX)&&hr(this.animationState.target.scaleOffsetX)&&hr(this.animationState.current.scaleOffsetY)&&hr(this.animationState.target.scaleOffsetY)){let I=(this.animationState.target.scaleOffsetX-this.animationState.current.scaleOffsetX)*o(e);this.animationState.current.scaleOffsetX+=I;let c=(this.animationState.target.scaleOffsetY-this.animationState.current.scaleOffsetY)*o(e);this.animationState.current.scaleOffsetY+=c}}e>=1&&(this.animationState.animating=!1,this.animationState.current=this.animationState.target,this.isRecovering=!1)}positionDistance(A,e){return Math.sqrt(Rf(A.sx-e.sx,2)+Rf(A.sy-e.sy,2))}recoverOriginal(A,e){this.animationState.target={sx:0,sy:0,cropWidth:A,cropHeight:e,timestamp:Date.now()},this.animationState.animating=!0,this.animationState.startTime=Date.now(),this.isRecovering=!0}dualStageCropping(A,e,o,n,a,I){let c=arguments.length>6&&arguments[6]!==void 0?arguments[6]:.3;if(this.isRecovering)return;let u=this.calculateTargetPosition(o,n,a,I,A,e);this.processFacePositionCrop(u,A,e),a*I/u.cropWidth/u.cropHeight>c&&this.recoverOriginal(A,e)}movingPortrait(A,e,o,n,a,I){var c,u,d,R,k,_,Z,iA,cA,TA,JA,Ie;let XA={sx:o+a/2+this.totalOffsetX,sy:n+I/2+this.totalOffsetY,cropWidth:A,cropHeight:e,scaleRatio:(u=(c=this.animationState.current)==null?void 0:c.scaleRatio)!=null?u:1,scaleOffsetX:(R=(d=this.animationState.current)==null?void 0:d.scaleOffsetX)!=null?R:0,scaleOffsetY:(_=(k=this.animationState.current)==null?void 0:k.scaleOffsetY)!=null?_:0,timestamp:Date.now()};this.animationState.target={sx:A/2,sy:n+I/2,cropWidth:A,cropHeight:e,scaleRatio:(iA=(Z=this.animationState.target)==null?void 0:Z.scaleRatio)!=null?iA:1,scaleOffsetX:(TA=(cA=this.animationState.target)==null?void 0:cA.scaleOffsetX)!=null?TA:0,scaleOffsetY:(Ie=(JA=this.animationState.target)==null?void 0:JA.scaleOffsetY)!=null?Ie:0,timestamp:Date.now()},this.animationState.animating||(this.animationState.target.scaleRatio=Math.sqrt(a*I/A/e/this.defaultScaleRatio),this.animationState.target.scaleOffsetX=-this.animationState.target.scaleRatio/2+.5,this.animationState.target.scaleOffsetY=1-this.animationState.target.scaleRatio,(this.animationState.target.sy-this.animationState.target.scaleOffsetY*this.animationState.target.cropHeight)/this.animationState.target.scaleRatio{A.log.error(o),A.destroy(new Ct({code:Ge.VIDEO_MANAGER_ERROR,extraCode:6,message:"init vb node error ".concat(o.message||o)})),this.resolvePreditReady()})}init(A){return DA(this,null,function*(){var e,o,n;this.predictReady=new Promise(u=>{this.resolvePreditReady=u});let a=A.Wasm,I=this.context.ctx;if(A.color&&(this._color=A.color),A.mat4&&(this._mat4=A.mat4),A.postProcessing&&(this._postProcessing=A.postProcessing),this._enableFaceCentering=(e=A.enableFaceCentering)!=null&&e,this._enableEffectOptimization=(o=A.enableEffectOptimization)!=null&&o,this.wasm=new a.AllIn1(I),this.wasm.blurRadius=A.blurRadius||3,this.wasm.mirror=!!A.mirror,this.wasm.rotation=A.rotation||0,this.wasm.vbMode=A.bg==="blur"?1:A.bg instanceof HTMLImageElement?2:A.bg==="color"?3:0,this._onAbort=A.onAbort,A.bg||this.resolvePreditReady(),A.waterMark){let{x:u,y:d,width:R,height:k}=A.waterMark;this.wasm.setWaterMark(u,d,R,k)}if(A.beautyParams){let{beauty:u,brightness:d,ruddy:R}=A.beautyParams;this.wasm.setBeauty(u,d,R,A?.width,A?.height)}this.program=this.wasm.init(),this.useProgram(),this.setAttributes(this.positionBuffer,this.texCoordBuffer),I.uniform1i(I.getUniformLocation(this.program,"mask"),1),A.bg instanceof HTMLImageElement&&(I.uniform1i(I.getUniformLocation(this.program,"bg"),2),this._bgTexture=this.createTexture(A.bg)),A.waterMark&&(I.uniform1i(I.getUniformLocation(this.program,"waterMark"),3),this._waterMarkTexture=this.createTexture(A.waterMark.image));let c=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);if(this._textureMatrixLocation=I.getUniformLocation(this.program,"u_textureMatrix"),I.uniformMatrix4fv(this._textureMatrixLocation,!1,c),this._offsetMatrixLocation=I.getUniformLocation(this.program,"u_offsetMatrix"),I.uniformMatrix4fv(this._offsetMatrixLocation,!1,c),this._colorLocation=I.getUniformLocation(this.program,"u_color"),I.uniform1i(I.getUniformLocation(this.program,"lastMask"),4),this._weixin){let u=this.context.createShader(I.FRAGMENT_SHADER,`#version 300 es +precision highp float; +uniform sampler2D u_texture; +uniform sampler2D mask; + +in vec2 v_texCoord; +out vec4 outColor; +void main() { + outColor = vec4(texture(u_texture, v_texCoord).rgb, texture(mask, v_texCoord).a); +}`),d=this.context.createShader(I.VERTEX_SHADER,`#version 300 es +in vec2 a_position; +in vec2 a_texCoord; +out vec2 v_texCoord; +void main() { + gl_Position = vec4(a_position.x, a_position.y, 0, 1); + v_texCoord = a_texCoord; +}`);this._prePrograme=this.context.createProgram(d,u),I.useProgram(this._prePrograme),this.setAttributes(this.positionBuffer,this.texCoordBuffer),I.uniform1i(I.getUniformLocation(this._prePrograme,"mask"),1)}!this._enableEffectOptimization||this.wasm.vbMode!==2&&this.wasm.vbMode!==3?this._postProcessing=void 0:QM()?(this._postProcessing=void 0,this.log.warn("Virtual background post-processing isn't allowed on mobile.")):(n=this._postProcessing)==null||n.init(I,this.positionBuffer,this.texCoordBuffer,4/3),yield this.initVisionTasks(A)})}initVisionTasks(A){return DA(this,null,function*(){if(A.bg){if(this._visionTaskRegistry=yield window.VisionTaskRegistry.getInstance(),!window.VisionTaskRegistry||!this._visionTaskRegistry||!this._visionTaskRegistry.visionWasm)throw new Error("Virtual background assets not found. Please redeploy the assets of the npm package.");if(this._selfieSegmentationHash=yield this._visionTaskRegistry.register(window.VisionTaskType.ImageSegmenter,{canvas:this.context._canvas}),this._visionTaskRegistry.setVideo(this._selfieSegmentationHash,this.image),this._enableFaceCentering)try{this._visionTaskRegistry.models.has(window.VisionTaskType.FaceDetector)||(yield this._visionTaskRegistry.preloadModels([window.VisionTaskType.FaceDetector]));let e=yield this._visionTaskRegistry.register(window.VisionTaskType.FaceDetector);if(!e)return;this._centerFace=new ftA(this.wasm.vbMode,this.image,e,this._visionTaskRegistry,this.context.log)}catch{this.log.error("Face detector model not found. Please redeploy the assets of the npm package.")}}})}onPredict(A){let e=this.context.ctx;this._weixin&&(this._lastMaskTexture||(this._lastMaskTexture=this.createTexture(this.image),this._lastMaskFbo=this.createFramebuffer(this._lastMaskTexture)));let o=this.getMaskTexture(A);if(!o)return;let n=o;this._postProcessing&&(this._postProcessing.ratio=this.image.videoWidth/this.image.videoHeight,n=this._postProcessing.postProcessing(o)),this.useProgram(),this.setAttributes(this.positionBuffer,this.texCoordBuffer),this.useTexture(),e.activeTexture(e.TEXTURE1),e.bindTexture(e.TEXTURE_2D,n||null),e.activeTexture(e.TEXTURE2),e.bindTexture(e.TEXTURE_2D,this._bgTexture||null),e.activeTexture(e.TEXTURE3),e.bindTexture(e.TEXTURE_2D,this._waterMarkTexture||null),this.wasm.vbMode===3&&e.uniform3fv(this._colorLocation,this._color),this.useBufferFrame(),this._segmentationMask=A,this.totalFrames++,this.centerFace(),gu(this.wasm.rotation)&&this.resize(this.image.height,this.image.width),e.viewport(0,0,e.canvas.width,e.canvas.height),e.drawArrays(e.TRIANGLE_STRIP,0,4),A.close()}getMaskTexture(A){return A.confidenceMasks?A.confidenceMasks[0].getAsWebGLTexture():void 0}onFirstFrame(){this.waitingFirstFrame=!1;let A=this.context.ctx;this.useTexture(),A.texImage2D(A.TEXTURE_2D,0,A.RGBA,A.RGBA,A.UNSIGNED_BYTE,this.image)}render(A){let e=this.context.ctx,{image:o}=this;this.tryVideoFrameCallback();let{videoWidth:n,videoHeight:a}=o;if(gu(this.wasm.rotation)&&!this._visionTaskRegistry&&([n,a]=[a,n]),n===0||a===0||!this.available)return!1;o.width=n,o.height=a;let I=!1;if(this.totalFrames)this.useTexture(),I=this._selfieTextureValid,this._selfieTextureValid=!0;else{if(!this.program)return!1;this.useTexture(),I=this._textureValid,this._textureValid=!0}if(this.width===n&&this.height===a&&I?e.texSubImage2D(e.TEXTURE_2D,0,0,0,e.RGBA,e.UNSIGNED_BYTE,o):(this.resize(n,a),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,o)),this._weixin){if(e.useProgram(this._prePrograme),this.useTexture(),this._segmentationMask){let c=this.getMaskTexture(this._segmentationMask);e.activeTexture(e.TEXTURE1),e.bindTexture(e.TEXTURE_2D,c||null),e.bindFramebuffer(e.FRAMEBUFFER,this._lastMaskFbo||null)}e.drawArrays(e.TRIANGLE_STRIP,0,4),this.useTexture(),this._segmentationMask?e.copyTexSubImage2D(e.TEXTURE_2D,0,0,0,0,0,n,a):e.copyTexImage2D(e.TEXTURE_2D,0,e.RGBA,0,0,n,a,0)}try{if(this._selfieSegmentationHash&&this._visionTaskRegistry){let c=this._visionTaskRegistry.getResult(this._selfieSegmentationHash);this.totalFrames===1&&this.context._canvas&&this.resolvePreditReady(),this.onPredict(c)}}catch(c){this._onAbort&&this._onAbort(c)}return this.totalFrames||(e.activeTexture(e.TEXTURE2),e.bindTexture(e.TEXTURE_2D,this._bgTexture||null),e.activeTexture(e.TEXTURE3),e.bindTexture(e.TEXTURE_2D,this._waterMarkTexture||null),e.drawArrays(e.TRIANGLE_STRIP,0,4)),this._visionTaskRegistry&&this._visionTaskRegistry.resetHashResults(),!1}centerFace(){if(!this._centerFace||!this._enableFaceCentering)return;let A=this.context.ctx;this._centerFace.aspectRatio=A.canvas.width/A.canvas.height,this._centerFace.actionCentering(this.image);let{current:e,offset:o}=this._centerFace;if(e&&(this.wasm.vbMode===1&&this.drawImage(e.sx,e.sy,e.cropWidth,e.cropHeight),o&&this.wasm.vbMode===2)){if(!this._mat4)return;let n=this._mat4.create(),{scaleRatio:a=1,scaleOffsetX:I=0,scaleOffsetY:c=0}=e;this._mat4.fromTranslation(n,[-o.offsetX/A.canvas.width+I,c,0]),this._mat4.scale(n,n,[a,a,1]),A.uniformMatrix4fv(this._offsetMatrixLocation,!1,n)}}drawImage(A,e,o,n){let a=this.context.ctx;if(!this._mat4)return;let{width:I,height:c}=a.canvas,u=this._mat4.create();this._mat4.fromTranslation(u,[A/I,1-(e+n)/c,0]),this._mat4.scale(u,u,[o/I,n/c,1]),a.uniformMatrix4fv(this._textureMatrixLocation,!1,u)}close(){var A;super.close();let e=this.context.ctx;this._bgTexture&&e.deleteTexture(this._bgTexture),this._waterMarkTexture&&e.deleteTexture(this._waterMarkTexture),this._lastMaskTexture&&e.deleteTexture(this._lastMaskTexture),this._lastMaskFbo&&e.deleteFramebuffer(this._lastMaskFbo),this._prePrograme&&e.deleteProgram(this._prePrograme),this._postProcessing&&this._postProcessing.close(),(A=this.wasm)==null||A.close()}},DtA=class extends Il{constructor(A){super(A,{name:"yuv-source",useDefaultProgram:!1,create2d:!1,useFbo:!1,createTexture:!1,logger:A.log,fragmentShaderSource:` + precision highp float; + uniform sampler2D ySampler; + uniform sampler2D uSampler; + uniform sampler2D vSampler; + varying highp vec2 textureCoord; + const mat4 YUV2RGB = mat4( + 1.1643828125, 0, 1.59602734375, -.87078515625, + 1.1643828125, -.39176171875, -.81296875, .52959375, + 1.1643828125, 2.017234375, 0, -1.081390625, + 0, 0, 0, 1); + void main() { + vec3 yuv; + yuv.r = texture2D(ySampler, textureCoord).r; + yuv.g = texture2D(uSampler, textureCoord).r; + yuv.b = texture2D(vSampler, textureCoord).r; + gl_FragColor = vec4(yuv,1) * YUV2RGB; + } + `,vertexShaderSource:` + attribute vec4 vertexPos; + attribute vec2 texturePos; + varying vec2 textureCoord; + void main() { + gl_Position = vertexPos; + textureCoord = texturePos; + }`}),G(this,"yTextureRef"),G(this,"uTextureRef"),G(this,"vTextureRef"),G(this,"Y"),G(this,"U"),G(this,"V"),this.useProgram();let e=this.context.ctx;e.pixelStorei(e.PACK_ALIGNMENT,1),e.pixelStorei(e.UNPACK_ALIGNMENT,1),this.setTexBuffer([0,1,1,1,0,0,1,0]),this.yTextureRef=this._initTexture("ySampler",0),this.uTextureRef=this._initTexture("uSampler",1),this.vTextureRef=this._initTexture("vSampler",2),this._canvas=A._canvas}_initTexture(A,e){let o=this.context.ctx,n=o.createTexture();return o.bindTexture(o.TEXTURE_2D,n),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MAG_FILTER,o.LINEAR),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MIN_FILTER,o.LINEAR),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_S,o.CLAMP_TO_EDGE),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_T,o.CLAMP_TO_EDGE),o.bindTexture(o.TEXTURE_2D,null),o.uniform1i(o.getUniformLocation(this.program,A),e),n}render(A){let e=this.context.ctx,o=this.width,n=this.height;return this.useProgram(),e.viewport(0,0,o,n),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,this.yTextureRef),e.texSubImage2D(e.TEXTURE_2D,0,0,0,o,n,e.LUMINANCE,e.UNSIGNED_BYTE,this.Y),e.activeTexture(e.TEXTURE1),e.bindTexture(e.TEXTURE_2D,this.uTextureRef),e.texSubImage2D(e.TEXTURE_2D,0,0,0,o/2,n/2,e.LUMINANCE,e.UNSIGNED_BYTE,this.U),e.activeTexture(e.TEXTURE2),e.bindTexture(e.TEXTURE_2D,this.vTextureRef),e.texSubImage2D(e.TEXTURE_2D,0,0,0,o/2,n/2,e.LUMINANCE,e.UNSIGNED_BYTE,this.V),this.draw(),!0}resize(A,e){super.resize(A,e);let o=this.context.ctx;o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,this.yTextureRef),o.texImage2D(o.TEXTURE_2D,0,o.LUMINANCE,A,e,0,o.LUMINANCE,o.UNSIGNED_BYTE,null),o.activeTexture(o.TEXTURE1),o.bindTexture(o.TEXTURE_2D,this.uTextureRef),o.texImage2D(o.TEXTURE_2D,0,o.LUMINANCE,A/2,e/2,0,o.LUMINANCE,o.UNSIGNED_BYTE,null),o.activeTexture(o.TEXTURE2),o.bindTexture(o.TEXTURE_2D,this.vTextureRef),o.texImage2D(o.TEXTURE_2D,0,o.LUMINANCE,A/2,e/2,0,o.LUMINANCE,o.UNSIGNED_BYTE,null)}},nz=(A,e)=>{switch(A){case"webCodecs":return e==="videoFrame"?514705:514706;case"wasm":return e==="webgl"?514707:e==="videoFrame"?514708:514709}throw new Error("decoder type not supported")},ytA=0,RtA=class{constructor(A){G(this,"id",ytA++),G(this,"trackDoneOB"),G(this,"startOB"),G(this,"stopOB"),G(this,"decoder"),G(this,"videoContext"),G(this,"gop",0),G(this,"gop_helper",0),G(this,"waitFirstKeyFrame",!0),G(this,"startTimestamp",0),G(this,"startTime",0),G(this,"startPerformanceTime",0),G(this,"inputFrameCount",0),G(this,"decodedFrameCount",0),G(this,"decodeFrameCount",0),G(this,"downgradeLevel",0),G(this,"lastDowngradeTime",0),G(this,"lastFrameDiff",0),G(this,"lastDecodeFrameTimestamp",0),G(this,"config"),G(this,"gop_before_configure",[]),G(this,"videoElement"),G(this,"type","wasm"),G(this,"goodType"),G(this,"renderer","2d"),G(this,"wasmOption"),G(this,"createDecoder"),G(this,"_decodeSink"),G(this,"isReported",!1),G(this,"track"),G(this,"stateChangeOB"),G(this,"failedReason");let{track:e,createDecoder:o}=A;if(this.stateChangeOB=yu(),this.track=e,this.createDecoder=o,this.wasmOption={yuvMode:A.renderer==="webgl",wasmPath:A.wasmPath,workerMode:A.workerMode,canvas:A.canvas},this.config=A.config,this.videoElement=A.videoElement,this.renderer=A.renderer,this.trackDoneOB=Ln(e.availableState,Uo.OFF),this.stopOB=yu(),A.type==="auto"){switch(A.fallback){case"wasm":this.type="wasm",this.renderer="webgl";break;case"wasm_2d":this.type="wasm",this.renderer="2d";break;case"wasm_video":this.type="wasm",this.renderer="videoFrame";break;default:this.type="webCodecs"}this.wasmOption.yuvMode=this.renderer==="webgl"}else this.type=A.type;this.changeRenderer(this.renderer),Jn(this.stateChangeOB,VW((n,a)=>(n!==a&&e.onDecodeDowngradeStateChanged({type:this.type,renderer:this.renderer,reason:this.failedReason,prevState:n,state:a}),a),"INITIALIZED"),Qc(this.stopOB),Ks()),this.start()}start(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0;this.waitFirstKeyFrame=!0,this.stateChangeOB.next("STARTING");let e=Jn(this.pipe(this.track),Qc(this.stopOB),qT());Jn(e,Ks(()=>{this.track.stat.framesDecoded++},o=>{if(this.track.log.error("".concat(this.id," play failed: ").concat(o," retryCount: ").concat(A)),ct.addFailedEvent({key:nz(this.type,this.renderer),error:o}),A>4)this.failedReason=o,this.stateChangeOB.next("FAILED"),ct.addFailedEvent({key:514704});else{if(this.goodType)return void this.start(A);switch(this.type){case"webCodecs":this.type="wasm",this.changeRenderer("webgl");break;case"wasm":this.renderer==="webgl"&&this.changeRenderer("videoFrame")}this.start(A+1)}},()=>{this.track.log.warn("".concat(this.id," decoderOB completed")),ct.addSuccessEvent({key:nz(this.type,this.renderer)}),ct.addSuccessEvent({key:514704})})),Jn(e,LM(1),Ks(()=>{this.track.player.handlePlaying("canvas"),this.goodType=this.type,this.stateChangeOB.next("STARTED")}))}mock(A){this._decodeSink?this._decodeSink.error(A):this.start()}close(A){this.stopOB.next(A)}changeRenderer(A){this.renderer=A,this.renderer==="videoFrame"&&!Em()&&(this.renderer="2d"),this.wasmOption.yuvMode=this.renderer==="webgl"}decode(A){let e=arguments.length>1&&arguments[1]!==void 0&&arguments[1];var o,n;if(this.failedReason)return;this.inputFrameCount++;let a=new Uint8Array(A.data);if((I=a)[0]!==0||I[1]!==0||I[2]!==0||I[3]!==1||a.length<5)return this.stateChangeOB.next("FAILED"),this.close("not h26x frame ".concat(a.subarray(0,5))),A;var I;let c=!1;switch(31&a[4]){case 5:case 7:c=!0}if(((o=this.decoder)==null?void 0:o.state)!=="configured")return this.track.log.debug("not configured ".concat(this.inputFrameCount)),c&&(this.gop_before_configure=[]),this.gop_before_configure.push({data:A.data,timestamp:A.timestamp,type:A.type}),A;this.gop_before_configure.length>0&&!e&&(this.gop_before_configure.forEach(d=>this.decode(d,!0)),this.gop_before_configure=[]);let{timestamp:u}=A;if(c?(this.gop=this.gop_helper,this.gop_helper=0):this.gop_helper++,this.decoder){if(this.waitFirstKeyFrame){if(!c)return void this.track.log.debug("wait first key frame ".concat(this.inputFrameCount," ").concat(a.subarray(0,5).join(" ")));this.waitFirstKeyFrame=!1,this.startTimestamp=u,this.startTime=Date.now(),this.startPerformanceTime=ki()}switch(this.downgradeLevel){case 0:case 1:break;case 2:if(this.gop_helper>this.gop>>1)return;break;case 3:if(this.gop_helper>0)return;break;default:return}return(this.decodeFrameCount<10||this.decodeFrameCount%500==0)&&this.track.log.debug("decode ".concat(this.decodeFrameCount," gop: ").concat(this.gop," ").concat(u," ").concat((n=A.getMetadata)==null?void 0:n.call(A).rtpTimestamp)),this.decodeFrameCount++,this.lastDecodeFrameTimestamp=u,void this.decoder.decode({data:A.data,type:A.type,timestamp:this.lastDecodeFrameTimestamp})}return A}checkDowngradeByFrameDiff(){let A=this.downgradeLevel,e=this.decodeFrameCount-this.decodedFrameCount;e>this.lastFrameDiff?(this.downgradeLevel++,this.downgradeLevel>4&&(this.downgradeLevel=4)):e<=this.lastFrameDiff&&this.downgradeLevel>0&&this.downgradeLevel--,this.downgradeLevel!==A&&this.track.log.debug("downgrade level ".concat(A," to ").concat(this.downgradeLevel," ").concat(this.decodeFrameCount," frameDiff: ").concat(e,", lastFrameDiff: ").concat(this.lastFrameDiff)),this.lastFrameDiff=e,this.lastDowngradeTime=Date.now()}checkDowngradeByTimestampDiff(A){let e=this.downgradeLevel;this.lastDecodeFrameTimestamp-A>9e4?(this.downgradeLevel++,this.downgradeLevel>4&&(this.downgradeLevel=4)):this.downgradeLevel>0&&this.downgradeLevel--,this.downgradeLevel!==e&&this.track.log.debug("downgrade level ".concat(e," to ").concat(this.downgradeLevel))}pipe(A){return e=>DA(this,null,function*(){this._decodeSink=e;let o,n=A.mediaTrack;e.defer(()=>{var c;n&&(A.player.setCanvas(),A.setInputMediaStreamTrack(n)),o?.close(),(c=this.videoContext)==null||c.destroy(),delete this._decodeSink});let{renderer:a,type:I}=this;A.log.info("decoder type: ".concat(this.type," renderer: ").concat(this.renderer));try{switch(I){case"wasm":o=this.createDecoder(I,this.wasmOption);break;case"webCodecs":o=this.createDecoder(I);break;default:throw new Error("not supported yet")}let c=0;if(o.on("videoFrame",u=>{this.decodedFrameCount++,c++,(c<=10||c%500==0)&&A.log.debug("frame ".concat(c," ").concat(this.decodedFrameCount,"/").concat(this.decodeFrameCount," decoded ").concat(u.timestamp)),Date.now()-this.lastDowngradeTime>5e3&&(this.type==="webCodecs"?this.checkDowngradeByFrameDiff():this.type==="wasm"&&this.checkDowngradeByTimestampDiff(u.timestamp)),e.next(u)}),o.on("error",u=>{A.log.error(u),e.error(I==="webCodecs"?4:8)}),yield o.initialize(this.videoElement),!this._decodeSink)return;if(o.configure(this.config),I==="wasm"&&a==="webgl"){this.videoContext=new aC({frameRate:15,logger:A.log,name:A.userId}),this.videoContext.create(),this.videoContext.on(aC.UNAVAILABLE,d=>{A.log.error(d),e.error(7)});let u=new DtA(this.videoContext);o.on("videoCodecInfo",d=>u.resize(d.width,d.height)),o.on("videoFrame",d=>{({y:u.Y,u:u.U,v:u.V}=d),this.downgradeLevel===1?this.decodedFrameCount%2==0&&u.render(this.decodedFrameCount):u.render(this.decodedFrameCount)}),A.source=u,A.player.setCanvas(this.videoContext._canvas,2)}else if(a==="videoFrame"){A.player.setCanvas();let u=new MediaStreamTrackGenerator({kind:"video"}),d=u.writable.getWriter();A.setInputMediaStreamTrack(u),o.on("videoFrame",R=>d.write(R))}else{this.videoContext=new Mu({frameRate:15,logger:A.log,name:A.userId}),this.videoContext.create({alpha:!1});let u=this.videoContext.createVideoImageSource();o.on("videoFrame",R=>{try{u.image=R,u.update()}catch(k){delete this.goodType,A.log.error(k),e.error(11)}});let d=new bq(this.videoContext,{name:"remotePlayer",logger:A.log});u.connect(d),A.source=u,A.player.setCanvas(this.videoContext._canvas,2)}this.decoder=o}catch(c){A.log.error(c),e.error(I==="webCodecs"?2:6)}})}},az=Promise.resolve(),sz=class extends ptA.EventEmitter{constructor(A){super(),this.room=A,G(this,"videoContext"),G(this,"_glVideoContext"),G(this,"_2dVideoContext"),G(this,"destination"),G(this,"smallVideoContext"),G(this,"smallDestination"),G(this,"smallTrackSource"),G(this,"smallImageSource"),G(this,"_isMirror",!1),G(this,"_rotation",0),G(this,"cameraTrack"),G(this,"cameraNode"),G(this,"transformNode"),G(this,"mixNode"),G(this,"screenTrack"),G(this,"screenNode"),G(this,"selfModel",!1),G(this,"blurRadius",3),G(this,"arTrack"),G(this,"_enableFaceCentering",!1),G(this,"_enableEffectOptimization",!1),G(this,"onAbort"),G(this,"_color"),G(this,"Wasm"),G(this,"waterMarkNode"),G(this,"_waterMarkOption"),G(this,"watermarkImageList",[]),G(this,"_beautyParams"),G(this,"isUsingArTrack",!1),G(this,"mixTrack"),G(this,"_isMixScreen",!1),G(this,"_virtualBackground"),G(this,"_virtualBackgroundAbortCallback"),G(this,"virtualBackgroundInstance"),G(this,"_bgAssetPath"),G(this,"log"),G(this,"_mat4"),G(this,"_postProcessing"),G(this,"_checkId",0),G(this,"_use2d",!1),G(this,"_autoSwitchRenderMode",!0),G(this,"encodePipeline",[]),G(this,"decodePipeline",[]),G(this,"updated",az),G(this,"_updateFlag",!1),this.log=nA.createLogger({parent:A?.getLogger(),id:"vm",userId:A?.userId,sdkAppId:A?.sdkAppId}),this.smallVideoContext=new Mu({frameRate:15,logger:this.log,name:"s"}),this.enablePrintDetail()}get smallMode(){var A;return((A=this.room)==null?void 0:A.smallMode)||"canvas"}get _hasVirtualBg(){return!!this._virtualBackground}get _hasWaterMark(){return this.watermarkImageList.length>0}get _isRotate(){return this._rotation!==0}get _isTransform(){return this._isMirror||this._isRotate}get renderMode(){return this._autoSwitchRenderMode?"auto":this._use2d?"2d":"webgl"}set renderMode(A){if(this._autoSwitchRenderMode=A==="auto",this._autoSwitchRenderMode)return;let e=A==="2d";this._use2d!==e&&(this._use2d=e,this.clear(),this.videoContext=this._use2d?this.get2dVideoContext():this.getGlVideoContext(),this.update())}get cameraResolution(){var A;let{width:e,height:o}=((A=this.cameraTrack)==null?void 0:A.settings)||{};return gu(this._rotation)?{width:o,height:e}:{width:e,height:o}}get2dVideoContext(){return this._2dVideoContext?this._2dVideoContext.destroy():this._2dVideoContext=new Mu({frameRate:15,logger:this.log,name:"m"}),this._2dVideoContext.create({alpha:this._hasWaterMark||this._hasVirtualBg}),this._2dVideoContext}getGlVideoContext(){if(this._glVideoContext){if(this._glVideoContext.available)return this._glVideoContext}else this._glVideoContext=new aC({frameRate:15,logger:this.log,name:"m"});return this.initializeGlVideoContext(),this._glVideoContext}initializeGlVideoContext(){try{this._glVideoContext.create(OO<=22),this._glVideoContext.on(aC.UNAVAILABLE,A=>{var e;this.emit("error",A),this.log.warn("video context unavailable",A),(e=this._virtualBackgroundAbortCallback)==null||e.call(this,A),this.update().catch(o=>{this.log.error(o)})})}catch(A){this.emit("error",A)}}initVirtualBackground(A,e,o){this.onAbort=A,this._mat4=e,this._postProcessing=o}enablePrintDetail(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:2e3;this._checkId=nn.run("interval",()=>{this.destination&&this.log.debug(this.destination.getInfo())},{delay:A})}destroy(){var A,e;(A=this._2dVideoContext)==null||A.destroy(),(e=this._glVideoContext)==null||e.destroy(),this.smallVideoContext.destroy(),nn.clearTask(this._checkId)}get needAlpha(){return this._hasWaterMark||this._hasVirtualBg}get active(){return(TQ||this._isMixScreen||this._isTransform||this._hasWaterMark||this._hasVirtualBg||this._beautyParams)&&this.checkOrCreateVideoContext()}sendCreateResult(){let A=arguments.length>1?arguments[1]:void 0,e=(arguments.length>0&&arguments[0]!==void 0?arguments[0]:"videoCtxGl")==="videoCtxGl"?512700:512701;A?ct.addFailedEvent({key:e,error:A}):ct.addSuccessEvent({key:e})}checkOrCreateVideoContext(){let A=this._use2d;if(this._autoSwitchRenderMode&&(this._use2d=!this._hasVirtualBg),this.videoContext)if(this.videoContext.available){let e=!this.videoContext.hasAlpha&&this.needAlpha;if(this._autoSwitchRenderMode&&A===this._hasVirtualBg)this.clear();else{if(!e||!this._use2d)return!0;this.clear()}}else{if(this._glVideoContext=new aC({frameRate:15,logger:this.log,name:"m"}),this.initializeGlVideoContext(),this._glVideoContext.available)return this.videoContext=this._glVideoContext,this.videoContext.available;this.log.warn("webgl is still not available"),this.clear(),this._use2d=!0}return this.videoContext=this._use2d?this.get2dVideoContext():this.getGlVideoContext(),this.videoContext.available}get smallTrack(){var A;return(A=this.smallDestination)==null?void 0:A.videoTrack}get hasSmall(){return!!this.smallTrack}get initialTrack(){var A;return(A=this.cameraTrack)==null?void 0:A.mediaTrack}setSmallVideo(A,e){if(this.smallMode!=="api")if(A){if(!this.smallVideoContext.available){if(this.smallVideoContext.create({alpha:!1}),!this.smallVideoContext.available)return;this.smallDestination=new ZAA(this.smallVideoContext,A,this.log),this.smallVideoContext.on(aC.UNAVAILABLE,o=>{this.log.warn("small video context lost",o)})}if(this.smallVideoContext.frameRate=A.frameRate,this.smallDestination.resolution=A,e)this.smallTrackSource&&(this.smallTrackSource.close(),delete this.smallTrackSource),this.smallImageSource?this.smallImageSource.image=e:(this.smallImageSource=this.smallVideoContext.createVideoImageSource(e),this.smallImageSource.resize(e.width,e.height),this.smallImageSource.connect(this.smallDestination));else if(this.smallImageSource&&(this.smallImageSource.close(),delete this.smallImageSource),this.smallTrackSource)this.smallTrackSource.replaceTrack(this.initialTrack);else{this.smallTrackSource=this.smallVideoContext.createVideoTrackSource(this.initialTrack,"smallTrackSource");let{width:o,height:n}=this.cameraTrack.settings;this.smallTrackSource.resize(o,n),this.smallTrackSource.connect(this.smallDestination)}}else this.smallVideoContext.available&&(this.smallVideoContext.destroy(),delete this.smallDestination,delete this.smallTrackSource,delete this.smallImageSource)}_setMainOutput(A){var e,o;try{let n=this.cameraTrack,{small:a,player:I}=n;TQ&&I.setCanvas(A);let c=A&&((e=this.destination)==null?void 0:e.videoTrack)||this.initialTrack;return this.isUsingArTrack&&this.arTrack&&(this.emit("output-track-changed"),c=this.arTrack),this.log.info("set main output ".concat(c?c.label:"no output track")),this.setSmallVideo(a,A),S.emit(K.LOCAL_VIDEO_TRACK_PREPROCESSED,{mediaTrack:c,profile:(o=this.cameraTrack)==null?void 0:o.profile,room:this.room}),n.setOutputMediaStreamTrack(c)}catch(n){this.log.error("set main output failed",n)}}update(){let A=arguments.length>0&&arguments[0]!==void 0&&arguments[0];return DA(this,null,function*(){var e;if(!this.cameraTrack||!this.initialTrack)return;if(!this.active)return this.cameraNode&&this.clear(),this._setMainOutput();let{settings:o,profile:n}=this.cameraTrack;if(this._use2d||!this._virtualBackground&&!this._beautyParams)this.destination||(this.destination=this.videoContext.createVideoTrackDestination({name:"mainDestination2d",logger:this.log}),this.destination.on(Il.RENDER,a=>{var I;(I=this.cameraTrack)==null||I.emit("render",a)})),al===16?this.initialTrack instanceof CanvasCaptureMediaStreamTrack?(this.cameraNode&&(this.cameraNode instanceof FM?(this.cameraNode.close(),delete this.cameraNode):this.cameraNode.image=this.initialTrack.canvas),this.cameraNode||(this.cameraNode=this.videoContext.createVideoImageSource(this.initialTrack.canvas,{name:"cameraCanvasSource",logger:this.log}))):(this.cameraNode&&(this.cameraNode instanceof FM?this.cameraNode.replaceTrack(this.initialTrack):(this.cameraNode.close(),delete this.cameraNode)),this.cameraNode||(this.cameraNode=this.videoContext.createVideoTrackSource(this.initialTrack,"cameraTrackSource"))):this.cameraNode?this.cameraNode.replaceTrack(this.initialTrack):this.cameraNode=this.videoContext.createVideoTrackSource(this.initialTrack,"cameraNodeSource"),this.cameraNode.resize(o.width,o.height);else if(A&&this.cameraNode&&this.destination)this.cameraNode.replaceTrack(this.initialTrack);else{this.cameraNode&&this.cameraNode.close(),this.destination?this.destination.disableCheckMute():(this.destination=new zAA(this.videoContext,{name:"mainDestination",logger:this.log}),this.destination.on(Il.RENDER,u=>{var d;(d=this.cameraTrack)==null||d.emit("render",u)}));let{width:a,height:I}=this.cameraResolution,c=yield this.getWatermarkImage(a,I);this._waterMarkOption={x:0,y:0,width:c.width,height:c.height,image:c},this.cameraNode=new mtA(this.videoContext,{input:this.initialTrack,width:a,height:I,mirror:this._isMirror,rotation:this._rotation,bg:this._virtualBackground,selfModel:this.selfModel,waterMark:this._waterMarkOption,beautyParams:this._beautyParams,useTflite:!0,blurRadius:this.blurRadius,assetPath:this._bgAssetPath,Wasm:this.Wasm,enableFaceCentering:this._enableFaceCentering,enableEffectOptimization:this._enableEffectOptimization,onAbort:this.onAbort,mat4:this._mat4,postProcessing:this._postProcessing,color:this._color}),this.cameraNode.connect(this.destination),this.destination.enableCheckMute(),yield this.cameraNode.predictReady}if(this.videoContext.frameRate=n.frameRate,this._use2d){let a=this.cameraNode;if(a.disconnect(),this._isTransform&&(this.transformNode?(this.transformNode.mirror=this._isMirror,this.transformNode.rotation=this._rotation):this.transformNode=new Zh(this.videoContext,this.log,this._isMirror,this._rotation),a=a.connect(this.transformNode),a.disconnect(),this.log.info("start mirror ".concat(this._isMirror," rotate ").concat(this.rotation))),this.mixNode&&this.mixNode.close(),delete this.mixNode,this._isMixScreen||this._hasWaterMark){if(this.mixNode=new o4(this.videoContext,this.log),a.connect(this.mixNode,{zIndex:1}),this._hasWaterMark&&!this.waterMarkNode&&this._waterMarkOption)this.waterMarkNode=this.videoContext.createVideoImageSource(this._waterMarkOption.image,{autoResize:!1,logger:this.log}),this.waterMarkNode.resize(this._waterMarkOption.width,this._waterMarkOption.height),this.waterMarkNode.x=this._waterMarkOption.x,this.waterMarkNode.y=this._waterMarkOption.y;else if(this.waterMarkNode){let{width:I,height:c}=this.cameraResolution;this.waterMarkNode.image=yield this.getWatermarkImage(I,c),I&&c&&this.waterMarkNode.resize(I,c)}(e=this.waterMarkNode)==null||e.connect(this.mixNode,{zIndex:2}),this._isMixScreen&&this.screenTrack&&(this.screenNode||(this.screenNode=this.videoContext.createVideoTrackSource(this.screenTrack.mediaTrack,"screenNodeSource"),this.screenNode.resize(this.screenTrack.settings.width,this.screenTrack.settings.height)),this.screenNode.shouldUpdate=!1,this.screenNode.connect(this.mixNode,{zIndex:0})),a=this.mixNode,this.log.info("start mix","".concat(this.mixNode.width,"x").concat(this.mixNode.height))}a.connect(this.destination)}return this.log.info("update ".concat(this._use2d?"2d":"webgl")),this._setMainOutput(this.videoContext.canvas)})}clearLastFrame(){var A;this.destination&&((A=this.destination.ctx2d)==null||A.clearRect(0,0,this.destination.width,this.destination.height))}changeInput(A){var e,o,n,a,I;if(A instanceof Nm)return this.log.info("change screen input",(e=A.mediaTrack)==null?void 0:e.label),this.setScreenTrack(A);if(A instanceof Ru)return this.log.info("change video input",(o=A.mediaTrack)==null?void 0:o.label),this.setCameraTrack(A);if(A instanceof tG){this.log.info("change remote input",(n=A.mediaTrack)==null?void 0:n.label);let c=A.mediaTrack;return A.setOutputMediaStreamTrack(c)}if(A instanceof Fq)return this.log.info("change mix input",(a=A.outMediaTrack)==null?void 0:a.label),this.setMixTrack(A);this.log.warn("change unknown input",(I=A.mediaTrack)==null?void 0:I.label)}removeInput(A){var e;A instanceof Nm?((e=this.screenNode)==null||e.close(),delete this.screenNode,delete this.screenTrack,this.update()):A instanceof Ru?this._isMixScreen?(delete this.cameraNode,this.cameraTrack._inputTrack=null,this.update()):(this.clear(),delete this.cameraTrack,this.smallImageSource&&(this.smallImageSource.close(),delete this.smallImageSource),this.smallTrackSource&&(this.smallTrackSource.close(),delete this.smallTrackSource)):A instanceof tG?A.source&&A.source.context.destroy():A instanceof Fq&&(delete this.mixTrack,this.update())}setMixTrack(A){this.mixTrack=A}setCameraTrack(A){return this.cameraTrack=A,this.update(!0)}setScreenTrack(A){return DA(this,null,function*(){return this.screenTrack=A,this._isMixScreen&&(this.screenNode?this.screenNode.replaceTrack(A.mediaTrack):yield this.update()),A.setOutputMediaStreamTrack(A.mediaTrack)})}getWatermarkImage(A,e){return DA(this,null,function*(){let o=document.createElement("canvas");e&&A&&(o.height=e,o.width=A);let n=o.getContext("2d");if(!n)throw new Ct({code:Ge.NOT_SUPPORTED,message:"Make image failed because of canvas context is null"});return this.watermarkImageList.sort((a,I)=>a.zIndex-I.zIndex),this.watermarkImageList.forEach(a=>{let{image:I,x:c,y:u,width:d,height:R,fillVideo:k}=a,_=k&&A||d,Z=k&&e||R,iA=k?0:c,cA=k?0:u;n.drawImage(I,iA,cA,_,Z)}),Vf(o.toDataURL())})}pushWaterMarkImageList(A){let{type:e}=A;this.watermarkImageList.some(o=>o.imageUrl===A.imageUrl&&o.height===A.height&&o.width===A.width&&o.x===A.x&&o.y===A.y&&o.type===A.type&&o.zIndex===A.zIndex&&o.fillVideo===A.fillVideo)||((e==="mute"||e==="watermark")&&(this.watermarkImageList=this.watermarkImageList.filter(o=>o.type!==e)),this.watermarkImageList.push(A))}setBeautyParams(A){return DA(this,null,function*(){this._beautyParams=A,this.update()})}stopBeauty(){return DA(this,null,function*(){this._beautyParams=void 0,this.update()})}setWatermark(A){return DA(this,null,function*(){let e;try{e=yield Vf(A?.imageElement||A.imageUrl)}catch{throw new Ct({code:Ge.INVALID_PARAMETER,message:"load image failed, url: ".concat(A.imageUrl)})}let{x:o=0,y:n=0,width:a=e.width,height:I=e.height,type:c="watermark",zIndex:u=2,fillVideo:d=!1}=A;this.watermarkImageList.some(R=>R.type===c)?(this.watermarkImageList=this.watermarkImageList.filter(R=>R.type!==c),this.pushWaterMarkImageList({x:o,y:n,width:a,height:I,image:e,zIndex:u,type:c,imageUrl:A.imageUrl,fillVideo:d}),e=yield this.getWatermarkImage(this.cameraResolution.width,this.cameraResolution.height),this._waterMarkOption={x:0,y:0,width:e.width,height:e.height,image:e},this.waterMarkNode?(this.waterMarkNode.x=0,this.waterMarkNode.y=0,this.waterMarkNode.resize(e.width,e.height),this.waterMarkNode.image=e):this.update()):(this.pushWaterMarkImageList({x:o,y:n,width:a,height:I,image:e,zIndex:u,type:c,imageUrl:A.imageUrl,fillVideo:d}),yield this.freshWatermark()),this.log.info("set watermark",JSON.stringify(this.watermarkImageList,(R,k)=>R==="imageUrl"?void 0:k))})}deleteWatermark(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"watermark";return DA(this,null,function*(){this.watermarkImageList=this.watermarkImageList.filter(e=>e.type!==A),this.log.info("delete watermark",A,JSON.stringify(this.watermarkImageList,(e,o)=>e==="imageUrl"?void 0:o)),yield this.freshWatermark()})}freshWatermark(){return DA(this,null,function*(){var A;(A=this.waterMarkNode)==null||A.close(),delete this.waterMarkNode,delete this._waterMarkOption;let{width:e,height:o}=this.cameraResolution,n=yield this.getWatermarkImage(e,o);this._waterMarkOption={x:0,y:0,width:n.width,height:n.height,image:n},this.update()})}setVirtualBackground(A){return DA(this,null,function*(){var e,o,n;if(A){if(A.onAbort&&(this._virtualBackgroundAbortCallback=A.onAbort),this._use2d&&!this._autoSwitchRenderMode)return Promise.reject(new Error("not support virtual background in 2d mode"));this._bgAssetPath=A.assetPath,A.type==="image"?this._virtualBackground=yield Vf(A.imageUrl):(this.blurRadius=A.blurLevel||this.blurRadius||3,this._virtualBackground=A.type),this._enableFaceCentering=(e=A.enableFaceCentering)!=null?e:this._enableFaceCentering,this._enableEffectOptimization=(o=A.enableEffectOptimization)!=null?o:this._enableEffectOptimization,this._color=(n=A.color)!=null?n:[0,1,0]}else delete this._virtualBackground,delete this._virtualBackgroundAbortCallback;if(this.log.info("".concat(this._virtualBackground?"start":"stop"," virtual background, ").concat(A?.type||"",", ").concat(this.blurRadius||"")),yield this.update(),this._virtualBackground&&!this._glVideoContext.available)throw new Ct({code:Ge.INVALID_OPERATION,message:"webgl context create failed, ".concat(this._glVideoContext.error)})})}get mixScreen(){return this._isMixScreen}set mixScreen(A){var e;this._isMixScreen=A,this._isMixScreen||((e=this.screenNode)==null||e.close(),delete this.screenNode),this.update()}set mirror(A){var e;this._isMirror!==A&&(this._isMirror=A,this._isTransform||((e=this.transformNode)==null||e.close(),delete this.transformNode),this.update())}get mirror(){return this._isMirror}set rotation(A){var e;this._rotation!==A&&(this._rotation=A,this._isTransform||((e=this.transformNode)==null||e.close(),delete this.transformNode),this.update())}get rotation(){return this._rotation}enableAr(A){this.arTrack=A,this.isUsingArTrack=!0,this.update()}updateAr(){return DA(this,null,function*(){var A;(A=this.cameraTrack)!=null&&A.mediaTrack&&(yield this.virtualBackgroundInstance.ar.updateInputTrack(this.cameraTrack.mediaTrack.clone()))})}disableAr(){var A;this.isUsingArTrack=!1,(A=this.arTrack)==null||A.stop(),this.arTrack=void 0,this.update()}createDecodeContext(A){return new RtA(A)}clear(){var A,e;(A=this.videoContext)==null||A.disconnect(),(e=this.destination)==null||e.removeAllListeners(),delete this.destination,delete this.cameraNode,delete this.transformNode,delete this.screenNode,delete this.waterMarkNode}addEncodeProcessor(A){let{processor:e,type:o}=A;var n;this.encodePipeline.includes(e)||(this.encodePipeline[o]=e,(n=this.room)==null||n.enableInsertableStreams())}addDecodeProcessor(A){let{processor:e,type:o}=A;var n;this.decodePipeline.includes(e)||(this.decodePipeline[o]=e,(n=this.room)==null||n.enableInsertableStreams())}removeEncodeProcessor(A){let{type:e}=A;this.encodePipeline[e]=void 0}removeDecodeProcessor(A){let{type:e}=A;this.decodePipeline[e]=void 0}};vt([wW(function(A){this.log.error("update failed",A)}),Dn(A=>function(){for(var e=arguments.length,o=new Array(e),n=0;n{A.apply(this,o).then(a,I),setTimeout(I,5e3,new Ct({code:Ge.API_CALL_TIMEOUT,message:"update timeout"}))}),this._updateFlag=!1,yield this.updated)})})],sz.prototype,"update");var MtA=0,wtA=class extends Uo{constructor(A){super("room"),G(this,"seq",++MtA),G(this,"sdkAppId"),G(this,"userId"),G(this,"userSig"),G(this,"privateMapKey"),G(this,"latencyLevel"),G(this,"tinyId"),G(this,"scene"),G(this,"roomId"),G(this,"useStringRoomId"),G(this,"role","anchor"),G(this,"joinParams",null),G(this,"localPublishFlag",0),G(this,"localTracks",new Set),G(this,"enableAutoPlayDialog",!0),G(this,"autoReceiveAudio",!0),G(this,"autoReceiveVideo",!0),G(this,"proxy_ws"),G(this,"proxy_wt"),G(this,"proxy_unified"),G(this,"checkSystemResult",{result:!0,detail:{isBrowserSupported:!0,isWebRTCSupported:!0,isWebCodecsSupported:!0,isMediaDevicesSupported:!0,isScreenShareSupported:!0,isSmallStreamSupported:!0,isH264EncodeSupported:!0,isVp8EncodeSupported:!0,isH264DecodeSupported:!0,isVp8DecodeSupported:!0,isH265EncodeSupported:!0,isH265DecodeSupported:!0}}),G(this,"keyPointManager"),G(this,"audioManager"),G(this,"videoManager"),G(this,"callDurationCalculator"),G(this,"badCaseDetector"),G(this,"scheduleResult",{domains:null,iceServers:null,iceTransportPolicy:null,trtcAutoConf:null}),G(this,"videoDecodeFallbackType"),G(this,"smallMode","canvas"),G(this,"prelinkPromise",null),G(this,"enableChorus",!1),G(this,"_isUsingCachedSchedule",!1),G(this,"_log"),G(this,"_joinedTimestamp",0),G(this,"_sdkType"),G(this,"heartbeatReport"),G(this,"heartbeatCount",0),G(this,"quality"),G(this,"enableSEI"),G(this,"isDestroyed",!1),this._log=nA.createLogger({parent:A.logger,id:"r".concat(this.seq)}),this.useStringRoomId=!!A.useStringRoomId,rn(A.autoReceiveAudio)&&(this.autoReceiveAudio=A.autoReceiveAudio),rn(A.autoReceiveVideo)&&(this.autoReceiveVideo=A.autoReceiveVideo),rn(A.enableAutoPlayDialog)&&(this.enableAutoPlayDialog=A.enableAutoPlayDialog),this._sdkType=A.sdkType,this.keyPointManager=new utA({room:this,frameWorkType:A.frameWorkType,component:A.component,language:A.language}),this.callDurationCalculator=new QtA({room:this}),this.badCaseDetector=new htA({room:this}),this.audioManager=new ieA(this),this.videoManager=new sz(this)}get videoCodec(){return"h264"}get scriptTransformWorker(){}get isMainStreamPublished(){for(let A of this.localTracks)if(4&A.mediaType)return!0;return!1}get isAuxStreamPublished(){for(let A of this.localTracks)if(2&A.mediaType)return!0;return!1}get hasAuxStream(){for(let A of this.remotePublishedUserMap.values())if(A.muteState.hasAuxiliary)return!0;return this.isAuxStreamPublished}get localMainAudioTrack(){for(let A of this.localTracks)if(1&A.mediaType)return A;return null}get localMainVideoTrack(){for(let A of this.localTracks)if(4&A.mediaType)return A;return null}get localAuxVideoTrack(){for(let A of this.localTracks)if(2&A.mediaType)return A;return null}get publishState(){let A={audio:!1,bigVideo:!1,smallVideo:!1,auxVideo:!1};return this.localTracks.forEach(e=>{if(e.isPublished||e.isPublishing)switch(e.mediaType){case 1:A.audio=!0;break;case 4:A.bigVideo=!0,A.smallVideo=e.hasSmall;break;case 2:A.auxVideo=!0}}),A}get muteState(){var A,e,o;return{audio:!((A=this.localMainAudioTrack)==null||!A.muted),bigVideo:!((e=this.localMainVideoTrack)==null||!e.muted),auxVideo:!((o=this.localAuxVideoTrack)==null||!o.muted)}}getLogger(){return this._log}get isJoining(){return this.state.toString()==="joining"}get isJoined(){return this.state==="joined"}get isLeft(){return this.state==="left"}addTrack(A){return DA(this,null,function*(){return this.publish(A)})}removeTrack(A){return DA(this,null,function*(){return this.unpublish(A)})}replaceTrack(A){return DA(this,null,function*(){})}setEncodedDataProcessingListener(A){throw new Error("Method not implemented.")}enableAIVoice(A){throw new Error("Method not implemented.")}setProxyServer(A){if(Sr(A))/^wss?:\/\//i.test(A)?this.proxy_ws=A:/^https?:\/\//i.test(A)&&(this.proxy_wt=A);else if(Cc(A)){let{websocketProxy:e,webtransportProxy:o,loggerProxy:n,scheduleProxy:a,unifiedProxy:I}=A;this.proxy_ws=e,this.proxy_wt=o,this.proxy_unified=I,I?(Pq([I,I]),wf("https://".concat(I))):(n&&wf(n),a&&Pq(a))}S.once(K.JOIN_RECEIVED_CMD_RES,()=>this.sendAbilityStatus({sched_domain:jQ.main,sched_back_domain:jQ.backup,signal_domain:this.proxy_ws||this.proxy_wt||""}))}getRemoteAudioStats(){return DA(this,null,function*(){let A={};return this.remotePublishedUserMap.forEach(e=>{A[e.userId]=e.remoteAudioTrack.stat}),A})}getTransportStats(){return DA(this,null,function*(){var A;let e={rtt:((A=this.quality)==null?void 0:A.uplinkRTT)||0,downlinksRTT:{}};if(this.quality)for(let o of this.quality.downlinkInfo)e.downlinksRTT[o.userId]=o.rtt;return e})}getRemoteVideoStats(){return DA(this,arguments,function(){var A=this;let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"main";return function*(){let o={};return A.remotePublishedUserMap.forEach(n=>{let a=e==="auxiliary"?n.remoteAuxiliaryTrack:n.remoteVideoTrack;o[n.userId]=a.stat}),o}()})}checkDestroy(){if(this.isDestroyed)throw new Ct({code:Ge.INVALID_OPERATION,message:Wi({key:Mi.CLIENT_DESTROYED,data:{funName:"join"}})})}destroy(){if(this.isJoined)throw this._log.warn(ts.INVALID_DESTROY),new Ct({code:Ge.INVALID_OPERATION,message:Wi({key:Mi.INVALID_DESTROY})});this._log.info("destroy room"),this.audioManager.destroy(),this.videoManager.destroy(),this.keyPointManager.destroy(),this.callDurationCalculator.destroy(),this.badCaseDetector.destroy(),this.isDestroyed=!0,S.emit(K.ROOM_DESTROY,{room:this})}schedule(A,e){return DA(this,null,function*(){var o,n,a,I;let c=ki();try{let{isCached:u,result:d,detailCost:R}=yield m4({userId:this.userId,sdkAppId:this.sdkAppId,roomId:this.useStringRoomId?A.strRoomId:A.roomId,useStringRoomId:this.useStringRoomId,version:il,userSig:this.userSig,role:this.scene==="live"?A.role:void 0,frameWorkType:e,latencyLevel:A.latencyLevel});this._isUsingCachedSchedule=u,this._log.info("schedule cache:".concat(+u," ").concat(nl(d,{keysToExclude:["username","credential"]}))),u&&S.once(K.JOIN_RECEIVED_CMD_RES,()=>this.sendAbilityStatus({scheduleCache:1})),this.scheduleResult=bt(bt({},this.scheduleResult),d),hr((o=d.config)==null?void 0:o.retryCount)&&bR(d.config.retryCount),Sr((n=d.config)==null?void 0:n.loggerDomain)&&wf(d.config.loggerDomain),this.videoDecodeFallbackType=((a=d.config)==null?void 0:a.videoDecodeFallback)||this.videoDecodeFallbackType,this.smallMode=((I=d.config)==null?void 0:I.smallMode)||this.smallMode,S.emit(K.JOIN_SCHEDULE_SUCCESS,{room:this,schedule:this.scheduleResult,detailCost:R}),ct.addSuccessEvent({key:521700,cost:ki()-c})}catch(u){throw ct.addFailedEvent({key:521700,error:u}),u}})}sendAbilityStatus(A){}enableInsertableStreams(){return Promise.resolve()}switchRoom(A){return Promise.reject()}isSwitchRoomSupported(){return!1}prelink(A,e,o,n,a,I){return DA(this,null,function*(){return Promise.resolve()})}closePrelink(){return DA(this,null,function*(){return Promise.resolve()})}},StA=es(hg()),gz=es(cN());function Iz(A){var e;let o=[];for(let n=0;nI.payload===A.rtp[n].payload)[0];o.push({payload:A.rtp[n].payload,codec:A.rtp[n].codec,fmtp:a?a.config:"",rate:A.rtp[n].rate,rtx:((e=A.rtp[n+1])==null?void 0:e.codec)==="rtx"?A.rtp[n+1].payload:0,rtcpfb:(A?.rtcpFb||[]).filter(I=>I.payload===A.rtp[n].payload).map(I=>{let{type:c,subtype:u}=I;return{id:c,params:u?[u]:[]}})})}return o}var vtA=(A,e,o)=>DA(null,null,function*(){var n;let a=rs(A),I={ice:{ufrag:"",password:""},dtls:{hash:"",fingerprint:"",setup:""},audio:{codecs:[],extensions:[]},video:{codecs:[],decoders:[],extensions:[]},useDataChannel:o};I.ice.ufrag=String(a.media[0].iceUfrag),I.ice.password=a.media[0].icePwd||"",a.fingerprint&&(I.dtls.hash=a.fingerprint.type,I.dtls.fingerprint=a.fingerprint.hash,I.dtls.setup=a.setup||""),a.media[0].fingerprint&&(I.dtls.hash=a.media[0].fingerprint.type,I.dtls.fingerprint=a.media[0].fingerprint.hash),I.dtls.setup=a.media[0].setup||"";let c=a.media[0],u=a.media[1];c.ext&&(I.audio.extensions=c.ext.map(R=>({id:R.value,uri:R.uri}))),u.ext&&(I.video.extensions=u.ext.map(R=>({id:R.value,uri:R.uri})));for(let R of c.rtp){if(R.codec!=="opus")continue;let k=c.fmtp.find(Z=>Z.payload===R.payload);if(!k)continue;let _={codec:R.codec,fmtp:k.config,payload:k.payload,rate:R.rate,channels:R.encoding,rtcpfb:[],rtx:0};(n=c.rtcpFb)==null||n.forEach(Z=>{let{payload:iA,type:cA,subtype:TA}=Z;if(iA===_.payload){let JA={id:cA,params:[]};TA&&JA.params.push(TA),_.rtcpfb.push(JA)}}),I.audio.codecs.push(_);break}let d=["h264","vp8","h265"];return e&&d.shift(),I.video.codecs=[...Iz(u)].filter(R=>d.includes(R.codec.toLocaleLowerCase())),I.video.decoders=(yield function(){return DA(this,null,function*(){let R=new RTCPeerConnection;R.addTransceiver(fA.VIDEO,{direction:fA.TRANSCEIVER_DIRECTION_RECVONLY});let k=yield R.createOffer();if(!k.sdp)return[];let _=Iz(rs(k.sdp).media[0]);return R.close(),_})}()).filter(R=>["h264","vp8","h265"].includes(R.codec.toLocaleLowerCase())),I}),cz=(A,e)=>{let o=(A||"").trim(),n=(e||"").trim(),a="profile-level-id",I="".concat(a,"=[0-9a-fA-F]{6}");if(new RegExp(I).test(o)){let u=new RegExp(I,"g");return o.replace(u,"".concat(a,"=").concat(n))}if(!o)return"".concat(a,"=").concat(n);let c=o.endsWith(";")?"":";";return"".concat(o).concat(c).concat(a,"=").concat(n)},NtA=A=>{let{serverAbility:e,clientAbility:o,offerSDP:n,enableCustomMessage:a,profileLevelIdConfig:I}=A,c=rs(n),u={extmapAllowMixed:"extmap-allow-mixed",groups:c.groups,icelite:"ice-lite",media:[],msidSemantic:{semantic:"",token:"WMS"},name:"-",origin:{address:"127.0.0.1",username:"-",sessionId:String(Date.now()),sessionVersion:1,netType:"IN",ipVer:4},timing:{start:0,stop:0},version:0},d={candidates:e.candidates.map(k=>({component:1,foundation:"1",generation:0,ip:k.ip,port:k.port,priority:k.priority,transport:k.foundation,type:k.type})),connection:{version:4,ip:"0.0.0.0"},direction:fA.TRANSCEIVER_DIRECTION_RECVONLY,ext:e.audio.extensions.map(k=>({value:k.id,uri:k.uri})),fingerprint:{type:e.dtls.hash,hash:e.dtls.fingerprint},fmtp:[{payload:e.audio.codecs[0].payload,config:e.audio.codecs[0].fmtp}],icePwd:e.ice.password,iceUfrag:e.ice.ufrag,mid:"0",payloads:String(e.audio.codecs[0].payload),port:c.media[0].port,protocol:c.media[0].protocol,type:fA.AUDIO,setup:e.dtls.setup,rtcpFb:e.audio.codecs[0].rtcpfb.map(k=>({payload:e.audio.codecs[0].payload,type:k.id,subtype:k.params[0]})),rtcpMux:"rtcp-mux",rtcpRsize:"rtcp-rsize",rtp:[{payload:e.audio.codecs[0].payload,codec:e.audio.codecs[0].codec,rate:e.audio.codecs[0].rate,encoding:e.audio.codecs[0].channels}]};u.media.push(d);let R=[I?.big,I?.small,I?.aux];return[1,2,3].forEach((k,_)=>{u.media.push(Ez({mid:k,serverAbility:e,clientAbility:o,parsedOffer:c,profileLevelId:R[_]}))}),a&&u.media.push(c.media.find(k=>k.mid==="dc")),$h(u)},Ez=A=>{let{mid:e,serverAbility:o,clientAbility:n,parsedOffer:a,isDownlink:I=!1,profileLevelId:c}=A,u={candidates:o.candidates.map(d=>({component:1,foundation:"1",generation:0,ip:d.ip,port:d.port,priority:d.priority,transport:d.foundation,type:d.type})),connection:{version:4,ip:"0.0.0.0"},direction:fA.TRANSCEIVER_DIRECTION_RECVONLY,ext:o.video.extensions.map(d=>({value:d.id,uri:d.uri})),fingerprint:{type:o.dtls.hash,hash:o.dtls.fingerprint},fmtp:[],icePwd:o.ice.password,iceUfrag:o.ice.ufrag,mid:String(e),payloads:"",port:a.media[0].port,protocol:a.media[0].protocol,type:fA.VIDEO,setup:o.dtls.setup,rtcpFb:[],rtcpMux:"rtcp-mux",rtcpRsize:"rtcp-rsize",rtp:[]};if(I){let d=o.video.decoders;(!d||d.length===0)&&(d=o.video.codecs),(!d||d.length===0)&&(d=n.video.decoders),d.forEach(R=>{HM(u,R)})}else{let d;d=o.useH265?o.video.codecs.findIndex(k=>k.codec.toLowerCase()==="h265"):o.video.codecs.findIndex(k=>k.codec.toLowerCase()===(o.useVp8?"vp8":"h264"));let R=o.video.codecs[d]||n.video.codecs[0];HM(u,R)}if(!I&&c){let d=u.fmtp,R=u.rtp.find(k=>{var _;return((_=k.codec)==null?void 0:_.toLowerCase())==="h264"});if(R){let k=d.find(_=>String(_.payload)===String(R.payload));k&&(k.config=cz(k.config,c))}}return u},HM=(A,e)=>{A.payloads="".concat(A.payloads," ").concat(e.payload).trim(),A.fmtp.push({payload:e.payload,config:e.fmtp}),A.rtcpFb=[...A.rtcpFb||[],...e.rtcpfb.map(o=>({payload:e.payload,type:o.id,subtype:o.params[0]}))],A.rtp.push({payload:e.payload,codec:e.codec.toUpperCase(),rate:e.rate}),e.rtx&&(A.payloads="".concat(A.payloads," ").concat(e.rtx),A.fmtp.push({payload:e.rtx,config:"apt=".concat(e.payload)}),A.rtp.push({payload:e.rtx,codec:"rtx",rate:e.rate}))},TtA=(A,e,o)=>{let n=gz.default.parse(A);return n.media.forEach((a,I)=>{var c;if((a.type===fA.AUDIO||a.type===fA.VIDEO)&&(function(u){if(!u.rtcpFb)return;let d=[];u.rtcpFb.forEach((R,k)=>{var _;d.push(R),u.rtcpFb&&((_=u.rtcpFb[k+1])==null?void 0:_.payload)!==R.payload&&R.type!=="rrtr"&&d.push({payload:R.payload,type:"rrtr"})}),u.rtcpFb=d}(a),function(u){u.type===fA.VIDEO&&u.fmtp&&u.fmtp.forEach(d=>{d.config.includes("apt")||(d.config+=";sps-pps-idr-in-keyframe=1")})}(a),function(u){u.type===fA.AUDIO&&u.fmtp&&u.fmtp.forEach(d=>{d.config+=";sprop-stereo=1;stereo=1"})}(a),function(u){let d=new Set(["urn:ietf:params:rtp-hdrext:sdes:mid","urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id","urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id"]);u.ext&&(u.ext=u.ext.filter(R=>!d.has(R.uri)))}(a),a.type===fA.VIDEO)){if(I<4)a.payloads="",a.fmtp=[],a.rtp=[],a.rtcpFb=[],e.video.codecs.forEach(u=>HM(a,u));else if(o){a.payloads="",a.fmtp=[],a.rtp=[],a.rtcpFb=[];let u=o.video.decoders;(!u||u.length===0)&&(u=o.video.codecs),(!u||u.length===0)&&(u=e.video.decoders),u.forEach(d=>HM(a,d))}}(c=a.payloads)!=null&&c.includes("datachannel")&&n.groups&&a.mid&&(n.groups[0].mids=n.groups[0].mids.replace(a.mid,"dc"),a.mid="dc")}),gz.default.write(n)};function EK(A){var e,o;let n=/profile-level-id=([0-9a-fA-F]{6})/.exec(A);return(o=(e=n?.[1])==null?void 0:e.toLowerCase())!=null?o:null}function lK(A){let e=A.toLowerCase();if(!/^[0-9a-f]{6}$/.test(e))return"unknown";let o=parseInt(e.slice(0,2),16);return o===66?"baseline":o===77?"main":o===100?"high":"unknown"}function lz(A,e){if(!e)return"";let o=A.trim().toLowerCase().replace(/_/g,"-");if(!o)return"";if(/^[0-9a-f]{6}$/.test(o))return o;if(o!=="baseline"&&o!=="main"&&o!=="high")return"";for(let n of e.video.codecs){let a=EK(n.fmtp);if(a&&lK(a)===o)return a}return""}var GtA=es(hg()),Cz=class extends GtA.EventEmitter{constructor(A){super(),this.room=A,G(this,"mainFpsHealth",1),G(this,"mainBitrateHealth",1),G(this,"badMainBitrateHealthCount",0),G(this,"lastEmitBadHealthTime",0),G(this,"log"),!ra&&Bc&&S.on("262",this.onVideoCodecChanged,this),this.log=A.getLogger().createChild({id:"h-d"})}onVideoCodecChanged(A){let{remoteUserId:e,streamType:o,isHWCodec:n,codec:a}=A;if(!e&&o!==7&&a==="h264"){if(!n)return void this.room.off("heartbeat-report",this.onHeartbeatReport,this);this.room.listeners("heartbeat-report").includes(this.onHeartbeatReport)||this.room.on("heartbeat-report",this.onHeartbeatReport,this)}}onHeartbeatReport(A){Date.now()-this.lastEmitBadHealthTime<3e4||(A.msg_up_stream_info.msg_video_status.forEach(e=>{if(e.uint32_video_enc_fps&&e.uint32_video_capture_fps){let o=e.uint32_video_enc_fps/e.uint32_video_capture_fps;e.uint32_video_stream_type===2&&(this.mainFpsHealth=o)}if(e.uint32_video_codec_bitrate&&e.uint32_video_stream_type===2){let{localMainVideoTrack:o}=this.room;o&&(this.mainBitrateHealth=e.uint32_video_codec_bitrate/1e3/o.profile.bitrate)}}),this.log.debug("mainBitrateHealth: ".concat(this.mainBitrateHealth," mainFpsHealth: ").concat(this.mainFpsHealth)),this.mainBitrateHealth>.5&&(this.badMainBitrateHealthCount=0),this.mainFpsHealth>.9&&this.mainBitrateHealth<.5&&(this.badMainBitrateHealthCount++,this.badMainBitrateHealthCount>3&&(this.badMainBitrateHealthCount=0,this.lastEmitBadHealthTime=Date.now(),this.log.warn("bad main bitrate health: ".concat(this.mainBitrateHealth)),this.emit("1",{isAux:!1}))))}destroy(){S.off("262",this.onVideoCodecChanged,this),this.room.off("heartbeat-report",this.onHeartbeatReport,this)}};G(Cz,"EVENT_BAD_HEALTH","bad_health");var ktA=Cz,VM=(A=>(A.TRACK="track",A.DATA_CHANNEL_MESSAGE="data_channel_msg",A[A.CONNECTION_STATE_CHANGED="connection-state-changed"]="CONNECTION_STATE_CHANGED",A[A.FIREWALL_RESTRICTION="firewall-restriction"]="FIREWALL_RESTRICTION",A.RECONNECTED="spc-reconnected",A.RECONNECT_FAILED="spc-reconnect-failed",A.ERROR="error",A.SEI_MESSAGE="sei-message",A.DUMP="dump",A))(VM||{}),_tA=1,Ap=class extends StA.default{constructor(A){let{signalChannel:e,room:o,enableDataChannel:n}=A;super(),G(this,"stat",{iceStartTime:0,iceEndTime:0,dtlsStartTime:0,dtlsEndTime:0,peerConnectionStartTime:0,peerConnectionEndTime:0}),G(this,"isDestroyed",!1),G(this,"currentState","DISCONNECTED"),G(this,"_room"),G(this,"_signalChannel"),G(this,"_peerConnection",null),G(this,"_datachannel",null),G(this,"_enableDataChannel"),G(this,"_log"),G(this,"_downlinkMIDMap",new Map),G(this,"_downlinkMIDUserIDMap",new Map),G(this,"_reconnectionTimer",-1),G(this,"reconnectionCount",0),G(this,"clientAbility"),G(this,"_serverAbility",null),G(this,"addDownlinkQueue",new Set),G(this,"removeDownlinkQueue",new Set),G(this,"_parsedAnswer",null),G(this,"_updateSDPPromise",null),G(this,"_waitForPCConnectedPromise"),G(this,"clearWaitForConnectedPromise"),G(this,"clearConnectTimeout"),G(this,"_isSDPLogged",!1),G(this,"enableInsertableStreams",!1),G(this,"insertableStreamsAbortMap",new Map),G(this,"receiverRemoteTrackMap",new WeakMap),G(this,"scriptTransformWorker"),G(this,"_isRelayTried",!1),G(this,"_rttOverCount",0),G(this,"originOffer",null),G(this,"autoSubscribedSsrcGroups",new Map),G(this,"autoSubscribedUserMap",new Map),G(this,"_h265DecodeFailed",!1),this._room=o,this._enableDataChannel=n,this._signalChannel=e,this._log=nA.createLogger({parent:this._room.getLogger(),id:"spc".concat(_tA++),userId:this._room.userId,sdkAppId:this._room.sdkAppId}),this._room.enableCodecPipeline&&(xQ?this.enableInsertableStreams=!0:this.initScriptTransformWorker()),this._room.healthDetector.on("1",this.onBadHealth,this)}get isH264EncodeSupported(){let A=this._room.checkSystemResult.detail.isH264EncodeSupported;return this._serverAbility&&(A=A&&!!this._serverAbility.video.codecs.find(e=>e.codec.toLowerCase()==="h264")),A}addAbortController(A,e){var o;(o=this.insertableStreamsAbortMap.get(A))==null||o.abort("destroy"),this.insertableStreamsAbortMap.set(A,e)}get isVP8EncodeSupported(){let A=this._room.checkSystemResult.detail.isVp8EncodeSupported;return this._serverAbility&&(A=A&&this._serverAbility.video.codecs.find(e=>e.codec.toLowerCase()==="vp8")),A}get isH265EncodeSupported(){let A=this._room.checkSystemResult.detail.isH265EncodeSupported;return this._serverAbility&&(A=A&&!!this._serverAbility.video.codecs.find(e=>e.codec.toLowerCase()==="h265")),A}get videoCodec(){var A,e,o;let n=(A=this._parsedAnswer)==null?void 0:A.media[1].rtp.find(a=>["h264","vp8","h265"].includes(a.codec.toLowerCase()));return n?n.codec.toLowerCase():(e=this._serverAbility)!=null&&e.useH265?"h265":(o=this._serverAbility)!=null&&o.useVp8?"vp8":"h264"}get downlinkVideoCodec(){var A,e,o;return(A=this._serverAbility)!=null&&A.useH265&&(e=this._serverAbility)!=null&&e.video.decoders.find(n=>n.codec.toLowerCase()==="h265")&&!this._h265DecodeFailed?"h265":(o=this._serverAbility)!=null&&o.video.decoders.find(n=>n.codec.toLowerCase()==="h264")?"h264":"vp8"}get isUsingH264(){return this.videoCodec==="h264"}get isUsingH265(){return this.videoCodec==="h265"}get isUsingVP8(){return this.videoCodec==="vp8"}get is42001fSupported(){return!!this.clientAbility&&!!this.clientAbility.video.codecs.find(A=>A.fmtp.includes("42001f"))}isProfileLevelIdSupported(A){return!!this.clientAbility&&!!this.clientAbility.video.codecs.find(e=>e.fmtp.includes(A))}get uplinkSSRC(){return this._peerConnection&&this._peerConnection.localDescription?(A=>{let e=rs(A),o={audioSsrc:0,audioRtxSsrc:0,bigVideoSsrc:0,bigVideoRtxSsrc:0,smallVideoSsrc:0,smallVideoRtxSsrc:0,auxVideoSsrc:0,auxVideoRtxSsrc:0};return e.media.forEach((n,a)=>{var I;if(n.ssrcs&&!Ee(n.ssrcs[0].id)){let c=Number(n.ssrcs[0].id),u=Number((I=n.ssrcs.filter(d=>d.attribute==="cname")[1])==null?void 0:I.id);switch(a){case 0:o.audioSsrc=c;break;case 1:o.bigVideoSsrc=c,o.bigVideoRtxSsrc=u;break;case 2:o.smallVideoSsrc=c,o.smallVideoRtxSsrc=u;break;case 3:o.auxVideoSsrc=c,o.auxVideoRtxSsrc=u}}}),o})(this._peerConnection.localDescription.sdp):{audioSsrc:0,audioRtxSsrc:0,bigVideoSsrc:0,bigVideoRtxSsrc:0,smallVideoSsrc:0,smallVideoRtxSsrc:0,auxVideoSsrc:0,auxVideoRtxSsrc:0}}onBadHealth(A){}initScriptTransformWorker(){MM&&(this.scriptTransformWorker=k4({videoEncodePipeline:this._room.videoManager.encodePipeline,videoDecodePipeline:this._room.videoManager.decodePipeline,audioEncodePipeline:this._room.audioManager.encodePipeline,audioDecodePipeline:this._room.audioManager.decodePipeline}),this.scriptTransformWorker.onmessage=A=>{A.data.type==="sei"?this.emit("sei-message",A.data):A.data.type,A.data.type==="dump"&&this.emit("dump",A.data)},this.scriptTransformWorker.onerror=A=>{this._log.error("scriptTransformWorker error: ",A.message)})}get isReconnecting(){return this.currentState==="RECONNECTING"||this._reconnectionTimer>0||this.reconnectionCount>0}get dtlsTransport(){if(!this._peerConnection)return null;let A=this._peerConnection.getSenders();return A.length===0?null:A[0].transport}getPeerConnectionConfig(A){var e;let o={encodedInsertableStreams:this.enableInsertableStreams,offerExtmapAllowMixed:!0,iceServers:A,iceTransportPolicy:this._room.getIceTransportPolicy(),sdpSemantics:this._room.sdpSemantics,bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",tcpCandidatePolicy:"disable",IceTransportsType:"nohost"},n=(e=this._peerConnection)==null?void 0:e.getConfiguration().encodedInsertableStreams;return NO(n)&&(o.encodedInsertableStreams=n),this._log.debug("getPeerConnectionConfig",JSON.stringify(o)),o}initialize(A){return DA(this,null,function*(){var e;let o;try{return this._peerConnection=new RTCPeerConnection(this.getPeerConnectionConfig(A)),this._peerConnection.oniceconnectionstatechange=()=>{if(!this._peerConnection)return;let n=this._peerConnection.iceConnectionState;this._log.debug("ice state: ".concat(n)),n==="checking"&&this.stat.iceStartTime===0?this.stat.iceStartTime=Date.now():n==="connected"&&this.stat.iceEndTime===0?(this.stat.iceEndTime=Date.now(),this._signalChannel.clearBakRelayIps(),ct.addSuccessEvent({key:521711,cost:this.stat.iceEndTime-this.stat.iceStartTime})):n==="failed"&&ct.addFailedEvent({key:521711})},this._peerConnection.onsignalingstatechange=()=>{var n;let a=((n=this._peerConnection)==null?void 0:n.signalingState)||"";this._log[a==="closed"?"debug":"info"]("signaling state: ".concat(a))},this._peerConnection.onconnectionstatechange=this.onConnectionStateChange.bind(this),this._peerConnection.ontrack=n=>this.emit("track",n),this._enableDataChannel&&(this._datachannel=this._peerConnection.createDataChannel("".concat(this._room.userId,"dc")),this._datachannel.binaryType="arraybuffer",this._datachannel.onopen=()=>{this._log.info("datachannel open")},this._datachannel.onclose=()=>{this._log.warn("datachannel close")},this._datachannel.onmessage=n=>{let a=new LtA(n.data);this.emit("data_channel_msg",{data:a})},this._datachannel.onerror=n=>{this._log.warn("datachannel error",n)}),this._peerConnection.addTransceiver(fA.AUDIO,{direction:fA.TRANSCEIVER_DIRECTION_SENDONLY}),this._peerConnection.addTransceiver(fA.VIDEO,{direction:fA.TRANSCEIVER_DIRECTION_SENDONLY}),this._peerConnection.addTransceiver(fA.VIDEO,{direction:fA.TRANSCEIVER_DIRECTION_SENDONLY}),this._peerConnection.addTransceiver(fA.VIDEO,{direction:fA.TRANSCEIVER_DIRECTION_SENDONLY}),o=yield this._peerConnection.createOffer(),this.clientAbility=yield vtA(o.sdp,((e=this._room.scheduleResult.config)==null?void 0:e.remove264FromSDP)||!1,this._enableDataChannel),this.originOffer=o,this.dtlsTransport&&(this.dtlsTransport.onstatechange=()=>{let{dtlsTransport:n}=this;n&&(this._log.debug("dtls state: ".concat(n.state)),n.state==="connecting"&&this.stat.dtlsStartTime===0?this.stat.dtlsStartTime=Date.now():n.state==="connected"&&this.stat.dtlsEndTime===0&&(this.stat.dtlsEndTime=Date.now()))}),ct.addSuccessEvent({key:521707}),this.clientAbility}catch(n){throw ct.addFailedEvent({key:521707,error:n}),this._log.error("initialize failed ".concat(n,` +offer: `).concat(o?.sdp)),n}})}setIceServers(A){return DA(this,null,function*(){var e;if(this._peerConnection&&A.length!==0)try{if(this._log.info("setIceServers",JSON.stringify(A,(o,n)=>o==="username"||o==="credential"?"hided":n)),this._peerConnection.setConfiguration(this.getPeerConnectionConfig(A)),(e=this._peerConnection)!=null&&e.localDescription||!this.originOffer)return void this._log.warn("setIceServers already has localDescription or no origin Offer");yield this.setOffer(this.originOffer)}catch(o){this._log.warn("setIceServers error ",o)}})}setPriority(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"high";if(this._peerConnection)try{this._peerConnection.getSenders().forEach(e=>{let o=e.getParameters();o.encodings[0]&&(o.encodings[0].priority=A,o.encodings[0].networkPriority=A,e.setParameters(o).catch(n=>{this._log.warn("setPriority error ",n)}))})}catch(e){this._log.warn("setPriority error ",e)}}connect(A){let e=arguments.length>1&&arguments[1]!==void 0&&arguments[1];return DA(this,null,function*(){var o,n,a;try{if(this.currentState==="CONNECTED")return;((o=this._peerConnection)==null||!o.localDescription)&&this.originOffer&&(yield this.setOffer(this.originOffer));let I=ki(),c=this.getProfileLevelIdConfig(),u={type:"answer",sdp:NtA({serverAbility:A,clientAbility:this.clientAbility,offerSDP:this._peerConnection.localDescription.sdp,enableCustomMessage:this._enableDataChannel,profileLevelIdConfig:c})};this._serverAbility=A,yield this.setAnswer(u),yield this.waitForPeerConnectionConnected(),this._room.firewallDetector.resetTimeoutCount();let d=((n=this._room.scheduleResult.config)==null?void 0:n.priority)||((a=this._room.joinParams)==null?void 0:a.priority)||new URLSearchParams(location.search).get("priority");d&&this.setPriority(d),e||ct.addSuccessEvent({key:521703,cost:ki()-I})}catch(I){let c=I instanceof Ct&&I.code===Ge.API_CALL_ABORTED;throw c||this._log.error("connect failed: ".concat(I),A),this.reset(),!c&&!this.isReconnecting&&!this.isDestroyed&&(ct.addFailedEvent({key:521703,error:I}),this.emitConnectionStateChangedEvent("DISCONNECTED"),this.startReconnection()),I}})}reconnect(){return DA(this,null,function*(){if(this._reconnectionTimer===-1){if(!this._signalChannel.isConnected)return this._log.warn("reconnect() wait signal channel is connected"),void this._signalChannel.once(gG,this.reconnect,this);try{this.reconnectionCount+=1,this._log.warn("reconnect() trying [".concat(this.reconnectionCount,"]")),this.reset();let A=this._signalChannel.getBackupRelayIpPair(),e=yield this.initialize(this._room.getIceServers(A!=null&&A.iceServer?[A.iceServer]:[])),o=bt({ability:e},A),n=yield this._signalChannel.sendWaitForResponse({command:etA,responseCommand:io.REBUILD_PEER_CONNECTION_RES,data:o,enableLog:!1});if(n.data.code!==0)throw new Ct({code:n.data.code,message:n.data.message});yield this.connect(n.data.data.ability,!0),ct.addSuccessEvent({key:521704}),this._log.warn("reconnect() success"),this.stopReconnection(),S.emit(K.SPC_RECONNECTED,{room:this._room}),this.emit("spc-reconnected")}catch(A){if(!this.isReconnecting||this.isDestroyed)return;if(A!=null&&A.message.includes("timeout")){let e=fQ(this.reconnectionCount);this._log.warn("reconnect() timeout, try again after ".concat(e/1e3,"s")),yield AC(e,o=>{this._reconnectionTimer=o}),this.clearReconnectionTimer(),yield this.reconnect()}else this._log.error("reconnect() failed ".concat(A?.code," ").concat(A)),ct.addFailedEvent({key:521704,error:A}),this.reconnectionCount>=Ch()&&this._log.warn("SDK has tried reconnect for ".concat(Ch()," times, but all failed, please check your network")),this.stopReconnection(),this.emitConnectionStateChangedEvent("DISCONNECTED"),this.emit("error")}}else this._log.warn("reconnect() is reconnecting, ignore current reconnection")})}getPeerConnection(){return this._peerConnection}startReconnection(){return DA(this,null,function*(){this.isReconnecting||(this._log.warn("start reconnect"),this._updateSDPPromise=null,this.emitConnectionStateChangedEvent("RECONNECTING"),yield this.reconnect())})}stopReconnection(){var A;this.isReconnecting&&(this._log.info("stop reconnect"),this.reconnectionCount=0,this.clearReconnectionTimer(),(A=this.clearConnectTimeout)==null||A.call(this),this._signalChannel.off(gG,this.reconnect,this),this.currentState==="RECONNECTING"&&this.emitConnectionStateChangedEvent("DISCONNECTED"))}checkPeerConnectionToReconnect(){var A;!this.isReconnecting&&((A=this._peerConnection)==null?void 0:A.connectionState)===hi.CLOSED&&this.startReconnection()}clearReconnectionTimer(){this._reconnectionTimer!==-1&&(clearTimeout(this._reconnectionTimer),this._reconnectionTimer=-1)}onConnectionStateChange(A){var e;let o=((e=this._peerConnection)==null?void 0:e.iceConnectionState)||"closed",n=this.getDTLSTransportState();this._log.info("connectionState: ".concat(A.target.connectionState," ICE: ").concat(o," DTLS: ").concat(n)),A.target.connectionState===hi.CONNECTING&&(this.stat.peerConnectionStartTime===0&&(this.stat.peerConnectionStartTime=Date.now()),this.emitConnectionStateChangedEvent("CONNECTING")),(A.target.connectionState===hi.FAILED||A.target.connectionState===hi.CLOSED)&&(this.emitConnectionStateChangedEvent("DISCONNECTED"),this._room.forceRelay?this.switchRelay(!1):this.startReconnection()),(A.target.connectionState===hi.CONNECTED||A.target.connectionState===hi.COMPLETED)&&(this.stat.peerConnectionEndTime===0&&(this.stat.peerConnectionEndTime=Date.now()),S.emit(K.SINGLE_CONNECTION_STAT,{room:this._room,stat:{ice:this.stat.iceEndTime-this.stat.iceStartTime,dtls:this.stat.dtlsEndTime-this.stat.dtlsStartTime,peerConnection:this.stat.peerConnectionEndTime-this.stat.peerConnectionStartTime}}),this.logSelectedCandidate(),this.emitConnectionStateChangedEvent("CONNECTED"))}getDTLSTransportState(){if(!this._peerConnection)return AB;let A=null;return AI()&&this._peerConnection.getSenders().length!==0?(A=this._peerConnection.getSenders()[0].transport,Ph()&&this._peerConnection.getReceivers().length!==0&&A?A.state:AB):AB}emitConnectionStateChangedEvent(A){A!==this.currentState&&(this.currentState==="RECONNECTING"&&A==="CONNECTING"||(this.emit(VM.CONNECTION_STATE_CHANGED,{prevState:this.currentState,state:A}),this.currentState=A))}logSelectedCandidate(){return DA(this,null,function*(){if(!this._peerConnection)return;let A=yield this._peerConnection.getStats();for(let[e,o]of A)if(Cm(o)){let n=A.get(o.localCandidateId),a=A.get(o.remoteCandidateId);n&&(this._log.info("local candidate: ".concat(n.candidateType," ").concat(n.protocol,":").concat(n.ip||n.address,":").concat(n.port," ").concat(n.networkType||""," ").concat(n.relayProtocol?"relayProtocol:".concat(n.relayProtocol," url: ").concat(n.url):"")),n.networkType&&KR(n.networkType)),a&&this._log.info("remote candidate: ".concat(a.candidateType," ").concat(a.protocol,":").concat(a.ip||a.address,":").concat(a.port));break}})}waitForPeerConnectionConnected(){return this._waitForPCConnectedPromise||(this._waitForPCConnectedPromise=new Promise((A,e)=>{if(this.currentState==="CONNECTED")return A();let o=c=>{c.state==="CONNECTED"&&(clearTimeout(I),a(),A())},n=c=>{let{room:u}=c;u===this._room&&(clearTimeout(I),a(),e(new Ct({code:Ge.API_CALL_ABORTED,message:Wi({key:Mi.CONNECTION_ABORTED,data:"leave room"})})))},a=()=>{S.off(K.LEAVE_SUCCESS,n,this),this.off(VM.CONNECTION_STATE_CHANGED,o,this)},I=setTimeout(()=>{a();let c=new Ct({code:Ge.API_CALL_TIMEOUT,message:"connection timeout"});this._room.firewallDetector.increaseTimeoutCount(),e(c)},yN);this.clearConnectTimeout=()=>{a(),clearTimeout(I),delete this.clearConnectTimeout},this.clearWaitForConnectedPromise=()=>{this._waitForPCConnectedPromise=null,e(new Ct({code:Ge.API_CALL_TIMEOUT,message:"connection timeout"}))},S.on(K.LEAVE_SUCCESS,n,this),this.on(VM.CONNECTION_STATE_CHANGED,o,this)}),this._waitForPCConnectedPromise=this._waitForPCConnectedPromise.finally(()=>{this._waitForPCConnectedPromise=null,delete this.clearConnectTimeout})),this._waitForPCConnectedPromise}waitForReconnected(){return this.isReconnecting?new Promise((A,e)=>{this.once("spc-reconnected",A),this.once("error",e)}):Promise.resolve()}addDownlink(A){return DA(this,null,function*(){if(this._log.info("addDownlink(".concat(A.userId,") trying")),this.isReconnecting&&(yield this.waitForReconnected()),this._updateSDPPromise&&(yield this._updateSDPPromise),this.updateLocalAndRemoteSDPConfig(A),this.addDownlinkQueue.size===0)try{yield this.updateSDP(),this._log.info("addDownlink(".concat(A.userId,") done"))}catch(e){this._log.error("addDownlink(".concat(A.userId,") failed ").concat(e)),yield this.startReconnection()}})}updateLocalAndRemoteSDPConfig(A){let{ssrc:e,userId:o,tinyId:n,prevMids:a}=A;if(!this._peerConnection)return;this._log.info("updateLocalAndRemoteSDPConfig ".concat(o," ").concat(JSON.stringify(e))),this._parsedAnswer||(this._parsedAnswer=rs(this._peerConnection.remoteDescription.sdp));let I,c,u,d=this._parsedAnswer.media.filter(_=>{var Z;return(Z=_.ssrcs)==null?void 0:Z.find(iA=>{var cA;return(cA=iA.value)==null?void 0:cA.includes(n)})});if(d.length===3)I=d[0],c=d[1],u=d[2];else{let _,Z=this._peerConnection.getTransceivers().slice(4);if(a?.length===3&&a.every(cA=>{var TA;return((TA=Z.find(JA=>Number(JA.mid)===cA))==null?void 0:TA.direction)==="inactive"})?(_=a,this._log.info("reusing previous mids for ".concat(o,": ").concat(_.join(","))),Z.forEach(cA=>{_.includes(Number(cA.mid))&&(cA.direction=fA.TRANSCEIVER_DIRECTION_RECVONLY)})):_=Z.filter(cA=>cA.direction==="inactive").slice(0,3).map(cA=>(cA.direction=fA.TRANSCEIVER_DIRECTION_RECVONLY,Number(cA.mid))),_.length===3)I=this._parsedAnswer.media.find(cA=>Number(cA.mid)===Number(_[0])),c=this._parsedAnswer.media.find(cA=>Number(cA.mid)===Number(_[1])),u=this._parsedAnswer.media.find(cA=>Number(cA.mid)===Number(_[2]));else if(_.length===0){this._peerConnection.addTransceiver(fA.AUDIO,{direction:fA.TRANSCEIVER_DIRECTION_RECVONLY}),this._peerConnection.addTransceiver(fA.VIDEO,{direction:fA.TRANSCEIVER_DIRECTION_RECVONLY}),this._peerConnection.addTransceiver(fA.VIDEO,{direction:fA.TRANSCEIVER_DIRECTION_RECVONLY}),I=JSON.parse(JSON.stringify(this._parsedAnswer.media[0]));let cA=Ez({mid:1,serverAbility:this._serverAbility,clientAbility:this.clientAbility,parsedOffer:rs(this._peerConnection.localDescription.sdp),isDownlink:!0});c=JSON.parse(JSON.stringify(cA)),u=JSON.parse(JSON.stringify(cA)),I.mid=this._parsedAnswer.media.length,this._parsedAnswer.media.push(I),c.mid=this._parsedAnswer.media.length,this._parsedAnswer.media.push(c),u.mid=this._parsedAnswer.media.length,this._parsedAnswer.media.push(u)}}I.direction=fA.TRANSCEIVER_DIRECTION_SENDONLY;let R="".concat(n,"-").concat(e.audio);I.ssrcs=[{id:e.audio,attribute:"cname",value:"".concat(R)},{id:e.audio,attribute:"msid",value:"".concat(R,"-").concat(fA.MAIN," ").concat(R,"-audio")}],c.direction=fA.TRANSCEIVER_DIRECTION_SENDONLY,c.ssrcs=[{id:e.video,attribute:"cname",value:"".concat(R)},{id:e.video,attribute:"msid",value:"".concat(R,"-").concat(fA.MAIN," ").concat(R,"-bigvideo")},{id:e.videoRtx,attribute:"cname",value:"".concat(R)},{id:e.videoRtx,attribute:"msid",value:"".concat(R,"-").concat(fA.MAIN," ").concat(R,"-bigvideo")}],c.ssrcGroups=[{semantics:"FID",ssrcs:"".concat(e.video," ").concat(e.videoRtx)}],u.direction=fA.TRANSCEIVER_DIRECTION_SENDONLY;let k="".concat(R,"-aux");u.ssrcs=[{id:e.auxiliary,attribute:"cname",value:k},{id:e.auxiliary,attribute:"msid",value:"".concat(k," ").concat(R,"-aux").concat(fA.VIDEO)},{id:e.auxiliaryRtx,attribute:"cname",value:"".concat(k," ").concat(R,"-aux").concat(fA.VIDEO)},{id:e.auxiliaryRtx,attribute:"msid",value:"".concat(k," ").concat(R,"-aux").concat(fA.VIDEO)}],u.ssrcGroups=[{semantics:"FID",ssrcs:"".concat(e.auxiliary," ").concat(e.auxiliaryRtx)}],this._parsedAnswer.groups&&(this._parsedAnswer.groups[0].mids=this._parsedAnswer.media.map(_=>_.mid).join(" ")),this._downlinkMIDMap.set(o,[I.mid,c.mid,u.mid]),this._downlinkMIDUserIDMap.set(I.mid,o),this._downlinkMIDUserIDMap.set(c.mid,o),this._downlinkMIDUserIDMap.set(u.mid,o)}removeDownlink(A){return DA(this,null,function*(){if(!this._downlinkMIDMap.has(A)||!this._peerConnection)return;this._log.info("removeDownlink(".concat(A,") trying")),this.isReconnecting&&(yield this.waitForReconnected()),this._updateSDPPromise&&(yield this._updateSDPPromise);let e=this._downlinkMIDMap.get(A),o=!1;return this._peerConnection.getTransceivers().forEach(n=>{e!=null&&e.includes(Number(n.mid))&&(o=!0,n.direction="inactive")}),this._parsedAnswer||(this._parsedAnswer=rs(this._peerConnection.remoteDescription.sdp)),this._parsedAnswer.media.forEach(n=>{e!=null&&e.includes(Number(n.mid))&&(o=!0,n.direction="inactive",n.ssrcs=[],n.ssrcGroups=[])}),this.removeDownlinkQueue.size===0&&o&&(yield this.updateSDP()),this._downlinkMIDMap.delete(A),e?.forEach(n=>this._downlinkMIDUserIDMap.delete(n)),this._log.info("removeDownlink(".concat(A,") done")),e})}setBandwidth(A){return DA(this,null,function*(){if(!this._peerConnection)return;let{audio:e,bigVideo:o,smallVideo:n,auxVideo:a}=A;try{if(TT()){let I=this._peerConnection.getSenders().slice(0,4);for(let u=0;u5e3?5e3:e),!0)}setSenderMaxBitrate(A,e){let o=A.getParameters();if((!o.encodings||o.encodings.length===0)&&(o.encodings=[{}]),e==="unlimited")delete o.encodings[0].maxBitrate;else{if(o.encodings[0].maxBitrate===1e3*e)return;o.encodings[0].maxBitrate=1e3*e}return A.setParameters(o)}setBandwidthBySDP(A){let{audio:e,bigVideo:o,smallVideo:n,auxVideo:a}=A;if(!this._peerConnection||!this._peerConnection.localDescription)return;let I=rs(this._peerConnection.localDescription.sdp);this._parsedAnswer||(this._parsedAnswer=rs(this._peerConnection.remoteDescription.sdp));let c=Yr?"TIAS":"AS";e&&(I.media[0].bandwidth=[{type:c,limit:Yr?1e3*e:e}],this._parsedAnswer.media[0].bandwidth=[{type:c,limit:Yr?1e3*e:e}]),o&&(I.media[1].bandwidth=[{type:c,limit:Yr?1e3*o:o}],this._parsedAnswer.media[1].bandwidth=[{type:c,limit:Yr?1e3*o:o}]),n&&(I.media[2].bandwidth=[{type:c,limit:Yr?1e3*n:n}],this._parsedAnswer.media[2].bandwidth=[{type:c,limit:Yr?1e3*n:n}]),a&&(I.media[3].bandwidth=[{type:c,limit:Yr?1e3*a:a}],this._parsedAnswer.media[3].bandwidth=[{type:c,limit:Yr?1e3*a:a}]);let u={type:"offer",sdp:$h(I)};return this.updateSDP({localDescription:u})}setScaleResolutionDownBy(A,e,o){let n=A.getParameters();(!n.encodings||n.encodings.length===0)&&(n.encodings=[{}]);let a=n.encodings[0].scaleResolutionDownBy;if(Ee(a)?e===1:e===a)return;let I="setScaleResolutionDownBy ".concat(o," ").concat(e);return a&&(I+=" prevScale: ".concat(a)),this._log.warn(I),n.encodings[0].scaleResolutionDownBy=e,A.setParameters(n)}setDegradationPreference(A,e,o){if(Bc&&tE<83||Ea&&gT($g,"12.1")||Yr&&aM<138)return;let n=A.getParameters(),a="balanced";if(e==="motion"?a="maintain-framerate":e==="detail"&&(a="maintain-resolution"),n.degradationPreference===a)return;let I="setDegradationPreference ".concat(o," ").concat(a);return this._log.info(I),n.degradationPreference=a,A.setParameters(n).catch(c=>this._log.warn("".concat(I," failed: ").concat(c)))}updateSDP(){let{localDescription:A}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!this._parsedAnswer)return Promise.resolve();let e=$h(this._parsedAnswer);return this._updateSDPPromise=new Promise((o,n)=>DA(this,null,function*(){var a,I;try{!A&&this._peerConnection&&(this._log.info("creating offer"),A=yield this._peerConnection.createOffer()),A&&(yield this.setOffer(A)),yield this.setAnswer({type:"answer",sdp:e}),this._updateSDPPromise=null,o()}catch(c){this._log.error(c),!this._isSDPLogged&&this._peerConnection&&(this._log.warn("current offer: ".concat(this.filterSDPDirection((a=this._peerConnection.localDescription)==null?void 0:a.sdp),` +next offer: `).concat(this.filterSDPDirection(A?.sdp))),this._log.warn("current answer: ".concat(this.filterSDPDirection((I=this._peerConnection.remoteDescription)==null?void 0:I.sdp),` +next answer: `).concat(this.filterSDPDirection(e))),this._log.warn("offer: ".concat(A?.sdp)),this._log.warn("answer: ".concat(e)),this._log.warn("transceivers: ".concat(JSON.stringify(this._peerConnection.getTransceivers().map(u=>{let{mid:d,currentDirection:R,direction:k,stopped:_}=u;return{mid:d,currentDirection:R,direction:k,stopped:_}})))),this._log.warn("parsedAnswer: ".concat(JSON.stringify(this._parsedAnswer))),this._isSDPLogged=!0),this._updateSDPPromise=null,n(c)}})),this._updateSDPPromise}setTransceiverDirection(A,e){return DA(this,null,function*(){if(!Yr||!this._peerConnection||!this._parsedAnswer)return;this._log.info("setting transceiver ".concat(e.join(",")," direction to ").concat(A));let o=this._peerConnection.getTransceivers();e.forEach(n=>{o[n].direction!==A&&(o[n].direction=A)});for(let n of e){let a=this._parsedAnswer.media[n].direction;A===_r.INACTIVE&&a===_r.RECVONLY&&(this._parsedAnswer.media[n].direction=A),A===_r.SENDONLY&&a===_r.INACTIVE&&(this._parsedAnswer.media[n].direction=_r.RECVONLY)}yield this.updateSDP()})}filterSDPDirection(){return rs(arguments.length>0&&arguments[0]!==void 0?arguments[0]:"").media.map(A=>A.direction)}setOffer(A){this._log.info("setting offer");let e=TtA(A.sdp,this.clientAbility,this._serverAbility);return this._log.debug(e),this._peerConnection.setLocalDescription({type:"offer",sdp:e})}setAnswer(A){return this._log.info("setting answer"),this._log.debug(A.sdp),this._peerConnection.setRemoteDescription(A)}switchVideoEncoder(A){return DA(this,null,function*(){if(this._parsedAnswer||(this._parsedAnswer=rs(this._peerConnection.remoteDescription.sdp)),!this._peerConnection||!this._parsedAnswer||!this._serverAbility)return;let e=!1;this._parsedAnswer.media.forEach(o=>{var n;if(o.type===fA.VIDEO){let a=this._serverAbility.video.codecs.find(I=>I.codec.toLowerCase()===A);a&&((n=o.payloads)==null||!n.includes(String(a.payload)))&&(o.fmtp=[],o.payloads="",o.rtp=[],o.rtcpFb=[],HM(o,a),e=!0)}}),e&&(this._log.warn("switch video encoder to ".concat(A)),yield this.updateSDP())})}getScheduleProfileLevelId(A){var e;try{let o=(e=this._room.scheduleResult.config)==null?void 0:e.profileLevelId,n="";if(A===2?n=JN(o?.big)?o.big:"":A===3?n=JN(o?.small)?o.small:"":A===7&&(n=JN(o?.aux)?o.aux:""),!n)return"";let a=lz(n,this.clientAbility);return a?this._log.info("use schedule profile level id: streamType=".concat(A,", raw=").concat(n,", resolved=").concat(a)):this._log.warn("schedule profile level id not resolved: streamType=".concat(A,", raw=").concat(n)),a}catch(o){return this._log.warn("getScheduleProfileLevelId error: ".concat(o)),""}}getProfileLevelIdConfig(){try{let A=new URLSearchParams(location.search).get("profileLevelId")||"",e=lz(A,this.clientAbility);if(e)return this._log.info("use url profile level id: raw=".concat(A,", resolved=").concat(e)),{big:e,small:e,aux:e};let o=this.getScheduleProfileLevelId(2),n=this.getScheduleProfileLevelId(3),a=this.getScheduleProfileLevelId(7);if(!o&&!n&&!a)return;let I={};return o&&(I.big=o),n&&(I.small=n),a&&(I.aux=a),I}catch(A){return void this._log.warn("getProfileLevelIdConfig error: ".concat(A))}}setH264ProfileLevelId(A,e){return DA(this,null,function*(){if(!this._peerConnection||!this._serverAbility)return;this._updateSDPPromise&&(yield this._updateSDPPromise),this._log.info("set H264 profile-level-id to ".concat(e?"high":"default"," for ").concat(A)),this._parsedAnswer||(this._parsedAnswer=rs(this._peerConnection.remoteDescription.sdp));let o=A==="main"?1:3,n=this._parsedAnswer.media[o];if(!n||n.type!==fA.VIDEO)return;let a=n.rtp||[],I=n.fmtp||[],c=a.find(Z=>{var iA;return((iA=Z.codec)==null?void 0:iA.toLowerCase())==="h264"});if(!c)return;let u=I.find(Z=>String(Z.payload)===String(c.payload));if(!u)return;let d=EK(u.config);if(!d)return;let R=lK(d)==="high";if(e&&R||!e&&!R)return;let k=this._serverAbility.video.codecs.map(Z=>EK(Z.fmtp)).filter(Boolean).find(Z=>{let iA=lK(Z);return e?iA==="high":iA!=="high"});if(!k)return;let _=u.config;u.config=cz(u.config,k),u.config!==_&&(yield this.updateSDP(),this._log.info("set H264 profile-level-id to ".concat(e?"high":"default"," success")))})}useHWEncoder(){let A=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0],e=arguments.length>1?arguments[1]:void 0;return DA(this,null,function*(){if(!this._peerConnection||!this._parsedAnswer||!this._serverAbility)return;let o=!1,n=[];Ee(e)?n=this._parsedAnswer.media.slice(1,4):e===2?n.push(this._parsedAnswer.media[1]):e===3?n.push(this._parsedAnswer.media[2]):e===7&&n.push(this._parsedAnswer.media[3]),n.forEach(a=>{var I;if(a.type===fA.VIDEO){let c;A&&this.is42001fSupported?c=this.clientAbility.video.codecs.find(u=>u.fmtp.includes("42001f")):A||(c=this._serverAbility.video.codecs.find(u=>u.codec.toLowerCase()===(this._serverAbility.useVp8?"vp8":"h264"))),c&&((I=a.payloads)==null||!I.includes(String(c.payload)))&&(a.fmtp=[],a.payloads="",a.rtp=[],a.rtcpFb=[],HM(a,c),o=!0)}}),o&&(this._log.warn("use ".concat(A?"hw":"sw"," encoder")),yield this.updateSDP())})}sendDataChannelMessage(A){var e;(e=this._datachannel)==null||e.send(A)}reset(){var A;this._peerConnection&&(this._peerConnection.close(),this._peerConnection.removeEventListener("track",this._peerConnection._onaddstreampoly,this),this._peerConnection._onaddstreampoly=null,this._peerConnection=null),this._datachannel=null,(A=this.clearWaitForConnectedPromise)==null||A.call(this),this._parsedAnswer=null,this.originOffer=null}close(){this._log.info("close pc"),this.isDestroyed=!0,this.removeRTCListener(),this.insertableStreamsAbortMap.forEach(A=>RQ(A.abort)&&A.abort("destroy")),this.insertableStreamsAbortMap.clear(),this.reset(),this.emitConnectionStateChangedEvent("DISCONNECTED"),this._downlinkMIDMap.clear(),this.stopReconnection(),this.removeAllListeners(),this._room.healthDetector.off("1",this.onBadHealth,this)}getReceiversByUserId(A){if(!this._peerConnection)return[];let e=this._peerConnection.getReceivers();return(this._downlinkMIDMap.get(A)||[]).map(o=>e[o])}get isUsingRelay(){return this._room.getIceTransportPolicy()==="relay"}detectTCPAndUDP(A){let{uplinkRTT:e,downlinkRTT:o}=A;var n;if(this.currentState!=="CONNECTED"||this._isRelayTried&&!this._room.forceRelay||this._room.getIceServers().length===0)return;let a=this._signalChannel.rtt,I=Math.max(e,o),{rttRatioThreshold:c,rttThreshold:u}=((n=this._room.scheduleResult.config)==null?void 0:n.useTurnTcpInfo)||{};if(!(c&&u&&a&&I))return;let d=Math.floor(I/a),R=(this._isRelayTried||d>c)&&I>u;R?++this._rttOverCount<5||(this._log.warn("detectTCPAndUDP ws-rtt: ".concat(a," upRTT: ").concat(e," downRTT: ").concat(o," ratio: ").concat(d," over-count: ").concat(this._rttOverCount," isOver: ").concat(R," isRelayTried: ").concat(this._isRelayTried," force-relay: ").concat(this._room.forceRelay)),this.isUsingRelay||this._isRelayTried?this._room.forceRelay&&this.switchRelay(!1):(this._isRelayTried=!0,this._rttOverCount=0,this.switchRelay(!0))):this._rttOverCount=0}switchRelay(A){let e=arguments.length>1&&arguments[1]!==void 0&&arguments[1];return DA(this,null,function*(){if(this.isUsingRelay===A)return;let o=A?"relay":"udp",n=A?521709:521710;try{this._room.forceRelay=A,this._log.warn("switchRelay ".concat(o));let a=Date.now();yield this.doSwitchRelay(o),this._log.warn("switchRelay ".concat(o," success")),ct.addSuccessEvent({key:n,cost:Date.now()-a})}catch(a){this._log.warn("switchRelay ".concat(o," failed"),a),ct.addFailedEvent({key:n,error:a}),e?this._room.reJoin():yield this.switchRelay(!A,!0)}})}doSwitchRelay(A){return new Promise((e,o)=>{let n=setTimeout(()=>{this.stopReconnection(),o(new Error("switch ".concat(A," timeout")))},1e4);this.startReconnection().then(e,o).finally(()=>clearTimeout(n))})}removeRTCListener(){this._peerConnection&&(this._peerConnection.oniceconnectionstatechange=null,this._peerConnection.onconnectionstatechange=null,this._peerConnection.onsignalingstatechange=null,this._peerConnection.ontrack=null),this.dtlsTransport&&(this.dtlsTransport.onstatechange=null)}requestRemoteFallbackToH264(){this._log.warn("H265 decode failed, remote need to fallback h264"),this._h265DecodeFailed=!0,this._signalChannel.sendWaitForResponse({command:gK,data:{videoDecCodec:"h264"},responseCommand:io.UPDATE_CONSTRAINT_CONFIG_RES}).then(A=>{A.data.code!==0&&this._log.warn(A.data.message)})}};vt([vW("reconnect")],Ap.prototype,"startReconnection"),vt([Kh(A=>A.userId)],Ap.prototype,"addDownlink"),vt([Kh(A=>A)],Ap.prototype,"removeDownlink"),vt([VT(!0)],Ap.prototype,"updateSDP"),vt([jh(521712,!1),mx(10,0)],Ap.prototype,"setOffer"),vt([jh(521713,!1),mx(10,0)],Ap.prototype,"setAnswer"),vt([Dn((A,e)=>function(){for(var o=arguments.length,n=new Array(o),a=0;aclearTimeout(I)),this._checkPendingPromiseSet.clear()),A.apply(this,n)})],Ap.prototype,"close");var btA=class{constructor(A){G(this,"tag"),G(this,"len"),G(this,"data");let e=new DataView(A);this.tag=e.getUint16(),this.len=e.getUint16(2),this.data=new Uint8Array(A).slice(4,4+this.len).buffer}},LtA=class{constructor(A){G(this,"tinyId"),G(this,"data");let e=new DataView(A),o=0,n=[];for(;o{d.tag===1?this.tinyId=new TextDecoder().decode(d.data):d.tag===2&&a.push(d.data)});let I=a.reduce((d,R)=>d+R.byteLength,0),c=new Uint8Array(I),u=0;a.forEach(d=>{c.set(new Uint8Array(d),u),u+=d.byteLength}),this.data=c.buffer}},Bz=new Set;function gB(){let A=Math.floor(4294967296*Math.random());return Bz.has(A)?gB():(Bz.add(A),A)}var FtA=es(hg()),uz=class extends FtA.default{constructor(A){super(),G(this,"userId"),G(this,"tinyId"),G(this,"_sdpSemantics"),G(this,"_isUplink"),G(this,"_room"),G(this,"_log"),G(this,"_currentState","DISCONNECTED"),G(this,"_prevTime",-1),G(this,"_blackSmallVideoDetectionId"),G(this,"isDestroyed",!1),this.userId=A.userId,this.tinyId=A.tinyId,this._room=A.room,this._sdpSemantics=A.room.sdpSemantics,this._isUplink=A.isUplink,this._log=nA.createLogger({parent:this._room.getLogger(),id:"n",userId:this._room.userId,remoteUserId:this._isUplink?void 0:this.userId,sdkAppId:this._room.sdkAppId,isLocal:this._isUplink})}get _peerConnection(){var A;return((A=this.singlePC)==null?void 0:A.getPeerConnection())||null}get singlePC(){return this._room.singlePC}get _signalChannel(){return this._room.signalChannel}close(A){this._log.info("close connection"),this.emit("closed",A)}destroy(){this.isDestroyed=!0}emitConnectionStateChangedEvent(A){return A!==this._currentState&&(S.emit(K.PEER_CONNECTION_STATE_CHANGED,{room:this._room,prevState:this._currentState,state:A,remoteUserId:this._isUplink?void 0:this.userId}),this.emit("connection-state-changed",{prevState:this._currentState,state:A}),this._currentState=A,!0)}getPeerConnection(){return this._peerConnection}getRoom(){return this._room}getUserId(){return this.userId}getTinyId(){return this.tinyId}getCurrentState(){return this._currentState}get isH264(){var A,e;return!((e=(A=this._peerConnection)==null?void 0:A.remoteDescription)==null||!e.sdp.includes("H264"))}};function Qz(A){let{when:e,onSkip:o}=A;return Dn((n,a)=>function(){for(var I=arguments.length,c=new Array(I),u=0;upostMessage({type:"log",message:"[worker] "+t.join(" ")});function startDetection(e,t,a){if(!tracks.has(e)){const c={reader:a.getReader(),blackCount:0,timeoutId:null,intervalId:null};tracks.set(e,c),c.timeoutId=setTimeout(()=>stopDetection(e,"timeout"),t),c.intervalId=setInterval(async()=>{try{await isFrameBlack(e)?(c.blackCount++,postMessage({type:"blackCount",trackId:e,count:c.blackCount}),3<=c.blackCount&&(postMessage({type:"black",trackId:e}),stopDetection(e,"black"))):c.blackCount=0}catch(t){log("check black video error:",t.message),stopDetection(e,"error")}},1e3)}}function stopDetection(t,e){var a=tracks.get(t);a&&(a.timeoutId&&clearTimeout(a.timeoutId),a.intervalId&&clearInterval(a.intervalId),a.reader&&a.reader.cancel(),tracks.delete(t),postMessage({type:e,trackId:t}))}async function isFrameBlack(t){t=tracks.get(t);if(!t)return!1;var t=t.reader,{done:t,value:e}=await t.read();if(!e||t)return!1;canvas||(canvas=new OffscreenCanvas(e.codedWidth,e.codedHeight),ctx=canvas.getContext("2d",{willReadFrequently:!0})),canvas.width===e.codedWidth&&canvas.height===e.codedHeight||(canvas.width=e.codedWidth,canvas.height=e.codedHeight,ctx=canvas.getContext("2d",{willReadFrequently:!0})),ctx.drawImage(e,0,0,canvas.width,canvas.height);t=getFrameBlackRatio(ctx.getImageData(0,0,canvas.width,canvas.height));return e.close(),1===t}function getFrameBlackRatio(t){var e=t.data;let a=0;for(let t=0;t<100;t++){var c=4*Math.floor(Math.random()*(e.length/4)),[c,r,n,o]=[e[c],e[1+c],e[2+c],e[3+c]];0{var{type:t,trackId:e,timeout:a,readable:c}=t.data;"addTrack"===t&&startDetection(e,a,c),"removeTrack"===t&&stopDetection(e)}; + `],{type:"application/javascript"}),e=URL.createObjectURL(A);this.worker=new Worker(e),URL.revokeObjectURL(e),this.worker.onerror=o=>this._log.warn("worker error:",o.message,o.filename||"unknown",o.lineno||"unknown"),this.worker.onmessage=o=>{var n;let{type:a,trackId:I,message:c,count:u}=o.data;if(a==="black")(n=this.callbacks.get(I))==null||n();else if(a==="log")this._log.warn(c);else if(a==="blackCount"){let d=this.userIdMap.get(I);this._log.warn("".concat(d||I," black count: ").concat(u))}}}return this.worker}start(A){let{track:e,isUplink:o,room:n,userId:a,onBlack:I}=A;if(this._log.debug("start detect black video",e.id),!Em()||!I||!e||typeof Worker>"u")return void this._log.warn("black video detector not supported");let c=u=>{var d,R,k,_;let Z;if(o)Z=(R=(d=u.msg_up_stream_info)==null?void 0:d.msg_video_status)==null?void 0:R.filter(iA=>iA.uint32_video_stream_type===3)[0];else{let iA=(k=u.msg_down_stream_info)==null?void 0:k.filter(cA=>{var TA;return((TA=cA.msg_user_info)==null?void 0:TA.str_identifier)===a})[0];Z=(_=iA?.msg_video_status)==null?void 0:_.filter(cA=>cA.uint32_video_stream_type===3)[0]}if(Z){let iA=(Z.uint32_video_codec_bitrate||0)/1e3;if(this.sleep[e.id]&&this.sleep[e.id]>0)return void(this.sleep[e.id]-=1);iA>0&&iA<10&&(this.sleep[e.id]=30,this._log.info("track bitrate",iA,"start check"),this.checkOnce(e,3e4))}};return n.on("heartbeat-report",c),this.heartbeatListenerCleaner.set(e.id,()=>n.off("heartbeat-report",c)),this.callbacks.set(e.id,I),this.userIdMap.set(e.id,a),e.id}checkOnce(A,e){try{let o=this.getWorker();if(!o)throw new Error("Worker not available");let n=new MediaStreamTrackProcessor({track:A});o.postMessage({type:"addTrack",trackId:A.id,timeout:e,readable:n.readable},[n.readable])}catch(o){this._log.warn("check error:",o),this.stop(A.id)}}stop(A){if(A){this.worker&&this.worker.postMessage({type:"removeTrack",trackId:A}),this.callbacks.delete(A),delete this.sleep[A];let e=this.heartbeatListenerCleaner.get(A);e&&e(),this.heartbeatListenerCleaner.delete(A),this.userIdMap.delete(A)}}destroy(){this.callbacks.forEach((A,e)=>this.stop(e)),this.worker&&(this.worker.terminate(),this.worker=null)}},Kx=class extends uz{constructor(A){super(fi(bt({},A),{isUplink:!0})),G(this,"localMainAudioTrack",null),G(this,"localMainVideoTrack",null),G(this,"localAuxAudioTrack",null),G(this,"localAuxVideoTrack",null),G(this,"_isPublishingAux",!1),G(this,"_publishingLocalAudioTrack"),G(this,"_publishingLocalVideoTrack"),G(this,"_mediaSettings",{videoCodec:"",videoWidth:0,videoHeight:0,videoBps:0,videoFps:0,videoDecCodec:"",audioCodec:"opus",audioFs:0,audioChannel:0,audioBps:0,smallVideoWidth:0,smallVideoHeight:0,smallVideoFps:0,smallVideoBps:0,auxVideoWidth:0,auxVideoHeight:0,auxVideoFps:0,auxVideoBps:0}),G(this,"_flag",0),G(this,"_checkPublishStateTimeoutId",-1),this.initialize()}get videoCodec(){var A;return((A=this.singlePC)==null?void 0:A.videoCodec)||"h264"}get ssrc(){if(!this.singlePC)return{audio:0,video:0,videoRtx:0,small:0,smallRtx:0,auxiliary:0,auxiliaryRtx:0};let{audioSsrc:A,bigVideoSsrc:e,bigVideoRtxSsrc:o,smallVideoSsrc:n,smallVideoRtxSsrc:a,auxVideoSsrc:I,auxVideoRtxSsrc:c}=this.singlePC.uplinkSSRC;return{audio:A||0,video:e||0,videoRtx:o||0,small:n||0,smallRtx:a||0,auxiliary:I||0,auxiliaryRtx:c||0}}get flag(){return this._flag}set flag(A){this._flag!==A&&(this._flag=A,this.checkPublishState())}checkPublishState(){let A=arguments.length>0&&arguments[0]!==void 0&&arguments[0];try{if(!A&&this._checkPublishStateTimeoutId>0)return;let{serverPublishState:e}=this,{publishState:o}=this._room,n=Object.keys(o).filter(a=>{if(o[a]!==e[a]&&o[a])switch(a){case"audio":return!(!this.localMainAudioTrack||!this.localMainAudioTrack.isMediaTrackActive);case"bigVideo":case"smallVideo":return!(!this.localMainVideoTrack||!this.localMainVideoTrack.isMediaTrackActive);case"auxVideo":return!(!this.localAuxVideoTrack||!this.localAuxVideoTrack.isMediaTrackActive)}return!1});if(n.length>0){if(!A)return void(this._checkPublishStateTimeoutId=nn.run("timeout",()=>this.checkPublishState(!0),{delay:1e4,count:1}));ct.addCount({key:521e3}),n.forEach(a=>{this._log.warn("".concat(a," publish failed during call ").concat(bQ()," ").concat(Qu())),ct.addEnum({key:521719,value:dz[a]})}),nn.clearTask(this._checkPublishStateTimeoutId),this._checkPublishStateTimeoutId=-1}}catch(e){this._log.warn("checkPublishState failed",e)}}get isMainStreamPublished(){return!(!this.localMainAudioTrack&&!this.localMainVideoTrack)}get isAuxStreamPublished(){return!(!this.localAuxVideoTrack&&!this.localAuxAudioTrack)}get serverPublishState(){return{audio:!!(this.flag&Gf),bigVideo:!!(this.flag&Nf),smallVideo:!!(this.flag&dN),auxVideo:!!(this.flag&Tf)}}initialize(){this.installEvents()}close(A){var e;let o=((e=this._peerConnection)==null?void 0:e.getSenders())||[];for(let n of o)n.replaceTrack(null);super.close(A),this.uninstallEvents(),this.uninstallTrackMuteEvents(this.localMainAudioTrack,this.localMainVideoTrack,this.localAuxVideoTrack),this.emitConnectionStateChangedEvent("DISCONNECTED")}installEvents(){this.listeners("connection-state-changed").includes(this.handleConnectionStateChange)||this.on("connection-state-changed",this.handleConnectionStateChange,this),this.installSPCEvents()}installSPCEvents(){var A,e;(A=this.singlePC)!=null&&A.listeners("spc-reconnected").includes(this.onSinglePCReconnected)||(e=this.singlePC)==null||e.on("spc-reconnected",this.onSinglePCReconnected,this)}uninstallSPCEvents(){var A;(A=this.singlePC)==null||A.off("spc-reconnected",this.onSinglePCReconnected,this)}uninstallEvents(){this.off("connection-state-changed",this.handleConnectionStateChange,this),this.uninstallSPCEvents()}emitConnectionStateChangedEvent(A,e){var o,n,a;let I=this._currentState,c=super.emitConnectionStateChangedEvent(A);return c&&I!==A&&(e?e.emit("connection-state-changed",{prevState:I,state:A}):((o=this.localMainVideoTrack)==null||o.emit("connection-state-changed",{prevState:I,state:A}),(n=this.localAuxVideoTrack)==null||n.emit("connection-state-changed",{prevState:I,state:A}),(a=this._publishingLocalVideoTrack)==null||a.emit("connection-state-changed",{prevState:I,state:A}))),c}onVideoEncodeFailed(A){return DA(this,null,function*(){if(!A||!A.isMediaTrackActive)return;let{videoCodec:e,singlePC:o}=this;if(!o)return;let n={h265:{supported:o.isH264EncodeSupported,target:"h264",log:"h265 encoder not working"},h264:{supported:o.isVP8EncodeSupported,target:"vp8",log:"h264 encoder not working"},vp8:{supported:!1,target:"vp8",log:"vp8 encoder not working, no fallback available"}};if(e==="vp9"||e==="av1")return;let a=n[e];this._log.warn(a.log),a!=null&&a.supported&&(yield o.switchVideoEncoder(a.target))})}publish(A){return DA(this,arguments,function(e){var o=this;let{localAudioTrack:n,localVideoTrack:a,isAuxiliary:I}=e;return function*(){var c,u,d,R,k,_,Z;if(!o.singlePC)return;if(o.installEvents(),o.installTrackMuteEvents(n,a),a&&(a.retryEncodeFailed=o.onVideoEncodeFailed.bind(o),Ea&&(kh($g,"26.2",!0)||kh(Cu,"26.2",!0)||Eu&&kh($g,"18.7",!0)))){o._log.warn("detectH264Supported for fallback 26.2 video encode issue");try{yield kA.detectH264SupportedByFakeStreaming(500)}catch{}}if(yield o.singlePC.waitForPeerConnectionConnected(),n&&(o._publishingLocalAudioTrack=n),a){if(!o.singlePC.isH264EncodeSupported&&!o.singlePC.isVP8EncodeSupported)throw new Ct({code:Ge.NOT_SUPPORTED_H264,message:Wi({key:Mi.NOT_SUPPORTED_H264ENCODE})});o.singlePC.isUsingH264&&!o.singlePC.isH264EncodeSupported&&o.singlePC.isVP8EncodeSupported&&(o._log.warn("h264 encoder not supported"),yield o.singlePC.switchVideoEncoder("vp8")),ra&&om()===115&&a.profile.width*a.profile.height<=230400&&(o._log.warn("fallback video to defaultBigVideoProfile: ".concat(JSON.stringify(vf))),a.setProfile(vf),yield a.applyProfile()),o._publishingLocalVideoTrack=a}let iA;if(o._isPublishingAux=I,a&&!I&&a.small&&(iA=o._room.videoManager.smallTrack),yield o._signalChannel.sendWaitForResponseWithRetry({command:z4,responseCommand:io.SPC_PUBLISH_RESULT,data:fi(bt({},o.singlePC.uplinkSSRC),{state:o._room.publishState,muteState:o._room.muteState}),retries:3}),a&&(yield o.checkHighProfile({streamType:a.streamType,newWidth:a.settings.width,newHeight:a.settings.height})),yield o.publishByTransceiver({localAudioTrack:n,localVideoTrack:a,smallTrack:iA,isAuxiliary:I}),o._publishingLocalAudioTrack=null,o._publishingLocalVideoTrack=null,o._isPublishingAux=!1,a){o[I?"localAuxVideoTrack":"localMainVideoTrack"]=a,yield o.singlePC.setDegradationPreference(o._peerConnection.getSenders()[I?3:1],a.contentHint,a.streamType);let{scaleResolutionDownBy:TA}=a;yield o.singlePC.setScaleResolutionDownBy(o._peerConnection.getSenders()[I?3:1],TA,a.streamType)}n&&(o[I?"localAuxAudioTrack":"localMainAudioTrack"]=n),yield o.singlePC.setBandwidth({audio:((c=o.localMainAudioTrack)==null?void 0:c.profile.bitrate)||((u=o.localAuxAudioTrack)==null?void 0:u.profile.bitrate),bigVideo:(d=o.localMainVideoTrack)==null?void 0:d.profile.bitrate,smallVideo:(k=(R=o.localMainVideoTrack)==null?void 0:R.small)==null?void 0:k.bitrate,auxVideo:(_=o.localAuxVideoTrack)==null?void 0:_.profile.bitrate}),o.sendMediaSettings();let cA=I?7:2;(o._room.preferHW||(Z=o._room.scheduleResult.config)!=null&&Z.preferHW)&&a&&a.profile.width*a.profile.height>=921600&&o.singlePC.useHWEncoder(!0,cA)}()})}publishByTransceiver(A){let{localAudioTrack:e,localVideoTrack:o,smallTrack:n,isAuxiliary:a}=A;if(!sl())return;this._log.info("publish by transceiver");let I=o?.outMediaTrack,c=e?.outMediaTrack,u=this._peerConnection.getTransceivers(),d=[],R=[],k=(Z,iA,cA)=>{var TA;let JA=u[iA].sender.replaceTrack(cA);R.push(iA),(TA=this.singlePC)!=null&&TA.enableInsertableStreams&&JA.then(()=>this.createEncodedStreams(u[iA].sender,Z)),this.initSenderTransform(u[iA].sender,Z),d.push(JA)};c&&k(e.mediaType,0,c),I&&k(o.mediaType,a?3:1,I),o!=null&&o.small&&d.push(this.publishSmall(this._room.videoManager.smallMode,o));let _=this.singlePC.setTransceiverDirection(_r.SENDONLY,R);return d.push(_),Promise.all(d)}getTrackByMediaType(A){switch(A){case 1:return this.localMainAudioTrack||this._room.localMainAudioTrack;case 4:case 8:return this.localMainVideoTrack||this._room.localMainVideoTrack;case 2:return this.localAuxVideoTrack||this._room.localAuxVideoTrack;default:return null}}createEncodedStreams(A,e){var o,n;if(this.singlePC.insertableStreamsAbortMap.has(A))return;let a=A.createEncodedStreams(),I=new AbortController;(o=this.singlePC)==null||o.addAbortController(A,I),((n=this.getTrackByMediaType(e))!=null&&n.enableEncodeFrame?a.readable.pipeThrough(new TransformStream({transform:(c,u)=>{var d,R;let k=this.getTrackByMediaType(e);if(!k||!k.encodeFrame)return u.enqueue(c);k.isAudio?u.enqueue(k.enableEncodeFrame?k.encodeFrame(c):c):u.enqueue((d=this.singlePC)!=null&&d.isUsingH264||(R=this.singlePC)!=null&&R.isUsingH265?k.encodeFrame(c,e===8):c)}}),I):a.readable).pipeTo(a.writable,I).catch(c=>{this._log.debug("encoded stream error",c),c!=="destroy"&&this._log.warn(c)})}initSenderTransform(A,e){if(!(this._peerConnection&&this.singlePC&&this.singlePC.scriptTransformWorker&&MM))return;let o=e!==2,n=e===8;A.transform||(A.transform=new RTCRtpScriptTransform(this.singlePC.scriptTransformWorker,{isReceiver:!1,isAudio:e===1,isMain:o,isSmall:n}))}enableSmall(A){return DA(this,null,function*(){A?yield this.publishSmall(this._room.videoManager.smallMode):yield this.unpublishSmall()})}publishSmall(A){return DA(this,arguments,function(e){var o=this;let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.localMainVideoTrack;return function*(){var a;if(!o.singlePC)return;if(e==="canvas"&&!RM())return void o._log.warn("canvas mode small stream is not supported");let I=o._peerConnection.getTransceivers(),{sender:c}=I[2],u=yield o.doPublishSmall(e,n),d=e==="canvas"?524700:524701;ct.addSuccessEvent({key:d}),u?((a=o.singlePC)!=null&&a.enableInsertableStreams&&o.createEncodedStreams(c,8),o.initSenderTransform(c,8),yield o.singlePC.setTransceiverDirection(_r.SENDONLY,[2]),o.updateMediaSettings(),yield o.doPublishChange(),c.track&&(o._blackSmallVideoDetectionId=Fm.start({track:c.track,room:o._room,isUplink:!0,userId:o.userId,onBlack:()=>{o._log.warn("small video is black");let R=e==="canvas"?524700:524701;ct.addFailedEvent({key:R,error:10002}),Fm.stop(o._blackSmallVideoDetectionId),o._blackSmallVideoDetectionId=void 0}}))):ct.addFailedEvent({key:d,error:10001})}()})}doPublishSmall(A){return DA(this,arguments,function(e){var o=this;let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.localMainVideoTrack;return function*(){if(!o.singlePC)return null;o._log.info("publish small",e);let a=o._peerConnection.getTransceivers(),{sender:I}=a[2];if(e==="canvas"&&o._room.videoManager.smallTrack)return yield I.replaceTrack(o._room.videoManager.smallTrack),"canvas";if(e==="api"&&n!=null&&n.outMediaTrack&&n!=null&&n.small){yield I.replaceTrack(n?.outMediaTrack);let c=I.getParameters(),u=AM(n?.profile,n?.small);return o._log.info("small scaleResolutionDownBy",u),c.encodings[0].scaleResolutionDownBy=u,I.setParameters(c),"api"}return o._log.warn("small track can not be enabled, smallMode: ".concat(o._room.videoManager.smallMode,", smallTrack: ").concat(!!o._room.videoManager.smallTrack,", bigVideoTrack: ").concat(!(n==null||!n.outMediaTrack))),null}()})}unpublishSmall(){return DA(this,null,function*(){this.singlePC&&(this._log.info("unpublish small"),yield this._peerConnection.getTransceivers()[2].sender.replaceTrack(null),yield this.singlePC.setTransceiverDirection(_r.INACTIVE,[2]),this.updateMediaSettings(),yield this.doPublishChange(),Fm.stop(this._blackSmallVideoDetectionId),this._blackSmallVideoDetectionId=void 0)})}checkHighProfile(A){return DA(this,null,function*(){var e,o;if((((e=this._room.scheduleResult.config)==null?void 0:e.profileLevelId)||{})[A.streamType==="main"?"big":"aux"]!=="high")return;let n=A.newWidth*A.newHeight>=921600&&!_h();try{yield(o=this.singlePC)==null?void 0:o.setH264ProfileLevelId(A.streamType,n)}catch(a){this._log.warn("setH264ProfileLevelId failed, ignore",a)}})}installTrackMuteEvents(){for(var A=arguments.length,e=new Array(A),o=0;o{n&&(n?.on("mute",this.sendMutedFlag,this),n?.on("unmute",this.sendMutedFlag,this))})}uninstallTrackMuteEvents(){for(var A=arguments.length,e=new Array(A),o=0;o{n&&(n?.off("mute",this.sendMutedFlag,this),n?.off("unmute",this.sendMutedFlag,this))})}unpublish(A){return DA(this,arguments,function(e){var o=this;let{localAudioTrack:n,localVideoTrack:a}=e;return function*(){var I;yield(I=o.singlePC)==null?void 0:I.waitForPeerConnectionConnected();let c=a&&a===o.localAuxVideoTrack||n&&n===o.localAuxAudioTrack,u=a?.outMediaTrack,d=o._peerConnection.getSenders(),R=[];n&&(c?o.localAuxAudioTrack=null:o.localMainAudioTrack=null,!o.localMainAudioTrack&&!o.localAuxAudioTrack&&(yield d[0].replaceTrack(null),R.push(0))),u&&(c?(yield d[3].replaceTrack(null),o.localAuxVideoTrack=null,o._mediaSettings=fi(bt({},o._mediaSettings),{auxVideoBps:0,auxVideoFps:0,auxVideoWidth:0,auxVideoHeight:0}),R.push(3)):(yield d[1].replaceTrack(null),yield d[2].replaceTrack(null),o.localMainVideoTrack=null,o._mediaSettings=fi(bt({},o._mediaSettings),{videoWidth:0,videoHeight:0,videoBps:0,videoFps:0,audioFs:0,audioChannel:0,audioBps:0,smallVideoWidth:0,smallVideoHeight:0,smallVideoFps:0,smallVideoBps:0}),R.push(1,2))),o.isMainStreamPublished||o.isAuxStreamPublished?(yield o.singlePC.setTransceiverDirection(_r.INACTIVE,R),yield o.doPublishChange(!1)):yield o.doUnpublish(),o.uninstallTrackMuteEvents(n,a),a?.emit("connection-state-changed",{prevState:o._currentState,state:"DISCONNECTED"})}()})}doPublishChange(){let A=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];return DA(this,null,function*(){let e={state:this._room.publishState,constraintConfig:this._mediaSettings},o=yield this._signalChannel.sendWaitForResponseWithRetry({command:nK,data:e,responseCommand:io.PUBLISH_STATE_CHANGE_RESULT,enableLog:A,retries:3});this.checkPublishResultCode(o.data.code,o.data.message)})}doUnpublish(){let A=arguments.length>0&&arguments[0]!==void 0&&arguments[0];return this._signalChannel.sendWaitForResponse({command:Yx,commandDesc:"unpublish",responseCommand:io.UNPUBLISH_RESULT,enableLog:A}).catch(e=>{if(e.getCode()===Ge.API_CALL_TIMEOUT||e.getCode()===Ge.API_CALL_ABORTED)return Promise.resolve();throw e})}updateMediaSettings(){var A,e;this._mediaSettings.videoCodec=((A=this.singlePC)==null?void 0:A.videoCodec)||"h264",this._mediaSettings.videoDecCodec=((e=this.singlePC)==null?void 0:e.downlinkVideoCodec)||"h264";let o=this._publishingLocalAudioTrack||this.localMainAudioTrack||this.localAuxAudioTrack,{localMainVideoTrack:n,localAuxVideoTrack:a}=this;if(this._publishingLocalVideoTrack&&(this._isPublishingAux?a=this._publishingLocalVideoTrack:n=this._publishingLocalVideoTrack),Jh){if(o&&o.outMediaTrack){let I=o.outMediaTrack.getSettings();this._mediaSettings.audioChannel=I.channelCount||1,this._mediaSettings.audioBps=1e3*o.profile.bitrate,this._mediaSettings.audioFs=I.sampleRate||0}if(n&&n.outMediaTrack){let I=n.outMediaTrack.getSettings(),{scaleResolutionDownBy:c}=n;this._mediaSettings.videoWidth=(I.width||0)/c||0,this._mediaSettings.videoHeight=(I.height||0)/c||0,this._mediaSettings.videoFps=I.frameRate||0,this._mediaSettings.videoBps=1e3*n.profile.bitrate,n.small&&(this._mediaSettings.smallVideoWidth=n.small.width,this._mediaSettings.smallVideoHeight=n.small.height,this._mediaSettings.smallVideoFps=n.small.frameRate,this._mediaSettings.smallVideoBps=1e3*n.small.bitrate)}if(a&&a.outMediaTrack){let I=a.outMediaTrack.getSettings(),{scaleResolutionDownBy:c}=a;this._mediaSettings.auxVideoWidth=(I.width||0)/c||0,this._mediaSettings.auxVideoHeight=(I.height||0)/c||0,this._mediaSettings.auxVideoFps=I.frameRate||0,this._mediaSettings.auxVideoBps=1e3*a.profile.bitrate}}else o&&o.outMediaTrack&&(this._mediaSettings.audioChannel=o.profile.channelCount,this._mediaSettings.audioBps=1e3*o.profile.bitrate,this._mediaSettings.audioFs=o.profile.sampleRate),n&&n.outMediaTrack&&(this._mediaSettings.videoWidth=n.profile.width,this._mediaSettings.videoHeight=n.profile.height,this._mediaSettings.videoFps=n.profile.frameRate,this._mediaSettings.videoBps=1e3*n.profile.bitrate);this._log.info("updateMediaSettings: ".concat(JSON.stringify(this._mediaSettings)))}sendMediaSettings(){this.updateMediaSettings(),this._signalChannel.sendWaitForResponse({command:gK,data:this._mediaSettings,responseCommand:io.UPDATE_CONSTRAINT_CONFIG_RES}).then(A=>{A.data.code!==0&&this._log.warn(A.data.message)}).catch(()=>{})}addTrack(A){return DA(this,null,function*(){if(!this._peerConnection)return;let e=A===this.localAuxAudioTrack||A===this.localAuxVideoTrack;this._log.info("is adding ".concat(A.kind," track to current published local ").concat(e?fA.AUXILIARY:fA.MAIN," stream")),mu()&&(yield this.addTrackByTransceiver(A,e))})}addTrackByTransceiver(A,e){return DA(this,null,function*(){var o;if(!A.mediaTrack)return;let n=this._peerConnection.getTransceivers();if(A.kind===fA.AUDIO)yield n[0].sender.replaceTrack(A.outMediaTrack);else{let a=e?3:1;yield n[a].sender.replaceTrack(A.outMediaTrack),a===1&&(o=this.localMainVideoTrack)!=null&&o.small&&this._room.videoManager.smallTrack&&(yield n[2].sender.replaceTrack(this._room.videoManager.smallTrack)),n[a].direction===_r.INACTIVE&&(yield this.singlePC.setTransceiverDirection(_r.SENDONLY,[a]))}this.updateMediaSettings(),yield this.doPublishChange()})}removeTrack(A){return DA(this,null,function*(){if(!this._peerConnection)return;let e=A===this.localAuxAudioTrack||A===this.localAuxVideoTrack;this._log.info("is removing ".concat(A.kind," track from current published local ").concat(e?fA.AUXILIARY:fA.MAIN," stream")),mu()&&(yield this.removeTrackByTransceiver(A,e))})}removeTrackByTransceiver(A,e){return DA(this,null,function*(){if(!A.mediaTrack)return;let o=this._peerConnection.getTransceivers();if(A.kind===fA.AUDIO)yield o[0].sender.replaceTrack(null);else{let n=e?3:1;yield o[n].sender.replaceTrack(null),n===1&&this._room.videoManager.hasSmall&&(yield o[2].sender.replaceTrack(null)),yield this.singlePC.setTransceiverDirection(_r.INACTIVE,[n])}this.updateMediaSettings(),yield this.doPublishChange()})}replaceTrack(A){return DA(this,null,function*(){var e;let o=(e=this._peerConnection)==null?void 0:e.getSenders(),n=A.outMediaTrack||A.mediaTrack;if(!o||o.length===0||!n||o.find(I=>I.track===n))return!1;let a=A.mediaType===2||A===this.localAuxAudioTrack||A===this.localAuxVideoTrack;return this._log.info("is replacing ".concat(n.kind," track ").concat(n.id," ").concat(n.label," on ").concat(a?fA.AUXILIARY:fA.MAIN," stream")),n.kind===fA.AUDIO&&o[0]&&(yield o[0].replaceTrack(n)),n.kind===fA.VIDEO&&(!a&&o[1]&&(yield o[1].replaceTrack(n)),a&&o[3]&&(yield o[3].replaceTrack(n))),!0})}setBandwidth(A){return DA(this,arguments,function(e){var o=this;let{bandwidth:n,type:a,videoType:I}=e;return function*(){if(o.singlePC){let c={};a===fA.AUDIO?c.audio=n:I==="big"?c.bigVideo=n:I==="small"?c.smallVideo=n:c.auxVideo=n,yield o.singlePC.setBandwidth(c)}}()})}sendMutedFlag(A){A===this.localAuxAudioTrack||A===this.localAuxVideoTrack||(this._log.info("send muted state: ".concat(JSON.stringify(this._room.muteState))),this._signalChannel.sendWaitForResponseWithRetry({command:K4,responseCommand:io.MUTE_RESULT,data:this._room.muteState,retries:3}).catch(()=>{}))}handleConnectionStateChange(A){A.state==="CONNECTED"&&(this.localMainVideoTrack||this._publishingLocalVideoTrack&&!this._isPublishingAux)&&S.emit(K.SEND_FIRST_VIDEO_FRAME,{room:this._room})}getVideoTrackId(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:fA.VIDEO;if(this._peerConnection){let e=this._peerConnection.getSenders();if(A===fA.AUXILIARY&&e[3]&&e[3].track)return e[3].track.id;if(A===fA.VIDEO&&e[1]&&e[1].track)return e[1].track.id}if(this.localMainVideoTrack&&A===fA.VIDEO){let e=this.localMainVideoTrack.mediaTrack;if(e)return e.id}if(this.localAuxVideoTrack&&A===fA.AUXILIARY){let e=this.localAuxVideoTrack.mediaTrack;if(e)return e.id}return""}getSSRC(){return this.ssrc}checkPublishResultCode(A,e){if(A!==0)throw A===FR?(this._log.error(ts.NOT_SUPPORTED_H264ENCODE),new Ct({code:Ge.NOT_SUPPORTED_H264,message:Wi({key:Mi.NOT_SUPPORTED_H264ENCODE})})):new Ct({code:Ge.UNKNOWN,message:Wi({key:Mi.SIGNAL_RESPONSE_FAILED,data:{signalResponse:io.PUBLISH_RESULT,code:A,message:e}})})}onSinglePCReconnected(){return DA(this,null,function*(){this.isMainStreamPublished&&(this._log.warn("republish main stream"),yield this.publish({localAudioTrack:this.localMainAudioTrack,localVideoTrack:this.localMainVideoTrack,isAuxiliary:!1})),this.isAuxStreamPublished&&(this._log.warn("republish aux stream"),yield this.publish({localAudioTrack:this.localAuxAudioTrack,localVideoTrack:this.localAuxVideoTrack,isAuxiliary:!0}))})}};vt([wm(A=>{let{localVideoTrack:e}=A;e==null||delete e.retryEncodeFailed})],Kx.prototype,"unpublish"),vt([Qz({when(){return this.isDestroyed}})],Kx.prototype,"doPublishChange"),vt([Qz({when(){return this.isDestroyed}})],Kx.prototype,"doUnpublish");var dz=(A=>(A[A.audio=1]="audio",A[A.bigVideo=2]="bigVideo",A[A.smallVideo=3]="smallVideo",A[A.auxVideo=4]="auxVideo",A))(dz||{}),hz=Kx;function pz(A){return Object.keys(A).filter(e=>A[e])}var jx=class extends uz{constructor(A){super(fi(bt({},A),{isUplink:!1})),G(this,"_flag",0),G(this,"isRobot",!1),G(this,"role","anchor"),G(this,"fromType"),G(this,"remoteAudioTrack"),G(this,"remoteVideoTrack"),G(this,"remoteAuxiliaryTrack"),G(this,"ssrc",{audio:0,video:0,videoRtx:0,auxiliary:0,auxiliaryRtx:0}),G(this,"_prevMids"),G(this,"jitterBufferTimeoutId",-1),G(this,"_jitterBufferResolve"),G(this,"_videoCodec"),G(this,"avPlayerStateSyncManager"),G(this,"isDataChannelSubscribed",!1),this.flag=A.flag,this.isRobot=A.isRobot||!1,this.fromType=A.fromType,this.remoteAudioTrack=new Dx(this._room,this),this.remoteVideoTrack=new tG(this._room,this),this.remoteAuxiliaryTrack=new n4(this._room,this),this.avPlayerStateSyncManager=new Kq({log:this._log,audioPlayer:this.remoteAudioTrack.player,videoPlayer:this.remoteVideoTrack.player}),this.initialize()}get videoCodec(){var A;return this._videoCodec||((A=this.singlePC)==null?void 0:A.downlinkVideoCodec)||"h264"}set videoCodec(A){this._videoCodec=A}get subscribeState(){return{audio:this.remoteAudioTrack.isSubscribed||this.remoteAudioTrack.isSubscribing,video:this.remoteVideoTrack.isBig&&(this.remoteVideoTrack.isSubscribed||this.remoteVideoTrack.isSubscribing),smallVideo:this.remoteVideoTrack.isSmall&&(this.remoteVideoTrack.isSubscribed||this.remoteVideoTrack.isSubscribing),auxiliary:this.remoteAuxiliaryTrack.isSubscribed||this.remoteAuxiliaryTrack.isSubscribing,datachannel:this.isDataChannelSubscribed}}get muteState(){return mQ(this.flag,this.userId)}get flag(){return this._flag}set flag(A){var e,o,n;A!==this._flag&&(this._flag=A,(e=this.remoteAudioTrack)==null||e.onFlagChanged(),(o=this.remoteVideoTrack)==null||o.onFlagChanged(),(n=this.remoteAuxiliaryTrack)==null||n.onFlagChanged())}get hasMainStream(){return this.muteState.hasAudio||this.muteState.hasVideo||this.muteState.hasSmall}get hasAuxStream(){return this.muteState.hasAuxiliary}get isMainStreamSubscribed(){return(this.subscribeState.audio||this.subscribeState.video||this.subscribeState.smallVideo)&&(this.muteState.hasAudio||this.muteState.hasVideo||this.muteState.hasSmall)}get isAuxStreamSubscribed(){return this.subscribeState.auxiliary&&this.muteState.hasAuxiliary}get isSmallStreamSubscribed(){return this.subscribeState.smallVideo&&this.muteState.hasSmall}get isBigStreamSubscribed(){return this.subscribeState.video&&this.muteState.hasVideo}isStreamUnpublished(A){return A===fA.MAIN?!this.muteState.hasAudio&&!this.muteState.hasVideo:!this.muteState.hasAuxiliary}initialize(){this.installEvents()}close(A){clearTimeout(this.jitterBufferTimeoutId),super.close(A),this.emitConnectionStateChangedEvent("DISCONNECTED"),this.remoteAudioTrack.close(),this.remoteVideoTrack.close(),this.remoteAuxiliaryTrack.close(),this.avPlayerStateSyncManager.destroy(),this.uninstallEvents(),this.removeDownlink()}installEvents(){this.singlePC&&(this.listeners("track").includes(this.onTrack)||this.singlePC.on("track",this.onTrack,this),this.listeners("spc-reconnected").includes(this.onSinglePCReconnected)||this.singlePC.on("spc-reconnected",this.onSinglePCReconnected,this),this.remoteVideoTrack.on("decode-failed",this.onDecodeFailed,this))}uninstallEvents(){this.singlePC&&(this.singlePC.off("track",this.onTrack,this),this.singlePC.off("spc-reconnected",this.onSinglePCReconnected,this),this.remoteVideoTrack.off("decode-failed",this.onDecodeFailed,this))}emitConnectionStateChangedEvent(A){var e,o;let n=this._currentState,a=super.emitConnectionStateChangedEvent(A);return a&&n!==A&&((e=this.remoteVideoTrack)==null||e.emit("connection-state-changed",{prevState:n,state:A}),(o=this.remoteAuxiliaryTrack)==null||o.emit("connection-state-changed",{prevState:n,state:A})),a}onTrack(A){var e,o;let n=A.streams[0],{track:a,receiver:I}=A;if(!n.id.includes(this.tinyId))return;let c=n.id.includes("aux")?"auxiliary":"main";this._log.debug("ontrack ".concat(c," ").concat(a.kind));let u=fA.AUDIO;a.kind===fA.VIDEO&&(u=c===fA.MAIN?fA.VIDEO:fA.AUXILIARY);let d=this.remoteAudioTrack;u===fA.VIDEO?d=this.remoteVideoTrack:u===fA.AUXILIARY&&(d=this.remoteAuxiliaryTrack),(e=this.singlePC)==null||e.receiverRemoteTrackMap.set(I,d),(o=this.singlePC)!=null&&o.scriptTransformWorker&&this.initReceiverTransform(I,c,a.kind===fA.AUDIO),this.singlePC.enableInsertableStreams&&this.createEncodedStreams(I),d.setInputMediaStreamTrack(a)}createEncodedStreams(A){if(!this.singlePC.insertableStreamsAbortMap.has(A)){let e=A.createEncodedStreams(),o=new AbortController,n={abortController:o,enqueue:a=>{var I,c,u;let d=(I=this.singlePC)==null?void 0:I.receiverRemoteTrackMap.get(A);return d&&(d.kind!=="video"||(c=this.singlePC)!=null&&c.isUsingH264||(u=this.singlePC)!=null&&u.isUsingH265)?d.decodeFrame(a):a}};e.readable.pipeThrough(new TransformStream({transform:(a,I)=>{let c=n.enqueue(a);c&&I.enqueue(c)}})).pipeTo(e.writable,o).catch(a=>{a!=="destroy"&&this._log.warn(a)}),this.singlePC.addAbortController(A,o)}}initReceiverTransform(A,e,o){!this._peerConnection||!this.singlePC||!this.singlePC.scriptTransformWorker||A.transform||(A.transform=new RTCRtpScriptTransform(this.singlePC.scriptTransformWorker,{isReceiver:!0,isAudio:o,userId:this.userId,streamType:e}))}subscribe(A,e){return DA(this,null,function*(){var o,n;try{let a=!0;if(this._log.info("subscribe ".concat(e," ").concat(pz(A))),this.hasSSRC){let u="subscribe_change";Object.values(A).find(d=>d===!0)||(u="unsubscribe"),yield this.sendSubscription(u,A)}else{if(yield this._room.switchRoomSubedReq,(o=this.singlePC)!=null&&o.autoSubscribedUserMap.size){let u=this.singlePC.autoSubscribedUserMap.get(this.userId);if(u){this.singlePC.autoSubscribedUserMap.delete(this.userId);let d=(n=this.singlePC.autoSubscribedSsrcGroups.get(this._room.roomId))==null?void 0:n[u.groupIndex];d&&(this.ssrc={audio:d.audioSsrc,video:d.bigVideoSsrc,videoRtx:d.bigVideoRtxSsrc,auxiliary:d.auxVideoSsrc,auxiliaryRtx:d.auxVideoRtxSsrc},a=!1)}}yield this.doSubscribe(A,a),this.checkTrackEnded(A)}let{user:I,mediaTrack:c}=this.remoteVideoTrack;A.smallVideo&&c?(ct.addSuccessEvent({key:524702}),this._blackSmallVideoDetectionId=Fm.start({track:c,isUplink:!1,room:this._room,userId:this.userId,onBlack:()=>{this._log.warn("small video is black, auto change to big"),this._room.changeType(!1,I),ct.addFailedEvent({key:524702}),Fm.stop(this._blackSmallVideoDetectionId),this._blackSmallVideoDetectionId=void 0}})):(Fm.stop(this._blackSmallVideoDetectionId),this._blackSmallVideoDetectionId=void 0)}catch(a){throw this._room.isJoined&&this.isStreamUnpublished(e)?(this._log.warn("".concat(a.message," ").concat(JSON.stringify(this.muteState))),new Ct({code:Ge.REMOTE_STREAM_NOT_EXIST,message:"remote user ".concat(this.userId," unpublished stream")})):a}})}checkTrackEnded(A){var e,o,n;if((A.audio&&((e=this.remoteAudioTrack.mediaTrack)==null?void 0:e.readyState)==="ended"||A.video&&((o=this.remoteVideoTrack.mediaTrack)==null?void 0:o.readyState)==="ended"||A.auxiliary&&((n=this.remoteAuxiliaryTrack.mediaTrack)==null?void 0:n.readyState)==="ended")&&this.singlePC&&!this.singlePC.isReconnecting){if(this._log.warn("remote track ended start spc reconnect"),Bc&&tE<92)return;this.singlePC.startReconnection()}}unsubscribe(A){return DA(this,arguments,function(e){var o=this;let{remoteTracks:n,streamType:a}=e;return function*(){var I;if(a==="main"&&!o.isMainStreamSubscribed||a==="auxiliary"&&!o.isAuxStreamSubscribed)return void o._log.info("".concat(a," stream already unsubscribed"));let c=bt({},o.subscribeState);n.forEach(d=>{switch(d.mediaType){case 1:c.audio=!1;break;case 4:c.video=!1;break;case 8:c.smallVideo=!1;break;case 2:c.auxiliary=!1}});let u="subscribe_change";Object.values(c).find(d=>d===!0)||(u="unsubscribe"),o._log.info("".concat(u==="unsubscribe"?u:"subscribe"," ").concat(a," [").concat(pz(c),"]")),u==="unsubscribe"&&((I=o.singlePC)==null||I.removeDownlinkQueue.add(o.tinyId)),yield o.sendSubscription(u,c),a==="main"&&(Fm.stop(o._blackSmallVideoDetectionId),o._blackSmallVideoDetectionId=void 0),u==="unsubscribe"&&(yield o.removeDownlink())}()})}subscribeDataChannel(){return DA(this,null,function*(){if(!this.singlePC)return;yield this.singlePC.waitForPeerConnectionConnected();let A=fi(bt({},this.subscribeState),{datachannel:!0});yield this.doSubscribe(A)})}unsubscribeDataChannel(){return DA(this,null,function*(){let A=fi(bt({},this.subscribeState),{datachannel:!1});yield this.sendSubscription("unsubscribe",A),yield this.removeDownlink()})}sendSubscription(A){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.subscribeState,o={srcTinyId:this.tinyId,srcUserId:this.userId},n=aK,a=io.UNSUBSCRIBE_RESULT;return A==="subscribe_change"&&(o={audio:e.audio,bigVideo:e.video,auxVideo:e.auxiliary,smallVideo:e.smallVideo,customData:e.datachannel,srcTinyId:this.tinyId},n=sK,a=io.SUBSCRIBE_CHANGE_RESULT),this._signalChannel.sendWaitForResponseWithRetry({command:n,data:o,responseCommand:a,timeout:1e4,retries:3}).then(I=>{let{data:c}=I;if(c.code!==0){let u=new Ct({code:c.code,message:Wi({key:Mi.ERROR_MESSAGE,data:{type:A,message:c.message}})});throw this._log.error(u),u}})}getMainStreamVideoTrackId(){return this.remoteVideoTrack&&this.remoteVideoTrack.mediaTrack?this.remoteVideoTrack.mediaTrack.id:""}getAuxStreamVideoTrackId(){return this.remoteAuxiliaryTrack&&this.remoteAuxiliaryTrack.mediaTrack?this.remoteAuxiliaryTrack.mediaTrack.id:""}setDelay(A){let{audioDelay:e,videoDelay:o}=A;this.remoteAudioTrack.stat.end2EndDelay=e,this.remoteVideoTrack.stat.end2EndDelay=o}onSinglePCReconnected(){return DA(this,null,function*(){(this.ssrc.audio||this.ssrc.video||this.ssrc.auxiliary||this.isDataChannelSubscribed)&&(this._log.warn("resubscribe ".concat(JSON.stringify(this.subscribeState))),yield this.doSubscribe(this.subscribeState),this.remoteAudioTrack.checkDecodeResult(),this.remoteVideoTrack.checkDecodeResult(),this.remoteAuxiliaryTrack.checkDecodeResult())})}get hasSSRC(){return this.ssrc.audio&&this.ssrc.video&&this.ssrc.auxiliary}doSubscribe(){return DA(this,arguments,function(){var A=this;let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.subscribeState,o=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1];return function*(){var n,a;if(A.singlePC){A.singlePC.addDownlinkQueue.add(A.tinyId),yield A.singlePC.waitForPeerConnectionConnected();try{if(o||!A.hasSSRC){let I={audioSsrc:gB(),bigVideoSsrc:gB(),bigVideoRtxSsrc:gB(),auxVideoSsrc:gB(),auxVideoRtxSsrc:gB()},{audioSsrc:c,bigVideoSsrc:u,bigVideoRtxSsrc:d,auxVideoSsrc:R,auxVideoRtxSsrc:k}=I;A.ssrc={audio:c,video:u,videoRtx:d,auxiliary:R,auxiliaryRtx:k},A.singlePC.addDownlinkQueue.delete(A.tinyId),yield A.singlePC.addDownlink({userId:A.userId,tinyId:A.tinyId,ssrc:A.ssrc,prevMids:A._prevMids});try{let _=yield A._signalChannel.sendWaitForResponseWithRetry({command:Z4,responseCommand:io.SPC_SUBSCRIBE_RESULT,data:{srcUserId:A.userId,srcTinyId:A.tinyId,audio:e.audio,bigVideo:e.video,auxVideo:e.auxiliary,smallVideo:e.smallVideo,customData:(n=e.datachannel)!=null&&n,ssrc:I},retries:3,retryTimeout:0});if(_.data.code!==0&&_.data.code!==-10036)throw new Ct({code:_.data.code,message:_.data.message});A.isDataChannelSubscribed=(a=e.datachannel)!=null&&a}catch(_){throw yield A.removeDownlink(),_}return}A.singlePC.addDownlinkQueue.delete(A.tinyId),yield A.singlePC.addDownlink({userId:A.userId,tinyId:A.tinyId,ssrc:A.ssrc,prevMids:A._prevMids})}finally{if((e.audio||e.video||e.smallVideo||e.auxiliary||!e.datachannel)&&Du){let{main:I,aux:c}=A._room.jitterBufferDelay||{},{jitterDelay:u=I,jitterDelayAux:d=c}=A._room.scheduleResult.config||{};(hr(u)||hr(d))&&A.setJitterBufferDelay({mainDelay:u,auxDelay:d})}}}}()})}removeDownlink(){return DA(this,null,function*(){this.singlePC&&(this.isDataChannelSubscribed=!1,this.ssrc={audio:0,video:0,videoRtx:0,auxiliary:0,auxiliaryRtx:0},this.singlePC.removeDownlinkQueue.delete(this.tinyId),clearTimeout(this.jitterBufferTimeoutId),this._jitterBufferResolve&&(this._jitterBufferResolve(),this._jitterBufferResolve=void 0),this.setJitterBufferDelay({mainDelay:0,auxDelay:0}),this._prevMids=yield this.singlePC.removeDownlink(this.userId))})}setJitterBufferDelay(A){let{mainDelay:e,auxDelay:o}=A;if(!Du||!this.singlePC||!this._peerConnection||$c(e)&&$c(o))return Promise.resolve();this._log.info("set jitterBuffer main: ".concat(e," aux: ").concat(o));let n=this.singlePC.getReceiversByUserId(this.userId);return hr(e)&&(this.remoteAudioTrack.jitterBufferDelay=e,this.remoteVideoTrack.jitterBufferDelay=e),hr(o)&&(this.remoteAuxiliaryTrack.jitterBufferDelay=o,$c(e)&&(this.remoteAudioTrack.jitterBufferDelay=o)),new Promise(a=>{this._jitterBufferResolve=a,this.doSetJitterBufferDelay({mainDelay:e,auxDelay:o,receivers:n,resolve:a})})}doSetJitterBufferDelay(A){let{mainDelay:e,auxDelay:o,receivers:n,resolve:a}=A;try{if(e===0&&o===0)return n.forEach(I=>I.jitterBufferTarget=0),this._jitterBufferResolve=void 0,a();if(n.forEach(I=>{var c;let u=I.track===this.remoteAuxiliaryTrack.outMediaTrack||$c(e)&&I.track===this.remoteAudioTrack.outMediaTrack;if(u&&$c(o)||!u&&$c(e))return;let d=u?o||0:e,R=(I.jitterBufferTarget||0)+100;R>d||(I.jitterBufferTarget=R,this._log.debug("set ".concat(u?"aux ":"").concat((c=I?.track)==null?void 0:c.kind," jitterBuffer delay ").concat(R," -> ").concat(d)))}),!n.find(I=>{let c=I.track===this.remoteAuxiliaryTrack.outMediaTrack?o||0:e;return I.jitterBufferTarget{this.doSetJitterBufferDelay({mainDelay:e,auxDelay:o,receivers:n,resolve:a})},1e3)}catch(I){this._log.warn("set jitterBuffer delay error: ".concat(I)),clearTimeout(this.jitterBufferTimeoutId),this._jitterBufferResolve=void 0,a()}}get audioReceiver(){var A;return((A=this.singlePC)==null?void 0:A.getReceiversByUserId(this.userId)[0])||null}onDecodeFailed(){this._room.downlinkVideoCodec==="h265"&&this._room.requestRemoteFallbackToH264()}};vt([VT(),Dn(A=>function(){for(var e=arguments.length,o=new Array(e),n=0;n{let c=u=>{this.off("closed",c),I(new Ct({code:Ge.API_CALL_ABORTED,message:Wi({key:Mi.CONNECTION_ABORTED,data:u})}))};this.on("closed",c),A.apply(this,o).then(a,I).finally(()=>{this.off("closed",c)})})})],jx.prototype,"subscribe"),vt([VT()],jx.prototype,"unsubscribe"),vt([Kh(()=>"jitter")],jx.prototype,"setJitterBufferDelay");var UtA=jx,OtA=es(hg()),fz=class t6 extends OtA.EventEmitter{constructor(e,o){super(),this.room=e,this.signalChannel=o,G(this,"log"),G(this,"cmdIdSeqMap",new Map),G(this,"messageMap",new Map),this.log=nA.createLogger({parent:e.getLogger(),id:"cmm",userId:e.userId}),this.onReceiveMsg=this.onReceiveMsg.bind(this),o.on(io.RECEIVE_CUSTOM_MSG,this.onReceiveMsg),this.room.on("peer-leave",n=>{let{userId:a}=n;[...this.messageMap.keys()].forEach(I=>{I.split("_").slice(0,-1).join("_")===a&&this.messageMap.delete(I)})})}send(e){let{cmdId:o,data:n}=e,a=this.cmdIdSeqMap.get(o)||Math.floor(16383*Math.random()),I={cmdId:o,msg:btoa(String.fromCharCode(...new Uint8Array(n))),ordered:!0,reliable:!0,streamSeq:a};this.cmdIdSeqMap.set(o,a+1),this.signalChannel.send(rtA,I),this.log.debug("send custom msg: ".concat(JSON.stringify(I)))}onReceiveMsg(e){let{data:o}=e.data,n=this.room.tinyIdToUserIdMap.get(o.srcTinyId);if(n){let a={userId:n,cmdId:o.cmdId,seq:o.streamSeq,data:Uint8Array.from(atob(o.msg),I=>I.charCodeAt(0)).buffer};if(o.ordered){let I="".concat(n,"_").concat(a.cmdId),c=this.messageMap.get(I);if(c&&c.lastSeq!==0)if(Math.abs(c.lastSeq-a.seq)>t6.SEQ_INTERVAL)this.messageMap.set(I,{lastSeq:a.seq,cachedMessageMap:new Map}),this.emitMessage(a);else if(a.seq>c.lastSeq){if(a.seq===c.lastSeq+1)this.emitMessage(a);else if(!c.cachedMessageMap.has(a.seq)){let u=setTimeout(()=>this.emitMessage(a,!0),5e3);c.cachedMessageMap.set(a.seq,{message:a,timeoutId:u})}}else this.log.debug("drop message ".concat(a.userId,"-").concat(a.cmdId,"-").concat(a.seq));else c||(c={lastSeq:0,cachedMessageMap:new Map},this.messageMap.set(I,c),setTimeout(()=>this.emitMessage(a,!0),100)),c.cachedMessageMap.set(a.seq,{message:a})}else this.emit("message",a)}else{this.log.warn("receive msg from unknown user, wait peer-join tinyId: ".concat(o.srcTinyId));let a=I=>{I.tinyId===o.srcTinyId&&(this.room.off("peer-join",a),this.onReceiveMsg(e))};this.room.on("peer-join",a),AC(2e3).then(()=>this.room.off("peer-join",a))}}emitMessage(e){let o=arguments.length>1&&arguments[1]!==void 0&&arguments[1];var n;let a=this.messageMap.get("".concat(e.userId,"_").concat(e.cmdId)),I=e;if(a){if(o){let u=[...a.cachedMessageMap.values()].sort((d,R)=>d.message.seq-R.message.seq);u[0]&&(I=u[0].message)}a.lastSeq!==0&&I.seq-a.lastSeq>1&&this.log.debug("msg lost userId: ".concat(I.userId," seq: ").concat(a.lastSeq," -> ").concat(I.seq)),a.lastSeq=I.seq,clearTimeout((n=a.cachedMessageMap.get(I.seq))==null?void 0:n.timeoutId),a.cachedMessageMap.delete(I.seq)}this.log.debug("receive custom msg: ".concat(JSON.stringify(I))),this.emit("message",I);let c=a?.cachedMessageMap.get(I.seq+1);c&&this.emitMessage(c.message)}};G(fz,"SEQ_INTERVAL",300);var xtA=fz,{isString:mz,isUndefined:Um,getNetworkType:YtA,isEmpty:PtA}=tl,ep=class extends wtA{constructor(A){super(A),G(this,"_businessInfo"),G(this,"userManager"),G(this,"_version"),G(this,"_heartbeat",-1),G(this,"_lastHeartBeatTime",-1),G(this,"_stats"),G(this,"_joinTimeout",-1),G(this,"_firstPublishedList",null),G(this,"_joinReject",null),G(this,"_isRelayChanged",!1),G(this,"sdpSemantics"),G(this,"signalChannel",null),G(this,"uplinkConnection",null),G(this,"singlePC",null),G(this,"enableSPC",Qm),G(this,"_changeBigSmallRecords",new Map),G(this,"networkQuality"),G(this,"_iceTransportPolicy"),G(this,"forceRelay",!1),G(this,"_turnServers",[]),G(this,"_iceServersFromJoin"),G(this,"_syncUserListInterval",-1),G(this,"_smallStreamConfig",{bitrate:100,frameRate:15,height:120,width:160}),G(this,"enableSEI",!1),G(this,"_enableAudioVolumeEvaluation",!1),G(this,"_audioVolumeIntervalId",0),G(this,"_enableMultiAuxStream",!1),G(this,"_pureAudioPushMode",!1),G(this,"_customMessageManager"),G(this,"_enableDataChannel",!1),G(this,"preferHW",!1),G(this,"healthDetector"),G(this,"playoutDelay"),G(this,"jitterBufferDelay"),G(this,"_updateAudioLevelTaskId",-1),G(this,"switchRoomSubedReq"),G(this,"resolveSwitchRoomSubedReq"),G(this,"enableVolumeControlInIOS"),G(this,"capturedLocalMainAudioTrack"),G(this,"capturedLocalMainVideoTrack"),G(this,"capturedLocalAuxVideoTrack"),G(this,"PRELINK_EXPIRED_TIME",3e5),G(this,"PRELINK_TIMEOUT",1e4),G(this,"prelinkTimeoutId",null),G(this,"firewallDetector"),this.firewallDetector=new geA,this.firewallDetector.on("firewall-restriction",()=>{this._log.warn("firewall restriction"),this.emit("firewall-restriction")}),this._stats=new EtA(this,this._log),this.userManager=new aeA(this.userId,this._log),this._version=il,this.sdpSemantics=LR,Um(A.sdpSemantics)?kA.isUnifiedPlanDefault()&&(this.sdpSemantics=_f):this.sdpSemantics=A.sdpSemantics,this._log.info("sdpSemantics: ".concat(this.sdpSemantics,", netType: ").concat(YtA())),A.iceTransportPolicy&&(this._iceTransportPolicy=A.iceTransportPolicy),this._enableMultiAuxStream=!Um(A.enableMultiAuxStream)&&A.enableMultiAuxStream,this.enableSEI=A.enableSEI&&Qm,!Um(A.enableSPC)&&Qm&&(this.enableSPC=A.enableSPC),this.preferHW=!!A.preferHW,this.enableVolumeControlInIOS=A.enableVolumeControlInIOS,this._initBusinessInfo(A),this.healthDetector=new ktA(this)}get isMainStreamPublished(){var A;return!((A=this.uplinkConnection)==null||!A.isMainStreamPublished)}get isMainAudioPublished(){var A;return!((A=this.uplinkConnection)==null||!A.localMainAudioTrack)}get isAuxStreamPublished(){var A;return!((A=this.uplinkConnection)==null||!A.isAuxStreamPublished)}get hasAuxStream(){return[...this.remotePublishedUserMap.values()].findIndex(A=>A.muteState.hasAuxiliary)>=0}get userMap(){return this.userManager.userMap}get remotePublishedUserMap(){return this.userManager.remotePublishedUserMap}get tinyIdToUserIdMap(){return new Map([...this.userMap.values()].map(A=>[A.tinyId,A.userId]))}get videoCodec(){var A;return((A=this.singlePC)==null?void 0:A.videoCodec)||"h264"}get downlinkVideoCodec(){var A;return((A=this.singlePC)==null?void 0:A.downlinkVideoCodec)||"h264"}join(A,e,o){return DA(this,null,function*(){return this.userManager.mySelfId=this.userId,this.userManager.on("1",n=>{this.emit("peer-join",n)}),this.userManager.on("8",n=>{this.emit("asr-robot-peer-join",n)}),this.userManager.on("9",n=>{this.emit("asr-robot-peer-leave",n)}),this.userManager.on("2",n=>{let{userId:a,reason:I}=n;this.closeDownLinkConnection(a,"remote user exitRoom"),this.emit("peer-leave",{userId:a,reason:I})}),this.userManager.on("3",this.createDownlinkConnection,this),this.userManager.on("5",this.closeDownLinkConnection,this),this.userManager.on("6",n=>{var a=PU(n,[]);S.emit(K.REMOTE_PUBLISH_STATE_CHANGED,bt({room:this},a)),this.emit("remote-publish-state-changed",bt({},a))}),this.joinParams=A,rn(A.enableDataChannel)&&(this._enableDataChannel=A.enableDataChannel),new Promise((n,a)=>DA(this,null,function*(){var I,c;this._joinReject=a;try{this.checkDestroy();try{yield Promise.all([this.initialize(),this.initSinglePC()])}catch(d){if(!(d instanceof Ct&&d.code===Ge.SPC_INITIALIZED_FAILED))return a(d);(I=this.signalChannel)==null||I.destroy(),yield this.initialize()}let u=ki();yield this.doJoin(A,(c=this.singlePC)==null?void 0:c.clientAbility),ct.addSuccessEvent({key:521708,cost:ki()-u}),n(),this._firstPublishedList&&this.onPublishedUserList({data:{userList:this._firstPublishedList}})}catch(u){ct.addFailedEvent({key:521708,error:u}),a(u)}this._joinReject=null}))})}initSinglePC(){return DA(this,null,function*(){if(this.enableSPC&&!this.singlePC){this.singlePC=new Ap({signalChannel:this.signalChannel,room:this,enableDataChannel:this._enableDataChannel}),this.singlePC.on("sei-message",A=>this.emit("sei-message",A)),this.singlePC.on("dump",A=>this.emit("dump",A)),this.singlePC.once("error",()=>this.fallbackToMPC()),this.singlePC.on("data_channel_msg",A=>{let e=new TextDecoder().decode(A.data.data||A.data);try{this.emit("data-channel-message",{data:JSON.parse(e)})}catch{}});try{return yield this.singlePC.initialize()}catch(A){throw this.fallbackToMPC(),new Ct({code:Ge.SPC_INITIALIZED_FAILED,message:A?.message})}}})}doJoin(A,e){return new Promise((o,n)=>DA(this,null,function*(){var a,I,c,u,d,R,k,_;A.privateMapKey&&(this.privateMapKey=A.privateMapKey),A.latencyLevel&&(this.latencyLevel=A.latencyLevel),this.signalChannel.once(Ox,cA=>{this.clearJoinTimeout(),S.emit(K.JOIN_SIGNAL_CONNECTION_END,{room:this,error:cA}),n(cA)}),rn((I=(a=this.scheduleResult)==null?void 0:a.config)==null?void 0:I.singlePC)&&Qm&&(this.enableSPC=this.scheduleResult.config.singlePC),this.keyPointManager.setConnectionType(this.singlePC?1:2),(!((u=(c=this.scheduleResult)==null?void 0:c.config)!=null&&u.jitterDelay)&&!((R=(d=this.scheduleResult)==null?void 0:d.config)!=null&&R.jitterDelayAux)||!Du)&&e&&this.playoutDelay&&(this._log.info("set playoutDelay",JSON.stringify(this.playoutDelay)),e.playoutDelay=this.playoutDelay);let Z={roomId:String(A.roomId||A.strRoomId),useStringRoomId:this.useStringRoomId,privateMapKey:this.privateMapKey,latencyLevel:this.latencyLevel,trtcRole:A.role,trtcScene:this.scene==="live"?2:1,sdpSemantics:this.sdpSemantics,version:this._version,ua:navigator&&navigator.userAgent||"",terminalType:er(),netType:hh(),bussinessInfo:this._businessInfo,ability:e,sdkType:this._sdkType,userSig:this.userSig,receiveMix:!0,isChorus:!!this.enableChorus,enableNtpAudioFrame:!!this.enableChorus&&yM(),transcription:this._enableDataChannel,downUseVp8:((k=this.scheduleResult.config)==null?void 0:k.downUseVp8)||!1};this._log.debug("join room signal data: ".concat(JSON.stringify(Z)));let iA=5e3;(_=this.scheduleResult.config)!=null&&_.enterRoomTimeout&&this.scheduleResult.config.enterRoomTimeout>=1&&(iA=1e3*this.scheduleResult.config.enterRoomTimeout),this._joinTimeout=window.setTimeout(()=>{n(new Ct({code:Ge.JOIN_ROOM_FAILED,message:Wi({key:Mi.JOIN_ROOM_TIMEOUT})}))},iA),S.emit(K.JOIN_SEND_CMD,{room:this}),this.signalChannel.send(this.singlePC?ttA:YeA,Z),this.signalChannel.once(io.JOIN_ROOM_RESULT,cA=>DA(this,null,function*(){this.clearJoinTimeout();let{code:TA,message:JA,data:Ie,tinyId:XA}=cA.data;S.emit(K.JOIN_RECEIVED_CMD_RES,{room:this,code:TA}),TA===0?(this._log.info("Join room success, start heartbeat"),XA&&(this.tinyId=XA),this.startHeartbeat(),this.syncUserList(),this.startSyncUserListInterval(),this._firstPublishedList=Ie.publishers,this._iceServersFromJoin=Ie.iceServer?[Ie.iceServer]:[],this.singlePC&&this.singlePC.setIceServers(this.getIceServers()).then(()=>{var Ft;(Ft=this.singlePC)==null||Ft.connect(fi(bt({},Ie.ability),{useVp8:Ie.ability.useVp8||!!A.useVp8,useH265:Ie.ability.useH265&&!!A.useH265})).catch(()=>{})}),o()):(this._log.error("Join room failed result: ".concat(TA," error: ").concat(JA)),n(new Ct({code:Ge.JOIN_ROOM_FAILED,extraCode:TA,message:Wi({key:Mi.JOIN_ROOM_FAILED,data:{error:JA,code:TA}})})))}))}))}reJoin(){return DA(this,null,function*(){if(this.isJoined)try{this._log.warn("reJoin pending: ".concat(this.joinParams.roomId));let A,e=[];if(this.singlePC&&(this.singlePC.close(),this.singlePC=null,e.push(this.initSinglePC().then(o=>(A=o,o)))),this.signalChannel&&(this.signalChannel.close(),e.push(this.signalChannel.connect())),yield Promise.all(e),yield this.doJoin(fi(bt({},this.joinParams),{role:this.role==="anchor"?20:21,privateMapKey:this.privateMapKey,latencyLevel:this.latencyLevel}),A),this._log.warn("reJoin success"),Jo.logSuccessEvent({userId:this.userId,eventType:oa.REJOIN}),this.singlePC){let o=n=>{var a;n.state==="CONNECTED"&&((a=this.singlePC)==null||a.off(VM.CONNECTION_STATE_CHANGED,o),this.uplinkConnection instanceof hz&&(this.uplinkConnection.installEvents(),this.uplinkConnection.onSinglePCReconnected()),this.remotePublishedUserMap.forEach(I=>{I.installEvents(),I.onSinglePCReconnected()}))};this.singlePC.on(VM.CONNECTION_STATE_CHANGED,o),this.checkConnectionsToReconnect(),this.uplinkConnection instanceof Vx&&!this.uplinkConnection.getIsReconnecting()&&this.uplinkConnection.startReconnection()}}catch(A){this._log.warn("reJoin fail ".concat(A)),this.reset(),Jo.logFailedEvent({userId:this.userId,eventType:oa.REJOIN,error:A}),this.emit("error",new Ct({code:Ge.JOIN_ROOM_FAILED,message:Wi({key:Mi.REJOIN_ROOM_FAILED,data:{roomId:this.joinParams.roomId}})}))}else this._log.warn("reJoin abort")})}initialize(A){return DA(this,null,function*(){var e,o;if(!(A!=null&&A.isPrelink)&&this.prelinkPromise&&(yield this.prelinkPromise),(e=this.signalChannel)!=null&&e.isPrelinkValid(this.sdkAppId,this.userId,this.userSig))return this._log.info("reuse prelink signal channel"),void this.signalChannel.consumePrelink();(o=this.signalChannel)!=null&&o.prelink&&this.signalChannel.close();let n,{mainUrl:a,backupUrl:I}=this.getSignalChannelUrl(),c=this.signalChannel||function(d){return[...Px.values()].find(k=>k.room.userId===d&&!k.room.isJoined)||null}(this.userId),u=!!(c&&c.isConnected&&c.keepAlive&&c.userId===this.userId);return Array.isArray(this.scheduleResult.domains)&&this.scheduleResult.domains.length>0&&(n=this.scheduleResult.domains[0]),this._log.info("".concat(u?"reuse":"setup"," signal channel")),u?(c.url=a,c.backupUrl=I,c.room.setSignalChannel(null),c.room=this,this.signalChannel=c):(c&&c.close(),this.signalChannel=new X4({sdkAppId:this.sdkAppId,userId:this.userId,userSig:this.userSig,url:a,backupUrl:I,room:this,signalDomainWhenUnifiedProxy:this.proxy_unified?n:void 0,prelink:A?.isPrelink}),this._customMessageManager=new xtA(this,this.signalChannel),this._customMessageManager.on("message",d=>{this.emit("custom-message",d)})),this.networkQuality||(this.networkQuality=new iz({signalChannel:this.signalChannel,room:this}),this.networkQuality.on(iz.EVENT_NETWORK_QUALITY,d=>{var R;this.emit("network-quality",d),(R=this.singlePC)==null||R.detectTCPAndUDP(d)})),nE(this,this.signalChannel).add(rK,d=>{S.emit(K.SIGNAL_CONNECTION_STATE_CHANGED,bt({room:this},d)),this.emit("signal-connection-state-changed",d)}).add(UeA,d=>{this.reset(),this.emit("error",d)}).add(io.PEER_JOIN,d=>{let{srcTinyId:R,userId:k,role:_,fromType:Z}=d.data.data;this.userManager.addUser({userId:k,tinyId:R,role:_,fromType:Z})}).add(io.PEER_LEAVE,d=>{let{userId:R,reason:k=0}=d.data.data;this.userManager.deleteUser(R,k)}).add(io.UPDATE_REMOTE_MUTE_STAT,d=>{this._lastHeartBeatTime>0&&Date.now()-this._lastHeartBeatTime>=1e4&&this.doHeartbeat(),this.onPublishedUserList(d.data)}).add(io.CLIENT_BANNED,d=>{let R=d.data.data,{reason:k}=R;if(Jo.uploadEvent({log:"stat-banned:".concat(k),userId:this.userId}),k==="user_time_out")return this._log.warn("".concat(k," last heart beat time: ").concat(this._lastHeartBeatTime," interval: ").concat(Date.now()-this._lastHeartBeatTime,", visibility: ").concat(document.visibilityState)),void this.reJoin();this._log[k==="kick"?"error":"info"]("user was banned because of [".concat(k,"]")),this.reset(),this.emit("banned",{reason:k})}).add(io.SEND_SWITCH_ROOM_SUBED_REQ,d=>{if(!this.singlePC)return;let{subList:R}=d.data.data;this._log.info("auto subscribe ".concat(nl(R,{keysToInclude:["userId"]}))),R.forEach(k=>{this.singlePC.autoSubscribedUserMap.set(k.userId,k)}),this.resolveSwitchRoomSubedReq()}).add(io.FALLBACK_CODEC,d=>DA(this,null,function*(){var R,k,_,Z,iA;let cA=d.data.data;((R=cA.videoControlInfo)==null?void 0:R.enableH265Enc)===0&&((k=this.singlePC)==null?void 0:k.videoCodec)==="h265"&&(this._log.warn("fallback codec enableH265Enc: ".concat((_=cA.videoControlInfo)==null?void 0:_.enableH265Enc)),ct.addCount({key:513e3}),yield(Z=this.singlePC)==null?void 0:Z.switchVideoEncoder("h264"),yield(iA=this.uplinkConnection)==null?void 0:iA.sendMediaSettings())})),this.signalChannel.once(H4,d=>{this.tinyId=d.signalInfo.tinyId,S.emit(K.JOIN_SIGNAL_CONNECTION_END,{room:this})}),S.emit(K.JOIN_SIGNAL_CONNECTION_START,{room:this}),yield this.signalChannel.connect(),u&&S.emit(K.JOIN_SIGNAL_CONNECTION_END,{room:this}),u})}setSignalChannel(A){this.signalChannel=A,A||pr(this)}leave(){return DA(this,null,function*(){var A;try{yield this.doHeartbeat()}catch{}this._log.info("leave() => leaving room"),S.emit(K.LEAVE_SEND_CMD,{room:this}),(A=this.signalChannel)==null||A.send(PeA),this.switchRoomSubedReq=void 0,this._changeBigSmallRecords.clear()})}clearNetworkQuality(){this.networkQuality&&(this.networkQuality.stop(),delete this.networkQuality)}closeConnections(){this.remotePublishedUserMap.forEach(A=>{this.closeDownLinkConnection(A.userId,"you exitRoom")})}clearJoinTimeout(){clearTimeout(this._joinTimeout),this._joinTimeout=-1}startHeartbeat(){this._heartbeat===-1&&(this._heartbeat=nn.run("ric",this.doHeartbeat.bind(this),{delay:2e3}),this.enableChorus&&this.startUpdateNTPTime())}stopHeartbeat(){this._heartbeat!==-1&&(this._log.info("stopHeartbeat"),nn.clearTask(this._heartbeat),this._heartbeat=-1,this._lastHeartBeatTime=-1)}doHeartbeat(){return DA(this,null,function*(){var A;let e=this.badCaseDetector.getMonitorFreeze(),o=yield this._stats.getStatsReport({uplinkConnection:this.uplinkConnection,downlinkConnections:this.remotePublishedUserMap,freezeMap:e});this.badCaseDetector.resetMonitor();let n=(A=this.signalChannel)!=null&&A.isConnected?function(I){if(UM.has(I)){let c=UM.get(I).map(u=>({uint32_event_id:u.eventId,uint64_date:u.timestamp,str_userid:u.remoteUserId,uint32_param1:u.param1,uint32_param2:u.param2,uint32_video_stream_type:u.streamType}));return UM.delete(I),c}return[]}(this.userId):[],a=fi(bt({str_sdk_version:wR,uint64_datetime:new Date().getTime(),msg_user_info:{str_identifier:this.userId,uint64_tinyid:this.tinyId},msg_event_msg:n,str_acc_ip:this.getSignalInfo().relayIp,str_client_ip:this.getSignalInfo().clientIp},o),{msg_device_info:bt({uint32_terminal_type:15,str_device_name:Qu(),str_os_version:"",uint32_net_type:hh()},o.msg_device_info)});if(this.heartbeatReport=a,this.heartbeatCount++,S.emit(K.HEARTBEAT_REPORT,{room:this,report:a}),this.signalChannel){if(this.signalChannel.isConnected){this.signalChannel.send(JeA,a);let I=Date.now();this._lastHeartBeatTime>0&&I-this._lastHeartBeatTime>1e4&&this._log.warn("heartbeat took ".concat(I-this._lastHeartBeatTime)),this._lastHeartBeatTime=I,this.signalChannel.isOnline||(this._log.warn("signal channel is not online"),this.signalChannel.startReconnection())}this.emit("heartbeat-report",fi(bt({},a),{bytes_sent:this._stats.totalBytesSent+this.signalChannel.bytesSent,bytes_received:this._stats.totalBytesReceived+this.signalChannel.bytesReceived}))}!this._isRelayChanged&&this.isRelayMaybeFailed()&&(this.reJoin(),this._isRelayChanged=!0)})}onPublishedUserList(A){if(!this.isJoined)return;let e=!1,o=A.data.userList||[],n=A.data.mixRobotList||[],a=[];for(let c of o){if(c.flag===hN)continue;let{userId:u,srcTinyId:d,flag:R,fromType:k}=c;u===this.userId&&(e=!0,this.uplinkConnection&&(this.uplinkConnection.flag=R),this.localPublishFlag!==R&&(this.localPublishFlag=R,this.emit("local-publish-flag-changed",R))),a.push({userId:u,tinyId:d,flag:R,fromType:k})}let I=[...n.map(c=>{let{userId:u,srcTinyId:d,flag:R,mixUserList:k,fromType:_}=c;return{userId:u,tinyId:d,flag:R,isRobot:!0,mixUserList:k,fromType:_}}),...a];I.forEach(c=>{let{userId:u}=c,d=this.remotePublishedUserMap.get(u);d&&this.checkSubscribeBigSmallVideo(d)}),A.data.fakeMixUser&&(A.data.fakeMixUser.tinyId=A.data.fakeMixUser.srcTinyId,I.push(A.data.fakeMixUser)),S.emit(K.RECEIVED_PUBLISHED_USER_LIST,{room:this,publishedUserList:I}),e||(this.localPublishFlag=0,this.emit("local-publish-flag-changed",0)),this.userManager.setRemotePublishedUserList(I)}closeUplink(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"you unpublished";this.uplinkConnection&&(this.localTracks.size>0&&this.uplinkConnection.doUnpublish().catch(()=>{}),this.uplinkConnection.close(A),A==="you exitRoom"&&(this.uplinkConnection.destroy(),this.uplinkConnection=null),this.uplinkConnection instanceof Vx&&(this.uplinkConnection=null)),this.localTracks.forEach(e=>e.unpublish()),this.localTracks.clear()}createDownlinkConnection(A){let{userId:e,tinyId:o,flag:n,isRobot:a,fromType:I}=A,c=new(this.singlePC?UtA:ez)({userId:e,tinyId:o,room:this,signalChannel:this.signalChannel,enableSEI:this.enableSEI,flag:n,isRobot:a,fromType:I});this.userManager.addRemotePublishedUser(c),this.installDownlinkEvents(c,e),this.emit("remote-published",c)}closeDownLinkConnection(A){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"remote user unpublished",o=this.remotePublishedUserMap.get(A);o&&(o.close(e),this.emit("remote-unpublished",o))}installDownlinkEvents(A,e){A.on("error",o=>{let n=o.getCode();n!==Ge.ICE_TRANSPORT_ERROR&&(n===Ge.DOWNLINK_RECONNECTION_FAILED&&this.closeDownLinkConnection(e),this.emit("error",o))}),A.on("connection-state-changed",o=>{this.emit("media-connection-state-changed",fi(bt({},o),{userId:A.userId}))})}startSyncUserListInterval(){this._syncUserListInterval===-1&&(this._syncUserListInterval=nn.run("ric",this.syncUserList.bind(this)))}stopSyncUserListInterval(){nn.clearTask(this._syncUserListInterval),this._syncUserListInterval=-1}syncUserList(){return this.getUserList().then(A=>{this.userManager.setUserList(A)}).catch(A=>{this._log.debug("sync user list failed: ".concat(A))})}getUserList(){var A;return(A=this.signalChannel)!=null&&A.isConnected?this.signalChannel.sendWaitForResponse({command:$eA,responseCommand:io.USER_LIST_RES,enableLog:!1,timeout:2e3}).then(e=>{let{data:o}=e,{code:n,message:a}=o;if(n===0)return(o.data&&o.data.userList||[]).map(I=>{let{userId:c,srcTinyId:u,role:d,fromType:R}=I;return{userId:c,tinyId:u,role:d,fromType:R}});throw Wi({key:Mi.SIGNAL_RESPONSE_FAILED,data:{signalResponse:io.USER_LIST_RES,code:n,message:a}})}):Promise.reject("not connected")}getAllConnections(){let A=[...this.remotePublishedUserMap.values()];return this.uplinkConnection&&A.push(this.uplinkConnection),A}isRelayMaybeFailed(){if(this.signalChannel&&!this.signalChannel.isOnline||!$4)return!1;if(this.singlePC)return this.singlePC.reconnectionCount>6;let A=this.getAllConnections();if(A.length===0)return!1;for(let e=0;e{if(e instanceof WQ&&!e.getIsReconnecting()){let o=e.getPeerConnection();o&&o.connectionState===hi.CLOSED&&(this._log.warn("[".concat(e.getUserId(),"] pc is closed but not reconnect")),e.startReconnection())}})}fallbackToMPC(){return DA(this,null,function*(){var A;if(this._log.warn("fallback to multi pc"),Jo.uploadEvent({log:"stat-fallback",userId:this.userId}),this.enableSPC=!1,(A=this.singlePC)==null||A.close(),this.singlePC=null,this.isJoined&&(yield this.reJoin()),this.uplinkConnection){let e=this.uplinkConnection;this.uplinkConnection=new Vx({userId:this.userId,tinyId:this.tinyId,room:this,signalChannel:this.signalChannel,enableSEI:this.enableSEI}),e.isMainStreamPublished&&(yield this.uplinkConnection.publish({localAudioTrack:e.localMainAudioTrack,localVideoTrack:e.localMainVideoTrack,isAuxiliary:!1})),e.isAuxStreamPublished&&(yield this.uplinkConnection.publish({localAudioTrack:e.localAuxAudioTrack,localVideoTrack:e.localAuxVideoTrack,isAuxiliary:!0})),e.close()}for(let e of[...this.remotePublishedUserMap.values()]){let o=new ez({userId:e.userId,tinyId:e.tinyId,room:this,signalChannel:this.signalChannel,enableSEI:this.enableSEI,flag:e.flag,remoteAudioTrack:e.remoteAudioTrack,remoteVideoTrack:e.remoteVideoTrack,remoteAuxiliaryTrack:e.remoteAuxiliaryTrack});this.installDownlinkEvents(o,e.userId),this.remotePublishedUserMap.set(e.userId,o),e.isMainStreamSubscribed&&(yield o.subscribe(e.subscribeState,"main")),e.isAuxStreamSubscribed&&(yield o.subscribe(e.subscribeState,"auxiliary"))}})}destroy(){this.isDestroyed||(this.signalChannel&&(this._log.info("destroying SignalChannel"),this.signalChannel.close(),this.signalChannel=null),super.destroy(),this._joinReject&&(this._joinReject(new Ct({code:Ge.INVALID_OPERATION,message:Wi({key:Mi.CLIENT_DESTROYED,data:{funName:"join"}})})),this.clearJoinTimeout(),this.reset()),this.firewallDetector.destroy(),this.removeAllListeners(),this.healthDetector.destroy(),nn.clearTask(this._audioVolumeIntervalId))}switchRole(A){return DA(this,null,function*(){this.role!==A&&(A==="audience"&&this.uplinkConnection&&this.closeUplink("you switch role to audience"),yield this.doSwitchRole(A))})}doSwitchRole(A){let e={command:AtA,data:{role:A==="anchor"?20:21,privateMapKey:this.privateMapKey,latencyLevel:this.latencyLevel},responseCommand:io.SWITCH_ROLE_RES,retries:1};return this._log.info("switchRole signal data: ".concat(JSON.stringify(e.data))),this.signalChannel.sendWaitForResponseWithRetry(e).then(o=>{let{code:n,message:a}=o.data;if(n!==0)throw new Ct({code:Ge.SWITCH_ROLE_FAILED,message:Wi({key:Mi.SWITCH_ROLE_FAILED,data:{message:a,code:n}})});this.role=A}).catch(o=>{throw o instanceof Ct&&o.getCode()===Ge.API_CALL_TIMEOUT&&(o=new Ct({code:Ge.SWITCH_ROLE_FAILED,message:Wi({key:Mi.SWITCH_ROLE_TIMEOUT})})),this._log.error(o),o})}subscribeDataChannel(){return DA(this,null,function*(){if(this.remotePublishedUserMap.size===0)return;let A=[...this.remotePublishedUserMap.values()].filter(e=>e.fromType===xR);this._log.info("subscribeDataChannel",A.map(e=>e.userId)),yield Promise.all(A.map(e=>DA(this,null,function*(){try{yield e.subscribe(fi(bt({},e.subscribeState),{datachannel:!0}),"main")}catch(o){this._log.error("subscribeDataChannel failed:",e.userId,o)}})))})}unsubscribeDataChannel(){return DA(this,null,function*(){if(this.remotePublishedUserMap.size===0)return;let A=[...this.remotePublishedUserMap.values()].filter(e=>e.fromType===xR);this._log.info("unsubscribeDataChannel",A.map(e=>e.userId)),yield Promise.all(A.map(e=>e.unsubscribeDataChannel()))})}_initUplinkConnection(){this.uplinkConnection=this.singlePC?new hz({userId:this.userId,tinyId:this.tinyId,room:this}):new Vx({userId:this.userId,tinyId:this.tinyId,room:this,signalChannel:this.signalChannel,enableSEI:this.enableSEI}),this.uplinkConnection.on("connection-state-changed",A=>{this.emit("media-connection-state-changed",fi(bt({},A),{userId:this.userId}))}),this.uplinkConnection.on("error",A=>{let e=A.getCode();e!==Ge.ICE_TRANSPORT_ERROR&&(e===Ge.UPLINK_RECONNECTION_FAILED&&this.closeUplink(),this.emit("error",A))})}publish(A){return DA(this,null,function*(){var e;this.uplinkConnection||this._initUplinkConnection();let o="".concat(A.streamType," ").concat(A.isAudio&&A.isScreen?"screen":"").concat(A.kind);this._log.info("publish() => ".concat(o)),yield(e=this.singlePC)==null?void 0:e.waitForPeerConnectionConnected(),yield this.uplinkConnection.publish({localAudioTrack:A instanceof vm?A:null,localVideoTrack:A instanceof Ru?A:null,isAuxiliary:A.streamType==="auxiliary"})})}unpublish(A){return DA(this,null,function*(){if((this.scene!=="live"||this.role==="anchor")&&(this.isMainStreamPublished||this.isAuxStreamPublished)&&this.uplinkConnection){try{let e="".concat(A.streamType," ").concat(A.isAudio&&A.isScreen?"screen":"").concat(A.kind);this._log.info("unpublish() => ".concat(e)),yield this.uplinkConnection.unpublish({localAudioTrack:A instanceof vm?A:null,localVideoTrack:A instanceof Ru?A:null})}catch{}this.localTracks.size===0&&this.closeUplink("you unpublished")}})}addTrack(A){if(!this.uplinkConnection||!A.mediaTrack)return Promise.resolve();let e=this.uplinkConnection.addTrack(A);return A.publish(this,e),e}removeTrack(A){return this.uplinkConnection&&A.mediaTrack?(A.unpublish(),this.uplinkConnection.removeTrack(A)):Promise.resolve()}replaceTrack(A){return this.uplinkConnection&&A.mediaTrack&&XO()?this.uplinkConnection.replaceTrack(A).then(e=>{e&&S.emit(K.LOCAL_TRACK_REPLACED,{track:A})}):Promise.resolve()}setBandWidth(A){return DA(this,null,function*(){this.uplinkConnection&&(yield this.uplinkConnection.setBandwidth(A),yield this.uplinkConnection.sendMediaSettings())})}enableSmall(A){return DA(this,null,function*(){if(!this.uplinkConnection||!this.uplinkConnection.localMainVideoTrack)return Promise.resolve();A&&this.uplinkConnection.localMainVideoTrack.small&&(yield this.setBandWidth({type:fA.VIDEO,videoType:fA.SMALL,bandwidth:this.uplinkConnection.localMainVideoTrack.small.bitrate})),yield this.uplinkConnection.enableSmall(A)})}subscribe(){for(var A=arguments.length,e=new Array(A),o=0;o!c.isSubscribed),e.length===0)return;let{userId:n}=e[0],a=this.remotePublishedUserMap.get(n);if(!a)return;let I=e.find(c=>c.mediaType===2)?"auxiliary":"main";try{let c=bt({},a.subscribeState);e.forEach(d=>{switch(d.mediaType){case 1:c.audio=!0;break;case 4:c.video=!0;break;case 8:c.smallVideo=!0;break;case 2:c.auxiliary=!0}});let u=this._changeBigSmallRecords.get(n);u&&u.options.smallVideo&&a.muteState.hasSmall&&c.video&&(c.video=!1,c.smallVideo=!0),S.emit(K.SUBSCRIBE_START,{room:this,streamType:I,remotePublishedUser:a,subscribeState:c}),this._log.info("subscribe() => ".concat(n," ").concat(I," ").concat(e.map(d=>d.strMediaType).join(",")," [").concat(IK(c),"] prev: [").concat(IK(a.subscribeState),"]")),yield a.subscribe(c,I),this._log.info("subscribe ".concat(n," ").concat(I," done"));for(let d of e)d.mediaTrack||(yield d.waitHasMediaTrack());S.emit(K.SUBSCRIBE_SUCCESS,{room:this,streamType:I,remotePublishedUser:a})}catch(c){let u=c instanceof Ct?c.getCode():Ge.UNKNOWN,d=c;throw c instanceof Ct?u===Ge.REMOTE_STREAM_NOT_EXIST&&(d=new Ct({code:Ge.API_CALL_ABORTED,message:Wi({key:Mi.API_CALL_ABORTED,data:{message:c.message,userId:n,streamType:I}})}),this._log.warn(d)):(d=new Ct({code:u,message:Wi({key:Mi.SUBSCRIBE_FAILED,data:{message:c.message,userId:n,streamType:I}})}),this._log.error(d)),d}})}unsubscribe(){for(var A=arguments.length,e=new Array(A),o=0;oc.mediaType===2)?"auxiliary":"main";this._log.info("unsubscribe() => ".concat(n," ").concat(I," ").concat(e.map(c=>c.strMediaType).join(",")));try{yield a.unsubscribe({remoteTracks:e,streamType:I})}catch(c){this._log.warn("unsubscribe() => failed ".concat(c))}e.forEach(c=>{c.unsubscribe(),c.mediaType===8&&c.setMediaType(4)}),S.emit(K.UNSUBSCRIBE_SUCCESS,{room:this,streamType:I,remotePublishedUser:a})})}setEncodedDataProcessingListener(A){throw new Error("Method not implemented.")}enableAudioVolumeEvaluation(){let A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:2e3,e=arguments.length>1?arguments[1]:void 0;if(A<=0)return this._enableAudioVolumeEvaluation=!1,void nn.clearTask(this._audioVolumeIntervalId);A=Math.floor(Math.max(A,100)),S.emit(K.AUDIO_LEVEL_INTERVAL,{interval:A}),this._audioVolumeIntervalId&&nn.clearTask(this._audioVolumeIntervalId),this._enableAudioVolumeEvaluation=!0,this._audioVolumeIntervalId=nn.run("intervalInWorker",()=>{var o;gx.isRunning?this.stopUpdateAudioLevelFromSenderStat():this.updateAudioLevelFromSenderStat(A,e);let n=[];(o=this.remotePublishedUserMap)==null||o.forEach(a=>{if(a.muteState.hasAudio){!gx.isRunning&&a.muteState.audioAvailable&&a.remoteAudioTrack.isSubscribed?this.updateDownlinkAudioLevelFromReceiver(a):a.remoteAudioTrack.volume=0;let I=Math.floor(100*a.remoteAudioTrack.getAudioLevel());n.push({userId:a.userId,volume:I,floatVolume:a.remoteAudioTrack.getInternalAudioLevel()})}}),this.emit("audio-volume",n)},{delay:A,backgroundTask:e})}updateAudioLevelFromSenderStat(A,e){return DA(this,null,function*(){var o;if(!this.uplinkConnection||!this.uplinkConnection.localMainAudioTrack||this._updateAudioLevelTaskId!==-1)return;let n=(o=this.uplinkConnection.getPeerConnection())==null?void 0:o.getSenders()[0];if(!n)return;let a=Math.max(A,500);this._log.warn("updateAudioLevelFromSenderStat ".concat(a)),this._updateAudioLevelTaskId=nn.run("intervalInWorker",()=>DA(this,null,function*(){if(!this.uplinkConnection||!this.uplinkConnection.localMainAudioTrack)return void this.stopUpdateAudioLevelFromSenderStat();let I=yield n.getStats();if(this._updateAudioLevelTaskId<0)return;let{localMainAudioTrack:c}=this.uplinkConnection;I.forEach(u=>{u.type==="media-source"&&u.audioLevel&&(c.volume=u.audioLevel)})}),{delay:a,backgroundTask:e})})}stopUpdateAudioLevelFromSenderStat(){var A;this._updateAudioLevelTaskId!==-1&&(this._log.warn("stopUpdateAudioLevelFromSenderStat"),nn.clearTask(this._updateAudioLevelTaskId),this._updateAudioLevelTaskId=-1,(A=this.uplinkConnection)!=null&&A.localMainAudioTrack&&(this.uplinkConnection.localMainAudioTrack.volume=0))}updateDownlinkAudioLevelFromReceiver(A){var e;let{audioReceiver:o}=A;if(!GT||!o)return;let n=(e=o.getSynchronizationSources()[0])==null?void 0:e.audioLevel;hr(n)?A.remoteAudioTrack.volume=Math.min(2*n,1):o.getStats().then(a=>{a.forEach(I=>{I.type==="inbound-rtp"&&hr(I.audioLevel)&&(A.remoteAudioTrack.volume=I.audioLevel)})})}getLocalAudioStats(){return DA(this,null,function*(){var A;let e={};return e[this.userId]={bytesSent:0,packetsSent:0,audioLevel:0},(A=this.uplinkConnection)!=null&&A.localMainAudioTrack&&(e[this.userId]=this.uplinkConnection.localMainAudioTrack.stat),e})}getLocalVideoStats(){return DA(this,null,function*(){var A,e;let o={};return o[this.userId]=((e=(A=this.uplinkConnection)==null?void 0:A.localMainVideoTrack)==null?void 0:e.stat)||{bytesSent:0,packetsSent:0,framesEncoded:0,framesSent:0,frameWidth:0,frameHeight:0,fpsCapture:0},o})}getTransportStats(){return DA(this,null,function*(){let A={rtt:0,downlinksRTT:{}};if(this.uplinkConnection){let e=yield this._stats.getSenderStats(this.uplinkConnection);A.rtt=e.rtt}for(let[,e]of this.remotePublishedUserMap){let o=yield this._stats.getReceiverStats(e);A.downlinksRTT[o.userId]=o.rtt}return A})}getRemoteVideoStats(A){return DA(this,null,function*(){let e={};for(let[o,n]of this.remotePublishedUserMap)A==="main"&&n.muteState.hasVideo&&(e[o]=n.remoteVideoTrack.stat),A==="auxiliary"&&n.muteState.hasAuxiliary&&(e[o]=n.remoteAuxiliaryTrack.stat);return e})}getRemoteAudioStats(){return DA(this,null,function*(){let A={};for(let[e,o]of this.remotePublishedUserMap)o.muteState.hasAudio&&(A[e]=o.remoteAudioTrack.stat);return A})}setTurnServer(A,e){this._log.info("set turn server: ".concat(JSON.stringify(A)," ").concat(e||""));let o=[];Array.isArray(A)?A.forEach(n=>o.push(tl.getTurnServer(n))):tl.isPlainObject(A)&&o.push(tl.getTurnServer(A)),this._turnServers=o,e&&(this._iceTransportPolicy=e)}sendStartMixTranscode(A){return this.signalChannel.sendWaitForResponse({command:jeA,data:A,timeout:5e3,responseCommand:io.START_MIX_TRANSCODE_RES,commandDesc:"startMixTranscode"}).catch(e=>{if(e.code!==Ge.API_CALL_ABORTED)throw e})}sendStopMixTranscode(A){return this.signalChannel.sendWaitForResponse({command:WeA,data:A,timeout:5e3,responseCommand:io.STOP_MIX_TRANSCODE_RES,commandDesc:"stopMixTranscode"}).catch(e=>{if(e.code!==Ge.API_CALL_ABORTED)throw e})}sendStartPublishCDN(A){let e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1];return this.signalChannel.sendWaitForResponse({command:e?HeA:qeA,data:A,timeout:5e3,responseCommand:e?io.START_PUBLISH_TENCENT_CDN_RES:io.START_PUBLISH_GIVEN_CDN_RES,commandDesc:"startPublishCDN"}).catch(o=>{if(o.code!==Ge.API_CALL_ABORTED)throw o})}sendStopPublishCDN(A){let e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1];return this.signalChannel.sendWaitForResponse({command:e?VeA:KeA,data:A,timeout:5e3,responseCommand:e?io.STOP_PUBLISH_TENCENT_CDN_RES:io.STOP_PUBLISH_GIVEN_CDN_RES,commandDesc:"stopPublishCDN"}).catch(o=>{if(o.code!==Ge.API_CALL_ABORTED)throw o})}sendStartPushStreamToRoom(A){return this.signalChannel.sendWaitForResponse({command:zeA,data:A,timeout:5e3,responseCommand:io.START_PUBLISH_CDN_STREAM_RES,commandDesc:"startPublishCDNStream"}).catch(e=>{if(e.code!==Ge.API_CALL_ABORTED)throw e})}sendUpdatePushStreamToRoom(A){return this.signalChannel.sendWaitForResponse({command:ZeA,data:A,timeout:5e3,responseCommand:io.UPDATE_PUBLISH_CDN_STREAM_RES,commandDesc:"updatePublishCDNStream"}).catch(e=>{if(e.code!==Ge.API_CALL_ABORTED)throw e})}sendStopPushStreamToRoom(A){return this.signalChannel.sendWaitForResponse({command:XeA,data:A,timeout:5e3,responseCommand:io.STOP_PUBLISH_CDN_STREAM_RES,commandDesc:"stopPublishCDNStream"}).catch(e=>{if(e.code!==Ge.API_CALL_ABORTED)throw e})}sendAbilityStatus(A){var e;(e=this.signalChannel)==null||e.sendWaitForResponse({command:itA,data:A,timeout:5e3,responseCommand:io.ABILITY_STATUS_REPORT_RESULT,commandDesc:"ability status report"}).catch(o=>{})}getIceServers(A){var e,o;return this._turnServers.length>0?this._turnServers:(e=this.scheduleResult.iceServers)!=null&&e.length?this.scheduleResult.iceServers:A!=null&&A.length?A:(o=this._iceServersFromJoin)!=null&&o.length?this._iceServersFromJoin:[]}getIceTransportPolicy(){return this.forceRelay?"relay":this._iceTransportPolicy||this.scheduleResult.iceTransportPolicy||"all"}getLogger(){return this._log}enableAIVoice(){throw new Error("Method not implemented.")}getSignalChannelUrl(){let A={mainUrl:"",backupUrl:""},e=tl.getEnv();return e?(A.mainUrl="wss://".concat(tl.getTestSignalDomain(e)),A.backupUrl=A.mainUrl):this.proxy_ws?(A.mainUrl=this.proxy_ws,A.backupUrl=A.mainUrl):this.proxy_unified?(A.mainUrl="wss://".concat(this.proxy_unified),A.backupUrl=A.mainUrl):Array.isArray(this.scheduleResult.domains)&&this.scheduleResult.domains.length>0&&(A.mainUrl="wss://".concat(this.scheduleResult.domains[0]),A.backupUrl=A.mainUrl,this.scheduleResult.domains[1]&&(A.backupUrl="wss://".concat(this.scheduleResult.domains[1]))),A}getSignalInfo(){var A;return((A=this.signalChannel)==null?void 0:A.getSignalInfo())||{clientIp:"",relayIp:""}}reset(){let A=arguments.length>0&&arguments[0]!==void 0&&arguments[0];this.stopSyncUserListInterval(),this.stopHeartbeat(),this.closeConnections(),this.clearNetworkQuality(),this.closeUplink("you exitRoom"),this.signalChannel&&(A&&this.signalChannel.keepAlive&&this.signalChannel.isConnected?this.signalChannel.stopKeepAliveIn(3600):(this.signalChannel.close(),this.setSignalChannel(null))),this.localPublishFlag=0,this.heartbeatCount=0,this._stats.reset(),this.userManager.clear(),this.userManager.removeAllListeners(),this.singlePC&&(this.singlePC.close(),this.singlePC=null),this.scheduleResult={domains:null,iceServers:null,iceTransportPolicy:null,trtcAutoConf:null},this.clearPrelinkTimeout(),this.prelinkPromise=null}prelink(A,e,o,n,a,I){return DA(this,null,function*(){var c;if(this.isJoined)throw new Ct({code:Ge.INVALID_OPERATION,message:"already joined room"});if(!a&&!I)throw new Ct({code:Ge.INVALID_OPERATION,message:"roomId or strRoomId is required"});if((c=this.signalChannel)!=null&&c.prelink){if(this.signalChannel.isConnecting)return void this._log.warn("prelink is connecting, please wait");if(this.signalChannel.isConnected)return void this._log.warn("prelink is already connected")}return this.userId=e,this.sdkAppId=A,this.userSig=o,this.roomId=String(a||I),this.useStringRoomId=!(!I||a),this._log.setSdkAppId(this.sdkAppId),this._log.setUserId(this.userId),this.prelinkPromise=Promise.race([this.doPrelink(A,e,o,n,a,I),new Promise((u,d)=>{this.prelinkTimeoutId=setTimeout(()=>{d(new Ct({code:Ge.INVALID_OPERATION,message:"prelink timeout after ".concat(this.PRELINK_TIMEOUT,"ms")}))},this.PRELINK_TIMEOUT)})]).then(()=>{this.clearPrelinkTimeout()}).catch(u=>{throw this.clearPrelinkTimeout(),this.closePrelink().catch(()=>{}),u}),this.prelinkPromise})}doPrelink(A,e,o,n,a,I){return DA(this,null,function*(){var c,u,d;try{if(!this.proxy_ws&&!this.proxy_wt&&!this.scheduleResult.domains&&!tl.getEnv()&&(yield this.schedule({sdkAppId:A,userId:e,userSig:o,roomId:a,strRoomId:I,role:20,privateMapKey:null,businessInfo:null,streamId:null,userDefineRecordId:null},n)),(c=this.scheduleResult.config)==null||!c.prelink)throw new Ct({code:Ge.INVALID_OPERATION,message:"prelink failed: your sdkAppId is not supported, please contact us [https://trtc.io/contact] to enable it."});yield this.initialize({isPrelink:!0}),(u=this.signalChannel)==null||u.markPrelinkConnected({sdkAppId:A,userId:e,userSig:o}),(d=this.signalChannel)==null||d.stopPrelinkIn(this.PRELINK_EXPIRED_TIME/1e3),this._log.info("prelink success")}catch(R){throw this._log.error("prelink failed",R),R}})}clearPrelinkTimeout(){this.prelinkTimeoutId&&(clearTimeout(this.prelinkTimeoutId),this.prelinkTimeoutId=null)}closePrelink(){return DA(this,null,function*(){var A;if(this.isJoined)throw new Ct({code:Ge.INVALID_OPERATION,message:"close prelink failed: has joined room"});if((A=this.signalChannel)!=null&&A.prelink){if(this.signalChannel.keepAlive)return void this._log.info("skip close prelink: use keepAlive");this.reset()}})}checkSubscribeBigSmallVideo(A){return DA(this,null,function*(){let{subscribeState:e,userId:o,muteState:{hasSmall:n,hasVideo:a}}=A;if(!n&&!a||!e.video&&!e.smallVideo)return;let I=this._changeBigSmallRecords.get(o);if(!I||I.isSubscribing||I.reSubscribeCount<=0)return;let{options:c,reSubscribeCount:u}=I;if(c.video&&e.video||c.smallVideo&&e.smallVideo&&n)return;let d={audio:A.remoteAudioTrack.isSubscribed||A.remoteAudioTrack.isSubscribing,auxiliary:A.remoteAuxiliaryTrack.isSubscribed||A.remoteAuxiliaryTrack.isSubscribing,video:c.video,smallVideo:c.smallVideo,datachannel:A.subscribeState.datachannel};try{if(!n&&d.smallVideo&&(d.video=!0,d.smallVideo=!1),d.smallVideo===e.smallVideo&&d.video===e.video)return;I.isSubscribing=!0,I.reSubscribeCount=u-1,yield A.subscribe(d,"main"),A.remoteVideoTrack.setMediaType(d.smallVideo?8:4),this._log.info("change [".concat(o,"] to ").concat(d.smallVideo?"small":"big"," video successfully. count ").concat(Lf-I.reSubscribeCount,".")),I.isSubscribing=!1,I.reSubscribeCount=Lf}catch(R){this._log.info("change [".concat(o,"] to ").concat(d.smallVideo?"small":"big"," video failed. count ").concat(Lf-I.reSubscribeCount,". reason: ").concat(R)),I.isSubscribing=!1,I.reSubscribeCount===0&&this._changeBigSmallRecords.delete(o)}})}changeType(A,e){let o={options:{video:!A,smallVideo:A},isSubscribing:!1,reSubscribeCount:Lf};this._changeBigSmallRecords.set(e.userId,o),this._log.info("set [".concat(e.userId,"] video prefer type: ").concat(A?"small":"big")),this.emit("subscribe-small-video-changed",{userId:e.userId,isSmall:A});let n=this.remotePublishedUserMap.get(e.userId);n&&this.checkSubscribeBigSmallVideo(n)}get smallStreamConfig(){return this._smallStreamConfig}_initBusinessInfo(A){this._businessInfo=A.businessInfo;let e={};if(mz(A.businessInfo)&&(e=JSON.parse(A.businessInfo)),!Um(A.pureAudioPushMode)){if(!Number.isInteger(Number(A.pureAudioPushMode)))throw new Ct({code:Ge.INVALID_PARAMETER,message:Wi({key:Mi.INVALID_PURE_AUDIO})});this._pureAudioPushMode=A.pureAudioPushMode,e.Str_uc_params||(e.Str_uc_params={}),e.Str_uc_params.pure_audio_push_mod=this._pureAudioPushMode}if(!Um(A.userDefineRecordId)){let o=/^[A-Za-z0-9_-]{1,64}$/gi;if(A.userDefineRecordId.match(o)===null)throw new Ct({code:Ge.INVALID_PARAMETER,message:Wi({key:Mi.INVALID_USER_DEFINE_RECORDID})});e.Str_uc_params||(e.Str_uc_params={}),e.Str_uc_params.userdefine_record_id=A.userDefineRecordId}if(!Um(A.userDefinePushArgs)){if(!(mz(A.userDefinePushArgs)&&String(A.userDefinePushArgs)&&String(A.userDefinePushArgs).length<=256))throw new Ct({code:Ge.INVALID_PARAMETER,message:Wi({key:Mi.INVALID_USER_DEFINE_PUSH_ARGS})});e.Str_uc_params||(e.Str_uc_params={}),e.Str_uc_params.userdefine_push_args=A.userDefinePushArgs}PtA(e)||(this._businessInfo=JSON.stringify(e))}sendCustomMessage(A){var e;(e=this._customMessageManager)==null||e.send(A)}enableInsertableStreams(){return DA(this,null,function*(){if(this.singlePC&&!this.singlePC.enableInsertableStreams&&xQ)return this.singlePC.enableInsertableStreams=!0,yield this.singlePC.waitForPeerConnectionConnected(),yield this.singlePC.startReconnection()})}sendSignalMessage(A){var e;return this.signalChannel?(e=this.signalChannel)==null?void 0:e.sendWaitForResponseWithRetry(A):Promise.reject(new Ct({code:Ge.INVALID_OPERATION,message:"not join"}))}get enableCodecPipeline(){return this.videoManager.encodePipeline.length>0||this.videoManager.decodePipeline.length>0||this.audioManager.encodePipeline.length>0||this.audioManager.decodePipeline.length>0}get scriptTransformWorker(){var A;return(A=this.singlePC)==null?void 0:A.scriptTransformWorker}switchRoom(A){return DA(this,null,function*(){var e;if(!this.signalChannel||!this.singlePC)return;let{roomId:o,strRoomId:n,userSig:a,privateMapKey:I}=A,c=((e=this.scheduleResult.config)==null?void 0:e.autoSubscribeCount)||A?.autoSubscribeCount||1,u=String(this.useStringRoomId?n:o),d=[];for(let Z=0;Z{this.resolveSwitchRoomSubedReq=Z,AC(5e3).then(Z)}),S.emit(K.SWITCH_ROOM_START,{room:this}),yield this.singlePC.waitForPeerConnectionConnected();try{this.userManager.clear(),k=yield this.signalChannel.sendWaitForResponse({command:ntA,responseCommand:io.SEND_SWITCH_ROOM_RES,data:R});let{code:Z,message:iA}=k.data;if(Z!==0){this._log.error("switch room failed. result: ".concat(Z," error: ").concat(iA));let cA=new Ct({code:Ge.SWITCH_ROOM_FAILED,extraCode:Z,message:iA});throw S.emit(K.SWITCH_ROOM_FAILED,{room:this,error:cA}),cA}this.userSig=a,Um(I)||(this.privateMapKey=I),S.emit(K.SWITCH_ROOM_SUCCESS,{room:this,currentRoomId:_,targetRoomId:u})}catch(Z){throw this.singlePC.autoSubscribedSsrcGroups.clear(),this.roomId=_,this.resolveSwitchRoomSubedReq(),Z}})}isSwitchRoomSupported(){var A;let e="unable to use switchRoom API, fallback to exitRoom and enterRoom.";return((A=this.scheduleResult.config)==null?void 0:A.switchRoom)!==!0?(this._log.warn("".concat(e," Reason: this sdkAppId is not supported, please contact us [https://trtc.io/contact] to enable it.")),!1):this.scene!=="live"?(this._log.warn("".concat(e," Reason: the scene is not 'live'.")),!1):this.role!=="audience"?(this._log.warn("".concat(e," Reason: the role is not 'audience'.")),!1):!!this.singlePC||(this._log.warn("".concat(e," Reason: is not using single peerConnection.")),!1)}requestRemoteFallbackToH264(){var A;(A=this.singlePC)==null||A.requestRemoteFallbackToH264()}startUpdateNTPTime(){if(!this.signalChannel)return;let A=[];for(let e=0;e<5;e++)A.push(this.updateNTPTime());return Promise.all(A).then(e=>{var o;let n=e[0].offset,a=e[0].offset;e.forEach(u=>{n=Math.min(u.offset,n),a=Math.max(u.offset,a)});let I=Math.floor(e.reduce((u,d)=>u+d.rtt,0)/e.length),c=Math.floor(e.reduce((u,d)=>u+d.offset,0)/e.length);(a-n>30||I>50)&&setTimeout(()=>this.startUpdateNTPTime(),5e3),iu(c),(o=this.scriptTransformWorker)==null||o.postMessage({type:"ntp-offset",data:c}),this._log.debug("ntp updated offset: ".concat(c)),this.emit("ntp-time-updated")}).catch(e=>{this._log.warn("ntp updated failed: ".concat(e))})}updateNTPTime(){let A=Date.now();return this.signalChannel.sendWaitForResponse({command:atA,responseCommand:io.UPDATE_NETWORK_TIME_RESULT,addReceiveTime:!0,data:{clientSendTime:String(A)},enableLog:!1}).then(e=>{let o=Number(e.data.data.serverSendTime),n=Number(e.data.data.serverRecvTime),a=e.data.receiveTime||Date.now();return{rtt:a-A-(n-o),offset:(n-A+(o-a))/2}})}};return vt([is(["left",Uo.INIT],"joined"),nB({settings:{retries:1,timeout:0},onRetrying(A){this._log.warn("join retry ".concat(A))},onRetryFailed(A){this._log.error("join failed",A)},onError(A,e){this._isUsingCachedSchedule&&!this.isDestroyed?(this._log.warn("is using cached schedule, retry join"),wu(!0),this.reset(),e()):this.signalChannel&&this.signalChannel.isConnected&&this.signalChannel.keepAlive?(this._log.warn("is using keepAlive ws, retry join"),this.signalChannel.close(),this.reset(),e()):(this.reset(),e())}}),Dn(A=>{let e=new beA;return function(o,n,a){return DA(this,null,function*(){let I=String(o.roomId||o.strRoomId);if(this.userId=o.userId,this.sdkAppId=o.sdkAppId,this.userSig=o.userSig,this._log.setSdkAppId(this.sdkAppId),this._log.setUserId(this.userId),this.scene=n,o.privateMapKey=o.privateMapKey||"",this.isJoined)throw new Ct({code:Ge.INVALID_OPERATION,message:Wi({key:Mi.INVALID_JOIN})});if(this.checkDestroy(),e.isJoined({userId:this.userId,roomId:I,sdkAppId:this.sdkAppId,room:this}))throw new Ct({code:Ge.INVALID_OPERATION,message:Wi({key:Mi.REPEAT_JOIN,data:this.userId})});e.add({room:this,roomId:I}),this.role=o.role===21?"audience":"anchor",this._log.info("Join() => joining room: ".concat(I," useStringRoomId: ").concat(this.useStringRoomId," scene: ").concat(this.scene," role: ").concat(this.role)),S.emit(K.JOIN_START,{room:this,roomId:I,params:o});let c=tl.getEnv();c||(c=ou.QCLOUD,this.proxy_ws&&(this.proxy_ws.startsWith(Ih.OLD_CLOUD_LADDER)?c=ou.OLD_CLOUD_LADDER:this.proxy_ws.startsWith(Ih.WEBRTC)&&(c=ou.WEBRTC))),Jo.setConfig({env:c,sdkAppId:String(this.sdkAppId),userId:this.userId,roomId:I}),kA.checkSystemRequirementsInternal(a).then(u=>{this.checkSystemResult=u,LeA.call(this)});try{!this.prelinkPromise&&!this.proxy_ws&&!this.proxy_wt&&!this.scheduleResult.domains&&!tl.getEnv()&&(yield this.schedule(o,a));let u=yield A.call(this,o,n,a);return this.roomId=I,this._joinedTimestamp=tl.performanceNow(),S.emit(K.JOIN_SUCCESS,{room:this}),a===30&&!o.component&&Jo.uploadEvent({log:"stat-conv-".concat(Number(GQ),"-").concat(location.hostname),userId:this.userId}),u}catch(u){throw e.delete({room:this,roomId:I}),S.emit(K.JOIN_FAILED,{room:this,error:u}),u}})}})],ep.prototype,"join"),vt([is("joined","left",{ignoreError:!0,success(){this.reset(!0)}}),Dn(A=>function(){for(var e=arguments.length,o=new Array(e),n=0;nA.mediaType),Dn(A=>function(){for(var e=arguments.length,o=new Array(e),n=0;nI.outMediaTrack&&I.state==="ready"),!o.length))return;S.emit("61",{room:this});let a=A.apply(this,o);return Promise.all(o.map(I=>I.publish(this,a)))})}),nB({settings:{retries:Ch,timeout:A=>fQ(A)},onError(A,e,o,n){let[a]=n;var I;(I=A.message)!=null&&I.includes("timeout")?(this._log.warn("publish ".concat(a.strMediaType," timeout"),A),e()):(this._log.error("publish ".concat(a.strMediaType," failed: ").concat(A)),o(A),S.emit(K.PUBLISH_FAILED,{room:this}))}})],ep.prototype,"publish"),vt([TM({fnName:"publish"}),Kh(A=>A.mediaType),Dn(A=>function(){for(var e=arguments.length,o=new Array(e),n=0;nI.unpublish()),a}),wm(function(){var A,e;this.localTracks.size===0&&AI()&&((e=(A=this.singlePC)==null?void 0:A.getPeerConnection())==null||e.getSenders().forEach(o=>o.track&&o.replaceTrack(null)))})],ep.prototype,"unpublish"),vt([wW(A=>{if(A.code!==Ge.API_CALL_ABORTED)throw A}),Kh(A=>A.userId)],ep.prototype,"replaceTrack"),vt([Kh(function(){for(var A=arguments.length,e=new Array(A),o=0;ofunction(){for(var e=arguments.length,o=new Array(e),n=0;n!I.isSubscribed&&I.subscribe(a)),a}),nB({settings:{retries:Ch,timeout:A=>fQ(A)},onError(A,e,o,n){if(A.message.includes("timeout"))this._log.warn("subscribe timeout"),e();else{let a=A?.code===Ge.API_CALL_ABORTED;this._log[a?"warn":"error"]("subscribe failed ".concat(n.map(I=>I.strMediaType).join(","),": ").concat(A)),o(A),S.emit(K.SUBSCRIBE_FAILED,{room:this,remoteTracks:n})}}})],ep.prototype,"subscribe"),vt([TM({fnName:"subscribe",callback(){for(var A=arguments.length,e=new Array(A),o=0;o{let a=this.remotePublishedUserMap.get(n.userId);a&&!a.isMainStreamSubscribed&&!a.isAuxStreamSubscribed&&a.close("you unsubscribed")})}}),Kh(function(){for(var A=arguments.length,e=new Array(A),o=0;oi in t?pY(t,i,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[i]=r,krA=(t,i)=>{for(var r in i||(i={}))r6.call(i,r)&&Rj(t,r,i[r]);if(E5)for(var r of E5(i))GrA.call(i,r)&&Rj(t,r,i[r]);return t},_rA=(t,i)=>function(){return i||(0,t[o6(t)[0]])((i={exports:{}}).exports,i),i.exports},brA=(t,i,r,s)=>{if(i&&typeof i=="object"||typeof i=="function")for(let g of o6(i))r6.call(t,g)||g===r||pY(t,g,{get:()=>i[g],enumerable:!(s=i6(i,g))||s.enumerable});return t},LrA=(t,i,r)=>(r=t!=null?NrA(TrA(t)):{},brA(pY(r,"default",{value:t,enumerable:!0}),t)),gw=(t,i,r,s)=>{for(var g,B=i6(i,r),Q=t.length-1;Q>=0;Q--)(g=t[Q])&&(B=g(i,r,B)||B);return B&&pY(i,r,B),B},rr=(t,i,r)=>Rj(t,typeof i!="symbol"?i+"":i,r),FrA=_rA({"../node_modules/.pnpm/eventemitter3@4.0.7/node_modules/eventemitter3/index.js"(t,i){var r=Object.prototype.hasOwnProperty,s="~";function g(){}function B(M,v,U){this.fn=M,this.context=v,this.once=U||!1}function Q(M,v,U,AA,z){if(typeof U!="function")throw new TypeError("The listener must be a function");var sA=new B(U,AA||M,z),eA=s?s+v:v;return M._events[eA]?M._events[eA].fn?M._events[eA]=[M._events[eA],sA]:M._events[eA].push(sA):(M._events[eA]=sA,M._eventsCount++),M}function f(M,v){--M._eventsCount===0?M._events=new g:delete M._events[v]}function m(){this._events=new g,this._eventsCount=0}Object.create&&(g.prototype=Object.create(null),new g().__proto__||(s=!1)),m.prototype.eventNames=function(){var M,v,U=[];if(this._eventsCount===0)return U;for(v in M=this._events)r.call(M,v)&&U.push(s?v.slice(1):v);return Object.getOwnPropertySymbols?U.concat(Object.getOwnPropertySymbols(M)):U},m.prototype.listeners=function(M){var v=s?s+M:M,U=this._events[v];if(!U)return[];if(U.fn)return[U.fn];for(var AA=0,z=U.length,sA=new Array(z);AA{if(!navigator.userAgent.includes("Firefox"))return t;const i=t.split(`\r +`),r=[],s=[];i.forEach(Q=>{const f=Q.toLowerCase();f.includes("a=rtpmap")&&f.includes("h264")&&r.push(Q)}),r.length>1&&s.push(...r.slice(1));const g=s.map(Q=>{const f=/a=rtpmap:(\d+)\s/.exec(Q);return f&&f.length>1?f[1]:null}).filter(Q=>Q!==null),B=[];return i.forEach(Q=>{let f=Q;if(Q.includes("a=setup")&&(f="a=setup:passive"),(Q.includes("m=audio")||Q.includes("m=video"))&&(f=Q.split(" ").filter((m,M)=>M<3||!g.includes(m)).join(" ")),Q.includes("a=fmtp")||Q.includes("a=rtcp-fb")||Q.includes("a=rtpmap")){const m=/a=(?:fmtp|rtcp-fb|rtpmap):(\d+)\s/.exec(Q);if(m&&m.length>1&&g.includes(m[1]))return}B.push(f)}),B.join(`\r +`)},l5=t=>{const i=t.split(`\r +`),r=[];i.forEach(Q=>{const f=Q.toLowerCase();f.includes("a=rtpmap")&&f.includes("h264")&&r.push(Q)});const s=r.map(Q=>{const f=/a=rtpmap:(\d+)\s/.exec(Q);return f&&f.length>1?f[1]:null}).filter(Q=>Q!==null),g=[];i.forEach(Q=>{let f=Q;if(Q.includes("a=fmtp:111")&&(f=`${Q};stereo=1`),Q.includes("a=fmtp")){const m=/a=fmtp:(\d+)\s/.exec(Q);m&&m.length>1&&s.includes(m[1])&&(f=`${Q};sps-pps-idr-in-keyframe=1`)}g.push(f)});const B=g.join(`\r +`);return OrA(B)},xrA="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict",SK=(t=21)=>{let i="",r=crypto.getRandomValues(new Uint8Array(t|=0));for(;t--;)i+=xrA[63&r[t]];return i},tw=t=>typeof t=="function",YrA=0,PrA=1,C5=2;function JrA({retryFunction:t,settings:i,onError:r,onRetrying:s,onRetryFailed:g,onRetrySuccess:B,context:Q}){return function(...f){const{retries:m=5,timeout:M=1e3}=i;let v=0,U=-1,AA=YrA;const z=async(sA,eA)=>{const X=Q||this;try{const QA=await t.apply(X,f);v>0&&B&&B.call(this,v),v=0,sA(QA)}catch(QA){const wA=()=>{clearTimeout(U),v=0,AA=C5,eA(QA)},HA=()=>{AA!==C5&&v<(tw(m)?m():m)?(v++,AA=PrA,tw(s)&&s.call(this,v,wA),U=window.setTimeout(()=>{U=-1,z(sA,eA)},tw(M)?M(v):M)):(wA(),tw(g)&&g.call(this,QA))};tw(r)?r.call(this,{error:QA,retry:HA,reject:eA,retryFuncArgs:f,retriedCount:v}):HA()}};return new Promise(z)}}var HrA=JrA,Nu=new WeakMap;function VrA({settings:t={retries:5,timeout:2e3},onError:i,onRetrying:r,onRetryFailed:s}){return function(g,B,Q){const f=HrA({retryFunction:Q.value,settings:t,onError({error:m,retry:M,reject:v,retryFuncArgs:U}){var AA;i?i.call(this,m,()=>{var z;(z=Nu.get(g))!=null&&z.has(B)?M():v(m)},v,U):(AA=Nu.get(g))!=null&&AA.has(B)?M():v(m)},onRetrying(m,M){var v;tw(r)&&r.call(this,m,M),(v=Nu.get(g))!=null&&v.has(B)&&(Nu.get(g).get(B).stopRetry=M)},onRetryFailed:s});return Q.value=function(...m){const M=Nu.get(g);return M?M.set(B,{args:m}):Nu.set(g,new Map([[B,{args:m}]])),f.apply(this,m).finally(()=>{var v;return(v=Nu.get(g))==null?void 0:v.delete(B)})},Q}}function qrA({fnName:t,callback:i,validateArgs:r=!0}){return function(s,g,B){const Q=B.value;return B.value=function(...f){var m,M;if((m=Nu.get(s))!=null&&m.has(t)){const{stopRetry:v,args:U}=Nu.get(s).get(t);let AA=!0;if(r){for(const z of U)if(!f.find(sA=>sA===z)){AA=!1;break}}AA&&(i&&i.apply(this,f),v&&v(),(M=Nu.get(s))==null||M.delete(t))}return Q.apply(this,f)},B}}var KrA=class{constructor(t,i){this.core=i,rr(this,"peerConnection"),rr(this,"audioTransceiver",null),rr(this,"videoTransceiver",null),rr(this,"timerId",null),rr(this,"callback",null),rr(this,"previousRawStats",null),rr(this,"_prevReportTime",0),rr(this,"_prevDecoderImplementation",""),rr(this,"_decodeMap",new Map),this.peerConnection=t,this.findTransceivers()}get statInterval(){return this._prevReportTime===0?2:(Date.now()-this._prevReportTime)/1e3}findTransceivers(){const t=this.peerConnection.getTransceivers();for(const i of t)if(i.receiver&&i.receiver.track){const{track:r}=i.receiver;r.kind==="audio"?this.audioTransceiver=i:r.kind==="video"&&(this.videoTransceiver=i)}}start(t,i=2e3){this.stop(),this.callback=t,this.collectStats(),this.timerId=window.setInterval(()=>{this.collectStats()},i)}stop(){this.timerId!==null&&(clearInterval(this.timerId),this.timerId=null),this.callback=null,this.previousRawStats=null,this._prevReportTime=0}async collectStats(){if(this.callback)try{const t=await this.peerConnection.getStats(),i=new Set(["inbound-rtp","track","candidate-pair","media-source","codec"]),r=[];t.forEach(f=>i.has(f.type)&&r.push(f));const s=Date.now(),g=this.parseAudioStats(r),B=this.parseVideoStats(r),Q=this.parseNetworkStats(r);this._prevReportTime=s,this.callback({audio:g,video:B,network:Q})}catch(t){this.core.log.error("Failed to collect WebRTC stats:",t)}}getDifferenceValue(t,i){if(this.core.utils.isUndefined(t))return i;const r=(i||0)-t;return r<0?0:r}parseAudioStats(t){var i,r,s,g;const B={bitrate:0,volume:0,packetLossRate:0,jitterBufferDelay:0,bytesReceived:0,packetsReceived:0,packetsLost:0};for(const Q of t){if(Q.type==="inbound-rtp"&&(Q.mediaType==="audio"||Q.kind==="audio")){if(B.bytesReceived=Q.bytesReceived||0,B.packetsReceived=Q.packetsReceived||0,B.packetsLost=Q.packetsLost||0,this.previousRawStats&&this.previousRawStats.audio){const M=this.getDifferenceValue(this.previousRawStats.audio.bytesReceived,B.bytesReceived);B.bitrate=Math.round(8*M/this.statInterval/1e3)}const f=this.getDifferenceValue((i=this.previousRawStats)==null?void 0:i.audio.packetsLost,B.packetsLost),m=this.getDifferenceValue((r=this.previousRawStats)==null?void 0:r.audio.packetsReceived,B.packetsReceived)+f;if(m>0&&(B.packetLossRate=Math.round(f/m*100)),this.core.utils.isUndefined(Q.audioLevel)||(B.volume=Q.audioLevel||0),Q.jitterBufferDelay&&Q.jitterBufferEmittedCount){let{jitterBufferEmittedCount:M}=Q,{jitterBufferDelay:v}=Q;(s=this.previousRawStats)!=null&&s.audio&&(M=this.getDifferenceValue(this.previousRawStats.audio.jitterBufferEmittedCount,Q.jitterBufferEmittedCount),v=this.getDifferenceValue(this.previousRawStats.audio.jitterBufferDelay,Q.jitterBufferDelay)),M>0&&(B.jitterBufferDelay=Math.floor(v/M*1e3)),this.previousRawStats||this.initPreviousRawStats(),this.previousRawStats.audio.jitterBufferDelay=Q.jitterBufferDelay,this.previousRawStats.audio.jitterBufferEmittedCount=Q.jitterBufferEmittedCount}this.previousRawStats||this.initPreviousRawStats(),this.previousRawStats.audio.bytesReceived=B.bytesReceived,this.previousRawStats.audio.packetsReceived=B.packetsReceived,this.previousRawStats.audio.packetsLost=B.packetsLost}!this.core.utils.isUndefined(Q.audioLevel)&&((g=this.audioTransceiver)!=null&&g.receiver.track)&&Q.trackIdentifier===this.audioTransceiver.receiver.track.id&&(B.volume=Q.audioLevel||0)}return B}parseVideoStats(t){var i,r,s,g,B;const Q={bitrate:0,frameRate:0,width:0,height:0,packetLossRate:0,jitterBufferDelay:0,bytesReceived:0,packetsReceived:0,packetsLost:0,framesDecoded:0};for(const f of t){if(f.type==="codec"&&this._decodeMap.set(f.id,f),f.type==="inbound-rtp"&&(f.mediaType==="video"||f.kind==="video")){if(Q.bytesReceived=f.bytesReceived||0,Q.packetsReceived=f.packetsReceived||0,Q.packetsLost=f.packetsLost||0,Q.framesDecoded=f.framesDecoded||0,this.core.utils.isUndefined(f.framesPerSecond)||(Q.frameRate=Math.round(f.framesPerSecond)),f.decoderImplementation&&this._prevDecoderImplementation!==f.decoderImplementation){const v=this._decodeMap.get(f.codecId),U=((i=v?.mimeType)==null?void 0:i.split("/")[1])||"unknown",AA=f.powerEfficientDecoder;this.core.log.info(`decoderImplementation change to ${f.decoderImplementation}(${U}) HWDecoder: ${AA}`),this._prevDecoderImplementation=f.decoderImplementation}if(this.previousRawStats&&this.previousRawStats.video){const v=this.getDifferenceValue(this.previousRawStats.video.bytesReceived,Q.bytesReceived);Q.bitrate=Math.round(8*v/this.statInterval/1e3)}const m=this.getDifferenceValue((r=this.previousRawStats)==null?void 0:r.video.packetsLost,Q.packetsLost),M=this.getDifferenceValue((s=this.previousRawStats)==null?void 0:s.video.packetsReceived,Q.packetsReceived)+m;if(M>0&&(Q.packetLossRate=Math.round(m/M*100)),f.jitterBufferDelay&&f.jitterBufferEmittedCount){let{jitterBufferEmittedCount:v}=f,{jitterBufferDelay:U}=f;(g=this.previousRawStats)!=null&&g.video&&(v=this.getDifferenceValue(this.previousRawStats.video.jitterBufferEmittedCount,f.jitterBufferEmittedCount),U=this.getDifferenceValue(this.previousRawStats.video.jitterBufferDelay,f.jitterBufferDelay)),v>0&&(Q.jitterBufferDelay=Math.floor(U/v*1e3)),this.previousRawStats||this.initPreviousRawStats(),this.previousRawStats.video.jitterBufferDelay=f.jitterBufferDelay,this.previousRawStats.video.jitterBufferEmittedCount=f.jitterBufferEmittedCount}this.previousRawStats||this.initPreviousRawStats(),this.previousRawStats.video.bytesReceived=Q.bytesReceived,this.previousRawStats.video.packetsReceived=Q.packetsReceived,this.previousRawStats.video.packetsLost=Q.packetsLost}!this.core.utils.isUndefined(f.frameWidth)&&((B=this.videoTransceiver)!=null&&B.receiver.track)&&f.trackIdentifier===this.videoTransceiver.receiver.track.id&&(Q.width=f.frameWidth,Q.height=f.frameHeight)}return Q}parseNetworkStats(t){const i={rtt:0};for(const r of t)if(r.type==="candidate-pair"&&(r.selected||r.state==="succeeded")&&this.core.utils.isNumber(r.currentRoundTripTime)){i.rtt=Math.floor(1e3*r.currentRoundTripTime);break}return i}initPreviousRawStats(){this.previousRawStats={timestamp:Date.now(),audio:{bytesReceived:0,packetsReceived:0,packetsLost:0},video:{bytesReceived:0,packetsReceived:0,packetsLost:0}}}},jrA=LrA(FrA()),B5=Symbol("instance"),A2=Symbol("cacheResult"),vK=class{constructor(i,r,s){this.oldState=i,this.newState=r,this.action=s,this.aborted=!1}abort(i){this.aborted=!0,HG.call(i,this.oldState,new Error(`action '${this.action}' aborted`))}toString(){return`${this.action}ing`}},NK=class extends Error{constructor(i,r,s){super(r),this.state=i,this.message=r,this.cause=s}};function WrA(t){return typeof t=="object"&&t&&"then"in t}var JG=new Map;function e2(t,i,r={}){return(s,g,B)=>{const Q=r.action||g;if(!r.context){const m=JG.get(s)||[];JG.has(s)||JG.set(s,m),m.push({from:t,to:i,action:Q})}const f=B.value;B.value=function(...m){let M=this;if(r.context&&(M=uC.get(typeof r.context=="function"?r.context.call(this,...m):r.context)),M.state===i)return r.sync?M[A2]:Promise.resolve(M[A2]);M.state instanceof vK&&M.state.action==r.abortAction&&M.state.abort(M);let v=null;Array.isArray(t)?t.length==0?M.state instanceof vK&&M.state.abort(M):typeof M.state=="string"&&t.includes(M.state)||(v=new NK(M._state,`${M.name} ${Q} to ${i} failed: current state ${M._state} not from ${t.join("|")}`)):t!==M.state&&(v=new NK(M._state,`${M.name} ${Q} to ${i} failed: current state ${M._state} not from ${t}`));const U=X=>{if(r.fail&&r.fail.call(this,X),r.sync){if(r.ignoreError)return X;throw X}return r.ignoreError?Promise.resolve(X):Promise.reject(X)};if(v)return U(v);const AA=M.state,z=new vK(AA,i,Q);HG.call(M,z);const sA=X=>{var QA;return M[A2]=X,z.aborted||(HG.call(M,i),(QA=r.success)===null||QA===void 0||QA.call(this,M[A2])),X},eA=X=>(HG.call(M,AA,X),U(X));try{const X=f.apply(this,m);return WrA(X)?X.then(sA).catch(eA):r.sync?sA(X):Promise.resolve(sA(X))}catch(X){return eA(new NK(M._state,`${M.name} ${Q} from ${t} to ${i} failed: ${X}`,X instanceof Error?X:new Error(String(X))))}}}}var zrA=typeof window<"u"&&window.__AFSM__?(r,s)=>{window.dispatchEvent(new CustomEvent(r,{detail:s}))}:typeof importScripts<"u"?(r,s)=>{postMessage({type:r,payload:s})}:()=>{};function HG(t,i){const r=this._state;this._state=t;const s=t.toString();t&&this.emit(s,r),this.emit(uC.STATECHANGED,t,r,i),this.updateDevTools({value:t,old:r,err:i instanceof Error?i.message:String(i)})}var uC=class EC extends jrA.default{constructor(i,r,s){super(),this.name=i,this.groupName=r,this._state=EC.INIT,i||(i=Date.now().toString(36)),s?Object.setPrototypeOf(this,s):s=Object.getPrototypeOf(this),r||(this.groupName=this.constructor.name);const g=s[B5];g?this.name=g.name+"-"+g.count++:s[B5]={name:this.name,count:0},this.updateDevTools({diagram:this.stateDiagram})}get stateDiagram(){const i=Object.getPrototypeOf(this),r=JG.get(i)||[];let s=new Set,g=[],B=[];const Q=new Set,f=Object.getPrototypeOf(i);JG.has(f)&&(f.stateDiagram.forEach(M=>s.add(M)),f.allStates.forEach(M=>Q.add(M))),r.forEach(({from:M,to:v,action:U})=>{typeof M=="string"?g.push({from:M,to:v,action:U}):M.length?M.forEach(AA=>{g.push({from:AA,to:v,action:U})}):B.push({to:v,action:U})}),g.forEach(({from:M,to:v,action:U})=>{Q.add(M),Q.add(v),Q.add(U+"ing"),s.add(`${M} --> ${U}ing : ${U}`),s.add(`${U}ing --> ${v} : ${U} 🟢`),s.add(`${U}ing --> ${M} : ${U} 🔴`)}),B.forEach(({to:M,action:v})=>{s.add(`${v}ing --> ${M} : ${v} 🟢`),Q.forEach(U=>{U!==M&&s.add(`${U} --> ${v}ing : ${v}`)})});const m=[...s];return Object.defineProperties(i,{stateDiagram:{value:m},allStates:{value:Q}}),m}static get(i){let r;return typeof i=="string"?(r=EC.instances.get(i),r||EC.instances.set(i,r=new EC(i,void 0,Object.create(EC.prototype)))):(r=EC.instances2.get(i),r||EC.instances2.set(i,r=new EC(i.constructor.name,void 0,Object.create(EC.prototype)))),r}static getState(i){var r;return(r=EC.get(i))===null||r===void 0?void 0:r.state}updateDevTools(i={}){zrA(EC.UPDATEAFSM,Object.assign({name:this.name,group:this.groupName},i))}get state(){return this._state}set state(i){HG.call(this,i)}};uC.STATECHANGED="stateChanged",uC.UPDATEAFSM="updateAFSM",uC.INIT="[*]",uC.ON="on",uC.OFF="off",uC.instances=new Map,uC.instances2=new WeakMap;var MG=class extends uC{constructor(i,r){super(),this.core=i,rr(this,"audioPlayer"),rr(this,"videoPlayer"),rr(this,"callback"),rr(this,"avPlayerStateSyncManager"),rr(this,"_log"),rr(this,"_videoPlayerLog"),rr(this,"_audioPlayerLog"),rr(this,"lastPausedReason"),rr(this,"muted",!1),this._log=r,this._videoPlayerLog=this._log.createChild({id:"vp"}),this._audioPlayerLog=this._log.createChild({id:"ap"}),this.videoPlayer=new i.VideoPlayer({id:"vp",log:this._videoPlayerLog,track:null,muted:!1,container:null,enableLogTrackState:!0}),this.audioPlayer=new i.RemoteAudioPlayer({id:"ap",log:this._audioPlayerLog,track:null,muted:!1,container:null,enableVolumeControlInIOS:!0,enableLogTrackState:!0}),this.audioPlayer.on(i.PlayerEvent.AUTOPLAY_FAILED,s=>this.handleAutoPlayFailed(this.audioPlayer,s)),this.videoPlayer.on(i.PlayerEvent.LOAD_START,()=>this.handleLoadStart("video")),this.audioPlayer.on(i.PlayerEvent.LOAD_START,()=>this.handleLoadStart("audio")),this.videoPlayer.on(i.PlayerEvent.PLAYER_STATE_CHANGED,this.handlePlayerStateChanged,this),this.audioPlayer.on(i.PlayerEvent.PLAYER_STATE_CHANGED,this.handlePlayerStateChanged,this),this.videoPlayer.on(i.PlayerEvent.ENTER_PICTURE_IN_PICTURE,this.handleEnterPictureInPicture,this),this.videoPlayer.on(i.PlayerEvent.LEAVE_PICTURE_IN_PICTURE,this.handleLeavePictureInPicture,this),this.videoPlayer.on(i.PlayerEvent.ENTER_FULL_SCREEN,this.handleEnterFullScreen,this),this.videoPlayer.on(i.PlayerEvent.LEAVE_FULL_SCREEN,this.handleLeaveFullScreen,this),this.avPlayerStateSyncManager=new i.AVPlayerStateSyncManager({log:this._log,audioPlayer:this.audioPlayer,videoPlayer:this.videoPlayer})}get isPlaying(){return this.videoPlayer.isPlaying&&this.audioPlayer.isPlaying}get isPaused(){return this.videoPlayer.isPaused&&this.audioPlayer.isPaused}get isStopped(){return this.videoPlayer.isStopped&&this.audioPlayer.isStopped}setCallback(i){this.callback=i}updateLogConfig(i){this._audioPlayerLog.setSdkAppId(i.sdkAppId),this._audioPlayerLog.setUserId(i.userId),this._videoPlayerLog.setSdkAppId(i.sdkAppId),this._videoPlayerLog.setUserId(i.userId)}handleLoadStart(i){this.onLoadStart()}handlePlayerStateChanged(i){i.state==="PLAYING"&&this.isPlaying&&this.onPlaying(),i.state==="PAUSED"&&this.isPaused&&this.onPaused(i.reason),i.state==="STOPPED"&&this.isStopped&&this.onStopped()}async handleEnterPictureInPicture(){var i,r;await this.videoPlayer.enterPIPPromise,(r=(i=this.callback)==null?void 0:i.onPictureInPictureStateChanged)==null||r.call(i,{isPictureInPicture:!0,pictureInPictureWindow:this.videoPlayer.pipWindow})}handleLeavePictureInPicture(){var i,r;(r=(i=this.callback)==null?void 0:i.onPictureInPictureStateChanged)==null||r.call(i,{isPictureInPicture:!1})}handleEnterFullScreen(){var i,r;(r=(i=this.callback)==null?void 0:i.onFullScreenStateChanged)==null||r.call(i,{isFullScreen:!0})}handleLeaveFullScreen(){var i,r;(r=(i=this.callback)==null?void 0:i.onFullScreenStateChanged)==null||r.call(i,{isFullScreen:!1})}onLoadStart(){}onPlaying(){}onPaused(i){this.lastPausedReason=i}onStopped(){}setVideoContainer(i){if(this.core.utils.isString(i)){const r=document.getElementById(i);r&&this.videoPlayer.setContainer(r)}else this.videoPlayer.setContainer(i)}setVolume(i){this.core.utils.isUndefined(i)||this.audioPlayer.setVolume(i/100)}setMuted(i){this.core.utils.isUndefined(i)||(this.muted=i,this.audioPlayer.setMuted(i))}setFillMode(i){i&&this.videoPlayer.setObjectFit(i)}setAudioTrack(i){this.audioPlayer.setTrack(i)}setVideoTrack(i){this.videoPlayer.setTrack(i)}async play(){const i=this.videoPlayer.play().catch(s=>{this.handleAutoPlayFailed(this.videoPlayer,s,"video")}),r=this.audioPlayer.play().catch(s=>{this.handleAutoPlayFailed(this.audioPlayer,s)});await Promise.all([i,r])}handleAutoPlayFailed(i,r,s="audio"){var g,B;this._log.warn("handleAutoPlayFailed",r);const Q=()=>{this.audioPlayer.resume().then(()=>{document.removeEventListener("click",Q,!0)})};document.addEventListener("click",Q,!0),(B=(g=this.callback)==null?void 0:g.onAutoPlayFailed)==null||B.call(g,{type:s,resume:()=>i.resume()})}pause(){this.videoPlayer.pause(!0),this.audioPlayer.setMuted(!0),this.audioPlayer.pause()}resume(){this.videoPlayer.resume(!0),this.audioPlayer.setMuted(this.muted),this.audioPlayer.resume()}async enterFullscreen(){await this.videoPlayer.enterFullscreen()}async exitFullscreen(){await this.videoPlayer.exitFullscreen()}async enterPictureInPicture(){await this.videoPlayer.enterPictureInPicture()}async exitPictureInPicture(){await this.videoPlayer.exitPictureInPicture()}stop(){this.videoPlayer&&this.videoPlayer.stop(),this.audioPlayer&&(this.audioPlayer.stop(),this.audioPlayer.setMuted(!1))}};gw([e2([uC.INIT,"PAUSED"],"LOADSTART",{ignoreError:!0,sync:!0,success(){var t,i;(i=(t=this.callback)==null?void 0:t.onLoadStart)==null||i.call(t)},fail(t){this._log.warn("onLoadStart",t)}})],MG.prototype,"onLoadStart"),gw([e2(["LOADSTART","PAUSED"],"PLAYING",{ignoreError:!0,sync:!0,success(){var t,i;(i=(t=this.callback)==null?void 0:t.onPlaying)==null||i.call(t)},fail(t){this._log.warn("onPlaying",t)}})],MG.prototype,"onPlaying"),gw([e2("PLAYING","PAUSED",{ignoreError:!0,sync:!0,success(){var t,i;(i=(t=this.callback)==null?void 0:t.onPaused)==null||i.call(t,{reason:this.lastPausedReason})},fail(t){this._log.warn("onPaused",t)}})],MG.prototype,"onPaused"),gw([e2([],uC.INIT,{ignoreError:!0,sync:!0,success(){var t,i;(i=(t=this.callback)==null?void 0:t.onStopped)==null||i.call(t)},fail(t){this._log.warn("onStopped",t)}})],MG.prototype,"onStopped");var u5=MG,ZrA=["overseas-webrtc.tlivewebrtc.com","oswebrtc-lint.tliveplay.com"],f2=class n6{constructor(i){this.core=i,rr(this,"_sdkAppId"),rr(this,"_userId"),rr(this,"connectedRoomIdSet",new Set),rr(this,"updateSeq",0),rr(this,"_log"),rr(this,"player"),rr(this,"peerConnection"),rr(this,"svrSig"),rr(this,"streamURL"),rr(this,"signalURL"),rr(this,"insertableStreamsAbortMap",new Map),rr(this,"scriptTransformWorker"),rr(this,"connectionState","disconnected"),rr(this,"isStarted",!1),rr(this,"isStopped",!0),rr(this,"isReconnecting",!1),rr(this,"callback"),rr(this,"isFireWallErrorEmitted",!1),rr(this,"stat"),rr(this,"isH264DecodeSupported"),rr(this,"connectionTimeoutId"),rr(this,"streamHealthCheckTimeoutId"),rr(this,"streamHealthCheckReject"),i.loggerManager.startUpload(),this._log=this.core.log.createChild({id:`${this.getAlias()}`}),this.player=new u5(i,this._log),i.innerEmitter.on(i.INNER_EVENT.SEI_MESSAGE,this.onSEIMessage,this)}getName(){return n6.Name}getAlias(){return"LEB"}getGroup(){return""}getValidateRule(i){switch(i){case"start":return UrA;case"update":case"stop":return{}}}get enableSEI(){return this.core.room.enableSEI&&(this.core.rtcDectection.IS_INSERTABLE_STREAM_SUPPORTED||this.core.rtcDectection.IS_SCRIPT_TRANSFORM_SUPPORTED)}wrapCallback(i){if(!i)return;const r={},s=["onStats","onSEIMessage"];for(const g of Object.keys(i)){const B=i[g];typeof B=="function"&&(s.includes(g)?r[g]=B:r[g]=(...Q)=>(this._log.debug(`callback ${g} called`,Q.length>0?Q[0]:""),B(...Q)))}return r}async start(i){var r;this.isStopped=!1;const{view:s,url:g,volume:B,muted:Q,fillMode:f,loggerConfig:m,callback:M}=i;this.callback=this.wrapCallback(M),this.player.setCallback(this.callback);const{errorModule:{RtcError:v,ErrorCode:U,ErrorCodeDictionary:AA},loggerManager:z,rtcDectection:sA}=this.core;if(this._sdkAppId=m.sdkAppId,this._userId=m.userId,this._log.setSdkAppId(m.sdkAppId),this._log.setUserId(m.userId),this.player.updateLogConfig(m),z.addJoinedUser(m),!sA.isWebRTCSupported()||!sA.isAddTransceiverSupported())throw new v({code:U.ENV_NOT_SUPPORTED,extraCode:AA.NOT_SUPPORTED_WEBRTC,message:"webrtc not supported"});if(!(await sA.decodeSupportStatus()).isH264DecodeSupported||this.isH264DecodeSupported===!1)throw this.isH264DecodeSupported=!1,new v({code:U.ENV_NOT_SUPPORTED,extraCode:AA.NOT_SUPPORTED_H264_DECODE,message:"h264 not supported"});!sA.IS_SEI_SUPPORTED&&M?.onSEIMessage&&((r=M.onError)==null||r.call(M,new v({code:U.ENV_NOT_SUPPORTED,extraCode:AA.NOT_SUPPORTED_SEI,message:"sei not supported"}))),this.player.setVideoContainer(s),this.player.setMuted(Q),this.player.setFillMode(f);try{await this.connect(g),this.stat=new KrA(this.peerConnection,this.core),this.stat.start(QA=>{var wA,HA;return(HA=(wA=this.callback)==null?void 0:wA.onStats)==null?void 0:HA.call(wA,QA)});const eA=this.player.play();this.player.setVolume(B);const X=this.createStreamHealthCheckPromise();await Promise.race([eA,X]),this.clearStreamHealthCheck(),this.isStarted=!0}catch(eA){throw this.stop(),eA}}async update(i){const{view:r,url:s,volume:g,muted:B,fillMode:Q,action:f,fullScreen:m,pictureInPicture:M}=i;s&&s!==this.streamURL&&await this.switchStream(s),this.player.setMuted(B),this.player.setVolume(g),this.player.setFillMode(Q),r&&this.player.videoPlayer.setContainer(this.core.utils.isString(r)?document.getElementById(r):r),f==="pause"?this.player.pause():f==="resume"&&this.player.resume(),this.core.utils.isBoolean(m)&&(m?await this.player.enterFullscreen():await this.player.exitFullscreen()),this.core.utils.isBoolean(M)&&(M?await this.player.enterPictureInPicture():await this.player.exitPictureInPicture())}async switchStream(i){this._log.info("switchStream",i);const r=this.peerConnection,s=this.streamURL,g=this.signalURL,B=this.svrSig,Q=new Map(this.insertableStreamsAbortMap),f=this.player;delete this.peerConnection,delete this.streamURL,delete this.signalURL,delete this.svrSig,this.insertableStreamsAbortMap.clear();const m=new u5(this.core,this._log);m.setVideoContainer(f.videoPlayer.container),m.setFillMode(f.videoPlayer.objectFit),m.setMuted(f.muted),m.setCallback(this.callback);const M=v=>{const{track:U}=v;this.createEncodedStreams(v.receiver),this.initReceiverTransform(v.receiver,U.kind==="audio"),U.kind==="audio"?m.setAudioTrack(U):m.setVideoTrack(U)};try{await this.connectForSwitch(i,M),this._log.info("switchStream: new connection established"),await this.waitForNewPlayerFirstFrame(m),this._log.info("switchStream: new stream first frame received"),f.audioPlayer.setMuted(!0),f.stop(),this.player=m,r&&(clearTimeout(this.connectionTimeoutId),r.close(),r.getReceivers().forEach(v=>Q.delete(v)),s&&B&&g&&this.fetchStopStreamWithParams(s,g,B).catch(v=>{this._log.warn("switchStream: stop old stream failed",v)})),this._log.info("switchStream: switch completed successfully")}catch(v){this._log.error("switchStream failed",v),m.stop();const U=this.peerConnection;throw U&&(U.close(),U.getReceivers().forEach(AA=>this.insertableStreamsAbortMap.delete(AA))),this.peerConnection=r,this.streamURL=s,this.signalURL=g,this.svrSig=B,this.insertableStreamsAbortMap=Q,this.player=f,f.audioPlayer.setMuted(f.muted),v}}waitForNewPlayerFirstFrame(i){return new Promise((r,s)=>{let g=0,B=!1;const Q=i.videoPlayer.getElement();if(!Q)return void s(new Error("VideoPlayer has no video element"));const f=()=>{B=!0,clearInterval(v),Q.removeEventListener("loadeddata",m),Q.removeEventListener("playing",M)},m=()=>{B||(this._log.info("waitForNewPlayerFirstFrame: loadeddata event fired"),f(),r())},M=()=>{B||(this._log.info("waitForNewPlayerFirstFrame: playing event fired"),f(),r())};Q.addEventListener("loadeddata",m,{once:!0}),Q.addEventListener("playing",M,{once:!0}),i.play().catch(U=>{this._log.warn("waitForNewPlayerFirstFrame: play failed",U)});const v=setInterval(()=>{if(!B){if(g+=100,Q.videoWidth>0&&Q.videoHeight>0)return this._log.info(`waitForNewPlayerFirstFrame: video has valid dimensions ${Q.videoWidth}x${Q.videoHeight}`),f(),void r();g>=1e4&&(f(),s(new Error("waitForNewPlayerFirstFrame timeout")))}},100)})}connectForSwitch(i,r){return new Promise((s,g)=>{try{this.initScriptTransformWorker();const B={encodedInsertableStreams:this.enableSEI,iceServers:[],sdpSemantics:"unified-plan",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",tcpCandidatePolicy:"disable",IceTransportsType:"nohost"},Q=new RTCPeerConnection(B);this.peerConnection=Q,Q.onconnectionstatechange=()=>{this.connectionState=Q.connectionState,this._log.info("connectForSwitch connectionState",Q.connectionState),Q.connectionState!=="failed"&&Q.connectionState!=="closed"||g(new Error(`connection is ${Q.connectionState}`)),Q.connectionState==="connected"&&(this.logSelectedCandidate(),s())},Q.ontrack=r,Q.addTransceiver("audio",{direction:"recvonly"}),Q.addTransceiver("video",{direction:"recvonly"}),this._log.info("connectForSwitch createOffer"),Q.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0,voiceActivityDetection:!1}).then(f=>(f.sdp=l5(f.sdp),this._log.info("connectForSwitch setOffer"),Q.setLocalDescription(f))).then(()=>{const f={sessionId:SK(),streamurl:i,clientinfo:this.core.environment.getOSString(),localsdp:Q.localDescription};return this.exchangeSDP(i,f)}).then(f=>(this._log.info("connectForSwitch setAnswer"),Q.setRemoteDescription(f))).catch(g)}catch(B){g(B)}this.connectionTimeoutId=setTimeout(()=>g(new Error("connection timeout")),1e4)})}async fetchStopStreamWithParams(i,r,s){try{const g=`${r}/webrtc/v1/stopstream`,B=await t2(g,{streamurl:i,svrsig:s},{timeout:3}),{errcode:Q,errmsg:f}=B;if(Q!==0)throw new Error(`errCode:${Q}, errmsg:${f}`);return B}catch(g){this._log.error("fetchStopStreamWithParams error",g)}}async stop(){this.isStopped=!0,this.clearStreamHealthCheck(),this.player.stop(),this.peerConnection&&(clearTimeout(this.connectionTimeoutId),this.peerConnection.close(),this.peerConnection.getReceivers().forEach(i=>this.insertableStreamsAbortMap.delete(i)),delete this.peerConnection,await this.fetchStopStream(),delete this.streamURL,delete this.signalURL,delete this.svrSig),this.stat&&(this.stat.stop(),delete this.stat),this.core.room.keyPointManager.uploadKVStat(this.core.kvStatManager,this._sdkAppId)}destroy(){this.stop(),this.core.innerEmitter.off(this.core.INNER_EVENT.SEI_MESSAGE,this.onSEIMessage,this)}createStreamHealthCheckPromise(){return new Promise((i,r)=>{this.streamHealthCheckReject=r,this.streamHealthCheckTimeoutId=window.setTimeout(()=>this.checkStreamHealth(r),5e3)})}clearStreamHealthCheck(){this.streamHealthCheckTimeoutId&&(clearTimeout(this.streamHealthCheckTimeoutId),delete this.streamHealthCheckTimeoutId),delete this.streamHealthCheckReject}async checkStreamHealth(i){if(!this.isStopped&&this.peerConnection)try{const r=this.peerConnection.getReceivers().find(U=>{var AA;return((AA=U.track)==null?void 0:AA.kind)==="video"});if(!r)return void this._log.warn("checkStreamHealth: no video receiver found");const s=await r.getStats();let g=0,B=0;s.forEach(U=>{U.type==="inbound-rtp"&&(U.mediaType==="video"||U.kind==="video")&&(g=U.bytesReceived||0,B=U.framesDecoded||0)});const{isPlaying:Q}=this.player,f=Q||B>0;this._log.info(`checkStreamHealth: bytesReceived=${g}, framesDecoded=${B}, isPlaying=${Q}`);const{RtcError:m,ErrorCode:M,ErrorCodeDictionary:v}=this.core.errorModule;g===0?(this._log.warn("checkStreamHealth: no stream data received after 5s"),i(new m({code:M.OPERATION_FAILED,message:"no stream data received"}))):f||(this._log.warn("checkStreamHealth: decode failed"),this.isH264DecodeSupported=!1,i(new m({code:M.ENV_NOT_SUPPORTED,extraCode:v.NOT_SUPPORTED_H264_DECODE,message:"h264 decode failed"})))}catch(r){this._log.warn("checkStreamHealth error",r)}}connect(i){return new Promise((r,s)=>{try{this.initScriptTransformWorker();const g={encodedInsertableStreams:this.enableSEI,iceServers:[],sdpSemantics:"unified-plan",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",tcpCandidatePolicy:"disable",IceTransportsType:"nohost"},B=new RTCPeerConnection(g);this.peerConnection=B,B.onconnectionstatechange=()=>{this.connectionState=B.connectionState,this._log.info("connectionState",B.connectionState),B.connectionState!=="failed"&&B.connectionState!=="closed"||(this.isStarted?this.reconnect(i):s(new Error(`connection is ${B.connectionState}`))),B.connectionState==="connected"&&(this.logSelectedCandidate(),r())},B.ontrack=Q=>this.onTrack(Q),B.addTransceiver("audio",{direction:"recvonly"}),B.addTransceiver("video",{direction:"recvonly"}),this._log.info("createOffer"),B.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0,voiceActivityDetection:!1}).then(Q=>(Q.sdp=l5(Q.sdp),this._log.info("setOffer"),B.setLocalDescription(Q))).then(()=>{const Q={sessionId:SK(),streamurl:i,clientinfo:this.core.environment.getOSString(),localsdp:B.localDescription};return this.exchangeSDP(i,Q)}).then(Q=>(this._log.info("setAnswer"),B.setRemoteDescription(Q))).catch(s)}catch(g){s(g)}this.connectionTimeoutId=setTimeout(()=>s(new Error("connection timeout")),1e4)})}async exchangeSDP(i,r){let s,g,B;try{this._log.info("exchangeSDP");const Q=XrA(i);if(!Q)throw new Error("streamDomain is empty");const{signalDomain:f,cached:m}=await this.fetchSignalDomain(Q);if(!f)throw new Error("signalDomain is empty");{this._log.info("try exchangeSDP signalDomain:",f,m);const M=await this.doExchangeSDP(`https://${f}`,r,3);s=M.url,g=M.remoteSdp,B=M.svrSig}}catch(Q){this._log.warn("exchangeSDP failed, fallback",Q);try{const f=await this.core.utils.promiseAny(ZrA.map(m=>this.doExchangeSDP(`https://${m}`,r,3)));s=f.url,g=f.remoteSdp,B=f.svrSig}catch(f){throw this._log.error("exchangeSDP failed",f),f[0]||f}}return this.streamURL=i,this.signalURL=s,this.svrSig=B,g}async reconnect(i){var r,s;if(!this.isReconnecting){this.isReconnecting=!0;try{this._log.warn("start reconnect"),await this.connect(i),this._log.warn("reconnect success")}catch(g){this._log.error("reconnect error",g);const{RtcError:B,ErrorCode:Q}=this.core.errorModule;(s=(r=this.callback)==null?void 0:r.onError)==null||s.call(r,new B({code:Q.OPERATION_FAILED,message:"reconnect failed"}))}finally{this.isReconnecting=!1}}}async logSelectedCandidate(){if(!this.peerConnection)return;const i=await this.peerConnection.getStats();for(const[r,s]of i)if(this.core.rtcDectection.isSelectedCandidatePair(s)){const g=i.get(s.localCandidateId),B=i.get(s.remoteCandidateId);g&&this._log.info(`local candidate: ${g.candidateType} ${g.protocol}:${g.ip||g.address}:${g.port} ${g.networkType||""} ${g.relayProtocol?`relayProtocol:${g.relayProtocol} url: ${g.url}`:""}`),B&&this._log.info(`remote candidate: ${B.candidateType} ${B.protocol}:${B.ip||B.address}:${B.port}`);break}}async doExchangeSDP(i,r,s){const g=`${i}/webrtc/v1/pullstream`,B=await t2(g,r,{timeout:s}),{errcode:Q,errmsg:f,remotesdp:m,svrsig:M}=B;if(Q!==0){const v=new Error(`errCode:${Q}, errMsg:${f}`);throw v.name="RequestSignalError",v}return{url:i,remoteSdp:m,svrSig:M}}createEncodedStreams(i){var r;if(this.enableSEI&&this.core.rtcDectection.IS_INSERTABLE_STREAM_SUPPORTED)try{if(this._log.warn("enableSEI",this.enableSEI),!this.insertableStreamsAbortMap.has(i)){const s=i.createEncodedStreams(),g=new AbortController,B={abortController:g,enqueue:Q=>i.track.kind==="audio"?Q:this.decodeVideoFrame(Q)};s.readable.pipeThrough(new TransformStream({transform:(Q,f)=>{const m=B.enqueue(Q);m&&f.enqueue(m)}})).pipeTo(s.writable,g).catch(Q=>{Q!=="destroy"&&this._log.warn(Q)}),(r=this.insertableStreamsAbortMap.get(i))==null||r.abort("destroy"),this.insertableStreamsAbortMap.set(i,g)}}catch(s){this._log.warn(`createEncodedStreams ${i.track.kind} failed`,s)}}initReceiverTransform(i,r){this.peerConnection&&this.enableSEI&&this.scriptTransformWorker&&!i.transform&&(i.transform=new RTCRtpScriptTransform(this.scriptTransformWorker,{isReceiver:!0,isAudio:r,userId:"",streamType:this.core.enums.RemoteStreamType.Main}))}initScriptTransformWorker(){const{room:i,rtcDectection:r,createScriptTransformWorker:s,trtc:g,TRTC:B}=this.core;!this.enableSEI||r.IS_INSERTABLE_STREAM_SUPPORTED||this.scriptTransformWorker||r.IS_SCRIPT_TRANSFORM_SUPPORTED&&(this._log.info("initScriptTransformWorker"),this.scriptTransformWorker=s({videoEncodePipeline:i.videoManager.encodePipeline,videoDecodePipeline:i.videoManager.decodePipeline,audioEncodePipeline:i.audioManager.encodePipeline,audioDecodePipeline:i.audioManager.decodePipeline}),this.scriptTransformWorker.onmessage=Q=>{var f,m;Q.data.type==="sei"&&((m=(f=this.callback)==null?void 0:f.onSEIMessage)==null||m.call(f,{data:Q.data.data,seiPayloadType:Q.data.seiPayloadType}))},this.scriptTransformWorker.onerror=Q=>{this._log.error("scriptTransformWorker error: ",Q.message)})}decodeVideoFrame(i){if(!this.core.room.videoManager)return i;for(const r of this.core.room.videoManager.decodePipeline)if(r&&!(i=r({frame:i})))return;return i}async fetchStopStream(){if(this.streamURL&&this.svrSig&&this.signalURL)try{const i=`${this.signalURL}/webrtc/v1/stopstream`,r=await t2(i,{streamurl:this.streamURL,svrsig:this.svrSig},{timeout:3}),{errcode:s,errmsg:g}=r;if(s!==0)throw new Error(`errCode:${s}, errmsg:${g}`);return r}catch(i){this._log.error("fetchStopStream error",i)}}onTrack(i){const{track:r}=i;this.createEncodedStreams(i.receiver),this.initReceiverTransform(i.receiver,r.kind==="audio"),r.kind==="audio"?this.player.setAudioTrack(r):this.player.setVideoTrack(r)}onSEIMessage({room:i,nalu:r}){var s,g;i===this.core.room&&((g=(s=this.callback)==null?void 0:s.onSEIMessage)==null||g.call(s,{data:r.seiPayload.buffer,seiPayloadType:r.seiPayloadType}))}async fetchSignalDomain(i,r=i2[0]){var s;const g=`https://${r}/signal_query`;try{const B=window.localStorage.getItem(TK);if(B){const v=JSON.parse(B);if(((s=v[i])==null?void 0:s.expire)-new Date().getTime()>0)return{signalDomain:v[i].signal,cached:!0}}const Q=await t2(g,{domain:i,requestid:SK(16),client_type:"Web",client_info:window.navigator.userAgent}),{errcode:f,errmsg:m,data:M}=Q;if(f===0){const{signal_domain:v,cache_time:U}=M;let AA={};const z=window.localStorage.getItem(TK);z&&(AA=JSON.parse(z)),AA[i]={signal:v,expire:new Date().getTime()+1e3*U};try{window.localStorage.setItem(TK,JSON.stringify(AA))}catch{}return{signalDomain:v,cached:!1}}throw new Error(`errCode:${f} errmsg:${m}`)}catch(B){return this._log.error("fetchSignalDomain error",B),i2[1]&&r!==i2[1]?this.fetchSignalDomain(i,i2[1]):{signalDomain:"",cached:!1}}}};rr(f2,"Name","LEBPlayer"),gw([qrA({fnName:"connect"})],f2.prototype,"stop"),gw([VrA({settings:{retries:1/0,timeout:2e3},onRetrying(t){var i;if(this._log.warn(`retry connect ${t}`),t>=3&&((i=this.callback)==null?void 0:i.onError)&&!this.isFireWallErrorEmitted){const{RtcError:r,ErrorCode:s,ErrorCodeDictionary:g}=this.core.errorModule;this.isFireWallErrorEmitted=!0,this.callback.onError(new r({code:s.OPERATION_FAILED,extraCode:g.FIREWALL_RESTRICTION,message:"firewall restriction"}))}},onError(t,i,r,s){var g;if(this._log.warn("connect failed",t),this.peerConnection&&(this.peerConnection.close(),delete this.peerConnection),!this.isStopped&&((g=t.message||t)==null?void 0:g.includes("connection")))i();else{const{RtcError:B,ErrorCode:Q}=this.core.errorModule;r(new B({code:Q.UNKNOWN_ERROR,message:t.message}))}}})],f2.prototype,"connect");var a6=f2,t2=async(t,i,r={})=>{const{timeout:s=10}=r;let g,B=0,Q={};window.AbortController&&(g=new window.AbortController,Q={signal:g.signal},B=window.setTimeout(()=>g.abort(),1e3*s));const f=await fetch(t,krA({body:JSON.stringify(i),cache:"no-cache",credentials:"same-origin",headers:{"content-type":"text/plain;charset=utf-8"},method:"POST",mode:"cors"},Q));if(B&&window.clearTimeout(B),f.status!==200)throw new Error(`Network Error, status code:${f.status}`);return f.json()},i2=["webrtc-signal-scheduler.tlivesource.com","bak-webrtc-signal-scheduler.tlivesource.com"],TK="LEB_PLAYER_STORAGE_KEY",XrA=t=>{const i=/^(?:webrtc:\/\/)([0-9.\-A-Za-z_]+)(?:\/)(?:[0-9.\-A-Za-z_=]+)(?:\/)(?:[^?#]*)(?:\?*)(?:[^?#]*)/.exec(t);return i?i[1]:""},$rA=a6;const AnA=Object.freeze(Object.defineProperty({__proto__:null,LEBPlayer:a6,default:$rA},Symbol.toStringTag,{value:"Module"})),enA=hk(AnA);var s6=Object.defineProperty,tnA=Object.defineProperties,inA=Object.getOwnPropertyDescriptors,Q5=Object.getOwnPropertySymbols,onA=Object.prototype.hasOwnProperty,rnA=Object.prototype.propertyIsEnumerable,Mj=(t,i,r)=>i in t?s6(t,i,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[i]=r,nnA=(t,i)=>{for(var r in i||(i={}))onA.call(i,r)&&Mj(t,r,i[r]);if(Q5)for(var r of Q5(i))rnA.call(i,r)&&Mj(t,r,i[r]);return t},anA=(t,i)=>tnA(t,inA(i)),snA=(t,i)=>{for(var r in i)s6(t,r,{get:i[r],enumerable:!0})},Oa=(t,i,r)=>Mj(t,typeof i!="symbol"?i+"":i,r);async function gnA({sdkAppId:t,userId:i,userSig:r,core:s}){var g;const B=Math.round(new Date().getTime()/1e3);try{const Q=await s.schedule.getAbilityConfig(t,s.schedule.ScheduleRequestType.TRTC_AUTO_CONF,{sdkAppId:t,userId:i,userSig:r,timestamp:B});s.log.info(`virtual background ability response: ${JSON.stringify(Q)}`);const{data:f}=Q;return(g=f?.trtcAutoConf)!=null&&g.web_ar?{auth:!0,timestamp:B}:{auth:!1}}catch(Q){return s.log.error("virtual background fetch error",Q),{auth:!1}}}var InA={sdkAppId:{required:!0,type:"number"},userId:{required:!0,type:"string"},userSig:{required:!0,type:"string"}};function cnA(t){return{name:"VirtualBackgroundOptions",type:"object",required:!0,allowEmpty:!1,properties:anA(nnA({},InA),{type:{required:!1,type:"string",values:["image","blur","color"]},src:{required:!1,type:"string"},blurLevel:{required:!1,type:"number",min:1,max:10},onAbort:{required:!1},color:{required:!1,type:["array","string"]},enableFaceCentering:{required:!1,type:"boolean"},enableEffectOptimization:{required:!1,type:"boolean"}}),validate(i,r,s,g){var B;const{RtcError:Q,ErrorCode:f,ErrorCodeDictionary:m}=t.errorModule;if(!i)return;const{type:M,src:v,onAbort:U}=i;if(M==="image"&&!v)throw new Q({code:f.INVALID_PARAMETER,extraCode:m.INVALID_PARAMETER_REQUIRED,fnName:s,messageParams:{key:"src"}});if(U&&!t.utils.isFunction(U))throw new Q({code:f.INVALID_PARAMETER,extraCode:m.INVALID_PARAMETER_TYPE,fnName:s,messageParams:{key:"onAbort",value:typeof U,rule:{type:"Function"}}});if(!((B=t.room.videoManager.cameraTrack)!=null&&B.mediaTrack))throw new Q({code:f.INVALID_OPERATION,extraCode:m.INVALID_OPERATION_NEED_VIDEO,fnName:s})}}}function EnA(t){return{name:"UpdateVirtualBackgroundOptions",type:"object",required:!0,allowEmpty:!1,properties:{type:{required:!0,type:"string",values:["image","blur","color"]},src:{required:!1,type:"string"},blurLevel:{required:!1,type:"number",min:1,max:10},color:{required:!1,type:["array","string"]},enableFaceCentering:{required:!1,type:"boolean"},enableEffectOptimization:{required:!1,type:"boolean"}},validate(i,r,s,g){if(!i)return;const{RtcError:B,ErrorCode:Q,ErrorCodeDictionary:f}=t.errorModule,{type:m,src:M}=i;if(m==="image"&&!M)throw new B({code:Q.INVALID_PARAMETER,extraCode:f.INVALID_PARAMETER_REQUIRED,fnName:s,messageParams:{key:"src"}})}}}function lnA(t){return{name:"StopVirtualBackgroundOptions",required:!1}}var CnA=(()=>{var t=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0;return function(i={}){var r,s,g=i;g.ready=new Promise((P,F)=>{r=P,s=F});var B=Object.assign({},g),Q="";typeof document<"u"&&document.currentScript&&(Q=document.currentScript.src),t&&(Q=t),Q=Q.indexOf("blob:")!==0?Q.substr(0,Q.replace(/[?#].*/,"").lastIndexOf("/")+1):"";var f,m,M=g.print||console.log.bind(console),v=g.printErr||console.error.bind(console);function U(P){if(bi(P))return function(F){for(var EA=atob(F),RA=new Uint8Array(EA.length),GA=0;GAP.startsWith(Zi);function qt(P){return Promise.resolve().then(()=>function(F){if(F==$e&&f)return new Uint8Array(f);var EA=U(F);if(EA)return EA;throw"both async and sync fetching of the wasm failed"}(P))}function ai(P,F,EA,RA){return function(GA,WA,Ce){return qt(GA).then(ge=>WebAssembly.instantiate(ge,WA)).then(ge=>ge).then(Ce,ge=>{v(`failed to asynchronously prepare wasm: ${ge}`),Je(ge)})}(F,EA,RA)}bi($e="data:application/octet-stream;base64,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IAEoAgA2AgAgAiABKAIENgIEIAIgASgCCDYCCCACIAEoAgw2AgwgAiABKAIQNgIQIAIgASgCFDYCFCACIAEoAhg2AhggAiABKAIcNgIcIAIgASgCIDYCICACIAEoAiQ2AiQgAiABKAIoNgIoIAIgASgCLDYCLCACIAEoAjA2AjAgAiABKAI0NgI0IAIgASgCODYCOCACIAEoAjw2AjwgAUFAayEBIAJBQGsiAiAFTQ0ACwsgAiAETw0BA0AgAiABKAIANgIAIAFBBGohASACQQRqIgIgBEkNAAsMAQsgA0EESQRAIAAhAgwBCyAAIANBBGsiBEsEQCAAIQIMAQsgACECA0AgAiABLQAAOgAAIAIgAS0AAToAASACIAEtAAI6AAIgAiABLQADOgADIAFBBGohASACQQRqIgIgBE0NAAsLIAIgA0kEQANAIAIgAS0AADoAACABQQFqIQEgAkEBaiICIANHDQALCyAACwsAIAEgAiAAEEIaCxIAIAFBAXRB8MoAakECIAAQQgv5AQEEfwJ/IAEQKiECIwBBEGsiBSQAAn8gAC0AC0EHdgRAIAAoAgQMAQsgAC0AC0H/AHELIgRBAE8EQAJAIAIgAC0AC0EHdgR/IAAoAghB/////wdxQQFrBUEKCyIDIARrTQRAIAJFDQECfyAALQALQQd2BEAgACgCAAwBCyAACyIDIAQEfyACIANqIAMgBBBFIAEgAkEAIAMgBGogAUsbQQAgASADTxtqBSABCyACEEUgACACIARqIgEQMSAFQQA6AA8gASADaiAFLQAPOgAADAELIAAgAyACIARqIANrIARBACACIAEQRAsgBUEQaiQAIAAMAQsQJwALC/ICAgJ/AX4CQCACRQ0AIAAgAToAACAAIAJqIgNBAWsgAToAACACQQNJDQAgACABOgACIAAgAToAASADQQNrIAE6AAAgA0ECayABOgAAIAJBB0kNACAAIAE6AAMgA0EEayABOgAAIAJBCUkNACAAQQAgAGtBA3EiBGoiAyABQf8BcUGBgoQIbCIBNgIAIAMgAiAEa0F8cSIEaiICQQRrIAE2AgAgBEEJSQ0AIAMgATYCCCADIAE2AgQgAkEIayABNgIAIAJBDGsgATYCACAEQRlJDQAgAyABNgIYIAMgATYCFCADIAE2AhAgAyABNgIMIAJBEGsgATYCACACQRRrIAE2AgAgAkEYayABNgIAIAJBHGsgATYCACAEIANBBHFBGHIiBGsiAkEgSQ0AIAGtQoGAgIAQfiEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkEgayICQR9LDQALCyAACwUAEAwAC1IBAn9B2NQAKAIAIgEgAEEHakF4cSICaiEAAkAgAkEAIAAgAU0bDQAgAD8AQRB0SwRAIAAQEUUNAQtB2NQAIAA2AgAgAQ8LQejeAEEwNgIAQX8LgwECBX8BfgJAIABCgICAgBBUBEAgACEHDAELA0AgAUEBayIBIAAgAEIKgCIHQgp+fadBMHI6AAAgAEL/////nwFWIQUgByEAIAUNAAsLIAenIgIEQANAIAFBAWsiASACIAJBCm4iA0EKbGtBMHI6AAAgAkEJSyEGIAMhAiAGDQALCyABC3oBA38CQAJAIAAiAUEDcUUNACABLQAARQRAQQAPCwNAIAFBAWoiAUEDcUUNASABLQAADQALDAELA0AgASICQQRqIQEgAigCACIDQX9zIANBgYKECGtxQYCBgoR4cUUNAAsDQCACIgFBAWohAiABLQAADQALCyABIABrC78EAQl/AkACfyAALQALQQd2BEAgACgCBAwBCyAALQALQf8AcQsiAiABSQRAIwBBEGsiBiQAIAEgAmsiBQRAIAUgAC0AC0EHdgR/IAAoAghB/////wdxQQFrBUEKCyICAn8gAC0AC0EHdgRAIAAoAgQMAQsgAC0AC0H/AHELIgFrSwRAIwBBEGsiBCQAAkAgBSACayABaiIDQe////8HIAJrTQRAAn8gAC0AC0EHdgRAIAAoAgAMAQsgAAshByAEQQRqIgggACACQef///8DSQR/IAQgAkEBdDYCDCAEIAIgA2o2AgQjAEEQayIDJAAgCCgCACAEQQxqIgkoAgBJIQogA0EQaiQAIAkgCCAKGygCACIDQQtPBH8gA0EQakFwcSIDIANBAWsiAyADQQtGGwVBCgtBAWoFQe////8HCxAwIAQoAgQhAyAEKAIIGiABBEAgAyAHIAEQIwsgAkEKRwRAIAcQGQsgACADNgIAIAAgACgCCEGAgICAeHEgBCgCCEH/////B3FyNgIIIAAgACgCCEGAgICAeHI2AgggBEEQaiQADAELECcACyAAIAE2AgQLIAECfyAALQALQQd2BEAgACgCAAwBCyAACyICaiAFEEAgACABIAVqIgAQMSAGQQA6AA8gACACaiAGLQAPOgAACyAGQRBqJAAMAQsCfyAALQALQQd2BEAgACgCAAwBCyAACyEEIwBBEGsiAiQAIAAgARAxIAJBADoADyABIARqIAItAA86AAAgAkEQaiQACwsGACAAEBkL0igBDH8jAEEQayIKJAACQAJAAkACQAJAAkACQAJAAkAgAEH0AU0EQEHs3gAoAgAiBkEQIABBC2pBeHEgAEELSRsiBUEDdiIAdiIBQQNxBEACQCABQX9zQQFxIABqIgJBA3QiAUGU3wBqIgAgAUGc3wBqKAIAIgEoAggiA0YEQEHs3gAgBkF+IAJ3cTYCAAwBCyADIAA2AgwgACADNgIICyABQQhqIQAgASACQQN0IgJBA3I2AgQgASACaiIBIAEoAgRBAXI2AgQMCgsgBUH03gAoAgAiB00NASABBEACQEECIAB0IgJBACACa3IgASAAdHFoIgFBA3QiAEGU3wBqIgIgAEGc3wBqKAIAIgAoAggiA0YEQEHs3gAgBkF+IAF3cSIGNgIADAELIAMgAjYCDCACIAM2AggLIAAgBUEDcjYCBCAAIAVqIgQgAUEDdCIBIAVrIgNBAXI2AgQgACABaiADNgIAIAcEQCAHQXhxQZTfAGohAUGA3wAoAgAhAgJ/IAZBASAHQQN2dCIFcUUEQEHs3gAgBSAGcjYCACABDAELIAEoAggLIQUgASACNgIIIAUgAjYCDCACIAE2AgwgAiAFNgIICyAAQQhqIQBBgN8AIAQ2AgBB9N4AIAM2AgAMCgtB8N4AKAIAIgtFDQEgC2hBAnRBnOEAaigCACICKAIEQXhxIAVrIQQgAiEBA0ACQCABKAIQIgBFBEAgASgCFCIARQ0BCyAAKAIEQXhxIAVrIgEgBCABIARJIgEbIQQgACACIAEbIQIgACEBDAELCyACKAIYIQkgAiACKAIMIgNHBEBB/N4AKAIAGiACKAIIIgAgAzYCDCADIAA2AggMCQsgAkEUaiIBKAIAIgBFBEAgAigCECIARQ0DIAJBEGohAQsDQCABIQggACIDQRRqIgEoAgAiAA0AIANBEGohASADKAIQIgANAAsgCEEANgIADAgLQX8hBSAAQb9/Sw0AIABBC2oiAEF4cSEFQfDeACgCACIIRQ0AQQAgBWshBAJAAkACQAJ/QQAgBUGAAkkNABpBHyAFQf///wdLDQAaIAVBJiAAQQh2ZyIAa3ZBAXEgAEEBdGtBPmoLIgdBAnRBnOEAaigCACIBRQRAQQAhAAwBC0EAIQAgBUEZIAdBAXZrQQAgB0EfRxt0IQIDQAJAIAEoAgRBeHEgBWsiBiAETw0AIAEhAyAGIgQNAEEAIQQgASEADAMLIAAgASgCFCIGIAYgASACQR12QQRxaigCECIBRhsgACAGGyEAIAJBAXQhAiABDQALCyAAIANyRQRAQQAhA0ECIAd0IgBBACAAa3IgCHEiAEUNAyAAaEECdEGc4QBqKAIAIQALIABFDQELA0AgACgCBEF4cSAFayICIARJIQEgAiAEIAEbIQQgACADIAEbIQMgACgCECIBBH8gAQUgACgCFAsiAA0ACwsgA0UNACAEQfTeACgCACAFa08NACADKAIYIQcgAyADKAIMIgJHBEBB/N4AKAIAGiADKAIIIgAgAjYCDCACIAA2AggMBwsgA0EUaiIBKAIAIgBFBEAgAygCECIARQ0DIANBEGohAQsDQCABIQYgACICQRRqIgEoAgAiAA0AIAJBEGohASACKAIQIgANAAsgBkEANgIADAYLIAVB9N4AKAIAIgNNBEBBgN8AKAIAIQACQCADIAVrIgFBEE8EQCAAIAVqIgIgAUEBcjYCBCAAIANqIAE2AgAgACAFQQNyNgIEDAELIAAgA0EDcjYCBCAAIANqIgEgASgCBEEBcjYCBEEAIQJBACEBC0H03gAgATYCAEGA3wAgAjYCACAAQQhqIQAMCAsgBUH43gAoAgAiAkkEQEH43gAgAiAFayIBNgIAQYTfAEGE3wAoAgAiACAFaiICNgIAIAIgAUEBcjYCBCAAIAVBA3I2AgQgAEEIaiEADAgLQQAhACAFQS9qIgQCf0HE4gAoAgAEQEHM4gAoAgAMAQtB0OIAQn83AgBByOIAQoCggICAgAQ3AgBBxOIAIApBDGpBcHFB2KrVqgVzNgIAQdjiAEEANgIAQajiAEEANgIAQYAgCyIBaiIGQQAgAWsiCHEiASAFTQ0HQaTiACgCACIDBEBBnOIAKAIAIgcgAWoiCSAHTQ0IIAMgCUkNCAsCQEGo4gAtAABBBHFFBEACQAJAAkACQEGE3wAoAgAiAwRAQaziACEAA0AgAyAAKAIAIgdPBEAgByAAKAIEaiADSw0DCyAAKAIIIgANAAsLQQAQKCICQX9GDQMgASEGQcjiACgCACIAQQFrIgMgAnEEQCABIAJrIAIgA2pBACAAa3FqIQYLIAUgBk8NA0Gk4gAoAgAiAARAQZziACgCACIDIAZqIgggA00NBCAAIAhJDQQLIAYQKCIAIAJHDQEMBQsgBiACayAIcSIGECgiAiAAKAIAIAAoAgRqRg0BIAIhAAsgAEF/Rg0BIAVBMGogBk0EQCAAIQIMBAtBzOIAKAIAIgIgBCAGa2pBACACa3EiAhAoQX9GDQEgAiAGaiEGIAAhAgwDCyACQX9HDQILQajiAEGo4gAoAgBBBHI2AgALIAEQKCECQQAQKCEAIAJBf0YNBSAAQX9GDQUgACACTQ0FIAAgAmsiBiAFQShqTQ0FC0Gc4gBBnOIAKAIAIAZqIgA2AgBBoOIAKAIAIABJBEBBoOIAIAA2AgALAkBBhN8AKAIAIgQEQEGs4gAhAANAIAIgACgCACIBIAAoAgQiA2pGDQIgACgCCCIADQALDAQLQfzeACgCACIAQQAgACACTRtFBEBB/N4AIAI2AgALQQAhAEGw4gAgBjYCAEGs4gAgAjYCAEGM3wBBfzYCAEGQ3wBBxOIAKAIANgIAQbjiAEEANgIAA0AgAEEDdCIBQZzfAGogAUGU3wBqIgM2AgAgAUGg3wBqIAM2AgAgAEEBaiIAQSBHDQALQfjeACAGQShrIgBBeCACa0EHcSIBayIDNgIAQYTfACABIAJqIgE2AgAgASADQQFyNgIEIAAgAmpBKDYCBEGI3wBB1OIAKAIANgIADAQLIAIgBE0NAiABIARLDQIgACgCDEEIcQ0CIAAgAyAGajYCBEGE3wAgBEF4IARrQQdxIgBqIgE2AgBB+N4AQfjeACgCACAGaiICIABrIgA2AgAgASAAQQFyNgIEIAIgBGpBKDYCBEGI3wBB1OIAKAIANgIADAMLQQAhAwwFC0EAIQIMAwtB/N4AKAIAIAJLBEBB/N4AIAI2AgALIAIgBmohAUGs4gAhAAJAAkACQANAIAEgACgCAEcEQCAAKAIIIgANAQwCCwsgAC0ADEEIcUUNAQtBrOIAIQADQAJAIAQgACgCACIBTwRAIAEgACgCBGoiAyAESw0BCyAAKAIIIQAMAQsLQfjeACAGQShrIgBBeCACa0EHcSIBayIINgIAQYTfACABIAJqIgE2AgAgASAIQQFyNgIEIAAgAmpBKDYCBEGI3wBB1OIAKAIANgIAIAQgA0EnIANrQQdxakEvayIAIAAgBEEQakkbIgFBGzYCBCABQbTiACkCADcCECABQaziACkCADcCCEG04gAgAUEIajYCAEGw4gAgBjYCAEGs4gAgAjYCAEG44gBBADYCACABQRhqIQADQCAAQQc2AgQgAEEIaiEMIABBBGohACAMIANJDQALIAEgBEYNAiABIAEoAgRBfnE2AgQgBCABIARrIgJBAXI2AgQgASACNgIAIAJB/wFNBEAgAkF4cUGU3wBqIQACf0Hs3gAoAgAiAUEBIAJBA3Z0IgJxRQRAQezeACABIAJyNgIAIAAMAQsgACgCCAshASAAIAQ2AgggASAENgIMIAQgADYCDCAEIAE2AggMAwtBHyEAIAJB////B00EQCACQSYgAkEIdmciAGt2QQFxIABBAXRrQT5qIQALIAQgADYCHCAEQgA3AhAgAEECdEGc4QBqIQECQEHw3gAoAgAiA0EBIAB0IgZxRQRAQfDeACADIAZyNgIAIAEgBDYCAAwBCyACQRkgAEEBdmtBACAAQR9HG3QhACABKAIAIQMDQCADIgEoAgRBeHEgAkYNAyAAQR12IQMgAEEBdCEAIAEgA0EEcWoiBigCECIDDQALIAYgBDYCEAsgBCABNgIYIAQgBDYCDCAEIAQ2AggMAgsgACACNgIAIAAgACgCBCAGajYCBCACQXggAmtBB3FqIgcgBUEDcjYCBCABQXggAWtBB3FqIgQgBSAHaiIFayEGAkBBhN8AKAIAIARGBEBBhN8AIAU2AgBB+N4AQfjeACgCACAGaiIANgIAIAUgAEEBcjYCBAwBC0GA3wAoAgAgBEYEQEGA3wAgBTYCAEH03gBB9N4AKAIAIAZqIgA2AgAgBSAAQQFyNgIEIAAgBWogADYCAAwBCyAEKAIEIgJBA3FBAUYEQCACQXhxIQkCQCACQf8BTQRAIAQoAgwiACAEKAIIIgFGBEBB7N4AQezeACgCAEF+IAJBA3Z3cTYCAAwCCyABIAA2AgwgACABNgIIDAELIAQoAhghCAJAIAQgBCgCDCIARwRAQfzeACgCABogBCgCCCIBIAA2AgwgACABNgIIDAELAkAgBEEUaiIBKAIAIgJFBEAgBCgCECICRQ0BIARBEGohAQsDQCABIQMgAiIAQRRqIgEoAgAiAg0AIABBEGohASAAKAIQIgINAAsgA0EANgIADAELQQAhAAsgCEUNAAJAIAQoAhwiAUECdEGc4QBqIgIoAgAgBEYEQCACIAA2AgAgAA0BQfDeAEHw3gAoAgBBfiABd3E2AgAMAgsgCEEQQRQgCCgCECAERhtqIAA2AgAgAEUNAQsgACAINgIYIAQoAhAiAQRAIAAgATYCECABIAA2AhgLIAQoAhQiAUUNACAAIAE2AhQgASAANgIYCyAGIAlqIQYgBCAJaiIEKAIEIQILIAQgAkF+cTYCBCAFIAZBAXI2AgQgBSAGaiAGNgIAIAZB/wFNBEAgBkF4cUGU3wBqIQACf0Hs3gAoAgAiAUEBIAZBA3Z0IgJxRQRAQezeACABIAJyNgIAIAAMAQsgACgCCAshASAAIAU2AgggASAFNgIMIAUgADYCDCAFIAE2AggMAQtBHyECIAZB////B00EQCAGQSYgBkEIdmciAGt2QQFxIABBAXRrQT5qIQILIAUgAjYCHCAFQgA3AhAgAkECdEGc4QBqIQECQAJAQfDeACgCACIAQQEgAnQiA3FFBEBB8N4AIAAgA3I2AgAgASAFNgIADAELIAZBGSACQQF2a0EAIAJBH0cbdCECIAEoAgAhAANAIAAiASgCBEF4cSAGRg0CIAJBHXYhACACQQF0IQIgASAAQQRxaiIDKAIQIgANAAsgAyAFNgIQCyAFIAE2AhggBSAFNgIMIAUgBTYCCAwBCyABKAIIIgAgBTYCDCABIAU2AgggBUEANgIYIAUgATYCDCAFIAA2AggLIAdBCGohAAwFCyABKAIIIgAgBDYCDCABIAQ2AgggBEEANgIYIAQgATYCDCAEIAA2AggLQfjeACgCACIAIAVNDQBB+N4AIAAgBWsiATYCAEGE3wBBhN8AKAIAIgAgBWoiAjYCACACIAFBAXI2AgQgACAFQQNyNgIEIABBCGohAAwDC0Ho3gBBMDYCAEEAIQAMAgsCQCAHRQ0AAkAgAygCHCIAQQJ0QZzhAGoiASgCACADRgRAIAEgAjYCACACDQFB8N4AIAhBfiAAd3EiCDYCAAwCCyAHQRBBFCAHKAIQIANGG2ogAjYCACACRQ0BCyACIAc2AhggAygCECIABEAgAiAANgIQIAAgAjYCGAsgAygCFCIARQ0AIAIgADYCFCAAIAI2AhgLAkAgBEEPTQRAIAMgBCAFaiIAQQNyNgIEIAAgA2oiACAAKAIEQQFyNgIEDAELIAMgBUEDcjYCBCADIAVqIgIgBEEBcjYCBCACIARqIAQ2AgAgBEH/AU0EQCAEQXhxQZTfAGohAAJ/QezeACgCACIBQQEgBEEDdnQiBXFFBEBB7N4AIAEgBXI2AgAgAAwBCyAAKAIICyEBIAAgAjYCCCABIAI2AgwgAiAANgIMIAIgATYCCAwBC0EfIQAgBEH///8HTQRAIARBJiAEQQh2ZyIAa3ZBAXEgAEEBdGtBPmohAAsgAiAANgIcIAJCADcCECAAQQJ0QZzhAGohAQJAAkAgCEEBIAB0IgVxRQRAQfDeACAFIAhyNgIAIAEgAjYCAAwBCyAEQRkgAEEBdmtBACAAQR9HG3QhACABKAIAIQUDQCAFIgEoAgRBeHEgBEYNAiAAQR12IQUgAEEBdCEAIAEgBUEEcWoiBigCECIFDQALIAYgAjYCEAsgAiABNgIYIAIgAjYCDCACIAI2AggMAQsgASgCCCIAIAI2AgwgASACNgIIIAJBADYCGCACIAE2AgwgAiAANgIICyADQQhqIQAMAQsCQCAJRQ0AAkAgAigCHCIAQQJ0QZzhAGoiASgCACACRgRAIAEgAzYCACADDQFB8N4AIAtBfiAAd3E2AgAMAgsgCUEQQRQgCSgCECACRhtqIAM2AgAgA0UNAQsgAyAJNgIYIAIoAhAiAARAIAMgADYCECAAIAM2AhgLIAIoAhQiAEUNACADIAA2AhQgACADNgIYCwJAIARBD00EQCACIAQgBWoiAEEDcjYCBCAAIAJqIgAgACgCBEEBcjYCBAwBCyACIAVBA3I2AgQgAiAFaiIDIARBAXI2AgQgAyAEaiAENgIAIAcEQCAHQXhxQZTfAGohAEGA3wAoAgAhAQJ/QQEgB0EDdnQiBSAGcUUEQEHs3gAgBSAGcjYCACAADAELIAAoAggLIQUgACABNgIIIAUgATYCDCABIAA2AgwgASAFNgIIC0GA3wAgAzYCAEH03gAgBDYCAAsgAkEIaiEACyAKQRBqJAAgAAvXAQIFfwF8IwBBEGsiBiQAIAZBBGoiAhA/IwBBEGsiBSQAIAG7IQcCfyACLQALQQd2BEAgAigCBAwBCyACLQALQf8AcQshBANAAkACfyACLQALQQd2BEAgAigCAAwBCyACCyEDIAUgBzkDACACAn8gAyAEQQFqIAUQRiIDQQBOBEAgAyAETQ0CIAMMAQsgBEEBdEEBcgsiBBArDAELCyACIAMQKyAAIAIpAgA3AgAgACACKAIINgIIIAJCADcCACACQQA2AgggBUEQaiQAIAIQQSAGQRBqJAAL9gUBCH8jAEEgayIHJAAgB0EMaiEEAkAgB0EVaiIGIgIgB0EgaiIJRg0AIAFBAE4NACACQS06AAAgAkEBaiECQQAgAWshAQsgBAJ/IAkiAyACayIFQQlMBEBBPSAFQSAgAUEBcmdrQdEJbEEMdSIIIAhBAnRBwMoAaigCACABTWpIDQEaCwJ/IAFBv4Q9TQRAIAFBj84ATQRAIAFB4wBNBEAgAUEJTQRAIAIgAUEwajoAACACQQFqDAQLIAIgARAkDAMLIAFB5wdNBEAgAiABQeQAbiIDQTBqOgAAIAJBAWogASADQeQAbGsQJAwDCyACIAEQNQwCCyABQZ+NBk0EQCACIAFBkM4AbiIDQTBqOgAAIAJBAWogASADQZDOAGxrEDUMAgsgAiABEDQMAQsgAUH/wdcvTQRAIAFB/6ziBE0EQCACIAFBwIQ9biIDQTBqOgAAIAJBAWogASADQcCEPWxrEDQMAgsgAiABEDMMAQsgAUH/k+vcA00EQCACIAFBgMLXL24iA0EwajoAACACQQFqIAEgA0GAwtcvbGsQMwwBCyACIAFBgMLXL24iAxAkIAEgA0GAwtcvbGsQMwshA0EACzYCBCAEIAM2AgAgBygCDCEIIwBBEGsiAyQAIwBBEGsiBSQAIAAhAQJAIAggBiIAayIGQe////8HTQRAAkAgBkELSQRAIAEgAS0AC0GAAXEgBkH/AHFyOgALIAEgAS0AC0H/AHE6AAsgASEEDAELIAVBCGogASAGQQtPBH8gBkEQakFwcSIEIARBAWsiBCAEQQtGGwVBCgtBAWoQMCAFKAIMGiABIAUoAggiBDYCACABIAEoAghBgICAgHhxIAUoAgxB/////wdxcjYCCCABIAEoAghBgICAgHhyNgIIIAEgBjYCBAsDQCAAIAhHBEAgBCAALQAAOgAAIARBAWohBCAAQQFqIQAMAQsLIAVBADoAByAEIAUtAAc6AAAgBUEQaiQADAELECcACyADQRBqJAAgCSQACxYAIAIQHCEBIAAgAjYCBCAAIAE2AgALOAAgAC0AC0EHdgRAIAAgATYCBA8LIAAgAC0AC0GAAXEgAUH/AHFyOgALIAAgAC0AC0H/AHE6AAsL1QIBAn8CQCAAIAFGDQAgASAAIAJqIgRrQQAgAkEBdGtNBEAgACABIAIQIhoPCyAAIAFzQQNxIQMCQAJAIAAgAUkEQCADDQIgAEEDcUUNAQNAIAJFDQQgACABLQAAOgAAIAFBAWohASACQQFrIQIgAEEBaiIAQQNxDQALDAELAkAgAw0AIARBA3EEQANAIAJFDQUgACACQQFrIgJqIgMgASACai0AADoAACADQQNxDQALCyACQQNNDQADQCAAIAJBBGsiAmogASACaigCADYCACACQQNLDQALCyACRQ0CA0AgACACQQFrIgJqIAEgAmotAAA6AAAgAg0ACwwCCyACQQNNDQADQCAAIAEoAgA2AgAgAUEEaiEBIABBBGohACACQQRrIgJBA0sNAAsLIAJFDQADQCAAIAEtAAA6AAAgAEEBaiEAIAFBAWohASACQQFrIgINAAsLCxsAIAAgAUHAhD1uIgAQJCABIABBwIQ9bGsQNAsbACAAIAFBkM4AbiIAECQgASAAQZDOAGxrEDULGQAgACABQeQAbiIAECQgASAAQeQAbGsQJAu9BAMDfAN/An4CfAJAIAC9QjSIp0H/D3EiBUHJB2tBP0kEQCAFIQQMAQsgBUHJB0kEQCAARAAAAAAAAPA/oA8LIAVBiQhJDQBEAAAAAAAAAAAgAL0iB0KAgICAgICAeFENARogBUH/D08EQCAARAAAAAAAAPA/oA8LIAdCAFMEQCMAQRBrIgREAAAAAAAAABA5AwggBCsDCEQAAAAAAAAAEKIPCyMAQRBrIgREAAAAAAAAAHA5AwggBCsDCEQAAAAAAAAAcKIPC0HoNSsDACAAokHwNSsDACIBoCICIAGhIgFBgDYrAwCiIAFB+DUrAwCiIACgoCIBIAGiIgAgAKIgAUGgNisDAKJBmDYrAwCgoiAAIAFBkDYrAwCiQYg2KwMAoKIgAr0iB6dBBHRB8A9xIgVB2DZqKwMAIAGgoKAhASAFQeA2aikDACAHQi2GfCEIIARFBEACfCAHQoCAgIAIg1AEQCAIQoCAgICAgICIP32/IgAgAaIgAKBEAAAAAAAAAH+iDAELIAhCgICAgICAgPA/fL8iAiABoiIBIAKgIgNEAAAAAAAA8D9jBHwjAEEQayIEIQYgBEKAgICAgICACDcDCCAGIAQrAwhEAAAAAAAAEACiOQMIRAAAAAAAAAAAIANEAAAAAAAA8D+gIgAgASACIAOhoCADRAAAAAAAAPA/IAChoKCgRAAAAAAAAPC/oCIAIABEAAAAAAAAAABhGwUgAwtEAAAAAAAAEACiCw8LIAi/IgAgAaIgAKALCwgAQcIKEFIAC3AAQeDUAEEZNgIAQeTUAEEANgIAEFVB5NQAQZDVACgCADYCAEGQ1QBB4NQANgIAQZTVAEEaNgIAQZjVAEEANgIAEFFBmNUAQZDVACgCADYCAEGQ1QBBlNUANgIAQbTWAEG81QA2AgBB7NUAQSo2AgALCwAgABA6GiAAEBkLMgECfyAAQczSADYCACAAKAIEQQxrIgEgASgCCEEBayICNgIIIAJBAEgEQCABEBkLIAALmgEAIABBAToANQJAIAAoAgQgAkcNACAAQQE6ADQCQCAAKAIQIgJFBEAgAEEBNgIkIAAgAzYCGCAAIAE2AhAgA0EBRw0CIAAoAjBBAUYNAQwCCyABIAJGBEAgACgCGCICQQJGBEAgACADNgIYIAMhAgsgACgCMEEBRw0CIAJBAUYNAQwCCyAAIAAoAiRBAWo2AiQLIABBAToANgsLTAEBfwJAIAFFDQAgAUHczgAQICIBRQ0AIAEoAgggACgCCEF/c3ENACAAKAIMIAEoAgxBABAeRQ0AIAAoAhAgASgCEEEAEB4hAgsgAgtdAQF/IAAoAhAiA0UEQCAAQQE2AiQgACACNgIYIAAgATYCEA8LAkAgASADRgRAIAAoAhhBAkcNASAAIAI2AhgPCyAAQQE6ADYgAEECNgIYIAAgACgCJEEBajYCJAsLYwECfyMAQRBrIgIkACABIAAoAgQiA0EBdWohASAAKAIAIQAgAkEIaiABIANBAXEEfyABKAIAIABqKAIABSAACxEAACACKAIMIgAQAiACKAIMIgEEQCABEAMLIAJBEGokACAAC0MBAX8jAEEQayIBJAAgAEIANwIAIABBADYCCCABQRBqJAAgACAALQALQQd2BH8gACgCCEH/////B3FBAWsFQQoLECsLPQEBfyMAQRBrIgIkACACQQA6AA8DQCABBEAgACACLQAPOgAAIAFBAWshASAAQQFqIQAMAQsLIAJBEGokAAsaACAALQALQQd2BEAgACgCCBogACgCABAZCwvmAQEFfyMAQRBrIgUkACMAQSBrIgMkACMAQRBrIgQkACAEIAA2AgwgBCAAIAFqNgIIIAMgBCgCDDYCGCADIAQoAgg2AhwgBEEQaiQAIAMoAhghBCADKAIcIQYjAEEQayIBJAAgASAGNgIMIAIgBCAGIARrIgQQQyABIAIgBGo2AgggAyABKAIMNgIQIAMgASgCCDYCFCABQRBqJAAgAyAAIAMoAhAgAGtqNgIMIAMgAiADKAIUIAJrajYCCCAFIAMoAgw2AgggBSADKAIINgIMIANBIGokACAFKAIMIQcgBUEQaiQAIAcLDwAgAgRAIAAgASACEDILC/UCAQV/IwBBEGsiByQAIAIgAUF/c0Hv////B2pNBEACfyAALQALQQd2BEAgACgCAAwBCyAACyEIIAdBBGoiCSAAIAFB5////wNJBH8gByABQQF0NgIMIAcgASACajYCBCMAQRBrIgIkACAJKAIAIAdBDGoiCigCAEkhCyACQRBqJAAgCiAJIAsbKAIAIgJBC08EfyACQRBqQXBxIgIgAkEBayICIAJBC0YbBUEKC0EBagVB7////wcLEDAgBygCBCECIAcoAggaIAQEQCACIAggBBAjCyAFBEAgAiAEaiAGIAUQIwsgAyAEayEGIAMgBEcEQCACIARqIAVqIAQgCGogBhAjCyABQQpHBEAgCBAZCyAAIAI2AgAgACAAKAIIQYCAgIB4cSAHKAIIQf////8HcXI2AgggACAAKAIIQYCAgIB4cjYCCCAAIAQgBWogBmoiADYCBCAHQQA6AAwgACACaiAHLQAMOgAAIAdBEGokAA8LECcACwoAIAAgASACEEMLuQEBBH8jAEEQayIEJAAgBCACNgIMIwBBoAFrIgMkACADIAAgA0GeAWogARsiBjYClAFBfyEFIAMgAUEBayIAQQAgACABTRs2ApgBIANBAEGQARAmIgBBfzYCTCAAQSA2AiQgAEF/NgJQIAAgAEGfAWo2AiwgACAAQZQBajYCVAJAIAFBAEgEQEHo3gBBPTYCAAwBCyAGQQA6AAAgAEH9CiACQR8QTSEFCyAAQaABaiQAIARBEGokACAFCwQA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KAIARQ0AIAIgBCgCGDYCAAsgAEEBRiEFDAELQQAhBQsgBEFAayQAIAULMQAgACABKAIIQQAQHgRAIAEgAiADED0PCyAAKAIIIgAgASACIAMgACgCACgCHBEGAAsYACAAIAEoAghBABAeBEAgASACIAMQPQsLnQEBAn8jAEFAaiIDJAACf0EBIAAgAUEAEB4NABpBACABRQ0AGkEAIAFBjM0AECAiAUUNABogA0EMakEAQTQQJhogA0EBNgI4IANBfzYCFCADIAA2AhAgAyABNgIIIAEgA0EIaiACKAIAQQEgASgCACgCHBEGACADKAIgIgBBAUYEQCACIAMoAhg2AgALIABBAUYLIQQgA0FAayQAIAQLCgAgACABQQAQHgtOAgF/AXwjAEEQayICJAAgAkEANgIMIAEoAgRB1M8AIAJBDGoQCSEDIAIoAgwiAQRAIAEQAQsgACADRAAAAAAAAAAAYjoAOCACQRBqJAALNwEBfyMAQRBrIgIkACACIAEtADg2AgggAEHUzwAgAkEIahAHNgIEIABB1NUANgIAIAJBEGokAAuoAQEFfyAAKAJUIgMoAgAhBSADKAIEIgQgACgCFCAAKAIcIgdrIgYgBCAGSRsiBgRAIAUgByAGECIaIAMgAygCACAGaiIFNgIAIAMgAygCBCAGayIENgIECyAEIAIgAiAESxsiBARAIAUgASAEECIaIAMgAygCACAEaiIFNgIAIAMgAygCBCAEazYCBAsgBUEAOgAAIAAgACgCLCIBNgIcIAAgATYCFCACC5wBAQJ/IwBBEGsiAiQAQcgAEBwhASAAKAIEIgAQAiACIAA2AgggAUHMLSACQQhqEAc2AgQgAUHU1QA2AgAgAUEBNgIcIAFB1NUANgIYIAFBATYCFCABQdTVADYCECABQQE2AgwgAUHU1QA2AgggAUEAOgAgIAFBADYCRCABQoCAgIAwNwI8IAFBADsANyABQQA7ACsgAkEQaiQAIAELigUCBn4CfyABIAEoAgBBB2pBeHEiAUEQajYCACAAIQkgASkDACEDIAEpAwghBSMAQSBrIgAkAAJAIAVC////////////AIMiBEKAgICAgIDAgDx9IARCgICAgICAwP/DAH1UBEAgBUIEhiADQjyIhCEEIANC//////////8PgyIDQoGAgICAgICACFoEQCAEQoGAgICAgICAwAB8IQIMAgsgBEKAgICAgICAgEB9IQIgA0KAgICAgICAgAhSDQEgAiAEQgGDfCECDAELIANQIARCgICAgICAwP//AFQgBEKAgICAgIDA//8AURtFBEAgBUIEhiADQjyIhEL/////////A4NCgICAgICAgPz/AIQhAgwBC0KAgICAgICA+P8AIQIgBEL///////+//8MAVg0AQgAhAiAEQjCIpyIBQZH3AEkNACADIQIgBUL///////8/g0KAgICAgIDAAIQiBCEGAkAgAUGB9wBrIghBwABxBEAgAyAIQUBqrYYhBkIAIQIMAQsgCEUNACAGIAitIgeGIAJBwAAgCGutiIQhBiACIAeGIQILIAAgAjcDECAAIAY3AxgCQEGB+AAgAWsiAUHAAHEEQCAEIAFBQGqtiCEDQgAhBAwBCyABRQ0AIARBwAAgAWuthiADIAGtIgKIhCEDIAQgAoghBAsgACADNwMAIAAgBDcDCCAAKQMIQgSGIAApAwAiA0I8iIQhAiAAKQMQIAApAxiEQgBSrSADQv//////////D4OEIgNCgYCAgICAgIAIWgRAIAJCAXwhAgwBCyADQoCAgICAgICACFINACACQgGDIAJ8IQILIABBIGokACAJIAIgBUKAgICAgICAgIB/g4S/OQMAC0ABAn8jAEEQayICJAAgAiABNgIMIAJB1NUANgIIIAJBCGogABEBACEDIAIoAgwiAQRAIAEQAwsgAkEQaiQAIAMLBABCAAsEAEEAC/YCAQh/IwBBIGsiAyQAIAMgACgCHCIENgIQIAAoAhQhBSADIAI2AhwgAyABNgIYIAMgBSAEayIBNgIUIAEgAmohBUECIQcCfwJAAkACQCAAKAI8IANBEGoiAUECIANBDGoQDSIEBH9B6N4AIAQ2AgBBfwVBAAsEQCABIQQMAQsDQCAFIAMoAgwiBkYNAiAGQQBIBEAgASEEDAQLIAEgBiABKAIEIghLIglBA3RqIgQgBiAIQQAgCRtrIgggBCgCAGo2AgAgAUEMQQQgCRtqIgEgASgCACAIazYCACAFIAZrIQUgACgCPCAEIgEgByAJayIHIANBDGoQDSIGBH9B6N4AIAY2AgBBfwVBAAtFDQALCyAFQX9HDQELIAAgACgCLCIBNgIcIAAgATYCFCAAIAEgACgCMGo2AhAgAgwBCyAAQQA2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EGokAAsiAQF+IAEgAq0gA61CIIaEIAQgABEMACIFQiCIpyQBIAWnCzcBAX8jAEEQayICJAAgAiABKAI8NgIIIABBnNAAIAJBCGoQBzYCBCAAQdTVADYCACACQRBqJAALC/NKFQBBgAgLhCZzZXRCZWF1dHkALSsgICAwWDB4AC0wWCswWCAwWC0weCsweCAweAB1bnNpZ25lZCBzaG9ydAB1bnNpZ25lZCBpbnQAaW5pdABmbG9hdAB1aW50NjRfdABibHVyUmFkaXVzAHZlY3RvcgBtaXJyb3IAYXR0YWNoU2hhZGVyAGRlbGV0ZVNoYWRlcgBjcmVhdGVTaGFkZXIAY29tcGlsZVNoYWRlcgB1bnNpZ25lZCBjaGFyAHN0ZDo6ZXhjZXB0aW9uAHJvdGF0aW9uAG5hbgBsaW5rUHJvZ3JhbQBkZWxldGVQcm9ncmFtAGNyZWF0ZVByb2dyYW0AYm9vbABlbXNjcmlwdGVuOjp2YWwAc2V0V2F0ZXJNYXJrAHN0b3BXYXRlck1hcmsAdW5zaWduZWQgbG9uZwBzdGQ6OndzdHJpbmcAYmFzaWNfc3RyaW5nAHN0ZDo6c3RyaW5nAHN0ZDo6dTE2c3RyaW5nAHN0ZDo6dTMyc3RyaW5nAGluZgAlZgBjbG9zZQBkb3VibGUAdmJNb2RlAHNoYWRlclNvdXJjZQB2b2lkAHNhbXBsZUNvbG9yICs9IHRleHR1cmUoZnJhbWUsIGJsdXJDb29yZGluYXRlc1sATkFOAElORgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgc2hvcnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgaW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxmbG9hdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dWludDhfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50OF90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MTZfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50MTZfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dWludDY0X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludDY0X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQzMl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQzMl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBjaGFyPgBzdGQ6OmJhc2ljX3N0cmluZzx1bnNpZ25lZCBjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxzaWduZWQgY2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8bG9uZz4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgbG9uZz4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8ZG91YmxlPgB2ZWMyIGMgPSB2X3RleENvb3JkOwB2ZWMyIGMgPSB2ZWMyKDEuMCAtIHZfdGV4Q29vcmQueCwgdl90ZXhDb29yZC55KTsAYyA9IHZlYzIoMS4wIC0gYy54LCAxLjAgLSBjLnkpOwBjID0gdmVjMihjLnksIDEuMCAtIGMueCk7AGMgPSB2ZWMyKDEuMCAtIGMueSwgYy54KTsAQWxsSW4xAC4ALjAsAC4wKSpvKSoAKG51bGwpACkqby55KTsgICAgdmVjMiBjb29yZDIgPSB2ZWMyKGZsb2F0KAAgICAgYyA9IHZlYzIodl90ZXhDb29yZC54LCAxLjAgLSB2X3RleENvb3JkLnkpOyAgICB2ZWMyIGNvb3JkMSA9IHZlYzIoZmxvYXQoACksIChjLnkgLWNvb3JkMS55KSAvIG8ueSAvIGZsb2F0KAApKm8ueSk7ICAgIGlmIChjLnggPiBjb29yZDEueCAmJiBjLnggPCBjb29yZDIueCAmJiBjLnkgPiBjb29yZDEueSAmJiBjLnkgPCBjb29yZDIueSkgeyAgICAgIHZlYzQgd2F0ZXJDb2xvciA9IHRleHR1cmUod2F0ZXJNYXJrLCB2ZWMyKChjLnggLSBjb29yZDEueCkgIC8gby54IC8gZmxvYXQoACkgKiBvLngsIGZsb2F0KABvdXRDb2xvci5yZ2IgKz0gdmVjMygAKTsgICAgICAgdmVjMyBzbW9vdGhDb2xvciA9IG91dENvbG9yLnJnYiArIChvdXRDb2xvci5yZ2ItdmVjMyhoaWdoUGFzcykpKmFscGhhKjAuMTsgICAgICAgc21vb3RoQ29sb3IgPSBtYXgoc21vb3RoQ29sb3IsIHZlYzMoMC4wKSk7ICAgICAgIHNtb290aENvbG9yID0gY2xhbXAocG93KHNtb290aENvbG9yLCB2ZWMzKABnKz1HKGMsdmVjMigAICAgICAgdmVjMiBvZmZzZXQgPSB2ZWMyKABdID0gdl90ZXhDb29yZC54eSArIG9mZnNldCAqIHZlYzIoADsgACkpLCB2ZWMzKDAuMCksIHZlYzMoMS4wKSk7ICAgICAgdmVjMyBzY3JlZW4gPSB2ZWMzKDEuMCkgLSAodmVjMygxLjApLXNtb290aENvbG9yKSAqICh2ZWMzKDEuMCktb3V0Q29sb3IucmdiKTsgICAgICAgdmVjMyBsaWdodGVuID0gbWF4KHNtb290aENvbG9yLCBvdXRDb2xvci5yZ2IpOyAgICAgICB2ZWMzIGJlYXV0eUNvbG9yID0gbWl4KG1peChvdXRDb2xvci5yZ2IsIHNjcmVlbiwgYWxwaGEpLCBsaWdodGVuLCBhbHBoYSk7ICAgICAgb3V0Q29sb3IucmdiID0gbWl4KG91dENvbG9yLnJnYiwgYmVhdXR5Q29sb3IsIAAKICAgICAgY29uc3QgbWF0MyBzYXR1cmF0ZU1hdHJpeCA9IG1hdDMoMS4xMTAyLC0wLjA1OTgsLTAuMDYxLC0wLjA3NzQsMS4wODI2LC0wLjExODYsLTAuMDIyOCwtMC4wMjI4LDEuMTc3Mik7CiAgICAgIHZlYzMgd2FybUNvbG9yID0gb3V0Q29sb3IucmdiICogc2F0dXJhdGVNYXRyaXg7CiAgICAgIG91dENvbG9yLnJnYiA9IG1peChvdXRDb2xvci5yZ2IsIHdhcm1Db2xvciwgACAgICAgIHNhbXBsZUNvbG9yID0gc2FtcGxlQ29sb3IgLyA2Mi4wOyAgICAgICBmbG9hdCBoaWdoUGFzcyA9IG91dENvbG9yLmcgLSBzYW1wbGVDb2xvciArIDAuNTsgICAgICAgY29uc3QgaGlnaHAgdmVjMyBXID0gdmVjMygwLjI5OSwwLjU4NywwLjExNCk7ICAgICAgZmxvYXQgbHVtaW5hbmNlID0gZG90KG91dENvbG9yLnJnYiwgVyk7ICAgICAgIGZsb2F0IGFscGhhID0gcG93KGx1bWluYW5jZSwgAF0pLmcgKiAAKSkpOyAgICAgIG91dENvbG9yID0gbWl4KG91dENvbG9yLHdhdGVyQ29sb3IsICB3YXRlckNvbG9yLmEpOyAgICB9ICAgIAApOyAgICAAKTsgICAgICB2ZWMyIGJsdXJDb29yZGluYXRlc1syNF07ICAgICAgACAgICAgIGZsb2F0IHNhbXBsZUNvbG9yID0gb3V0Q29sb3IuZyAqIDIyLjA7ICAgICAgIAAjdmVyc2lvbiAzMDAgZXMKICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgIHVuaWZvcm0gc2FtcGxlcjJEIGZyYW1lOwogICAgdW5pZm9ybSBzYW1wbGVyMkQgbWFzazsKICAgIHVuaWZvcm0gc2FtcGxlcjJEIGJnOwogICAgdW5pZm9ybSBzYW1wbGVyMkQgd2F0ZXJNYXJrOwogICAgdW5pZm9ybSBzYW1wbGVyMkQgbGFzdE1hc2s7CiAgICB1bmlmb3JtIG1hdDQgdV9vZmZzZXRNYXRyaXg7CiAgICB1bmlmb3JtIHZlYzMgdV9jb2xvcjsKICAgIGluIHZlYzIgdl90ZXhDb29yZDsKICAgIG91dCB2ZWM0IG91dENvbG9yOwogICAgdmVjNCBHKHZlYzIgYyx2ZWMyIHMpewogICAgICByZXR1cm4gdGV4dHVyZShmcmFtZSx0ZXh0dXJlKG1hc2ssYytzKS5yPjAuMz9jOmMrcyk7CiAgICB9CiAgICB2b2lkIG1haW4oKSB7CiAgICAgIAAKICAgICAgdmVjMiBvZmZzZXRNYXNrVVYgPSAodV9vZmZzZXRNYXRyaXggKiB2ZWM0KGMsIDAsIDEpKS54eTsKICAgICAgZmxvYXQgaXNJbnNpZGVYID0gKG9mZnNldE1hc2tVVi54ID49IDAuMCkgJiYgKG9mZnNldE1hc2tVVi54IDw9IDEuMCkgPyAxLjAgOiAwLjA7CiAgICAgIGZsb2F0IGlzSW5zaWRlWSA9IChvZmZzZXRNYXNrVVYueSA+PSAwLjApICYmIChvZmZzZXRNYXNrVVYueSA8PSAxLjApID8gMS4wIDogMC4wOwogICAgICBmbG9hdCBpc0luc2lkZSA9IGlzSW5zaWRlWCAqIGlzSW5zaWRlWTsKICAgICAgZmxvYXQgbWFza2VkQWxwaGEgPSB0ZXh0dXJlKG1hc2ssIG9mZnNldE1hc2tVVikuciAqIGlzSW5zaWRlOwogICAgICBtYXNrZWRBbHBoYSA9IG1hc2tlZEFscGhhPDAuNT8yLjAqbWFza2VkQWxwaGEqbWFza2VkQWxwaGE6MS4wLTIuMCooMS4wLW1hc2tlZEFscGhhKSooMS4wLW1hc2tlZEFscGhhKTsKICAgICAgc3JjX2NvbG9yID0gdGV4dHVyZShmcmFtZSwgb2Zmc2V0TWFza1VWICwgaXNJbnNpZGUpOwogICAgICBvdXRDb2xvciA9IG1peCh0ZXh0dXJlKGJnLCBjKSwgc3JjX2NvbG9yLCBtYXNrZWRBbHBoYSk7CiAgICAACiAgICB2ZWM0IGcgPSB2ZWM0KDAuMCk7CiAgICAACiAgICAgIGMueSA9IDEuMCAtIGMueTsKICAgICAgdmVjNCBzcmNfY29sb3IgPSB0ZXh0dXJlKGZyYW1lLCBjKTsKICAgICAgZmxvYXQgYSA9IHRleHR1cmUobWFzaywgYykucjsKICAgICAgYSA9IGE8MC41PzIuMCphKmE6MS4wLTIuMCooMS4wLWEpKigxLjAtYSk7CiAgICAgIC8vIGZsb2F0IGEyID0gdGV4dHVyZShsYXN0TWFzaywgYykuYTsKICAgICAgLy8gYTIgPSBhMjwwLjU/Mi4wKmEyKmEyOjEuMC0yLjAqKDEuMC1hMikqKDEuMC1hMik7CiAgICAgIC8vIGZsb2F0IGRlbHRhID0gYSAtIGEyOwogICAgICAvLyBpZiAoZGVsdGEgPCAwLjI1ICYmIGRlbHRhID4gLTAuMjUpCiAgICAgIC8vIHsKICAgICAgLy8gICAgIGEgPSBhICsgMC41KmRlbHRhOwogICAgICAvLyB9CiAgICAgIAogICAgICB2ZWMyIG8gPSAxLjAgLyB2ZWMyKHRleHR1cmVTaXplKGZyYW1lLCAwKSk7CiAgICAACiAgICAgIG91dENvbG9yID0gZzsKICAAI3ZlcnNpb24gMzAwIGVzCmluIHZlYzIgYV9wb3NpdGlvbjsKaW4gdmVjMiBhX3RleENvb3JkOwoKdW5pZm9ybSBtYXQ0IHVfdGV4dHVyZU1hdHJpeDsKCm91dCB2ZWMyIHZfdGV4Q29vcmQ7CnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQoYV9wb3NpdGlvbi54LCBhX3Bvc2l0aW9uLnksIDAsIDEpOwogIHZfdGV4Q29vcmQgPSh1X3RleHR1cmVNYXRyaXggKiB2ZWM0KGFfdGV4Q29vcmQsIDAsIDEpKS54eTsKfQoAc2V0QmVhdXR5ICVmICVmICVmICVmICVmCgBvdXRDb2xvciA9IHNyY19jb2xvcjsKAG91dENvbG9yID0gbWl4KHZlYzQodV9jb2xvciwxLjApLHNyY19jb2xvcixhKTsKADZBbGxJbjEAAIAoAABfFgAAUDZBbGxJbjEAAAAABCkAAHAWAAAAAAAAaBYAAFBLNkFsbEluMQAAAAQpAACMFgAAAQAAAGgWAABpaQB2AHZpAHwWAADMFgAATjEwZW1zY3JpcHRlbjN2YWxFAACAKAAAuBYAAGlpaQB2aWlpAAAAALwnAAB8FgAAcCgAAHAoAABwKAAAcCgAAHAoAAB2aWlkZGRkZABBkC4LyAi8JwAAfBYAAHAoAABwKAAAcCgAAHAoAAB2aWlkZGRkALwnAAB8FgAAdmlpALwnAADMFgAAzBYAAHwWAADMFgAAHCgAALwnAADMFgAAoBcAAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0ljTlNfMTFjaGFyX3RyYWl0c0ljRUVOU185YWxsb2NhdG9ySWNFRUVFAACAKAAAYBcAAMwWAAC8JwAAzBYAAMwWAABOU3QzX18yMTJiYXNpY19zdHJpbmdJaE5TXzExY2hhcl90cmFpdHNJaEVFTlNfOWFsbG9jYXRvckloRUVFRQAAgCgAALgXAABOU3QzX18yMTJiYXNpY19zdHJpbmdJd05TXzExY2hhcl90cmFpdHNJd0VFTlNfOWFsbG9jYXRvckl3RUVFRQAAgCgAAAAYAABOU3QzX18yMTJiYXNpY19zdHJpbmdJRHNOU18xMWNoYXJfdHJhaXRzSURzRUVOU185YWxsb2NhdG9ySURzRUVFRQAAAIAoAABIGAAATlN0M19fMjEyYmFzaWNfc3RyaW5nSURpTlNfMTFj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")||(Dt=$e,$e=g.locateFile?g.locateFile(Dt,Q):Q+Dt);var Ki=P=>{for(;P.length>0;)P.shift()(g)};g.noExitRuntime;function Ur(P){this.excPtr=P,this.ptr=P-24,this.set_type=function(F){QA[this.ptr+4>>2]=F},this.get_type=function(){return QA[this.ptr+4>>2]},this.set_destructor=function(F){QA[this.ptr+8>>2]=F},this.get_destructor=function(){return QA[this.ptr+8>>2]},this.set_caught=function(F){F=F?1:0,AA[this.ptr+12|0]=F},this.get_caught=function(){return AA[this.ptr+12|0]!=0},this.set_rethrown=function(F){F=F?1:0,AA[this.ptr+13|0]=F},this.get_rethrown=function(){return AA[this.ptr+13|0]!=0},this.init=function(F,EA){this.set_adjusted_ptr(0),this.set_type(F),this.set_destructor(EA)},this.set_adjusted_ptr=function(F){QA[this.ptr+16>>2]=F},this.get_adjusted_ptr=function(){return QA[this.ptr+16>>2]},this.get_exception_ptr=function(){if(Cs(this.get_type()))return QA[this.excPtr>>2];var F=this.get_adjusted_ptr();return F!==0?F:this.excPtr}}var Er,no,Kn,Xi=P=>{for(var F="",EA=P;z[EA];)F+=Er[z[EA++]];return F},yr={},lr={},Ni={},wt=P=>{throw new no(P)},Ji=P=>{throw new Kn(P)},Di=(P,F,EA)=>{function RA(ge){var we=EA(ge);we.length!==P.length&&Ji("Mismatched type converter count");for(var _e=0;_e{lr.hasOwnProperty(ge)?GA[we]=lr[ge]:(WA.push(ge),yr.hasOwnProperty(ge)||(yr[ge]=[]),yr[ge].push(()=>{GA[we]=lr[ge],++Ce===WA.length&&RA(GA)}))}),WA.length===0&&RA(GA)};function ar(P,F,EA={}){if(!("argPackAdvance"in F))throw new TypeError("registerType registeredInstance requires argPackAdvance");return function(RA,GA,WA={}){var Ce=GA.name;if(RA||wt(`type "${Ce}" must have a positive integer typeid pointer`),lr.hasOwnProperty(RA)){if(WA.ignoreDuplicateRegistrations)return;wt(`Cannot register type '${Ce}' twice`)}if(lr[RA]=GA,delete Ni[RA],yr.hasOwnProperty(RA)){var ge=yr[RA];delete yr[RA],ge.forEach(we=>we())}}(P,F,EA)}var MA,YA=P=>{wt(P.$$.ptrType.registeredClass.name+" instance already deleted")},pe=!1,st=P=>{},Te=P=>{P.count.value-=1,P.count.value===0&&(F=>{F.smartPtr?F.smartPtrType.rawDestructor(F.smartPtr):F.ptrType.registeredClass.rawDestructor(F.ptr)})(P)},be=(P,F,EA)=>{if(F===EA)return P;if(EA.baseClass===void 0)return null;var RA=be(P,F,EA.baseClass);return RA===null?null:EA.downcast(RA)},yt={},ht=()=>Object.keys(zt).length,ae=()=>{var P=[];for(var F in zt)zt.hasOwnProperty(F)&&P.push(zt[F]);return P},ye=[],Xe=()=>{for(;ye.length;){var P=ye.pop();P.$$.deleteScheduled=!1,P.delete()}},ot=P=>{MA=P,ye.length&&MA&&MA(Xe)},zt={},yi=(P,F)=>(F=((EA,RA)=>{for(RA===void 0&&wt("ptr should not be undefined");EA.baseClass;)RA=EA.upcast(RA),EA=EA.baseClass;return RA})(P,F),zt[F]),Hi=(P,F)=>(F.ptrType&&F.ptr||Ji("makeClassHandle requires ptr and ptrType"),!!F.smartPtrType!=!!F.smartPtr&&Ji("Both smartPtrType and smartPtr must be specified"),F.count={value:1},ji(Object.create(P,{$$:{value:F}})));function Ei(P){var F=this.getPointee(P);if(!F)return this.destructor(P),null;var EA=yi(this.registeredClass,F);if(EA!==void 0){if(EA.$$.count.value===0)return EA.$$.ptr=F,EA.$$.smartPtr=P,EA.clone();var RA=EA.clone();return this.destructor(P),RA}function GA(){return this.isSmartPointer?Hi(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:F,smartPtrType:this,smartPtr:P}):Hi(this.registeredClass.instancePrototype,{ptrType:this,ptr:P})}var WA,Ce=this.registeredClass.getActualType(F),ge=yt[Ce];if(!ge)return GA.call(this);WA=this.isConst?ge.constPointerType:ge.pointerType;var we=be(F,this.registeredClass,WA.registeredClass);return we===null?GA.call(this):this.isSmartPointer?Hi(WA.registeredClass.instancePrototype,{ptrType:WA,ptr:we,smartPtrType:this,smartPtr:P}):Hi(WA.registeredClass.instancePrototype,{ptrType:WA,ptr:we})}var ji=P=>typeof FinalizationRegistry>"u"?(ji=F=>F,P):(pe=new FinalizationRegistry(F=>{Te(F.$$)}),st=F=>pe.unregister(F),(ji=F=>{var EA=F.$$;if(EA.smartPtr){var RA={$$:EA};pe.register(F,RA,F)}return F})(P));function Xo(){}var sr=(P,F)=>Object.defineProperty(F,"name",{value:P}),Lo=(P,F,EA)=>{if(P[F].overloadTable===void 0){var RA=P[F];P[F]=function(){return P[F].overloadTable.hasOwnProperty(arguments.length)||wt(`Function '${EA}' called with an invalid number of arguments (${arguments.length}) - expects one of (${P[F].overloadTable})!`),P[F].overloadTable[arguments.length].apply(this,arguments)},P[F].overloadTable=[],P[F].overloadTable[RA.argCount]=RA}};function Nr(P,F,EA,RA,GA,WA,Ce,ge){this.name=P,this.constructor=F,this.instancePrototype=EA,this.rawDestructor=RA,this.baseClass=GA,this.getActualType=WA,this.upcast=Ce,this.downcast=ge,this.pureVirtualFunctions=[]}var Vo=(P,F,EA)=>{for(;F!==EA;)F.upcast||wt(`Expected null or instance of ${EA.name}, got an instance of ${F.name}`),P=F.upcast(P),F=F.baseClass;return P};function et(P,F){if(F===null)return this.isReference&&wt(`null is not a valid ${this.name}`),0;F.$$||wt(`Cannot pass "${ao(F)}" as a ${this.name}`),F.$$.ptr||wt(`Cannot pass deleted object as a pointer of type ${this.name}`);var EA=F.$$.ptrType.registeredClass;return Vo(F.$$.ptr,EA,this.registeredClass)}function Kr(P,F){var EA;if(F===null)return this.isReference&&wt(`null is not a valid ${this.name}`),this.isSmartPointer?(EA=this.rawConstructor(),P!==null&&P.push(this.rawDestructor,EA),EA):0;F.$$||wt(`Cannot pass "${ao(F)}" as a ${this.name}`),F.$$.ptr||wt(`Cannot pass deleted object as a pointer of type ${this.name}`),!this.isConst&&F.$$.ptrType.isConst&&wt(`Cannot convert argument of type ${F.$$.smartPtrType?F.$$.smartPtrType.name:F.$$.ptrType.name} to parameter type ${this.name}`);var RA=F.$$.ptrType.registeredClass;if(EA=Vo(F.$$.ptr,RA,this.registeredClass),this.isSmartPointer)switch(F.$$.smartPtr===void 0&&wt("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:F.$$.smartPtrType===this?EA=F.$$.smartPtr:wt(`Cannot convert argument of type ${F.$$.smartPtrType?F.$$.smartPtrType.name:F.$$.ptrType.name} to parameter type ${this.name}`);break;case 1:EA=F.$$.smartPtr;break;case 2:if(F.$$.smartPtrType===this)EA=F.$$.smartPtr;else{var GA=F.clone();EA=this.rawShare(EA,gr.toHandle(()=>GA.delete())),P!==null&&P.push(this.rawDestructor,EA)}break;default:wt("Unsupporting sharing policy")}return EA}function Qn(P,F){if(F===null)return this.isReference&&wt(`null is not a valid ${this.name}`),0;F.$$||wt(`Cannot pass "${ao(F)}" as a ${this.name}`),F.$$.ptr||wt(`Cannot pass deleted object as a pointer of type ${this.name}`),F.$$.ptrType.isConst&&wt(`Cannot convert argument of type ${F.$$.ptrType.name} to parameter type ${this.name}`);var EA=F.$$.ptrType.registeredClass;return Vo(F.$$.ptr,EA,this.registeredClass)}function ho(P){return this.fromWireType(QA[P>>2])}function jn(P,F,EA,RA,GA,WA,Ce,ge,we,_e,Ke){this.name=P,this.registeredClass=F,this.isReference=EA,this.isConst=RA,this.isSmartPointer=GA,this.pointeeType=WA,this.sharingPolicy=Ce,this.rawGetPointee=ge,this.rawConstructor=we,this.rawShare=_e,this.rawDestructor=Ke,GA||F.baseClass!==void 0?this.toWireType=Kr:RA?(this.toWireType=et,this.destructorFunction=null):(this.toWireType=Qn,this.destructorFunction=null)}var $t,$r,On=[],An=P=>{var F=On[P];return F||(P>=On.length&&(On.length=P+1),On[P]=F=$t.get(P)),F},Tr=(P,F,EA)=>P.includes("j")?((RA,GA,WA)=>{var Ce=g["dynCall_"+RA];return WA&&WA.length?Ce.apply(null,[GA].concat(WA)):Ce.call(null,GA)})(P,F,EA):An(F).apply(null,EA),ei=(P,F)=>{var EA,RA,GA,WA=(P=Xi(P)).includes("j")?(EA=P,RA=F,GA=[],function(){return GA.length=0,Object.assign(GA,arguments),Tr(EA,RA,GA)}):An(F);return typeof WA!="function"&&wt(`unknown function pointer with signature ${P}: ${F}`),WA},Es=P=>{var F=Ba(P),EA=Xi(F);return Mr(F),EA},jr=(P,F)=>{var EA=[],RA={};throw F.forEach(function GA(WA){RA[WA]||lr[WA]||(Ni[WA]?Ni[WA].forEach(GA):(EA.push(WA),RA[WA]=!0))}),new $r(`${P}: `+EA.map(Es).join([", "]))},Gr=(P,F)=>{for(var EA=[],RA=0;RA>2]);return EA},$o=P=>{for(;P.length;){var F=P.pop();P.pop()(F)}};function sn(P,F,EA,RA,GA,WA){var Ce=F.length;Ce<2&&wt("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var ge=F[1]!==null&&EA!==null,we=!1,_e=1;_e(P instanceof Object||wt(`${EA} with invalid "this": ${P}`),P instanceof F.registeredClass.constructor||wt(`${EA} incompatible with "this" of type ${P.constructor.name}`),P.$$.ptr||wt(`cannot call emscripten binding method ${EA} on deleted object`),Vo(P.$$.ptr,P.$$.ptrType.registeredClass,F.registeredClass));function hn(){this.allocated=[void 0],this.freelist=[]}var Gi=new hn,pn=P=>{P>=Gi.reserved&&--Gi.get(P).refcount===0&&Gi.free(P)},nI=()=>{for(var P=0,F=Gi.reserved;F(P||wt("Cannot use deleted val. handle = "+P),Gi.get(P).value),toHandle:P=>{switch(P){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:return Gi.allocate({refcount:1,value:P})}}};function gn(P){return this.fromWireType(X[P>>2])}var Yo,Tg,So,ao=P=>{if(P===null)return"null";var F=typeof P;return F==="object"||F==="array"||F==="function"?P.toString():""+P},EE=(P,F)=>{switch(F){case 4:return function(EA){return this.fromWireType(wA[EA>>2])};case 8:return function(EA){return this.fromWireType(HA[EA>>3])};default:throw new TypeError(`invalid float width (${F}): ${P}`)}},Ta=(P,F,EA)=>{switch(F){case 1:return EA?RA=>AA[RA|0]:RA=>z[RA|0];case 2:return EA?RA=>sA[RA>>1]:RA=>eA[RA>>1];case 4:return EA?RA=>X[RA>>2]:RA=>QA[RA>>2];default:throw new TypeError(`invalid integer width (${F}): ${P}`)}},po=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0,Ja=(P,F,EA)=>{for(var RA=F+EA,GA=F;P[GA]&&!(GA>=RA);)++GA;if(GA-F>16&&P.buffer&&po)return po.decode(P.subarray(F,GA));for(var WA="";F>10,56320|1023&_e)}}else WA+=String.fromCharCode((31&Ce)<<6|ge)}else WA+=String.fromCharCode(Ce)}return WA},Mc=(P,F)=>P?Ja(z,P,F):"",Qr=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,Fo=(P,F)=>{for(var EA=P,RA=EA>>1,GA=RA+F/2;!(RA>=GA)&&eA[RA];)++RA;if((EA=RA<<1)-P>32&&Qr)return Qr.decode(z.subarray(P,EA));for(var WA="",Ce=0;!(Ce>=F/2);++Ce){var ge=sA[P+2*Ce>>1];if(ge==0)break;WA+=String.fromCharCode(ge)}return WA},$s=(P,F,EA)=>{if(EA===void 0&&(EA=2147483647),EA<2)return 0;for(var RA=F,GA=(EA-=2)<2*P.length?EA/2:P.length,WA=0;WA>1]=Ce,F+=2}return sA[F>>1]=0,F-RA},Ha=P=>2*P.length,Gs=(P,F)=>{for(var EA=0,RA="";!(EA>=F/4);){var GA=X[P+4*EA>>2];if(GA==0)break;if(++EA,GA>=65536){var WA=GA-65536;RA+=String.fromCharCode(55296|WA>>10,56320|1023&WA)}else RA+=String.fromCharCode(GA)}return RA},Ga=(P,F,EA)=>{if(EA===void 0&&(EA=2147483647),EA<4)return 0;for(var RA=F,GA=RA+EA-4,WA=0;WA=55296&&Ce<=57343&&(Ce=65536+((1023&Ce)<<10)|1023&P.charCodeAt(++WA)),X[F>>2]=Ce,(F+=4)+4>GA)break}return X[F>>2]=0,F-RA},Rr=P=>{for(var F=0,EA=0;EA=55296&&RA<=57343&&++EA,F+=4}return F},Ia=(P,F)=>{var EA=lr[P];return EA===void 0&&wt(F+" has unknown type "+Es(P)),EA},fo=(P,F,EA)=>{var RA=[],GA=P.toWireType(RA,EA);return RA.length&&(QA[F>>2]=gr.toHandle(RA)),GA},aI={},en=[],qo=Reflect.construct,Gg=[null,[],[]],kg=(P,F)=>{var EA=Gg[P];F===0||F===10?((P===1?M:v)(Ja(EA,0)),EA.length=0):EA.push(F)};(()=>{for(var P=new Array(256),F=0;F<256;++F)P[F]=String.fromCharCode(F);Er=P})(),no=g.BindingError=class extends Error{constructor(P){super(P),this.name="BindingError"}},Kn=g.InternalError=class extends Error{constructor(P){super(P),this.name="InternalError"}},Object.assign(Xo.prototype,{isAliasOf(P){if(!(this instanceof Xo)||!(P instanceof Xo))return!1;var F=this.$$.ptrType.registeredClass,EA=this.$$.ptr;P.$$=P.$$;for(var RA=P.$$.ptrType.registeredClass,GA=P.$$.ptr;F.baseClass;)EA=F.upcast(EA),F=F.baseClass;for(;RA.baseClass;)GA=RA.upcast(GA),RA=RA.baseClass;return F===RA&&EA===GA},clone(){if(this.$$.ptr||YA(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var P,F=ji(Object.create(Object.getPrototypeOf(this),{$$:{value:(P=this.$$,{count:P.count,deleteScheduled:P.deleteScheduled,preservePointerOnDelete:P.preservePointerOnDelete,ptr:P.ptr,ptrType:P.ptrType,smartPtr:P.smartPtr,smartPtrType:P.smartPtrType})}}));return F.$$.count.value+=1,F.$$.deleteScheduled=!1,F},delete(){this.$$.ptr||YA(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&wt("Object already scheduled for deletion"),st(this),Te(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)},isDeleted(){return!this.$$.ptr},deleteLater(){return this.$$.ptr||YA(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&wt("Object already scheduled for deletion"),ye.push(this),ye.length===1&&MA&&MA(Xe),this.$$.deleteScheduled=!0,this}}),g.getInheritedInstanceCount=ht,g.getLiveInheritedInstances=ae,g.flushPendingDeletes=Xe,g.setDelayFunction=ot,Object.assign(jn.prototype,{getPointee(P){return this.rawGetPointee&&(P=this.rawGetPointee(P)),P},destructor(P){this.rawDestructor&&this.rawDestructor(P)},argPackAdvance:8,readValueFromPointer:ho,deleteObject(P){P!==null&&P.delete()},fromWireType:Ei}),$r=g.UnboundTypeError=(Yo=Error,(So=sr(Tg="UnboundTypeError",function(P){this.name=Tg,this.message=P;var F=new Error(P).stack;F!==void 0&&(this.stack=this.toString()+` +`+F.replace(/^Error(:[^\n]*)?\n/,""))})).prototype=Object.create(Yo.prototype),So.prototype.constructor=So,So.prototype.toString=function(){return this.message===void 0?this.name:`${this.name}: ${this.message}`},So),Object.assign(hn.prototype,{get(P){return this.allocated[P]},has(P){return this.allocated[P]!==void 0},allocate(P){var F=this.freelist.pop()||this.allocated.length;return this.allocated[F]=P,F},free(P){this.allocated[P]=void 0,this.freelist.push(P)}}),Gi.allocated.push({value:void 0},{value:null},{value:!0},{value:!1}),Gi.reserved=Gi.allocated.length,g.count_emval_handles=nI;var fn,ls={w:(P,F,EA)=>{throw new Ur(P).init(F,EA),P},q:(P,F,EA,RA,GA)=>{},u:(P,F,EA,RA)=>{ar(P,{name:F=Xi(F),fromWireType:function(GA){return!!GA},toWireType:function(GA,WA){return WA?EA:RA},argPackAdvance:8,readValueFromPointer:function(GA){return this.fromWireType(z[GA])},destructorFunction:null})},y:(P,F,EA,RA,GA,WA,Ce,ge,we,_e,Ke,Bt,Rt)=>{Ke=Xi(Ke),WA=ei(GA,WA),ge&&(ge=ei(Ce,ge)),_e&&(_e=ei(we,_e)),Rt=ei(Bt,Rt);var Ye=(nt=>{if(nt===void 0)return"_unknown";var ii=(nt=nt.replace(/[^a-zA-Z0-9_]/g,"$")).charCodeAt(0);return ii>=48&&ii<=57?`_${nt}`:nt})(Ke);((nt,ii,oi)=>{g.hasOwnProperty(nt)?(wt(`Cannot register public name '${nt}' twice`),Lo(g,nt,nt),g.hasOwnProperty(oi)&&wt(`Cannot register multiple overloads of a function with the same number of arguments (${oi})!`),g[nt].overloadTable[oi]=ii):g[nt]=ii})(Ye,function(){jr(`Cannot construct ${Ke} due to unbound types`,[RA])}),Di([P,F,EA],RA?[RA]:[],function(nt){var ii,oi;nt=nt[0],oi=RA?(ii=nt.registeredClass).instancePrototype:Xo.prototype;var Ko=sr(Ke,function(){if(Object.getPrototypeOf(this)!==Kt)throw new no("Use 'new' to construct "+Ke);if(ro.constructor_body===void 0)throw new no(Ke+" has no accessible constructor");var xr=ro.constructor_body[arguments.length];if(xr===void 0)throw new no(`Tried to invoke ctor of ${Ke} with invalid number of parameters (${arguments.length}) - expected (${Object.keys(ro.constructor_body).toString()}) parameters instead!`);return xr.apply(this,arguments)}),Kt=Object.create(oi,{constructor:{value:Ko}});Ko.prototype=Kt;var ro=new Nr(Ke,Ko,Kt,Rt,ii,WA,ge,_e);ro.baseClass&&(ro.baseClass.__derivedClasses===void 0&&(ro.baseClass.__derivedClasses=[]),ro.baseClass.__derivedClasses.push(ro));var ks=new jn(Ke,ro,!0,!1,!1),Zr=new jn(Ke+"*",ro,!1,!1,!1),In=new jn(Ke+" const*",ro,!1,!0,!1);return yt[P]={pointerType:Zr,constPointerType:In},((xr,sI,jo)=>{g.hasOwnProperty(xr)||Ji("Replacing nonexistant public symbol"),g[xr].overloadTable!==void 0&&jo!==void 0?g[xr].overloadTable[jo]=sI:(g[xr]=sI,g[xr].argCount=jo)})(Ye,Ko),[ks,Zr,In]})},x:(P,F,EA,RA,GA,WA)=>{var Ce=Gr(F,EA);GA=ei(RA,GA),Di([],[P],function(ge){var we=`constructor ${(ge=ge[0]).name}`;if(ge.registeredClass.constructor_body===void 0&&(ge.registeredClass.constructor_body=[]),ge.registeredClass.constructor_body[F-1]!==void 0)throw new no(`Cannot register multiple constructors with identical number of parameters (${F-1}) for class '${ge.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);return ge.registeredClass.constructor_body[F-1]=()=>{jr(`Cannot construct ${ge.name} due to unbound types`,Ce)},Di([],Ce,_e=>(_e.splice(1,0,null),ge.registeredClass.constructor_body[F-1]=sn(we,_e,null,GA,WA),[])),[]})},i:(P,F,EA,RA,GA,WA,Ce,ge,we)=>{var _e=Gr(EA,RA);F=(Ke=>{const Bt=(Ke=Ke.trim()).indexOf("(");return Bt!==-1?Ke.substr(0,Bt):Ke})(F=Xi(F)),WA=ei(GA,WA),Di([],[P],function(Ke){var Bt=`${(Ke=Ke[0]).name}.${F}`;function Rt(){jr(`Cannot call ${Bt} due to unbound types`,_e)}F.startsWith("@@")&&(F=Symbol[F.substring(2)]),ge&&Ke.registeredClass.pureVirtualFunctions.push(F);var Ye=Ke.registeredClass.instancePrototype,nt=Ye[F];return nt===void 0||nt.overloadTable===void 0&&nt.className!==Ke.name&&nt.argCount===EA-2?(Rt.argCount=EA-2,Rt.className=Ke.name,Ye[F]=Rt):(Lo(Ye,F,Bt),Ye[F].overloadTable[EA-2]=Rt),Di([],_e,function(ii){var oi=sn(Bt,ii,Ke,WA,Ce);return Ye[F].overloadTable===void 0?(oi.argCount=EA-2,Ye[F]=oi):Ye[F].overloadTable[EA-2]=oi,[]}),[]})},k:(P,F,EA,RA,GA,WA,Ce,ge,we,_e)=>{F=Xi(F),GA=ei(RA,GA),Di([],[P],function(Ke){var Bt=`${(Ke=Ke[0]).name}.${F}`,Rt={get(){jr(`Cannot access ${Bt} due to unbound types`,[EA,Ce])},enumerable:!0,configurable:!0};return Rt.set=we?()=>jr(`Cannot access ${Bt} due to unbound types`,[EA,Ce]):Ye=>wt(Bt+" is a read-only property"),Object.defineProperty(Ke.registeredClass.instancePrototype,F,Rt),Di([],we?[EA,Ce]:[EA],function(Ye){var nt=Ye[0],ii={get(){var Ko=dn(this,Ke,Bt+" getter");return nt.fromWireType(GA(WA,Ko))},enumerable:!0};if(we){we=ei(ge,we);var oi=Ye[1];ii.set=function(Ko){var Kt=dn(this,Ke,Bt+" setter"),ro=[];we(_e,Kt,oi.toWireType(ro,Ko)),$o(ro)}}return Object.defineProperty(Ke.registeredClass.instancePrototype,F,ii),[]}),[]})},t:(P,F)=>{ar(P,{name:F=Xi(F),fromWireType:EA=>{var RA=gr.toValue(EA);return pn(EA),RA},toWireType:(EA,RA)=>gr.toHandle(RA),argPackAdvance:8,readValueFromPointer:gn,destructorFunction:null})},p:(P,F,EA)=>{ar(P,{name:F=Xi(F),fromWireType:RA=>RA,toWireType:(RA,GA)=>GA,argPackAdvance:8,readValueFromPointer:EE(F,EA),destructorFunction:null})},g:(P,F,EA,RA,GA)=>{F=Xi(F);var WA=we=>we;if(RA===0){var Ce=32-8*EA;WA=we=>we<>>Ce}var ge=F.includes("unsigned");ar(P,{name:F,fromWireType:WA,toWireType:ge?function(we,_e){return this.name,_e>>>0}:function(we,_e){return this.name,_e},argPackAdvance:8,readValueFromPointer:Ta(F,EA,RA!==0),destructorFunction:null})},a:(P,F,EA)=>{var RA=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][F];function GA(WA){var Ce=QA[WA>>2],ge=QA[WA+4>>2];return new RA(AA.buffer,ge,Ce)}ar(P,{name:EA=Xi(EA),fromWireType:GA,argPackAdvance:8,readValueFromPointer:GA},{ignoreDuplicateRegistrations:!0})},o:(P,F)=>{var EA=(F=Xi(F))==="std::string";ar(P,{name:F,fromWireType(RA){var GA,WA=QA[RA>>2],Ce=RA+4;if(EA)for(var ge=Ce,we=0;we<=WA;++we){var _e=Ce+we;if(we==WA||z[_e]==0){var Ke=Mc(ge,_e-ge);GA===void 0?GA=Ke:(GA+="\0",GA+=Ke),ge=_e+1}}else{var Bt=new Array(WA);for(we=0;we{for(var Rt=0,Ye=0;Ye=55296&&nt<=57343?(Rt+=4,++Ye):Rt+=3}return Rt})(GA):GA.length;var ge=Po(4+WA+1),we=ge+4;if(QA[ge>>2]=WA,EA&&Ce)((Bt,Rt,Ye,nt)=>{if(!(nt>0))return 0;for(var ii=Ye,oi=Ye+nt-1,Ko=0;Ko=55296&&Kt<=57343&&(Kt=65536+((1023&Kt)<<10)|1023&Bt.charCodeAt(++Ko)),Kt<=127){if(Ye>=oi)break;Rt[Ye++]=Kt}else if(Kt<=2047){if(Ye+1>=oi)break;Rt[Ye++]=192|Kt>>6,Rt[Ye++]=128|63&Kt}else if(Kt<=65535){if(Ye+2>=oi)break;Rt[Ye++]=224|Kt>>12,Rt[Ye++]=128|Kt>>6&63,Rt[Ye++]=128|63&Kt}else{if(Ye+3>=oi)break;Rt[Ye++]=240|Kt>>18,Rt[Ye++]=128|Kt>>12&63,Rt[Ye++]=128|Kt>>6&63,Rt[Ye++]=128|63&Kt}}Rt[Ye]=0})(GA,z,we,WA+1);else if(Ce)for(var _e=0;_e255&&(Mr(we),wt("String has UTF-16 code units that do not fit in 8 bits")),z[we+_e]=Ke}else for(_e=0;_e{var RA,GA,WA,Ce,ge;EA=Xi(EA),F===2?(RA=Fo,GA=$s,Ce=Ha,WA=()=>eA,ge=1):F===4&&(RA=Gs,GA=Ga,Ce=Rr,WA=()=>QA,ge=2),ar(P,{name:EA,fromWireType:we=>{for(var _e,Ke=QA[we>>2],Bt=WA(),Rt=we+4,Ye=0;Ye<=Ke;++Ye){var nt=we+4+Ye*F;if(Ye==Ke||Bt[nt>>ge]==0){var ii=RA(Rt,nt-Rt);_e===void 0?_e=ii:(_e+="\0",_e+=ii),Rt=nt+F}}return Mr(we),_e},toWireType:(we,_e)=>{typeof _e!="string"&&wt(`Cannot pass non-string to C++ string type ${EA}`);var Ke=Ce(_e),Bt=Po(4+Ke+F);return QA[Bt>>2]=Ke>>ge,GA(_e,Bt+4,Ke+F),we!==null&&we.push(Mr,Bt),Bt},argPackAdvance:8,readValueFromPointer:gn,destructorFunction(we){Mr(we)}})},v:(P,F)=>{ar(P,{isVoid:!0,name:F=Xi(F),argPackAdvance:0,fromWireType:()=>{},toWireType:(EA,RA)=>{}})},j:(P,F,EA)=>(P=gr.toValue(P),F=Ia(F,"emval::as"),fo(F,EA,P)),e:(P,F,EA,RA,GA)=>{var WA,Ce;return(P=en[P])(F=gr.toValue(F),F[EA=(Ce=aI[WA=EA])===void 0?Xi(WA):Ce],RA,GA)},d:pn,f:(P,F,EA)=>{var RA=((_e,Ke)=>{for(var Bt=new Array(_e),Rt=0;Rt<_e;++Rt)Bt[Rt]=Ia(QA[Ke+4*Rt>>2],"parameter "+Rt);return Bt})(P,F),GA=RA.shift();P--;var WA,Ce,ge=new Array(P),we=`methodCaller<(${RA.map(_e=>_e.name).join(", ")}) => ${GA.name}>`;return WA=sr(we,(_e,Ke,Bt,Rt)=>{for(var Ye=0,nt=0;nt{P>4&&(Gi.get(P).refcount+=1)},b:P=>{var F=gr.toValue(P);$o(F),pn(P)},h:(P,F)=>{var EA=(P=Ia(P,"_emval_take_value")).readValueFromPointer(F);return gr.toHandle(EA)},m:()=>{Je("")},s:(P,F,EA)=>z.copyWithin(P,F,F+EA),r:P=>{z.length,Je("OOM")},n:(P,F,EA,RA)=>{for(var GA=0,WA=0;WA>2],ge=QA[F+4>>2];F+=8;for(var we=0;we>2]=GA,0}},Or=function(){var P={a:ls};function F(EA,RA){var GA,WA;return Or=EA.exports,m=Or.z,GA=m.buffer,g.HEAP8=AA=new Int8Array(GA),g.HEAP16=sA=new Int16Array(GA),g.HEAPU8=z=new Uint8Array(GA),g.HEAPU16=eA=new Uint16Array(GA),g.HEAP32=X=new Int32Array(GA),g.HEAPU32=QA=new Uint32Array(GA),g.HEAPF32=wA=new Float32Array(GA),g.HEAPF64=HA=new Float64Array(GA),$t=Or.C,WA=Or.A,jA.unshift(WA),function(){if(qe--,g.monitorRunDependencies&&g.monitorRunDependencies(qe),qe==0&&Et){var Ce=Et;Et=null,Ce()}}(),Or}if(qe++,g.monitorRunDependencies&&g.monitorRunDependencies(qe),g.instantiateWasm)try{return g.instantiateWasm(P,F)}catch(EA){v(`Module.instantiateWasm callback failed with error: ${EA}`),s(EA)}return ai(0,$e,P,function(EA){F(EA.instance)}).catch(s),{}}(),Po=P=>(Po=Or.B)(P),Ba=P=>(Ba=Or.D)(P),Mr=P=>(Mr=Or.E)(P),Cs=P=>(Cs=Or.F)(P);g.dynCall_jiji=(P,F,EA,RA,GA)=>(g.dynCall_jiji=Or.G)(P,F,EA,RA,GA),g._vertexShaderSource=10688;function Va(){function P(){fn||(fn=!0,g.calledRun=!0,VA||(Ki(jA),r(g),g.onRuntimeInitialized&&g.onRuntimeInitialized(),function(){if(g.postRun)for(typeof g.postRun=="function"&&(g.postRun=[g.postRun]);g.postRun.length;)Me(g.postRun.shift());Ki(Ve)}()))}qe>0||(function(){if(g.preRun)for(typeof g.preRun=="function"&&(g.preRun=[g.preRun]);g.preRun.length;)Ze(g.preRun.shift());Ki(ue)}(),qe>0||(g.setStatus?(g.setStatus("Running..."),setTimeout(function(){setTimeout(function(){g.setStatus("")},1),P()},1)):P()))}if(Et=function P(){fn||Va(),fn||(Et=P)},g.preInit)for(typeof g.preInit=="function"&&(g.preInit=[g.preInit]);g.preInit.length>0;)g.preInit.pop()();return Va(),i.ready}})(),BnA=CnA,nd=typeof navigator>"u"?"":navigator.userAgent,_o=t=>new RegExp(t,"i").test(nd),Is=t=>{if(_o(t)){const i=new RegExp(`${t}\\/([\\d.]+)`),r=nd.match(i);if(r&&r[1])return r[1]}return""},fY=t=>{if(_o(t)){const i=new RegExp(`${t}\\/(\\d+)`),r=nd.match(i);if(r&&r[1])return parseFloat(r[1])}return NaN},d5=/AppleWebKit\/([\d.]+)/i.exec(nd);d5&&parseFloat(d5[1]);var g6=_o("iPad"),I6=typeof navigator<"u"&&navigator.maxTouchPoints&&navigator.maxTouchPoints>2&&_o("Macintosh"),c6=_o("iPhone")&&!g6,unA=_o("iPod"),E6=c6||g6||unA||I6,B3=_o("Android"),QnA=function(){if(B3){const t=nd.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i);if(t){const i=t[1]&&parseFloat(t[1]),r=t[2]&&parseFloat(t[2]);if(i&&r)return parseFloat(`${t[1]}.${t[2]}`);if(i)return i}}return NaN}();B3&&_o("webkit")&&QnA<2.3;var dnA=_o("Firefox"),hnA=Is("Firefox");fY("Firefox");var l6=_o("Edge"),pnA=Is("Edge"),C6=_o("Edg"),fnA=Is("Edg");fY("Edg");var B6=_o("SogouMobileBrowser"),mnA=Is("SogouMobileBrowser"),u6=_o("MetaSr\\s"),DnA=Is("MetaSr\\s"),hD=_o("TBS"),ynA=Is("TBS"),Q6=_o("XWEB"),RnA=Is("XWEB");_o("MSIE\\s8\\.0");var MnA=_o("MSIE\\/\\d+");(function(){if(MnA){const t=/MSIE\s(\d+)\.\d/.exec(nd);let i=t&&parseFloat(t[1]);return!i&&/Trident\/7.0/i.test(nd)&&/rv:11.0/.test(nd)&&(i=11),i}return NaN})();var wnA=_o("(micromessenger|webbrowser)"),SnA=Is("MicroMessenger"),u3=!hD&&_o("MQQBrowser")&&_o("COVC"),Q3=!hD&&_o("MQQBrowser")&&!_o("COVC"),h5=Q3||u3?Is("MQQBrowser"):"",d6=!hD&&_o(" QQBrowser"),vnA=Is(" QQBrowser"),h6=!hD&&_o("QQBrowserLite"),NnA=Is("QQBrowserLite"),p6=!hD&&_o("MQBHD"),TnA=Is("MQBHD");_o("Windows");!E6&&_o("MAC OS X");!B3&&_o("Linux");_o("CrOS");_o("MicroMessenger");_o("UCBrowser");_o("Electron");var f6=_o("MiuiBrowser"),GnA=Is("MiuiBrowser"),m6=_o("HuaweiBrowser");_o("Huawei")||_o("HUAWEI");_o("Honor")||_o("HONOR");var knA=Is("HuaweiBrowser"),D6=_o("SamsungBrowser"),_nA=Is("SamsungBrowser"),y6=_o("HeyTapBrowser"),bnA=Is("HeyTapBrowser"),R6=_o("VivoBrowser"),LnA=Is("VivoBrowser");_o("OpenHarmony");Is("OpenHarmony");var FnA=()=>fY("Chrome"),p5=_o("CriOS"),M6=_o("Chrome"),UnA=!l6&&!u6&&!B6&&!hD&&!Q6&&!C6&&!d6&&!f6&&!m6&&!D6&&!y6&&!R6&&M6;_o("HeadlessChrome");var OnA=FnA(),xnA=Is("Chrome");fY("Electron");var YnA=!M6&&!Q3&&!u3&&!h6&&!p6&&_o("Safari"),w6=Is("Version"),S6=(()=>{if(I6)return w6;if(E6){const t=nd.match(/OS (\d+)_(\d+)/i);if(t&&t[1]){let i=t[1];return t[2]&&(i+=`.${t[2]}`),i}}return""})();Number(S6.split(".")[0]);(()=>{const t=Number(S6.split(".")[0]);return t===14||t===13})();PnA();function PnA(){const t=new Map([[dnA,["Firefox",hnA]],[C6,["Edg",fnA]],[UnA,["Chrome",xnA]],[p5,["ChiOS",Is("CriOS")]],[YnA&&!p5,["Safari",w6]],[hD,["TBS",ynA]],[Q6,["XWEB",RnA]],[wnA&&c6,["WeChat",SnA]],[d6,["QQ(Win)",vnA]],[Q3,["QQ(Mobile)",h5]],[u3,["QQ(Mobile X5)",h5]],[h6,["QQ(Mac)",NnA]],[p6,["QQ(iPad)",TnA]],[f6,["MI",GnA]],[m6,["HW",knA]],[D6,["Samsung",_nA]],[y6,["OPPO",bnA]],[R6,["VIVO",LnA]],[l6,["EDGE",pnA]],[B6,["SogouMobile",mnA]],[u6,["Sogou",DnA]]]);let i="unknown",r="unknown";return t.has(!0)&&([i,r]=t.get(!0)),{name:i,version:r}}var as=1e-6,Dw=typeof Float32Array<"u"?Float32Array:Array,v6={};function JnA(){var t=new Dw(16);return Dw!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t}function HnA(t){var i=new Dw(16);return i[0]=t[0],i[1]=t[1],i[2]=t[2],i[3]=t[3],i[4]=t[4],i[5]=t[5],i[6]=t[6],i[7]=t[7],i[8]=t[8],i[9]=t[9],i[10]=t[10],i[11]=t[11],i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15],i}function VnA(t,i){return t[0]=i[0],t[1]=i[1],t[2]=i[2],t[3]=i[3],t[4]=i[4],t[5]=i[5],t[6]=i[6],t[7]=i[7],t[8]=i[8],t[9]=i[9],t[10]=i[10],t[11]=i[11],t[12]=i[12],t[13]=i[13],t[14]=i[14],t[15]=i[15],t}function qnA(t,i,r,s,g,B,Q,f,m,M,v,U,AA,z,sA,eA){var X=new Dw(16);return X[0]=t,X[1]=i,X[2]=r,X[3]=s,X[4]=g,X[5]=B,X[6]=Q,X[7]=f,X[8]=m,X[9]=M,X[10]=v,X[11]=U,X[12]=AA,X[13]=z,X[14]=sA,X[15]=eA,X}function KnA(t,i,r,s,g,B,Q,f,m,M,v,U,AA,z,sA,eA,X){return t[0]=i,t[1]=r,t[2]=s,t[3]=g,t[4]=B,t[5]=Q,t[6]=f,t[7]=m,t[8]=M,t[9]=v,t[10]=U,t[11]=AA,t[12]=z,t[13]=sA,t[14]=eA,t[15]=X,t}function N6(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function jnA(t,i){if(t===i){var r=i[1],s=i[2],g=i[3],B=i[6],Q=i[7],f=i[11];t[1]=i[4],t[2]=i[8],t[3]=i[12],t[4]=r,t[6]=i[9],t[7]=i[13],t[8]=s,t[9]=B,t[11]=i[14],t[12]=g,t[13]=Q,t[14]=f}else t[0]=i[0],t[1]=i[4],t[2]=i[8],t[3]=i[12],t[4]=i[1],t[5]=i[5],t[6]=i[9],t[7]=i[13],t[8]=i[2],t[9]=i[6],t[10]=i[10],t[11]=i[14],t[12]=i[3],t[13]=i[7],t[14]=i[11],t[15]=i[15];return t}function WnA(t,i){var r=i[0],s=i[1],g=i[2],B=i[3],Q=i[4],f=i[5],m=i[6],M=i[7],v=i[8],U=i[9],AA=i[10],z=i[11],sA=i[12],eA=i[13],X=i[14],QA=i[15],wA=r*f-s*Q,HA=r*m-g*Q,VA=r*M-B*Q,ue=s*m-g*f,jA=s*M-B*f,Ve=g*M-B*m,Ze=v*eA-U*sA,Me=v*X-AA*sA,qe=v*QA-z*sA,Et=U*X-AA*eA,Je=U*QA-z*eA,$e=AA*QA-z*X,Dt=wA*$e-HA*Je+VA*Et+ue*qe-jA*Me+Ve*Ze;return Dt?(Dt=1/Dt,t[0]=(f*$e-m*Je+M*Et)*Dt,t[1]=(g*Je-s*$e-B*Et)*Dt,t[2]=(eA*Ve-X*jA+QA*ue)*Dt,t[3]=(AA*jA-U*Ve-z*ue)*Dt,t[4]=(m*qe-Q*$e-M*Me)*Dt,t[5]=(r*$e-g*qe+B*Me)*Dt,t[6]=(X*VA-sA*Ve-QA*HA)*Dt,t[7]=(v*Ve-AA*VA+z*HA)*Dt,t[8]=(Q*Je-f*qe+M*Ze)*Dt,t[9]=(s*qe-r*Je-B*Ze)*Dt,t[10]=(sA*jA-eA*VA+QA*wA)*Dt,t[11]=(U*VA-v*jA-z*wA)*Dt,t[12]=(f*Me-Q*Et-m*Ze)*Dt,t[13]=(r*Et-s*Me+g*Ze)*Dt,t[14]=(eA*HA-sA*ue-X*wA)*Dt,t[15]=(v*ue-U*HA+AA*wA)*Dt,t):null}function znA(t,i){var r=i[0],s=i[1],g=i[2],B=i[3],Q=i[4],f=i[5],m=i[6],M=i[7],v=i[8],U=i[9],AA=i[10],z=i[11],sA=i[12],eA=i[13],X=i[14],QA=i[15],wA=r*f-s*Q,HA=r*m-g*Q,VA=r*M-B*Q,ue=s*m-g*f,jA=s*M-B*f,Ve=g*M-B*m,Ze=v*eA-U*sA,Me=v*X-AA*sA,qe=v*QA-z*sA,Et=U*X-AA*eA,Je=U*QA-z*eA,$e=AA*QA-z*X;return t[0]=f*$e-m*Je+M*Et,t[1]=g*Je-s*$e-B*Et,t[2]=eA*Ve-X*jA+QA*ue,t[3]=AA*jA-U*Ve-z*ue,t[4]=m*qe-Q*$e-M*Me,t[5]=r*$e-g*qe+B*Me,t[6]=X*VA-sA*Ve-QA*HA,t[7]=v*Ve-AA*VA+z*HA,t[8]=Q*Je-f*qe+M*Ze,t[9]=s*qe-r*Je-B*Ze,t[10]=sA*jA-eA*VA+QA*wA,t[11]=U*VA-v*jA-z*wA,t[12]=f*Me-Q*Et-m*Ze,t[13]=r*Et-s*Me+g*Ze,t[14]=eA*HA-sA*ue-X*wA,t[15]=v*ue-U*HA+AA*wA,t}function ZnA(t){var i=t[0],r=t[1],s=t[2],g=t[3],B=t[4],Q=t[5],f=t[6],m=t[7],M=t[8],v=t[9],U=t[10],AA=t[11],z=t[12],sA=t[13],eA=t[14],X=i*Q-r*B,QA=i*f-s*B,wA=r*f-s*Q,HA=M*sA-v*z,VA=M*eA-U*z,ue=v*eA-U*sA;return m*(i*ue-r*VA+s*HA)-g*(B*ue-Q*VA+f*HA)+t[15]*(M*wA-v*QA+U*X)-AA*(z*wA-sA*QA+eA*X)}function T6(t,i,r){var s=i[0],g=i[1],B=i[2],Q=i[3],f=i[4],m=i[5],M=i[6],v=i[7],U=i[8],AA=i[9],z=i[10],sA=i[11],eA=i[12],X=i[13],QA=i[14],wA=i[15],HA=r[0],VA=r[1],ue=r[2],jA=r[3];return t[0]=HA*s+VA*f+ue*U+jA*eA,t[1]=HA*g+VA*m+ue*AA+jA*X,t[2]=HA*B+VA*M+ue*z+jA*QA,t[3]=HA*Q+VA*v+ue*sA+jA*wA,HA=r[4],VA=r[5],ue=r[6],jA=r[7],t[4]=HA*s+VA*f+ue*U+jA*eA,t[5]=HA*g+VA*m+ue*AA+jA*X,t[6]=HA*B+VA*M+ue*z+jA*QA,t[7]=HA*Q+VA*v+ue*sA+jA*wA,HA=r[8],VA=r[9],ue=r[10],jA=r[11],t[8]=HA*s+VA*f+ue*U+jA*eA,t[9]=HA*g+VA*m+ue*AA+jA*X,t[10]=HA*B+VA*M+ue*z+jA*QA,t[11]=HA*Q+VA*v+ue*sA+jA*wA,HA=r[12],VA=r[13],ue=r[14],jA=r[15],t[12]=HA*s+VA*f+ue*U+jA*eA,t[13]=HA*g+VA*m+ue*AA+jA*X,t[14]=HA*B+VA*M+ue*z+jA*QA,t[15]=HA*Q+VA*v+ue*sA+jA*wA,t}function XnA(t,i,r){var s,g,B,Q,f,m,M,v,U,AA,z,sA,eA=r[0],X=r[1],QA=r[2];return i===t?(t[12]=i[0]*eA+i[4]*X+i[8]*QA+i[12],t[13]=i[1]*eA+i[5]*X+i[9]*QA+i[13],t[14]=i[2]*eA+i[6]*X+i[10]*QA+i[14],t[15]=i[3]*eA+i[7]*X+i[11]*QA+i[15]):(s=i[0],g=i[1],B=i[2],Q=i[3],f=i[4],m=i[5],M=i[6],v=i[7],U=i[8],AA=i[9],z=i[10],sA=i[11],t[0]=s,t[1]=g,t[2]=B,t[3]=Q,t[4]=f,t[5]=m,t[6]=M,t[7]=v,t[8]=U,t[9]=AA,t[10]=z,t[11]=sA,t[12]=s*eA+f*X+U*QA+i[12],t[13]=g*eA+m*X+AA*QA+i[13],t[14]=B*eA+M*X+z*QA+i[14],t[15]=Q*eA+v*X+sA*QA+i[15]),t}function $nA(t,i,r){var s=r[0],g=r[1],B=r[2];return t[0]=i[0]*s,t[1]=i[1]*s,t[2]=i[2]*s,t[3]=i[3]*s,t[4]=i[4]*g,t[5]=i[5]*g,t[6]=i[6]*g,t[7]=i[7]*g,t[8]=i[8]*B,t[9]=i[9]*B,t[10]=i[10]*B,t[11]=i[11]*B,t[12]=i[12],t[13]=i[13],t[14]=i[14],t[15]=i[15],t}function AaA(t,i,r,s){var g,B,Q,f,m,M,v,U,AA,z,sA,eA,X,QA,wA,HA,VA,ue,jA,Ve,Ze,Me,qe,Et,Je=s[0],$e=s[1],Dt=s[2],Zi=Math.sqrt(Je*Je+$e*$e+Dt*Dt);return Zi0?(r[0]=2*(f*Q+v*s+m*B-M*g)/U,r[1]=2*(m*Q+v*g+M*s-f*B)/U,r[2]=2*(M*Q+v*B+f*g-m*s)/U):(r[0]=2*(f*Q+v*s+m*B-M*g),r[1]=2*(m*Q+v*g+M*s-f*B),r[2]=2*(M*Q+v*B+f*g-m*s)),G6(t,i,r),t}function caA(t,i){return t[0]=i[12],t[1]=i[13],t[2]=i[14],t}function k6(t,i){var r=i[0],s=i[1],g=i[2],B=i[4],Q=i[5],f=i[6],m=i[8],M=i[9],v=i[10];return t[0]=Math.sqrt(r*r+s*s+g*g),t[1]=Math.sqrt(B*B+Q*Q+f*f),t[2]=Math.sqrt(m*m+M*M+v*v),t}function EaA(t,i){var r=new Dw(3);k6(r,i);var s=1/r[0],g=1/r[1],B=1/r[2],Q=i[0]*s,f=i[1]*g,m=i[2]*B,M=i[4]*s,v=i[5]*g,U=i[6]*B,AA=i[8]*s,z=i[9]*g,sA=i[10]*B,eA=Q+v+sA,X=0;return eA>0?(X=2*Math.sqrt(eA+1),t[3]=.25*X,t[0]=(U-z)/X,t[1]=(AA-m)/X,t[2]=(f-M)/X):Q>v&&Q>sA?(X=2*Math.sqrt(1+Q-v-sA),t[3]=(U-z)/X,t[0]=.25*X,t[1]=(f+M)/X,t[2]=(AA+m)/X):v>sA?(X=2*Math.sqrt(1+v-Q-sA),t[3]=(AA-m)/X,t[0]=(f+M)/X,t[1]=.25*X,t[2]=(U+z)/X):(X=2*Math.sqrt(1+sA-Q-v),t[3]=(f-M)/X,t[0]=(AA+m)/X,t[1]=(U+z)/X,t[2]=.25*X),t}function laA(t,i,r,s){i[0]=s[12],i[1]=s[13],i[2]=s[14];var g=s[0],B=s[1],Q=s[2],f=s[4],m=s[5],M=s[6],v=s[8],U=s[9],AA=s[10];r[0]=Math.sqrt(g*g+B*B+Q*Q),r[1]=Math.sqrt(f*f+m*m+M*M),r[2]=Math.sqrt(v*v+U*U+AA*AA);var z=1/r[0],sA=1/r[1],eA=1/r[2],X=g*z,QA=B*sA,wA=Q*eA,HA=f*z,VA=m*sA,ue=M*eA,jA=v*z,Ve=U*sA,Ze=AA*eA,Me=X+VA+Ze,qe=0;return Me>0?(qe=2*Math.sqrt(Me+1),t[3]=.25*qe,t[0]=(ue-Ve)/qe,t[1]=(jA-wA)/qe,t[2]=(QA-HA)/qe):X>VA&&X>Ze?(qe=2*Math.sqrt(1+X-VA-Ze),t[3]=(ue-Ve)/qe,t[0]=.25*qe,t[1]=(QA+HA)/qe,t[2]=(jA+wA)/qe):VA>Ze?(qe=2*Math.sqrt(1+VA-X-Ze),t[3]=(jA-wA)/qe,t[0]=(QA+HA)/qe,t[1]=.25*qe,t[2]=(ue+Ve)/qe):(qe=2*Math.sqrt(1+Ze-X-VA),t[3]=(QA-HA)/qe,t[0]=(jA+wA)/qe,t[1]=(ue+Ve)/qe,t[2]=.25*qe),t}function CaA(t,i,r,s){var g=i[0],B=i[1],Q=i[2],f=i[3],m=g+g,M=B+B,v=Q+Q,U=g*m,AA=g*M,z=g*v,sA=B*M,eA=B*v,X=Q*v,QA=f*m,wA=f*M,HA=f*v,VA=s[0],ue=s[1],jA=s[2];return t[0]=(1-(sA+X))*VA,t[1]=(AA+HA)*VA,t[2]=(z-wA)*VA,t[3]=0,t[4]=(AA-HA)*ue,t[5]=(1-(U+X))*ue,t[6]=(eA+QA)*ue,t[7]=0,t[8]=(z+wA)*jA,t[9]=(eA-QA)*jA,t[10]=(1-(U+sA))*jA,t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t}function BaA(t,i,r,s,g){var B=i[0],Q=i[1],f=i[2],m=i[3],M=B+B,v=Q+Q,U=f+f,AA=B*M,z=B*v,sA=B*U,eA=Q*v,X=Q*U,QA=f*U,wA=m*M,HA=m*v,VA=m*U,ue=s[0],jA=s[1],Ve=s[2],Ze=g[0],Me=g[1],qe=g[2],Et=(1-(eA+QA))*ue,Je=(z+VA)*ue,$e=(sA-HA)*ue,Dt=(z-VA)*jA,Zi=(1-(AA+QA))*jA,bi=(X+wA)*jA,qt=(sA+HA)*Ve,ai=(X-wA)*Ve,Ki=(1-(AA+eA))*Ve;return t[0]=Et,t[1]=Je,t[2]=$e,t[3]=0,t[4]=Dt,t[5]=Zi,t[6]=bi,t[7]=0,t[8]=qt,t[9]=ai,t[10]=Ki,t[11]=0,t[12]=r[0]+Ze-(Et*Ze+Dt*Me+qt*qe),t[13]=r[1]+Me-(Je*Ze+Zi*Me+ai*qe),t[14]=r[2]+qe-($e*Ze+bi*Me+Ki*qe),t[15]=1,t}function uaA(t,i){var r=i[0],s=i[1],g=i[2],B=i[3],Q=r+r,f=s+s,m=g+g,M=r*Q,v=s*Q,U=s*f,AA=g*Q,z=g*f,sA=g*m,eA=B*Q,X=B*f,QA=B*m;return t[0]=1-U-sA,t[1]=v+QA,t[2]=AA-X,t[3]=0,t[4]=v-QA,t[5]=1-M-sA,t[6]=z+eA,t[7]=0,t[8]=AA+X,t[9]=z-eA,t[10]=1-M-U,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function QaA(t,i,r,s,g,B,Q){var f=1/(r-i),m=1/(g-s),M=1/(B-Q);return t[0]=2*B*f,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*B*m,t[6]=0,t[7]=0,t[8]=(r+i)*f,t[9]=(g+s)*m,t[10]=(Q+B)*M,t[11]=-1,t[12]=0,t[13]=0,t[14]=Q*B*2*M,t[15]=0,t}function _6(t,i,r,s,g){var B=1/Math.tan(i/2);if(t[0]=B/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=B,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,g!=null&&g!==1/0){var Q=1/(s-g);t[10]=(g+s)*Q,t[14]=2*g*s*Q}else t[10]=-1,t[14]=-2*s;return t}snA(v6,{add:()=>waA,adjoint:()=>znA,clone:()=>HnA,copy:()=>VnA,create:()=>JnA,decompose:()=>laA,determinant:()=>ZnA,equals:()=>TaA,exactEquals:()=>NaA,frob:()=>MaA,fromQuat:()=>uaA,fromQuat2:()=>IaA,fromRotation:()=>naA,fromRotationTranslation:()=>G6,fromRotationTranslationScale:()=>CaA,fromRotationTranslationScaleOrigin:()=>BaA,fromScaling:()=>raA,fromTranslation:()=>oaA,fromValues:()=>qnA,fromXRotation:()=>aaA,fromYRotation:()=>saA,fromZRotation:()=>gaA,frustum:()=>QaA,getRotation:()=>EaA,getScaling:()=>k6,getTranslation:()=>caA,identity:()=>N6,invert:()=>WnA,lookAt:()=>DaA,mul:()=>GaA,multiply:()=>T6,multiplyScalar:()=>SaA,multiplyScalarAndAdd:()=>vaA,ortho:()=>faA,orthoNO:()=>b6,orthoZO:()=>maA,perspective:()=>daA,perspectiveFromFieldOfView:()=>paA,perspectiveNO:()=>_6,perspectiveZO:()=>haA,rotate:()=>AaA,rotateX:()=>eaA,rotateY:()=>taA,rotateZ:()=>iaA,scale:()=>$nA,set:()=>KnA,str:()=>RaA,sub:()=>kaA,subtract:()=>L6,targetTo:()=>yaA,translate:()=>XnA,transpose:()=>jnA});var daA=_6;function haA(t,i,r,s,g){var B=1/Math.tan(i/2);if(t[0]=B/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=B,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,g!=null&&g!==1/0){var Q=1/(s-g);t[10]=g*Q,t[14]=g*s*Q}else t[10]=-1,t[14]=-s;return t}function paA(t,i,r,s){var g=Math.tan(i.upDegrees*Math.PI/180),B=Math.tan(i.downDegrees*Math.PI/180),Q=Math.tan(i.leftDegrees*Math.PI/180),f=Math.tan(i.rightDegrees*Math.PI/180),m=2/(Q+f),M=2/(g+B);return t[0]=m,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=M,t[6]=0,t[7]=0,t[8]=-(Q-f)*m*.5,t[9]=(g-B)*M*.5,t[10]=s/(r-s),t[11]=-1,t[12]=0,t[13]=0,t[14]=s*r/(r-s),t[15]=0,t}function b6(t,i,r,s,g,B,Q){var f=1/(i-r),m=1/(s-g),M=1/(B-Q);return t[0]=-2*f,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*m,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*M,t[11]=0,t[12]=(i+r)*f,t[13]=(g+s)*m,t[14]=(Q+B)*M,t[15]=1,t}var faA=b6;function maA(t,i,r,s,g,B,Q){var f=1/(i-r),m=1/(s-g),M=1/(B-Q);return t[0]=-2*f,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*m,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=M,t[11]=0,t[12]=(i+r)*f,t[13]=(g+s)*m,t[14]=B*M,t[15]=1,t}function DaA(t,i,r,s){var g,B,Q,f,m,M,v,U,AA,z,sA=i[0],eA=i[1],X=i[2],QA=s[0],wA=s[1],HA=s[2],VA=r[0],ue=r[1],jA=r[2];return Math.abs(sA-VA)0&&(v*=z=1/Math.sqrt(z),U*=z,AA*=z);var sA=m*AA-M*U,eA=M*v-f*AA,X=f*U-m*v;return(z=sA*sA+eA*eA+X*X)>0&&(sA*=z=1/Math.sqrt(z),eA*=z,X*=z),t[0]=sA,t[1]=eA,t[2]=X,t[3]=0,t[4]=U*X-AA*eA,t[5]=AA*sA-v*X,t[6]=v*eA-U*sA,t[7]=0,t[8]=v,t[9]=U,t[10]=AA,t[11]=0,t[12]=g,t[13]=B,t[14]=Q,t[15]=1,t}function RaA(t){return"mat4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+", "+t[9]+", "+t[10]+", "+t[11]+", "+t[12]+", "+t[13]+", "+t[14]+", "+t[15]+")"}function MaA(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]+t[3]*t[3]+t[4]*t[4]+t[5]*t[5]+t[6]*t[6]+t[7]*t[7]+t[8]*t[8]+t[9]*t[9]+t[10]*t[10]+t[11]*t[11]+t[12]*t[12]+t[13]*t[13]+t[14]*t[14]+t[15]*t[15])}function waA(t,i,r){return t[0]=i[0]+r[0],t[1]=i[1]+r[1],t[2]=i[2]+r[2],t[3]=i[3]+r[3],t[4]=i[4]+r[4],t[5]=i[5]+r[5],t[6]=i[6]+r[6],t[7]=i[7]+r[7],t[8]=i[8]+r[8],t[9]=i[9]+r[9],t[10]=i[10]+r[10],t[11]=i[11]+r[11],t[12]=i[12]+r[12],t[13]=i[13]+r[13],t[14]=i[14]+r[14],t[15]=i[15]+r[15],t}function L6(t,i,r){return t[0]=i[0]-r[0],t[1]=i[1]-r[1],t[2]=i[2]-r[2],t[3]=i[3]-r[3],t[4]=i[4]-r[4],t[5]=i[5]-r[5],t[6]=i[6]-r[6],t[7]=i[7]-r[7],t[8]=i[8]-r[8],t[9]=i[9]-r[9],t[10]=i[10]-r[10],t[11]=i[11]-r[11],t[12]=i[12]-r[12],t[13]=i[13]-r[13],t[14]=i[14]-r[14],t[15]=i[15]-r[15],t}function SaA(t,i,r){return t[0]=i[0]*r,t[1]=i[1]*r,t[2]=i[2]*r,t[3]=i[3]*r,t[4]=i[4]*r,t[5]=i[5]*r,t[6]=i[6]*r,t[7]=i[7]*r,t[8]=i[8]*r,t[9]=i[9]*r,t[10]=i[10]*r,t[11]=i[11]*r,t[12]=i[12]*r,t[13]=i[13]*r,t[14]=i[14]*r,t[15]=i[15]*r,t}function vaA(t,i,r,s){return t[0]=i[0]+r[0]*s,t[1]=i[1]+r[1]*s,t[2]=i[2]+r[2]*s,t[3]=i[3]+r[3]*s,t[4]=i[4]+r[4]*s,t[5]=i[5]+r[5]*s,t[6]=i[6]+r[6]*s,t[7]=i[7]+r[7]*s,t[8]=i[8]+r[8]*s,t[9]=i[9]+r[9]*s,t[10]=i[10]+r[10]*s,t[11]=i[11]+r[11]*s,t[12]=i[12]+r[12]*s,t[13]=i[13]+r[13]*s,t[14]=i[14]+r[14]*s,t[15]=i[15]+r[15]*s,t}function NaA(t,i){return t[0]===i[0]&&t[1]===i[1]&&t[2]===i[2]&&t[3]===i[3]&&t[4]===i[4]&&t[5]===i[5]&&t[6]===i[6]&&t[7]===i[7]&&t[8]===i[8]&&t[9]===i[9]&&t[10]===i[10]&&t[11]===i[11]&&t[12]===i[12]&&t[13]===i[13]&&t[14]===i[14]&&t[15]===i[15]}function TaA(t,i){var r=t[0],s=t[1],g=t[2],B=t[3],Q=t[4],f=t[5],m=t[6],M=t[7],v=t[8],U=t[9],AA=t[10],z=t[11],sA=t[12],eA=t[13],X=t[14],QA=t[15],wA=i[0],HA=i[1],VA=i[2],ue=i[3],jA=i[4],Ve=i[5],Ze=i[6],Me=i[7],qe=i[8],Et=i[9],Je=i[10],$e=i[11],Dt=i[12],Zi=i[13],bi=i[14],qt=i[15];return Math.abs(r-wA)<=as*Math.max(1,Math.abs(r),Math.abs(wA))&&Math.abs(s-HA)<=as*Math.max(1,Math.abs(s),Math.abs(HA))&&Math.abs(g-VA)<=as*Math.max(1,Math.abs(g),Math.abs(VA))&&Math.abs(B-ue)<=as*Math.max(1,Math.abs(B),Math.abs(ue))&&Math.abs(Q-jA)<=as*Math.max(1,Math.abs(Q),Math.abs(jA))&&Math.abs(f-Ve)<=as*Math.max(1,Math.abs(f),Math.abs(Ve))&&Math.abs(m-Ze)<=as*Math.max(1,Math.abs(m),Math.abs(Ze))&&Math.abs(M-Me)<=as*Math.max(1,Math.abs(M),Math.abs(Me))&&Math.abs(v-qe)<=as*Math.max(1,Math.abs(v),Math.abs(qe))&&Math.abs(U-Et)<=as*Math.max(1,Math.abs(U),Math.abs(Et))&&Math.abs(AA-Je)<=as*Math.max(1,Math.abs(AA),Math.abs(Je))&&Math.abs(z-$e)<=as*Math.max(1,Math.abs(z),Math.abs($e))&&Math.abs(sA-Dt)<=as*Math.max(1,Math.abs(sA),Math.abs(Dt))&&Math.abs(eA-Zi)<=as*Math.max(1,Math.abs(eA),Math.abs(Zi))&&Math.abs(X-bi)<=as*Math.max(1,Math.abs(X),Math.abs(bi))&&Math.abs(QA-qt)<=as*Math.max(1,Math.abs(QA),Math.abs(qt))}var GaA=T6,kaA=L6,CG=`#version 300 es +in vec2 a_position; +in vec2 a_texCoord; +out vec2 v_texCoord; +void main() { + gl_Position = vec4(a_position.x, a_position.y, 0, 1); + v_texCoord = a_texCoord; +}`,d3=t=>`precision highp float; +uniform sampler2D mask;in vec2 v_texCoord; +out vec4 outColor; +void main() {${t}}`,_aA=`#version 300 es +uniform sampler2D lastMask; +${d3(`highp float current = texture(mask, v_texCoord).r; + highp float previous = texture(lastMask, v_texCoord).r; + highp float diff = abs(current - previous); + const float smoothFactor = 0.05; + const float threshold = 0.3; + highp float blendedMask = diff < threshold + ? previous * (1.0 - smoothFactor) + current * smoothFactor + : current; + outColor = vec4(blendedMask,0.0,0.0, 1.0);`)} +`,baA=`#version 300 es +${d3(` vec2 o = 1.0 / vec2(textureSize(mask, 0)); + float size = 3.0; + int sizeDb = int(size*size); + float samples[9]; + int idx = 0; + float side = (size - 1.0) / 2.0; + for (float x = -side; x <= side; x += 1.0) { + for (float y = -side; y <= side; y += 1.0) { + vec2 sampleCoord = v_texCoord + vec2(x, y) * o; + int index = int((x + 1.0) * size + (y + 1.0)); + samples[index] = texture(mask, sampleCoord).r; + } + } + for (int i = 0; i < sizeDb - 1; i++) { + for (int j = 0; j < sizeDb - 1 - i; j++) { + if (samples[j] > samples[j + 1]) { + float temp = samples[j]; + samples[j] = samples[j + 1]; + samples[j + 1] = temp; + } + } + } + float endR=samples[sizeDb/2]>0.5?1.0:0.0; + outColor = vec4(endR, 0.0, 0.0, 1.0);`)} +`,LaA=`#version 300 es +${d3(` vec2 o = 1.0 / vec2(textureSize(mask, 0)); + float size = 3.0; + float side = (size - 1.0) / 2.0; + float stronglyEroded = 1.0; + for (float x = -side; x <= side; x += 1.0) { + for (float y = -side; y <= side; y += 1.0) { + vec2 sampleCoord = v_texCoord + vec2(x, y) * o; + stronglyEroded = min(stronglyEroded, texture(mask, sampleCoord).r); + } + } + outColor = vec4(stronglyEroded, 0.0, 0.0, 1.0);`)} +`,FaA=`#version 300 es +precision highp float; +uniform sampler2D mask; +uniform sampler2D originalMask; +uniform sampler2D maskEdge; +in vec2 v_texCoord; +out vec4 outColor; +float u_highThreshold = 0.9; +float u_smoothSigma = 2.0; +float u_featherRadius = 4.0; +float balancedTransition(float value) { + return value * value * (3.0 - 2.0 * value); +} +float hybridBlur(sampler2D tex, vec2 uv, vec2 texelSize, float edgeIntensity, float sigma) { + float edgeWeight = smoothstep(u_highThreshold * 0.8, u_highThreshold, edgeIntensity); + if (edgeWeight < u_highThreshold * 0.8) { + return texture(tex, uv).r; + } + float adaptiveRadius = mix(u_featherRadius * 0.5, u_featherRadius * 1.5, edgeWeight); + int kernelSize = int(ceil(2.5 * sigma)); + float sum = 0.0; + float weightSum = 0.0; + for (int i = -kernelSize; i <= kernelSize; i++) { + for (int j = -kernelSize; j <= kernelSize; j++) { + vec2 offset = vec2(float(i), float(j)) * texelSize * adaptiveRadius; + vec2 sampleUV = uv + offset; + float sampleValue = texture(originalMask, sampleUV).r; + float dist = length(vec2(i, j)) / float(kernelSize); + float weight = 1.0 - balancedTransition(dist); + sum += sampleValue * weight; + weightSum += weight; + } + } + return sum / weightSum; +} +void main() { + vec2 texelSize = 1.0 / vec2(textureSize(mask, 0)); + float edge = texture(maskEdge, v_texCoord).r; + float centerValue = texture(mask, v_texCoord).r; + float smoothedValue = hybridBlur(mask, v_texCoord, texelSize, edge, u_smoothSigma); + float finalAlpha; + if (edge == 1.0) { + finalAlpha = smoothedValue; + } else if (centerValue > 0.70) { + finalAlpha = 1.0; + } else if (centerValue < 0.30) { + finalAlpha = 0.0; + } else { + float t = balancedTransition((centerValue - 0.30)); + finalAlpha = mix(centerValue, smoothedValue, 1.0 - t * 0.95); + } + outColor = vec4(finalAlpha, 0.0, 0.0, 1.0); +} +`,UaA=`#version 300 es +precision highp float; +uniform sampler2D mask; +in vec2 v_texCoord; +out vec4 outColor; +float u_gradientScale = 0.25; +const float SOBEL_KERNEL_X[9] = float[9]( + -1.0, 0.0, 1.0, + -2.0, 0.0, 2.0, + -1.0, 0.0, 1.0 +); +const float SOBEL_KERNEL_Y[9] = float[9]( + -1.0, -2.0, -1.0, + 0.0, 0.0, 0.0, + 1.0, 2.0, 1.0 +); +float nonMaxSuppression(float gradient, vec2 uv, vec2 texelSize, float angle) { + vec2 dir = vec2(cos(angle), sin(angle)); + vec2 offset1 = dir * texelSize; + vec2 offset2 = -dir * texelSize; + float n1 = texture(mask, uv + offset1).r; + float n2 = texture(mask, uv + offset2).r; + return (gradient >= n1 && gradient >= n2) ? gradient : 0.0; +} +void main() { + vec2 o = 1.0 / vec2(textureSize(mask, 0)); + float gx = 0.0, gy = 0.0; + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + vec2 offset = vec2(float(i), float(j)) * o; + float maskValue = texture(mask, v_texCoord + offset).r; + int idx = (i+1)*3 + (j+1); + gx += maskValue * SOBEL_KERNEL_X[idx]; + gy += maskValue * SOBEL_KERNEL_Y[idx]; + } + } + float gradient = sqrt(gx*gx + gy*gy) * u_gradientScale; + float angle = atan(gy, gx); + float nmsEdge = nonMaxSuppression(gradient, v_texCoord, o, angle); + float edge = nmsEdge > 0.0 ? 1.0 : 0.0; + outColor = vec4(edge, 0.0, 0.0, 1.0); +} +`,OaA=class{constructor(){Oa(this,"gl"),Oa(this,"positionBuffer"),Oa(this,"texCoordBuffer"),Oa(this,"ratio"),Oa(this,"_tdProgram"),Oa(this,"_kcProgram"),Oa(this,"_mdProgram"),Oa(this,"_edgeProgram"),Oa(this,"_borderProgram"),Oa(this,"_lastMaskTexture")}init(t,i,r,s){this.initParams(t,i,r,s),this.initPrograms()}initParams(t,i,r,s){this.gl=t,this.positionBuffer=i,this.texCoordBuffer=r,this.ratio=s}initPrograms(){this._tdProgram=this.createProgram(CG,_aA,["mask","lastMask"]),this._mdProgram=this.createProgram(CG,baA,["mask"]),this._kcProgram=this.createProgram(CG,LaA,["mask"]),this._borderProgram=this.createProgram(CG,FaA,["mask","maskEdge","originalMask"]),this._edgeProgram=this.createProgram(CG,UaA,["mask"])}setAttributes(...t){const{gl:i}=this;t.forEach((r,s)=>{i.enableVertexAttribArray(s),i.bindBuffer(i.ARRAY_BUFFER,r),i.vertexAttribPointer(s,2,i.FLOAT,!1,0,0)})}createShader(t,i){const{gl:r}=this,s=r.createShader(t);return r.shaderSource(s,i),r.compileShader(s),s}createProgram(t,i,r){const{gl:s}=this,g=this.createShader(s.FRAGMENT_SHADER,i),B=this.createShader(s.VERTEX_SHADER,t),Q=s.createProgram();if(s.attachShader(Q,B),s.attachShader(Q,g),s.linkProgram(Q),!s.getProgramParameter(Q,s.LINK_STATUS))throw new Error(`${s.getProgramInfoLog(Q)}`);return s.useProgram(Q),this.setAttributes(this.positionBuffer,this.texCoordBuffer),r.forEach((f,m)=>{s.uniform1i(s.getUniformLocation(Q,f),1+m)}),Q}createFramebuffer(t){const{gl:i}=this,r=i.createFramebuffer();return i.bindFramebuffer(i.FRAMEBUFFER,r),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,t,0),r}getTempTexture(t,i,r=!0,s){const{gl:g}=this;let B,Q;g.useProgram(t),this.ratio===16/9?(B=640,Q=360):(B=640,Q=480);const f=g.createTexture();g.activeTexture(g.TEXTURE0),g.bindTexture(g.TEXTURE_2D,f),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,g.LINEAR),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,g.LINEAR),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_S,g.CLAMP_TO_EDGE),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_T,g.CLAMP_TO_EDGE),g.pixelStorei(g.PACK_ALIGNMENT,1),g.pixelStorei(g.UNPACK_ALIGNMENT,1),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,B,Q,0,g.RGBA,g.UNSIGNED_BYTE,null);const m=this.createFramebuffer(f);return i.forEach((M,v)=>{M&&(g.activeTexture(g.TEXTURE1+v),g.bindTexture(g.TEXTURE_2D,M||null))}),this.setAttributes(this.positionBuffer,this.texCoordBuffer),g.viewport(0,0,B,Q),g.drawArrays(g.TRIANGLE_STRIP,0,4),r&&i.forEach((M,v)=>{M&&s!==v&&g.deleteTexture(M)}),g.deleteFramebuffer(m),f}postProcessing(t){this._lastMaskTexture=this.getTempTexture(this._tdProgram,[t,this._lastMaskTexture]);let i=this.getTempTexture(this._kcProgram,[this._lastMaskTexture],!1);for(let r=0;r<3;r++){i=this.getTempTexture(this._mdProgram,[i]);const s=this.getTempTexture(this._edgeProgram,[i],!1);i=this.getTempTexture(this._borderProgram,[i,s,this._lastMaskTexture],!0,2)}return i}close(){const{gl:t}=this;this._borderProgram&&t.deleteProgram(this._borderProgram),this._edgeProgram&&t.deleteProgram(this._edgeProgram),this._kcProgram&&t.deleteProgram(this._kcProgram),this._mdProgram&&t.deleteProgram(this._mdProgram),this._tdProgram&&t.deleteProgram(this._tdProgram)}},xaA=new OaA,YaA=(t=>(t[t.TRACE=0]="TRACE",t[t.DEBUG=1]="DEBUG",t[t.INFO=2]="INFO",t[t.WARN=3]="WARN",t[t.ERROR=4]="ERROR",t[t.NONE=5]="NONE",t))(YaA||{}),PaA={alpha:!0,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0,powerPreference:"low-power"},jM=570703,GK=0,F6=class U6{constructor(i){this.core=i,Oa(this,"seq"),Oa(this,"_core"),Oa(this,"log"),Oa(this,"preLoadPromise"),Oa(this,"startResolve"),Oa(this,"startReject"),Oa(this,"mediaPipeSolutions"),Oa(this,"assetsPath"),Oa(this,"currentType"),Oa(this,"onAbort"),Oa(this,"isAborted",!1),GK+=1,this.seq=GK,this._core=i,this.log=i.log.createChild({id:`${this.getAlias()}${GK}`}),this.log.info("created"),i.assetsPath&&(this.preLoadPromise=this.preload(i.assetsPath))}static isSupported(){if(OnA<90)return!1;const i=document.createElement("canvas").getContext("webgl2",PaA);return!!(i&&i instanceof WebGL2RenderingContext)}async preload(i){try{this._core.room.videoManager.Wasm||(this._core.room.videoManager.Wasm=await BnA());const r=s=>{var g;this.core.kvStatManager.addEnum({key:jM,value:this.getKVTypeValue(!1,this.isAborted,"ABORT_IN_INFERENCE")}),this.isAborted=!0,this.log.error("mediaPipeSolutions abort",s),this.core.clearStarted(this,this.getGroup()),this.stop(),(g=this.onAbort)==null||g.call(this,s)};this._core.room.videoManager.initVirtualBackground(r,v6,xaA),await this._core.initVisionTaskRegistry(i,["ImageSegmenter"])}catch(r){const{RtcError:s,ErrorCode:g}=this._core.errorModule;throw new s({code:g.INVALID_OPERATION,message:`VirtualBackground preload error, please redeploy the assets of the npm package. detail: ${r}`})}}getName(){return U6.Name}getAlias(){return"vb"}getValidateRule(i){switch(i){case"start":return cnA(this._core);case"update":return EnA(this._core);case"stop":return lnA(this._core)}}getGroup(){return"vb"}getKVTypeValue(i=!1,r=!1,s="NONE"){let g=0;switch(this.currentType){case"blur":g|=0;break;case"image":g|=1;break;case"color":g|=2}switch(i&&(g|=256),r&&(g|=512),s){case"ABORT_IN_INFERENCE":g|=4096;break;case"ABORT_IN_VIDEO_MANAGER":g|=8192;break;case"OTHER":g|=61440}return g}hexToRgb(i){const r=i.replace("#","");return[parseInt(r.slice(0,2),16)/255,parseInt(r.slice(2,4),16)/255,parseInt(r.slice(4,6),16)/255]}async start(i){const{type:r="blur",src:s,blurLevel:g=3,onAbort:B}=i;this.currentType=r,this.onAbort=B,r==="color"&&typeof i.color=="string"&&(i.color=this.hexToRgb(i.color));const{auth:Q}=await gnA({sdkAppId:i.sdkAppId,userId:i.userId,userSig:i.userSig,core:this._core}),{RtcError:f,ErrorCodeDictionary:m,ErrorCode:M}=this._core.errorModule;if(!Q){const v=this._core.utils.isOverseaSdkAppId(i.sdkAppId)?"https://trtc.io/document/56025":"https://cloud.tencent.com/document/product/647/85386";throw new f({code:m.NEED_TO_BUY,messageParams:{value:"Virtual Background",url:v}})}if(!this.preLoadPromise){if(!this._core.assetsPath)throw new f({code:M.INVALID_PARAMETER,message:"you need to deploy the assets of the npm package and set assetsPath param in TRTC.create()"});this.preLoadPromise=this.preload(this._core.assetsPath)}return await this.preLoadPromise,this.core.room.videoManager.setVirtualBackground({type:r,imageUrl:s,blurLevel:g,enableFaceCentering:i.enableFaceCentering,enableEffectOptimization:i.enableEffectOptimization,color:i.color,onAbort:v=>{var U;this.core.kvStatManager.addEnum({key:jM,value:this.getKVTypeValue(!0,this.isAborted,"ABORT_IN_VIDEO_MANAGER")}),this.isAborted=!0,this.core.clearStarted(this,this.getGroup()),this.stop(),delete this.preLoadPromise,(U=this.onAbort)==null||U.call(this,v)}}).then(()=>{this.core.kvStatManager.addEnum({key:jM,value:this.getKVTypeValue(!1,this.isAborted,"NONE")})}).catch(v=>{throw this.core.kvStatManager.addEnum({key:jM,value:this.getKVTypeValue(!0,this.isAborted,"OTHER")}),v})}async update(i){const{type:r,src:s}=i;return r!==this.currentType&&(this.currentType=r),r==="color"&&typeof i.color=="string"&&(i.color=this.hexToRgb(i.color)),this.core.room.videoManager.setVirtualBackground({type:r,imageUrl:s,blurLevel:i.blurLevel,enableFaceCentering:i.enableFaceCentering,enableEffectOptimization:i.enableEffectOptimization,color:i.color}).then(()=>{this.core.kvStatManager.addEnum({key:jM,value:this.getKVTypeValue(!1,!1,"NONE")})}).catch(()=>{this.core.kvStatManager.addEnum({key:jM,value:this.getKVTypeValue(!0,!1,"OTHER")})})}async stop(){return this.core.room.videoManager.setVirtualBackground()}};Oa(F6,"Name","VirtualBackground");var O6=F6,JaA=O6;const HaA=Object.freeze(Object.defineProperty({__proto__:null,VirtualBackground:O6,default:JaA},Symbol.toStringTag,{value:"Module"})),VaA=hk(HaA);var qaA=Object.defineProperty,KaA=(t,i,r)=>i in t?qaA(t,i,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[i]=r,wG=(t,i,r)=>KaA(t,typeof i!="symbol"?i+"":i,r);function jaA(t){return{name:"BasicBeautyOptions",type:"object",required:!0,allowEmpty:!1,properties:{beauty:{required:!1,type:"number"},brightness:{required:!1,type:"number"},ruddy:{required:!1,type:"number"}},validate(i,r,s,g){const{RtcError:B,ErrorCode:Q,ErrorCodeDictionary:f}=t.errorModule;if(t.utils.isOverseaSdkAppId(i.sdkAppId))throw new B({code:Q.INVALID_OPERATION,extraCode:f.INVALID_OPERATION,message:"This feature is not yet available in your country or region. If you have any questions, you can go to the community for consultation: https://zhiliao.qq.com/s/cWSPGIIM62CC/c3TPGIIM62CQ"})}}}function WaA(t){return{name:"StopBasicBeautyOptions",required:!1}}var zaA=(()=>{var t=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0;return function(i={}){var r,s,g=i;g.ready=new Promise((P,F)=>{r=P,s=F});var B=Object.assign({},g),Q="";typeof document<"u"&&document.currentScript&&(Q=document.currentScript.src),t&&(Q=t),Q=Q.indexOf("blob:")!==0?Q.substr(0,Q.replace(/[?#].*/,"").lastIndexOf("/")+1):"";var f,m,M=g.print||console.log.bind(console),v=g.printErr||console.error.bind(console);function U(P){if(bi(P))return function(F){for(var EA=atob(F),RA=new Uint8Array(EA.length),GA=0;GAP.startsWith(Zi);function qt(P){return Promise.resolve().then(()=>function(F){if(F==$e&&f)return new Uint8Array(f);var EA=U(F);if(EA)return EA;throw"both async and sync fetching of the wasm failed"}(P))}function ai(P,F,EA,RA){return function(GA,WA,Ce){return qt(GA).then(ge=>WebAssembly.instantiate(ge,WA)).then(ge=>ge).then(Ce,ge=>{v(`failed to asynchronously prepare wasm: ${ge}`),Je(ge)})}(F,EA,RA)}bi($e="data:application/octet-stream;base64,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IAEoAgA2AgAgAiABKAIENgIEIAIgASgCCDYCCCACIAEoAgw2AgwgAiABKAIQNgIQIAIgASgCFDYCFCACIAEoAhg2AhggAiABKAIcNgIcIAIgASgCIDYCICACIAEoAiQ2AiQgAiABKAIoNgIoIAIgASgCLDYCLCACIAEoAjA2AjAgAiABKAI0NgI0IAIgASgCODYCOCACIAEoAjw2AjwgAUFAayEBIAJBQGsiAiAFTQ0ACwsgAiAETw0BA0AgAiABKAIANgIAIAFBBGohASACQQRqIgIgBEkNAAsMAQsgA0EESQRAIAAhAgwBCyAAIANBBGsiBEsEQCAAIQIMAQsgACECA0AgAiABLQAAOgAAIAIgAS0AAToAASACIAEtAAI6AAIgAiABLQADOgADIAFBBGohASACQQRqIgIgBE0NAAsLIAIgA0kEQANAIAIgAS0AADoAACABQQFqIQEgAkEBaiICIANHDQALCyAACwsAIAEgAiAAEEIaCxIAIAFBAXRB8MoAakECIAAQQgv5AQEEfwJ/IAEQKiECIwBBEGsiBSQAAn8gAC0AC0EHdgRAIAAoAgQMAQsgAC0AC0H/AHELIgRBAE8EQAJAIAIgAC0AC0EHdgR/IAAoAghB/////wdxQQFrBUEKCyIDIARrTQRAIAJFDQECfyAALQALQQd2BEAgACgCAAwBCyAACyIDIAQEfyACIANqIAMgBBBFIAEgAkEAIAMgBGogAUsbQQAgASADTxtqBSABCyACEEUgACACIARqIgEQMSAFQQA6AA8gASADaiAFLQAPOgAADAELIAAgAyACIARqIANrIARBACACIAEQRAsgBUEQaiQAIAAMAQsQJwALC/ICAgJ/AX4CQCACRQ0AIAAgAToAACAAIAJqIgNBAWsgAToAACACQQNJDQAgACABOgACIAAgAToAASADQQNrIAE6AAAgA0ECayABOgAAIAJBB0kNACAAIAE6AAMgA0EEayABOgAAIAJBCUkNACAAQQAgAGtBA3EiBGoiAyABQf8BcUGBgoQIbCIBNgIAIAMgAiAEa0F8cSIEaiICQQRrIAE2AgAgBEEJSQ0AIAMgATYCCCADIAE2AgQgAkEIayABNgIAIAJBDGsgATYCACAEQRlJDQAgAyABNgIYIAMgATYCFCADIAE2AhAgAyABNgIMIAJBEGsgATYCACACQRRr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ACACQQA6AA8DQCABBEAgACACLQAPOgAAIAFBAWshASAAQQFqIQAMAQsLIAJBEGokAAsaACAALQALQQd2BEAgACgCCBogACgCABAZCwvmAQEFfyMAQRBrIgUkACMAQSBrIgMkACMAQRBrIgQkACAEIAA2AgwgBCAAIAFqNgIIIAMgBCgCDDYCGCADIAQoAgg2AhwgBEEQaiQAIAMoAhghBCADKAIcIQYjAEEQayIBJAAgASAGNgIMIAIgBCAGIARrIgQQQyABIAIgBGo2AgggAyABKAIMNgIQIAMgASgCCDYCFCABQRBqJAAgAyAAIAMoAhAgAGtqNgIMIAMgAiADKAIUIAJrajYCCCAFIAMoAgw2AgggBSADKAIINgIMIANBIGokACAFKAIMIQcgBUEQaiQAIAcLDwAgAgRAIAAgASACEDILC/UCAQV/IwBBEGsiByQAIAIgAUF/c0Hv////B2pNBEACfyAALQALQQd2BEAgACgCAAwBCyAACyEIIAdBBGoiCSAAIAFB5////wNJBH8gByABQQF0NgIMIAcgASACajYCBCMAQRBrIgIkACAJKAIAIAdBDGoiCigCAEkhCyACQRBqJAAgCiAJIAsbKAIAIgJBC08EfyACQRBqQXBxIgIgAkEBayICIAJBC0YbBUEKC0EBagVB7////wcLEDAgBygCBCECIAcoAggaIAQEQCACIAggBBAjCyAFBEAgAiAEaiAGIAUQIwsgAyAEayEGIAMgBEcEQCACIARqIAVqIAQgCGogBhAjCyABQQpHBEAgCBAZCyAAIAI2AgAgACAAKAIIQYCAgIB4cSAHKAIIQf////8HcXI2AgggACAAKAIIQYCAgIB4cjYCCCAAIAQgBWogBmoiADYCBCAHQQA6AAwgACACaiAHLQAMOgAAIAdBEGokAA8LECcACwoAIAAgASACEEMLuQEBBH8jAEEQayIEJAAgBCACNgIMIwBBoAFrIgMkACADIAAgA0GeAWogARsiBjYClAFBfyEFIAMgAUEBayIAQQAgACABTRs2ApgBIANBAEGQARAmIgBBfzYCTCAAQSA2AiQgAEF/NgJQIAAgAEGfAWo2AiwgACAAQZQBajYCVAJAIAFBAEgEQEHo3gBBPTYCAAwBCyAGQQA6AAAgAEH9CiACQR8QTSEFCyAAQaABaiQAIARBEGokACAFCwQA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KAIARQ0AIAIgBCgCGDYCAAsgAEEBRiEFDAELQQAhBQsgBEFAayQAIAULMQAgACABKAIIQQAQHgRAIAEgAiADED0PCyAAKAIIIgAgASACIAMgACgCACgCHBEGAAsYACAAIAEoAghBABAeBEAgASACIAMQPQsLnQEBAn8jAEFAaiIDJAACf0EBIAAgAUEAEB4NABpBACABRQ0AGkEAIAFBjM0AECAiAUUNABogA0EMakEAQTQQJhogA0EBNgI4IANBfzYCFCADIAA2AhAgAyABNgIIIAEgA0EIaiACKAIAQQEgASgCACgCHBEGACADKAIgIgBBAUYEQCACIAMoAhg2AgALIABBAUYLIQQgA0FAayQAIAQLCgAgACABQQAQHgtOAgF/AXwjAEEQayICJAAgAkEANgIMIAEoAgRB1M8AIAJBDGoQCSEDIAIoAgwiAQRAIAEQAQsgACADRAAAAAAAAAAAYjoAOCACQRBqJAALNwEBfyMAQRBrIgIkACACIAEtADg2AgggAEHUzwAgAkEIahAHNgIEIABB1NUANgIAIAJBEGokAAuoAQEFfyAAKAJUIgMoAgAhBSADKAIEIgQgACgCFCAAKAIcIgdrIgYgBCAGSRsiBgRAIAUgByAGECIaIAMgAygCACAGaiIFNgIAIAMgAygCBCAGayIENgIECyAEIAIgAiAESxsiBARAIAUgASAEECIaIAMgAygCACAEaiIFNgIAIAMgAygCBCAEazYCBAsgBUEAOgAAIAAgACgCLCIBNgIcIAAgATYCFCACC5wBAQJ/IwBBEGsiAiQAQcgAEBwhASAAKAIEIgAQAiACIAA2AgggAUHMLSACQQhqEAc2AgQgAUHU1QA2AgAgAUEBNgIcIAFB1NUANgIYIAFBATYCFCABQdTVADYCECABQQE2AgwgAUHU1QA2AgggAUEAOgAgIAFBADYCRCABQoCAgIAwNwI8IAFBADsANyABQQA7ACsgAkEQaiQAIAELigUCBn4CfyABIAEoAgBBB2pBeHEiAUEQajYCACAAIQkgASkDACEDIAEpAwghBSMAQSBrIgAkAAJAIAVC////////////AIMiBEKAgICAgIDAgDx9IARCgICAgICAwP/DAH1UBEAgBUIEhiADQjyIhCEEIANC//////////8PgyIDQoGAgICAgICACFoEQCAEQoGAgICAgICAwAB8IQIMAgsgBEKAgICAgICAgEB9IQIgA0KAgICAgICAgAhSDQEgAiAEQgGDfCECDAELIANQIARCgICAgICAwP//AFQgBEKAgICAgIDA//8AURtFBEAgBUIEhiADQjyIhEL/////////A4NCgICAgICAgPz/AIQhAgwBC0KAgICAgICA+P8AIQIgBEL///////+//8MAVg0AQgAhAiAEQjCIpyIBQZH3AEkNACADIQIgBUL///////8/g0KAgICAgIDAAIQiBCEGAkAgAUGB9wBrIghBwABxBEAgAyAIQUBqrYYhBkIAIQIMAQsgCEUNACAGIAitIgeGIAJBwAAgCGutiIQhBiACIAeGIQILIAAgAjcDECAAIAY3AxgCQEGB+AAgAWsiAUHAAHEEQCAEIAFBQGqtiCEDQgAhBAwBCyABRQ0AIARBwAAgAWuthiADIAGtIgKIhCEDIAQgAoghBAsgACADNwMAIAAgBDcDCCAAKQMIQgSGIAApAwAiA0I8iIQhAiAAKQMQIAApAxiEQgBSrSADQv//////////D4OEIgNCgYCAgICAgIAIWgRAIAJCAXwhAgwBCyADQoCAgICAgICACFINACACQgGDIAJ8IQILIABBIGokACAJIAIgBUKAgICAgICAgIB/g4S/OQMAC0ABAn8jAEEQayICJAAgAiABNgIMIAJB1NUANgIIIAJBCGogABEBACEDIAIoAgwiAQRAIAEQAwsgAkEQaiQAIAMLBABCAAsEAEEAC/YCAQh/IwBBIGsiAyQAIAMgACgCHCIENgIQIAAoAhQhBSADIAI2AhwgAyABNgIYIAMgBSAEayIBNgIUIAEgAmohBUECIQcCfwJAAkACQCAAKAI8IANBEGoiAUECIANBDGoQDSIEBH9B6N4AIAQ2AgBBfwVBAAsEQCABIQQMAQsDQCAFIAMoAgwiBkYNAiAGQQBIBEAgASEEDAQLIAEgBiABKAIEIghLIglBA3RqIgQgBiAIQQAgCRtrIgggBCgCAGo2AgAgAUEMQQQgCRtqIgEgASgCACAIazYCACAFIAZrIQUgACgCPCAEIgEgByAJayIHIANBDGoQDSIGBH9B6N4AIAY2AgBBfwVBAAtFDQALCyAFQX9HDQELIAAgACgCLCIBNgIcIAAgATYCFCAAIAEgACgCMGo2AhAgAgwBCyAAQQA2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EGokAAsiAQF+IAEgAq0gA61CIIaEIAQgABEMACIFQiCIpyQBIAWnCzcBAX8jAEEQayICJAAgAiABKAI8NgIIIABBnNAAIAJBCGoQBzYCBCAAQdTVADYCACACQRBqJAALC/NKFQBBgAgLhCZzZXRCZWF1dHkALSsgICAwWDB4AC0wWCswWCAwWC0weCsweCAweAB1bnNpZ25lZCBzaG9ydAB1bnNpZ25lZCBpbnQAaW5pdABmbG9hdAB1aW50NjRfdABibHVyUmFkaXVzAHZlY3RvcgBtaXJyb3IAYXR0YWNoU2hhZGVyAGRlbGV0ZVNoYWRlcgBjcmVhdGVTaGFkZXIAY29tcGlsZVNoYWRlcgB1bnNpZ25lZCBjaGFyAHN0ZDo6ZXhjZXB0aW9uAHJvdGF0aW9uAG5hbgBsaW5rUHJvZ3JhbQBkZWxldGVQcm9ncmFtAGNyZWF0ZVByb2dyYW0AYm9vbABlbXNjcmlwdGVuOjp2YWwAc2V0V2F0ZXJNYXJrAHN0b3BXYXRlck1hcmsAdW5zaWduZWQgbG9uZwBzdGQ6OndzdHJpbmcAYmFzaWNfc3RyaW5nAHN0ZDo6c3RyaW5nAHN0ZDo6dTE2c3RyaW5nAHN0ZDo6dTMyc3RyaW5nAGluZgAlZgBjbG9zZQBkb3VibGUAdmJNb2RlAHNoYWRlclNvdXJjZQB2b2lkAHNhbXBsZUNvbG9yICs9IHRleHR1cmUoZnJhbWUsIGJsdXJDb29yZGluYXRlc1sATkFOAElORgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgc2hvcnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgaW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxmbG9hdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dWludDhfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50OF90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MTZfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50MTZfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dWludDY0X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludDY0X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQzMl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQzMl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBjaGFyPgBzdGQ6OmJhc2ljX3N0cmluZzx1bnNpZ25lZCBjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxzaWduZWQgY2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8bG9uZz4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgbG9uZz4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8ZG91YmxlPgB2ZWMyIGMgPSB2X3RleENvb3JkOwB2ZWMyIGMgPSB2ZWMyKDEuMCAtIHZfdGV4Q29vcmQueCwgdl90ZXhDb29yZC55KTsAYyA9IHZlYzIoMS4wIC0gYy54LCAxLjAgLSBjLnkpOwBjID0gdmVjMihjLnksIDEuMCAtIGMueCk7AGMgPSB2ZWMyKDEuMCAtIGMueSwgYy54KTsAQWxsSW4xAC4ALjAsAC4wKSpvKSoAKG51bGwpACkqby55KTsgICAgdmVjMiBjb29yZDIgPSB2ZWMyKGZsb2F0KAAgICAgYyA9IHZlYzIodl90ZXhDb29yZC54LCAxLjAgLSB2X3RleENvb3JkLnkpOyAgICB2ZWMyIGNvb3JkMSA9IHZlYzIoZmxvYXQoACksIChjLnkgLWNvb3JkMS55KSAvIG8ueSAvIGZsb2F0KAApKm8ueSk7ICAgIGlmIChjLnggPiBjb29yZDEueCAmJiBjLnggPCBjb29yZDIueCAmJiBjLnkgPiBjb29yZDEueSAmJiBjLnkgPCBjb29yZDIueSkgeyAgICAgIHZlYzQgd2F0ZXJDb2xvciA9IHRleHR1cmUod2F0ZXJNYXJrLCB2ZWMyKChjLnggLSBjb29yZDEueCkgIC8gby54IC8gZmxvYXQoACkgKiBvLngsIGZsb2F0KABvdXRDb2xvci5yZ2IgKz0gdmVjMygAKTsgICAgICAgdmVjMyBzbW9vdGhDb2xvciA9IG91dENvbG9yLnJnYiArIChvdXRDb2xvci5yZ2ItdmVjMyhoaWdoUGFzcykpKmFscGhhKjAuMTsgICAgICAgc21vb3RoQ29sb3IgPSBtYXgoc21vb3RoQ29sb3IsIHZlYzMoMC4wKSk7ICAgICAgIHNtb290aENvbG9yID0gY2xhbXAocG93KHNtb290aENvbG9yLCB2ZWMzKABnKz1HKGMsdmVjMigAICAgICAgdmVjMiBvZmZzZXQgPSB2ZWMyKABdID0gdl90ZXhDb29yZC54eSArIG9mZnNldCAqIHZlYzIoADsgACkpLCB2ZWMzKDAuMCksIHZlYzMoMS4wKSk7ICAgICAgdmVjMyBzY3JlZW4gPSB2ZWMzKDEuMCkgLSAodmVjMygxLjApLXNtb290aENvbG9yKSAqICh2ZWMzKDEuMCktb3V0Q29sb3IucmdiKTsgICAgICAgdmVjMyBsaWdodGVuID0gbWF4KHNtb290aENvbG9yLCBvdXRDb2xvci5yZ2IpOyAgICAgICB2ZWMzIGJlYXV0eUNvbG9yID0gbWl4KG1peChvdXRDb2xvci5yZ2IsIHNjcmVlbiwgYWxwaGEpLCBsaWdodGVuLCBhbHBoYSk7ICAgICAgb3V0Q29sb3IucmdiID0gbWl4KG91dENvbG9yLnJnYiwgYmVhdXR5Q29sb3IsIAAKICAgICAgY29uc3QgbWF0MyBzYXR1cmF0ZU1hdHJpeCA9IG1hdDMoMS4xMTAyLC0wLjA1OTgsLTAuMDYxLC0wLjA3NzQsMS4wODI2LC0wLjExODYsLTAuMDIyOCwtMC4wMjI4LDEuMTc3Mik7CiAgICAgIHZlYzMgd2FybUNvbG9yID0gb3V0Q29sb3IucmdiICogc2F0dXJhdGVNYXRyaXg7CiAgICAgIG91dENvbG9yLnJnYiA9IG1peChvdXRDb2xvci5yZ2IsIHdhcm1Db2xvciwgACAgICAgIHNhbXBsZUNvbG9yID0gc2FtcGxlQ29sb3IgLyA2Mi4wOyAgICAgICBmbG9hdCBoaWdoUGFzcyA9IG91dENvbG9yLmcgLSBzYW1wbGVDb2xvciArIDAuNTsgICAgICAgY29uc3QgaGlnaHAgdmVjMyBXID0gdmVjMygwLjI5OSwwLjU4NywwLjExNCk7ICAgICAgZmxvYXQgbHVtaW5hbmNlID0gZG90KG91dENvbG9yLnJnYiwgVyk7ICAgICAgIGZsb2F0IGFscGhhID0gcG93KGx1bWluYW5jZSwgAF0pLmcgKiAAKSkpOyAgICAgIG91dENvbG9yID0gbWl4KG91dENvbG9yLHdhdGVyQ29sb3IsICB3YXRlckNvbG9yLmEpOyAgICB9ICAgIAApOyAgICAAKTsgICAgICB2ZWMyIGJsdXJDb29yZGluYXRlc1syNF07ICAgICAgACAgICAgIGZsb2F0IHNhbXBsZUNvbG9yID0gb3V0Q29sb3IuZyAqIDIyLjA7ICAgICAgIAAjdmVyc2lvbiAzMDAgZXMKICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgIHVuaWZvcm0gc2FtcGxlcjJEIGZyYW1lOwogICAgdW5pZm9ybSBzYW1wbGVyMkQgbWFzazsKICAgIHVuaWZvcm0gc2FtcGxlcjJEIGJnOwogICAgdW5pZm9ybSBzYW1wbGVyMkQgd2F0ZXJNYXJrOwogICAgdW5pZm9ybSBzYW1wbGVyMkQgbGFzdE1hc2s7CiAgICB1bmlmb3JtIG1hdDQgdV9vZmZzZXRNYXRyaXg7CiAgICB1bmlmb3JtIHZlYzMgdV9jb2xvcjsKICAgIGluIHZlYzIgdl90ZXhDb29yZDsKICAgIG91dCB2ZWM0IG91dENvbG9yOwogICAgdmVjNCBHKHZlYzIgYyx2ZWMyIHMpewogICAgICByZXR1cm4gdGV4dHVyZShmcmFtZSx0ZXh0dXJlKG1hc2ssYytzKS5yPjAuMz9jOmMrcyk7CiAgICB9CiAgICB2b2lkIG1haW4oKSB7CiAgICAgIAAKICAgICAgdmVjMiBvZmZzZXRNYXNrVVYgPSAodV9vZmZzZXRNYXRyaXggKiB2ZWM0KGMsIDAsIDEpKS54eTsKICAgICAgZmxvYXQgaXNJbnNpZGVYID0gKG9mZnNldE1hc2tVVi54ID49IDAuMCkgJiYgKG9mZnNldE1hc2tVVi54IDw9IDEuMCkgPyAxLjAgOiAwLjA7CiAgICAgIGZsb2F0IGlzSW5zaWRlWSA9IChvZmZzZXRNYXNrVVYueSA+PSAwLjApICYmIChvZmZzZXRNYXNrVVYueSA8PSAxLjApID8gMS4wIDogMC4wOwogICAgICBmbG9hdCBpc0luc2lkZSA9IGlzSW5zaWRlWCAqIGlzSW5zaWRlWTsKICAgICAgZmxvYXQgbWFza2VkQWxwaGEgPSB0ZXh0dXJlKG1hc2ssIG9mZnNldE1hc2tVVikuciAqIGlzSW5zaWRlOwogICAgICBtYXNrZWRBbHBoYSA9IG1hc2tlZEFscGhhPDAuNT8yLjAqbWFza2VkQWxwaGEqbWFza2VkQWxwaGE6MS4wLTIuMCooMS4wLW1hc2tlZEFscGhhKSooMS4wLW1hc2tlZEFscGhhKTsKICAgICAgc3JjX2NvbG9yID0gdGV4dHVyZShmcmFtZSwgb2Zmc2V0TWFza1VWICwgaXNJbnNpZGUpOwogICAgICBvdXRDb2xvciA9IG1peCh0ZXh0dXJlKGJnLCBjKSwgc3JjX2NvbG9yLCBtYXNrZWRBbHBoYSk7CiAgICAACiAgICB2ZWM0IGcgPSB2ZWM0KDAuMCk7CiAgICAACiAgICAgIGMueSA9IDEuMCAtIGMueTsKICAgICAgdmVjNCBzcmNfY29sb3IgPSB0ZXh0dXJlKGZyYW1lLCBjKTsKICAgICAgZmxvYXQgYSA9IHRleHR1cmUobWFzaywgYykucjsKICAgICAgYSA9IGE8MC41PzIuMCphKmE6MS4wLTIuMCooMS4wLWEpKigxLjAtYSk7CiAgICAgIC8vIGZsb2F0IGEyID0gdGV4dHVyZShsYXN0TWFzaywgYykuYTsKICAgICAgLy8gYTIgPSBhMjwwLjU/Mi4wKmEyKmEyOjEuMC0yLjAqKDEuMC1hMikqKDEuMC1hMik7CiAgICAgIC8vIGZsb2F0IGRlbHRhID0gYSAtIGEyOwogICAgICAvLyBpZiAoZGVsdGEgPCAwLjI1ICYmIGRlbHRhID4gLTAuMjUpCiAgICAgIC8vIHsKICAgICAgLy8gICAgIGEgPSBhICsgMC41KmRlbHRhOwogICAgICAvLyB9CiAgICAgIAogICAgICB2ZWMyIG8gPSAxLjAgLyB2ZWMyKHRleHR1cmVTaXplKGZyYW1lLCAwKSk7CiAgICAACiAgICAgIG91dENvbG9yID0gZzsKICAAI3ZlcnNpb24gMzAwIGVzCmluIHZlYzIgYV9wb3NpdGlvbjsKaW4gdmVjMiBhX3RleENvb3JkOwoKdW5pZm9ybSBtYXQ0IHVfdGV4dHVyZU1hdHJpeDsKCm91dCB2ZWMyIHZfdGV4Q29vcmQ7CnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQoYV9wb3NpdGlvbi54LCBhX3Bvc2l0aW9uLnksIDAsIDEpOwogIHZfdGV4Q29vcmQgPSh1X3RleHR1cmVNYXRyaXggKiB2ZWM0KGFfdGV4Q29vcmQsIDAsIDEpKS54eTsKfQoAc2V0QmVhdXR5ICVmICVmICVmICVmICVmCgBvdXRDb2xvciA9IHNyY19jb2xvcjsKAG91dENvbG9yID0gbWl4KHZlYzQodV9jb2xvciwxLjApLHNyY19jb2xvcixhKTsKADZBbGxJbjEAAIAoAABfFgAAUDZBbGxJbjEAAAAABCkAAHAWAAAAAAAAaBYAAFBLNkFsbEluMQAAAAQpAACMFgAAAQAAAGgWAABpaQB2AHZpAHwWAADMFgAATjEwZW1zY3JpcHRlbjN2YWxFAACAKAAAuBYAAGlpaQB2aWlpAAAAALwnAAB8FgAAcCgAAHAoAABwKAAAcCgAAHAoAAB2aWlkZGRkZABBkC4LyAi8JwAAfBYAAHAoAABwKAAAcCgAAHAoAAB2aWlkZGRkALwnAAB8FgAAdmlpALwnAADMFgAAzBYAAHwWAADMFgAAHCgAALwnAADMFgAAoBcAAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0ljTlNfMTFjaGFyX3RyYWl0c0ljRUVOU185YWxsb2NhdG9ySWNFRUVFAACAKAAAYBcAAMwWAAC8JwAAzBYAAMwWAABOU3QzX18yMTJiYXNpY19zdHJpbmdJaE5TXzExY2hhcl90cmFpdHNJaEVFTlNfOWFsbG9jYXRvckloRUVFRQAAgCgAALgXAABOU3QzX18yMTJiYXNpY19zdHJpbmdJd05TXzExY2hhcl90cmFpdHNJd0VFTlNfOWFsbG9jYXRvckl3RUVFRQAAgCgAAAAYAABOU3QzX18yMTJiYXNpY19zdHJpbmdJRHNOU18xMWNoYXJfdHJhaXRzSURzRUVOU185YWxsb2NhdG9ySURzRUVFRQAAAIAoAABIGAAATlN0M19fMjEyYmFzaWNfc3RyaW5nSURpTlNfMTFj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")||(Dt=$e,$e=g.locateFile?g.locateFile(Dt,Q):Q+Dt);var Ki=P=>{for(;P.length>0;)P.shift()(g)};g.noExitRuntime;function Ur(P){this.excPtr=P,this.ptr=P-24,this.set_type=function(F){QA[this.ptr+4>>2]=F},this.get_type=function(){return QA[this.ptr+4>>2]},this.set_destructor=function(F){QA[this.ptr+8>>2]=F},this.get_destructor=function(){return QA[this.ptr+8>>2]},this.set_caught=function(F){F=F?1:0,AA[this.ptr+12|0]=F},this.get_caught=function(){return AA[this.ptr+12|0]!=0},this.set_rethrown=function(F){F=F?1:0,AA[this.ptr+13|0]=F},this.get_rethrown=function(){return AA[this.ptr+13|0]!=0},this.init=function(F,EA){this.set_adjusted_ptr(0),this.set_type(F),this.set_destructor(EA)},this.set_adjusted_ptr=function(F){QA[this.ptr+16>>2]=F},this.get_adjusted_ptr=function(){return QA[this.ptr+16>>2]},this.get_exception_ptr=function(){if(Cs(this.get_type()))return QA[this.excPtr>>2];var F=this.get_adjusted_ptr();return F!==0?F:this.excPtr}}var Er,no,Kn,Xi=P=>{for(var F="",EA=P;z[EA];)F+=Er[z[EA++]];return F},yr={},lr={},Ni={},wt=P=>{throw new no(P)},Ji=P=>{throw new Kn(P)},Di=(P,F,EA)=>{function RA(ge){var we=EA(ge);we.length!==P.length&&Ji("Mismatched type converter count");for(var _e=0;_e{lr.hasOwnProperty(ge)?GA[we]=lr[ge]:(WA.push(ge),yr.hasOwnProperty(ge)||(yr[ge]=[]),yr[ge].push(()=>{GA[we]=lr[ge],++Ce===WA.length&&RA(GA)}))}),WA.length===0&&RA(GA)};function ar(P,F,EA={}){if(!("argPackAdvance"in F))throw new TypeError("registerType registeredInstance requires argPackAdvance");return function(RA,GA,WA={}){var Ce=GA.name;if(RA||wt(`type "${Ce}" must have a positive integer typeid pointer`),lr.hasOwnProperty(RA)){if(WA.ignoreDuplicateRegistrations)return;wt(`Cannot register type '${Ce}' twice`)}if(lr[RA]=GA,delete Ni[RA],yr.hasOwnProperty(RA)){var ge=yr[RA];delete yr[RA],ge.forEach(we=>we())}}(P,F,EA)}var MA,YA=P=>{wt(P.$$.ptrType.registeredClass.name+" instance already deleted")},pe=!1,st=P=>{},Te=P=>{P.count.value-=1,P.count.value===0&&(F=>{F.smartPtr?F.smartPtrType.rawDestructor(F.smartPtr):F.ptrType.registeredClass.rawDestructor(F.ptr)})(P)},be=(P,F,EA)=>{if(F===EA)return P;if(EA.baseClass===void 0)return null;var RA=be(P,F,EA.baseClass);return RA===null?null:EA.downcast(RA)},yt={},ht=()=>Object.keys(zt).length,ae=()=>{var P=[];for(var F in zt)zt.hasOwnProperty(F)&&P.push(zt[F]);return P},ye=[],Xe=()=>{for(;ye.length;){var P=ye.pop();P.$$.deleteScheduled=!1,P.delete()}},ot=P=>{MA=P,ye.length&&MA&&MA(Xe)},zt={},yi=(P,F)=>(F=((EA,RA)=>{for(RA===void 0&&wt("ptr should not be undefined");EA.baseClass;)RA=EA.upcast(RA),EA=EA.baseClass;return RA})(P,F),zt[F]),Hi=(P,F)=>(F.ptrType&&F.ptr||Ji("makeClassHandle requires ptr and ptrType"),!!F.smartPtrType!=!!F.smartPtr&&Ji("Both smartPtrType and smartPtr must be specified"),F.count={value:1},ji(Object.create(P,{$$:{value:F}})));function Ei(P){var F=this.getPointee(P);if(!F)return this.destructor(P),null;var EA=yi(this.registeredClass,F);if(EA!==void 0){if(EA.$$.count.value===0)return EA.$$.ptr=F,EA.$$.smartPtr=P,EA.clone();var RA=EA.clone();return this.destructor(P),RA}function GA(){return this.isSmartPointer?Hi(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:F,smartPtrType:this,smartPtr:P}):Hi(this.registeredClass.instancePrototype,{ptrType:this,ptr:P})}var WA,Ce=this.registeredClass.getActualType(F),ge=yt[Ce];if(!ge)return GA.call(this);WA=this.isConst?ge.constPointerType:ge.pointerType;var we=be(F,this.registeredClass,WA.registeredClass);return we===null?GA.call(this):this.isSmartPointer?Hi(WA.registeredClass.instancePrototype,{ptrType:WA,ptr:we,smartPtrType:this,smartPtr:P}):Hi(WA.registeredClass.instancePrototype,{ptrType:WA,ptr:we})}var ji=P=>typeof FinalizationRegistry>"u"?(ji=F=>F,P):(pe=new FinalizationRegistry(F=>{Te(F.$$)}),st=F=>pe.unregister(F),(ji=F=>{var EA=F.$$;if(EA.smartPtr){var RA={$$:EA};pe.register(F,RA,F)}return F})(P));function Xo(){}var sr=(P,F)=>Object.defineProperty(F,"name",{value:P}),Lo=(P,F,EA)=>{if(P[F].overloadTable===void 0){var RA=P[F];P[F]=function(){return P[F].overloadTable.hasOwnProperty(arguments.length)||wt(`Function '${EA}' called with an invalid number of arguments (${arguments.length}) - expects one of (${P[F].overloadTable})!`),P[F].overloadTable[arguments.length].apply(this,arguments)},P[F].overloadTable=[],P[F].overloadTable[RA.argCount]=RA}};function Nr(P,F,EA,RA,GA,WA,Ce,ge){this.name=P,this.constructor=F,this.instancePrototype=EA,this.rawDestructor=RA,this.baseClass=GA,this.getActualType=WA,this.upcast=Ce,this.downcast=ge,this.pureVirtualFunctions=[]}var Vo=(P,F,EA)=>{for(;F!==EA;)F.upcast||wt(`Expected null or instance of ${EA.name}, got an instance of ${F.name}`),P=F.upcast(P),F=F.baseClass;return P};function et(P,F){if(F===null)return this.isReference&&wt(`null is not a valid ${this.name}`),0;F.$$||wt(`Cannot pass "${ao(F)}" as a ${this.name}`),F.$$.ptr||wt(`Cannot pass deleted object as a pointer of type ${this.name}`);var EA=F.$$.ptrType.registeredClass;return Vo(F.$$.ptr,EA,this.registeredClass)}function Kr(P,F){var EA;if(F===null)return this.isReference&&wt(`null is not a valid ${this.name}`),this.isSmartPointer?(EA=this.rawConstructor(),P!==null&&P.push(this.rawDestructor,EA),EA):0;F.$$||wt(`Cannot pass "${ao(F)}" as a ${this.name}`),F.$$.ptr||wt(`Cannot pass deleted object as a pointer of type ${this.name}`),!this.isConst&&F.$$.ptrType.isConst&&wt(`Cannot convert argument of type ${F.$$.smartPtrType?F.$$.smartPtrType.name:F.$$.ptrType.name} to parameter type ${this.name}`);var RA=F.$$.ptrType.registeredClass;if(EA=Vo(F.$$.ptr,RA,this.registeredClass),this.isSmartPointer)switch(F.$$.smartPtr===void 0&&wt("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:F.$$.smartPtrType===this?EA=F.$$.smartPtr:wt(`Cannot convert argument of type ${F.$$.smartPtrType?F.$$.smartPtrType.name:F.$$.ptrType.name} to parameter type ${this.name}`);break;case 1:EA=F.$$.smartPtr;break;case 2:if(F.$$.smartPtrType===this)EA=F.$$.smartPtr;else{var GA=F.clone();EA=this.rawShare(EA,gr.toHandle(()=>GA.delete())),P!==null&&P.push(this.rawDestructor,EA)}break;default:wt("Unsupporting sharing policy")}return EA}function Qn(P,F){if(F===null)return this.isReference&&wt(`null is not a valid ${this.name}`),0;F.$$||wt(`Cannot pass "${ao(F)}" as a ${this.name}`),F.$$.ptr||wt(`Cannot pass deleted object as a pointer of type ${this.name}`),F.$$.ptrType.isConst&&wt(`Cannot convert argument of type ${F.$$.ptrType.name} to parameter type ${this.name}`);var EA=F.$$.ptrType.registeredClass;return Vo(F.$$.ptr,EA,this.registeredClass)}function ho(P){return this.fromWireType(QA[P>>2])}function jn(P,F,EA,RA,GA,WA,Ce,ge,we,_e,Ke){this.name=P,this.registeredClass=F,this.isReference=EA,this.isConst=RA,this.isSmartPointer=GA,this.pointeeType=WA,this.sharingPolicy=Ce,this.rawGetPointee=ge,this.rawConstructor=we,this.rawShare=_e,this.rawDestructor=Ke,GA||F.baseClass!==void 0?this.toWireType=Kr:RA?(this.toWireType=et,this.destructorFunction=null):(this.toWireType=Qn,this.destructorFunction=null)}var $t,$r,On=[],An=P=>{var F=On[P];return F||(P>=On.length&&(On.length=P+1),On[P]=F=$t.get(P)),F},Tr=(P,F,EA)=>P.includes("j")?((RA,GA,WA)=>{var Ce=g["dynCall_"+RA];return WA&&WA.length?Ce.apply(null,[GA].concat(WA)):Ce.call(null,GA)})(P,F,EA):An(F).apply(null,EA),ei=(P,F)=>{var EA,RA,GA,WA=(P=Xi(P)).includes("j")?(EA=P,RA=F,GA=[],function(){return GA.length=0,Object.assign(GA,arguments),Tr(EA,RA,GA)}):An(F);return typeof WA!="function"&&wt(`unknown function pointer with signature ${P}: ${F}`),WA},Es=P=>{var F=Ba(P),EA=Xi(F);return Mr(F),EA},jr=(P,F)=>{var EA=[],RA={};throw F.forEach(function GA(WA){RA[WA]||lr[WA]||(Ni[WA]?Ni[WA].forEach(GA):(EA.push(WA),RA[WA]=!0))}),new $r(`${P}: `+EA.map(Es).join([", "]))},Gr=(P,F)=>{for(var EA=[],RA=0;RA>2]);return EA},$o=P=>{for(;P.length;){var F=P.pop();P.pop()(F)}};function sn(P,F,EA,RA,GA,WA){var Ce=F.length;Ce<2&&wt("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var ge=F[1]!==null&&EA!==null,we=!1,_e=1;_e(P instanceof Object||wt(`${EA} with invalid "this": ${P}`),P instanceof F.registeredClass.constructor||wt(`${EA} incompatible with "this" of type ${P.constructor.name}`),P.$$.ptr||wt(`cannot call emscripten binding method ${EA} on deleted object`),Vo(P.$$.ptr,P.$$.ptrType.registeredClass,F.registeredClass));function hn(){this.allocated=[void 0],this.freelist=[]}var Gi=new hn,pn=P=>{P>=Gi.reserved&&--Gi.get(P).refcount===0&&Gi.free(P)},nI=()=>{for(var P=0,F=Gi.reserved;F(P||wt("Cannot use deleted val. handle = "+P),Gi.get(P).value),toHandle:P=>{switch(P){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:return Gi.allocate({refcount:1,value:P})}}};function gn(P){return this.fromWireType(X[P>>2])}var Yo,Tg,So,ao=P=>{if(P===null)return"null";var F=typeof P;return F==="object"||F==="array"||F==="function"?P.toString():""+P},EE=(P,F)=>{switch(F){case 4:return function(EA){return this.fromWireType(wA[EA>>2])};case 8:return function(EA){return this.fromWireType(HA[EA>>3])};default:throw new TypeError(`invalid float width (${F}): ${P}`)}},Ta=(P,F,EA)=>{switch(F){case 1:return EA?RA=>AA[RA|0]:RA=>z[RA|0];case 2:return EA?RA=>sA[RA>>1]:RA=>eA[RA>>1];case 4:return EA?RA=>X[RA>>2]:RA=>QA[RA>>2];default:throw new TypeError(`invalid integer width (${F}): ${P}`)}},po=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0,Ja=(P,F,EA)=>{for(var RA=F+EA,GA=F;P[GA]&&!(GA>=RA);)++GA;if(GA-F>16&&P.buffer&&po)return po.decode(P.subarray(F,GA));for(var WA="";F>10,56320|1023&_e)}}else WA+=String.fromCharCode((31&Ce)<<6|ge)}else WA+=String.fromCharCode(Ce)}return WA},Mc=(P,F)=>P?Ja(z,P,F):"",Qr=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,Fo=(P,F)=>{for(var EA=P,RA=EA>>1,GA=RA+F/2;!(RA>=GA)&&eA[RA];)++RA;if((EA=RA<<1)-P>32&&Qr)return Qr.decode(z.subarray(P,EA));for(var WA="",Ce=0;!(Ce>=F/2);++Ce){var ge=sA[P+2*Ce>>1];if(ge==0)break;WA+=String.fromCharCode(ge)}return WA},$s=(P,F,EA)=>{if(EA===void 0&&(EA=2147483647),EA<2)return 0;for(var RA=F,GA=(EA-=2)<2*P.length?EA/2:P.length,WA=0;WA>1]=Ce,F+=2}return sA[F>>1]=0,F-RA},Ha=P=>2*P.length,Gs=(P,F)=>{for(var EA=0,RA="";!(EA>=F/4);){var GA=X[P+4*EA>>2];if(GA==0)break;if(++EA,GA>=65536){var WA=GA-65536;RA+=String.fromCharCode(55296|WA>>10,56320|1023&WA)}else RA+=String.fromCharCode(GA)}return RA},Ga=(P,F,EA)=>{if(EA===void 0&&(EA=2147483647),EA<4)return 0;for(var RA=F,GA=RA+EA-4,WA=0;WA=55296&&Ce<=57343&&(Ce=65536+((1023&Ce)<<10)|1023&P.charCodeAt(++WA)),X[F>>2]=Ce,(F+=4)+4>GA)break}return X[F>>2]=0,F-RA},Rr=P=>{for(var F=0,EA=0;EA=55296&&RA<=57343&&++EA,F+=4}return F},Ia=(P,F)=>{var EA=lr[P];return EA===void 0&&wt(F+" has unknown type "+Es(P)),EA},fo=(P,F,EA)=>{var RA=[],GA=P.toWireType(RA,EA);return RA.length&&(QA[F>>2]=gr.toHandle(RA)),GA},aI={},en=[],qo=Reflect.construct,Gg=[null,[],[]],kg=(P,F)=>{var EA=Gg[P];F===0||F===10?((P===1?M:v)(Ja(EA,0)),EA.length=0):EA.push(F)};(()=>{for(var P=new Array(256),F=0;F<256;++F)P[F]=String.fromCharCode(F);Er=P})(),no=g.BindingError=class extends Error{constructor(P){super(P),this.name="BindingError"}},Kn=g.InternalError=class extends Error{constructor(P){super(P),this.name="InternalError"}},Object.assign(Xo.prototype,{isAliasOf(P){if(!(this instanceof Xo)||!(P instanceof Xo))return!1;var F=this.$$.ptrType.registeredClass,EA=this.$$.ptr;P.$$=P.$$;for(var RA=P.$$.ptrType.registeredClass,GA=P.$$.ptr;F.baseClass;)EA=F.upcast(EA),F=F.baseClass;for(;RA.baseClass;)GA=RA.upcast(GA),RA=RA.baseClass;return F===RA&&EA===GA},clone(){if(this.$$.ptr||YA(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var P,F=ji(Object.create(Object.getPrototypeOf(this),{$$:{value:(P=this.$$,{count:P.count,deleteScheduled:P.deleteScheduled,preservePointerOnDelete:P.preservePointerOnDelete,ptr:P.ptr,ptrType:P.ptrType,smartPtr:P.smartPtr,smartPtrType:P.smartPtrType})}}));return F.$$.count.value+=1,F.$$.deleteScheduled=!1,F},delete(){this.$$.ptr||YA(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&wt("Object already scheduled for deletion"),st(this),Te(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)},isDeleted(){return!this.$$.ptr},deleteLater(){return this.$$.ptr||YA(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&wt("Object already scheduled for deletion"),ye.push(this),ye.length===1&&MA&&MA(Xe),this.$$.deleteScheduled=!0,this}}),g.getInheritedInstanceCount=ht,g.getLiveInheritedInstances=ae,g.flushPendingDeletes=Xe,g.setDelayFunction=ot,Object.assign(jn.prototype,{getPointee(P){return this.rawGetPointee&&(P=this.rawGetPointee(P)),P},destructor(P){this.rawDestructor&&this.rawDestructor(P)},argPackAdvance:8,readValueFromPointer:ho,deleteObject(P){P!==null&&P.delete()},fromWireType:Ei}),$r=g.UnboundTypeError=(Yo=Error,(So=sr(Tg="UnboundTypeError",function(P){this.name=Tg,this.message=P;var F=new Error(P).stack;F!==void 0&&(this.stack=this.toString()+` +`+F.replace(/^Error(:[^\n]*)?\n/,""))})).prototype=Object.create(Yo.prototype),So.prototype.constructor=So,So.prototype.toString=function(){return this.message===void 0?this.name:`${this.name}: ${this.message}`},So),Object.assign(hn.prototype,{get(P){return this.allocated[P]},has(P){return this.allocated[P]!==void 0},allocate(P){var F=this.freelist.pop()||this.allocated.length;return this.allocated[F]=P,F},free(P){this.allocated[P]=void 0,this.freelist.push(P)}}),Gi.allocated.push({value:void 0},{value:null},{value:!0},{value:!1}),Gi.reserved=Gi.allocated.length,g.count_emval_handles=nI;var fn,ls={w:(P,F,EA)=>{throw new Ur(P).init(F,EA),P},q:(P,F,EA,RA,GA)=>{},u:(P,F,EA,RA)=>{ar(P,{name:F=Xi(F),fromWireType:function(GA){return!!GA},toWireType:function(GA,WA){return WA?EA:RA},argPackAdvance:8,readValueFromPointer:function(GA){return this.fromWireType(z[GA])},destructorFunction:null})},y:(P,F,EA,RA,GA,WA,Ce,ge,we,_e,Ke,Bt,Rt)=>{Ke=Xi(Ke),WA=ei(GA,WA),ge&&(ge=ei(Ce,ge)),_e&&(_e=ei(we,_e)),Rt=ei(Bt,Rt);var Ye=(nt=>{if(nt===void 0)return"_unknown";var ii=(nt=nt.replace(/[^a-zA-Z0-9_]/g,"$")).charCodeAt(0);return ii>=48&&ii<=57?`_${nt}`:nt})(Ke);((nt,ii,oi)=>{g.hasOwnProperty(nt)?(wt(`Cannot register public name '${nt}' twice`),Lo(g,nt,nt),g.hasOwnProperty(oi)&&wt(`Cannot register multiple overloads of a function with the same number of arguments (${oi})!`),g[nt].overloadTable[oi]=ii):g[nt]=ii})(Ye,function(){jr(`Cannot construct ${Ke} due to unbound types`,[RA])}),Di([P,F,EA],RA?[RA]:[],function(nt){var ii,oi;nt=nt[0],oi=RA?(ii=nt.registeredClass).instancePrototype:Xo.prototype;var Ko=sr(Ke,function(){if(Object.getPrototypeOf(this)!==Kt)throw new no("Use 'new' to construct "+Ke);if(ro.constructor_body===void 0)throw new no(Ke+" has no accessible constructor");var xr=ro.constructor_body[arguments.length];if(xr===void 0)throw new no(`Tried to invoke ctor of ${Ke} with invalid number of parameters (${arguments.length}) - expected (${Object.keys(ro.constructor_body).toString()}) parameters instead!`);return xr.apply(this,arguments)}),Kt=Object.create(oi,{constructor:{value:Ko}});Ko.prototype=Kt;var ro=new Nr(Ke,Ko,Kt,Rt,ii,WA,ge,_e);ro.baseClass&&(ro.baseClass.__derivedClasses===void 0&&(ro.baseClass.__derivedClasses=[]),ro.baseClass.__derivedClasses.push(ro));var ks=new jn(Ke,ro,!0,!1,!1),Zr=new jn(Ke+"*",ro,!1,!1,!1),In=new jn(Ke+" const*",ro,!1,!0,!1);return yt[P]={pointerType:Zr,constPointerType:In},((xr,sI,jo)=>{g.hasOwnProperty(xr)||Ji("Replacing nonexistant public symbol"),g[xr].overloadTable!==void 0&&jo!==void 0?g[xr].overloadTable[jo]=sI:(g[xr]=sI,g[xr].argCount=jo)})(Ye,Ko),[ks,Zr,In]})},x:(P,F,EA,RA,GA,WA)=>{var Ce=Gr(F,EA);GA=ei(RA,GA),Di([],[P],function(ge){var we=`constructor ${(ge=ge[0]).name}`;if(ge.registeredClass.constructor_body===void 0&&(ge.registeredClass.constructor_body=[]),ge.registeredClass.constructor_body[F-1]!==void 0)throw new no(`Cannot register multiple constructors with identical number of parameters (${F-1}) for class '${ge.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);return ge.registeredClass.constructor_body[F-1]=()=>{jr(`Cannot construct ${ge.name} due to unbound types`,Ce)},Di([],Ce,_e=>(_e.splice(1,0,null),ge.registeredClass.constructor_body[F-1]=sn(we,_e,null,GA,WA),[])),[]})},i:(P,F,EA,RA,GA,WA,Ce,ge,we)=>{var _e=Gr(EA,RA);F=(Ke=>{const Bt=(Ke=Ke.trim()).indexOf("(");return Bt!==-1?Ke.substr(0,Bt):Ke})(F=Xi(F)),WA=ei(GA,WA),Di([],[P],function(Ke){var Bt=`${(Ke=Ke[0]).name}.${F}`;function Rt(){jr(`Cannot call ${Bt} due to unbound types`,_e)}F.startsWith("@@")&&(F=Symbol[F.substring(2)]),ge&&Ke.registeredClass.pureVirtualFunctions.push(F);var Ye=Ke.registeredClass.instancePrototype,nt=Ye[F];return nt===void 0||nt.overloadTable===void 0&&nt.className!==Ke.name&&nt.argCount===EA-2?(Rt.argCount=EA-2,Rt.className=Ke.name,Ye[F]=Rt):(Lo(Ye,F,Bt),Ye[F].overloadTable[EA-2]=Rt),Di([],_e,function(ii){var oi=sn(Bt,ii,Ke,WA,Ce);return Ye[F].overloadTable===void 0?(oi.argCount=EA-2,Ye[F]=oi):Ye[F].overloadTable[EA-2]=oi,[]}),[]})},k:(P,F,EA,RA,GA,WA,Ce,ge,we,_e)=>{F=Xi(F),GA=ei(RA,GA),Di([],[P],function(Ke){var Bt=`${(Ke=Ke[0]).name}.${F}`,Rt={get(){jr(`Cannot access ${Bt} due to unbound types`,[EA,Ce])},enumerable:!0,configurable:!0};return Rt.set=we?()=>jr(`Cannot access ${Bt} due to unbound types`,[EA,Ce]):Ye=>wt(Bt+" is a read-only property"),Object.defineProperty(Ke.registeredClass.instancePrototype,F,Rt),Di([],we?[EA,Ce]:[EA],function(Ye){var nt=Ye[0],ii={get(){var Ko=dn(this,Ke,Bt+" getter");return nt.fromWireType(GA(WA,Ko))},enumerable:!0};if(we){we=ei(ge,we);var oi=Ye[1];ii.set=function(Ko){var Kt=dn(this,Ke,Bt+" setter"),ro=[];we(_e,Kt,oi.toWireType(ro,Ko)),$o(ro)}}return Object.defineProperty(Ke.registeredClass.instancePrototype,F,ii),[]}),[]})},t:(P,F)=>{ar(P,{name:F=Xi(F),fromWireType:EA=>{var RA=gr.toValue(EA);return pn(EA),RA},toWireType:(EA,RA)=>gr.toHandle(RA),argPackAdvance:8,readValueFromPointer:gn,destructorFunction:null})},p:(P,F,EA)=>{ar(P,{name:F=Xi(F),fromWireType:RA=>RA,toWireType:(RA,GA)=>GA,argPackAdvance:8,readValueFromPointer:EE(F,EA),destructorFunction:null})},g:(P,F,EA,RA,GA)=>{F=Xi(F);var WA=we=>we;if(RA===0){var Ce=32-8*EA;WA=we=>we<>>Ce}var ge=F.includes("unsigned");ar(P,{name:F,fromWireType:WA,toWireType:ge?function(we,_e){return this.name,_e>>>0}:function(we,_e){return this.name,_e},argPackAdvance:8,readValueFromPointer:Ta(F,EA,RA!==0),destructorFunction:null})},a:(P,F,EA)=>{var RA=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][F];function GA(WA){var Ce=QA[WA>>2],ge=QA[WA+4>>2];return new RA(AA.buffer,ge,Ce)}ar(P,{name:EA=Xi(EA),fromWireType:GA,argPackAdvance:8,readValueFromPointer:GA},{ignoreDuplicateRegistrations:!0})},o:(P,F)=>{var EA=(F=Xi(F))==="std::string";ar(P,{name:F,fromWireType(RA){var GA,WA=QA[RA>>2],Ce=RA+4;if(EA)for(var ge=Ce,we=0;we<=WA;++we){var _e=Ce+we;if(we==WA||z[_e]==0){var Ke=Mc(ge,_e-ge);GA===void 0?GA=Ke:(GA+="\0",GA+=Ke),ge=_e+1}}else{var Bt=new Array(WA);for(we=0;we{for(var Rt=0,Ye=0;Ye=55296&&nt<=57343?(Rt+=4,++Ye):Rt+=3}return Rt})(GA):GA.length;var ge=Po(4+WA+1),we=ge+4;if(QA[ge>>2]=WA,EA&&Ce)((Bt,Rt,Ye,nt)=>{if(!(nt>0))return 0;for(var ii=Ye,oi=Ye+nt-1,Ko=0;Ko=55296&&Kt<=57343&&(Kt=65536+((1023&Kt)<<10)|1023&Bt.charCodeAt(++Ko)),Kt<=127){if(Ye>=oi)break;Rt[Ye++]=Kt}else if(Kt<=2047){if(Ye+1>=oi)break;Rt[Ye++]=192|Kt>>6,Rt[Ye++]=128|63&Kt}else if(Kt<=65535){if(Ye+2>=oi)break;Rt[Ye++]=224|Kt>>12,Rt[Ye++]=128|Kt>>6&63,Rt[Ye++]=128|63&Kt}else{if(Ye+3>=oi)break;Rt[Ye++]=240|Kt>>18,Rt[Ye++]=128|Kt>>12&63,Rt[Ye++]=128|Kt>>6&63,Rt[Ye++]=128|63&Kt}}Rt[Ye]=0})(GA,z,we,WA+1);else if(Ce)for(var _e=0;_e255&&(Mr(we),wt("String has UTF-16 code units that do not fit in 8 bits")),z[we+_e]=Ke}else for(_e=0;_e{var RA,GA,WA,Ce,ge;EA=Xi(EA),F===2?(RA=Fo,GA=$s,Ce=Ha,WA=()=>eA,ge=1):F===4&&(RA=Gs,GA=Ga,Ce=Rr,WA=()=>QA,ge=2),ar(P,{name:EA,fromWireType:we=>{for(var _e,Ke=QA[we>>2],Bt=WA(),Rt=we+4,Ye=0;Ye<=Ke;++Ye){var nt=we+4+Ye*F;if(Ye==Ke||Bt[nt>>ge]==0){var ii=RA(Rt,nt-Rt);_e===void 0?_e=ii:(_e+="\0",_e+=ii),Rt=nt+F}}return Mr(we),_e},toWireType:(we,_e)=>{typeof _e!="string"&&wt(`Cannot pass non-string to C++ string type ${EA}`);var Ke=Ce(_e),Bt=Po(4+Ke+F);return QA[Bt>>2]=Ke>>ge,GA(_e,Bt+4,Ke+F),we!==null&&we.push(Mr,Bt),Bt},argPackAdvance:8,readValueFromPointer:gn,destructorFunction(we){Mr(we)}})},v:(P,F)=>{ar(P,{isVoid:!0,name:F=Xi(F),argPackAdvance:0,fromWireType:()=>{},toWireType:(EA,RA)=>{}})},j:(P,F,EA)=>(P=gr.toValue(P),F=Ia(F,"emval::as"),fo(F,EA,P)),e:(P,F,EA,RA,GA)=>{var WA,Ce;return(P=en[P])(F=gr.toValue(F),F[EA=(Ce=aI[WA=EA])===void 0?Xi(WA):Ce],RA,GA)},d:pn,f:(P,F,EA)=>{var RA=((_e,Ke)=>{for(var Bt=new Array(_e),Rt=0;Rt<_e;++Rt)Bt[Rt]=Ia(QA[Ke+4*Rt>>2],"parameter "+Rt);return Bt})(P,F),GA=RA.shift();P--;var WA,Ce,ge=new Array(P),we=`methodCaller<(${RA.map(_e=>_e.name).join(", ")}) => ${GA.name}>`;return WA=sr(we,(_e,Ke,Bt,Rt)=>{for(var Ye=0,nt=0;nt{P>4&&(Gi.get(P).refcount+=1)},b:P=>{var F=gr.toValue(P);$o(F),pn(P)},h:(P,F)=>{var EA=(P=Ia(P,"_emval_take_value")).readValueFromPointer(F);return gr.toHandle(EA)},m:()=>{Je("")},s:(P,F,EA)=>z.copyWithin(P,F,F+EA),r:P=>{z.length,Je("OOM")},n:(P,F,EA,RA)=>{for(var GA=0,WA=0;WA>2],ge=QA[F+4>>2];F+=8;for(var we=0;we>2]=GA,0}},Or=function(){var P={a:ls};function F(EA,RA){var GA,WA;return Or=EA.exports,m=Or.z,GA=m.buffer,g.HEAP8=AA=new Int8Array(GA),g.HEAP16=sA=new Int16Array(GA),g.HEAPU8=z=new Uint8Array(GA),g.HEAPU16=eA=new Uint16Array(GA),g.HEAP32=X=new Int32Array(GA),g.HEAPU32=QA=new Uint32Array(GA),g.HEAPF32=wA=new Float32Array(GA),g.HEAPF64=HA=new Float64Array(GA),$t=Or.C,WA=Or.A,jA.unshift(WA),function(){if(qe--,g.monitorRunDependencies&&g.monitorRunDependencies(qe),qe==0&&Et){var Ce=Et;Et=null,Ce()}}(),Or}if(qe++,g.monitorRunDependencies&&g.monitorRunDependencies(qe),g.instantiateWasm)try{return g.instantiateWasm(P,F)}catch(EA){v(`Module.instantiateWasm callback failed with error: ${EA}`),s(EA)}return ai(0,$e,P,function(EA){F(EA.instance)}).catch(s),{}}(),Po=P=>(Po=Or.B)(P),Ba=P=>(Ba=Or.D)(P),Mr=P=>(Mr=Or.E)(P),Cs=P=>(Cs=Or.F)(P);g.dynCall_jiji=(P,F,EA,RA,GA)=>(g.dynCall_jiji=Or.G)(P,F,EA,RA,GA),g._vertexShaderSource=10688;function Va(){function P(){fn||(fn=!0,g.calledRun=!0,VA||(Ki(jA),r(g),g.onRuntimeInitialized&&g.onRuntimeInitialized(),function(){if(g.postRun)for(typeof g.postRun=="function"&&(g.postRun=[g.postRun]);g.postRun.length;)Me(g.postRun.shift());Ki(Ve)}()))}qe>0||(function(){if(g.preRun)for(typeof g.preRun=="function"&&(g.preRun=[g.preRun]);g.preRun.length;)Ze(g.preRun.shift());Ki(ue)}(),qe>0||(g.setStatus?(g.setStatus("Running..."),setTimeout(function(){setTimeout(function(){g.setStatus("")},1),P()},1)):P()))}if(Et=function P(){fn||Va(),fn||(Et=P)},g.preInit)for(typeof g.preInit=="function"&&(g.preInit=[g.preInit]);g.preInit.length>0;)g.preInit.pop()();return Va(),i.ready}})(),ZaA=zaA,kK=0,x6=class Y6{constructor(i){this.core=i,wG(this,"seq"),wG(this,"_core"),wG(this,"log"),wG(this,"beautyParams"),kK+=1,this.seq=kK,this._core=i,this.log=i.log.createChild({id:`${this.getAlias()}${kK}`}),this.log.info("created")}getName(){return Y6.Name}getAlias(){return"bb"}getValidateRule(i){switch(i){case"start":case"update":return jaA(this._core);case"stop":return WaA(this._core)}}getGroup(){return"bb"}async start(i){this._core.room.videoManager.Wasm||(this._core.room.videoManager.Wasm=await ZaA()),this._core.room.videoManager.renderMode="webgl";const r=this._core.utils.isUndefined(i.beauty)?.5:i.beauty,s=this._core.utils.isUndefined(i.brightness)?.5:i.brightness,g=this._core.utils.isUndefined(i.ruddy)?.5:i.ruddy;return this._core.room.videoManager.setBeautyParams({beauty:r,brightness:s,ruddy:g})}async update(i){const r=this._core.utils.isUndefined(i.beauty)?.5:i.beauty,s=this._core.utils.isUndefined(i.brightness)?.5:i.brightness,g=this._core.utils.isUndefined(i.ruddy)?.5:i.ruddy;return this._core.room.videoManager.setBeautyParams({beauty:r,brightness:s,ruddy:g})}async stop(){return this._core.room.videoManager.renderMode="auto",this._core.room.videoManager.stopBeauty()}destroy(){this._core.room.videoManager.renderMode="auto"}};wG(x6,"Name","BasicBeauty");var P6=x6,XaA=P6;const $aA=Object.freeze(Object.defineProperty({__proto__:null,BasicBeauty:P6,default:XaA},Symbol.toStringTag,{value:"Module"})),AsA=hk($aA);var esA=Object.defineProperty,tsA=(t,i,r)=>i in t?esA(t,i,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[i]=r,m2=(t,i,r)=>tsA(t,typeof i!="symbol"?i+"":i,r),isA={name:"option",required:!0,properties:{sourceLanguage:{type:"string",required:!0},translationLanguages:{type:["string","array"],required:!1},userIdsToTranscribe:{type:["string","array"],required:!1},transcriberRobotId:{type:"string",required:!1}}},osA={name:"option",required:!0,properties:{transcriberRobotId:{type:"string",required:!0}}},rsA=new Set([2002,4003]),J6=class H6{constructor(i){this.core=i,m2(this,"disableRandomCall",!0),m2(this,"activeTranscriberMap",new Map),m2(this,"_log"),this._log=this.core.log.createChild({id:`${this.getAlias()}`})}getName(){return H6.Name}getAlias(){return"rt-trans"}getGroup(){return"*"}getValidateRule(i){switch(i){case"start":return isA;case"update":return{};case"stop":return osA}}async start(i){var r;const{RtcError:s,ErrorCode:g}=this.core.errorModule;if(!this.core.room.sendSignalMessage)throw new s({code:g.ENV_NOT_SUPPORTED});const{sourceLanguage:B,translationLanguages:Q,userIdsToTranscribe:f="all",transcriberRobotId:m}=i,M=m||`transcriber_${this.core.room.roomId}_robot_${this.core.room.userId}`,v={sdkappid:this.core.room.sdkAppId,roomid:String(this.core.room.roomId),roomType:this.core.room.useStringRoomId?1:0,agentParam:{cdnRobotUserid:M,lifecycleUserid:this.core.room.userId,maxIdletime:30},subscribeParams:{subUsers:[]},asrParams:{lang:B,vadSilenceTime:1e3},translationParams:{mode:1,targetLangs:[""]}};Q&&Q.length>0&&(v.translationParams.mode=1,v.translationParams.targetLangs=Array.isArray(Q)?Q:[Q]),f==="all"?v.subscribeParams.subUsers=[]:Array.isArray(f)?v.subscribeParams.subUsers=f.map(U=>({userId:U,roomType:this.core.room.useStringRoomId?1:0,roomid:String(this.core.room.roomId)})):f&&(v.subscribeParams.subUsers=[{userId:f,roomType:this.core.room.useStringRoomId?1:0,roomid:String(this.core.room.roomId)}]);try{this._log.info(`start_cloud_transcription ${JSON.stringify(v)}`);const U=await this.core.room.sendSignalMessage({command:"start_cloud_transcription",responseCommand:String(8268),data:v,retries:0}),{code:AA,data:z}=U.data;if(AA!==0){const eA=((r=U.data)==null?void 0:r.message)||"";throw this._log.error("start_cloud_transcription failed",{extraCode:AA,reason:eA,data:z}),new s({code:g.SERVER_ERROR,extraCode:AA,message:eA})}const{taskId:sA}=z;if(!sA)throw this._log.error("taskId is required",{data:U.data}),new s({code:g.SERVER_ERROR,message:"taskId is required"});return this.activeTranscriberMap.set(sA,i),this._log.info(`start_cloud_transcription success ${sA}, activeSize: ${this.activeTranscriberMap.size}`),sA}catch(U){throw this._log.error("start_cloud_transcription failed",{error:U}),U}}async update(){}async stop({transcriberRobotId:i}){var r;const{RtcError:s,ErrorCode:g}=this.core.errorModule;if(!this.core.room.sendSignalMessage)throw new s({code:g.ENV_NOT_SUPPORTED});try{const B=await this.core.room.sendSignalMessage({command:"stop_cloud_transcription",responseCommand:String(8270),data:{taskId:i},retries:3});if(B.data.code!==0){const Q=B.data.code,f=((r=B.data)==null?void 0:r.message)||"";if(!rsA.has(Q))throw this._log.error("stop_cloud_transcription failed",{extraCode:Q,reason:f,data:B.data.data}),new s({code:g.SERVER_ERROR,extraCode:Q,message:f});this._log.warn("stop_cloud_transcription ignored error",{extraCode:Q,reason:f,data:B.data.data})}this.activeTranscriberMap.delete(i)}catch(B){throw this._log.error("stop_cloud_transcription failed",{error:B}),B}}destroy(){this.activeTranscriberMap.clear()}};m2(J6,"Name","RealtimeTranscriber");var V6=J6,nsA=V6;const asA=Object.freeze(Object.defineProperty({__proto__:null,RealtimeTranscriber:V6,default:nsA},Symbol.toStringTag,{value:"Module"})),ssA=hk(asA);var gsA=Object.create,pk=Object.defineProperty,IsA=Object.defineProperties,q6=Object.getOwnPropertyDescriptor,csA=Object.getOwnPropertyDescriptors,K6=Object.getOwnPropertyNames,O2=Object.getOwnPropertySymbols,EsA=Object.getPrototypeOf,h3=Object.prototype.hasOwnProperty,j6=Object.prototype.propertyIsEnumerable,wj=(t,i,r)=>i in t?pk(t,i,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[i]=r,cr=(t,i)=>{for(var r in i||(i={}))h3.call(i,r)&&wj(t,r,i[r]);if(O2)for(var r of O2(i))j6.call(i,r)&&wj(t,r,i[r]);return t},lB=(t,i)=>IsA(t,csA(i)),lsA=(t,i)=>{var r={};for(var s in t)h3.call(t,s)&&i.indexOf(s)<0&&(r[s]=t[s]);if(t!=null&&O2)for(var s of O2(t))i.indexOf(s)<0&&j6.call(t,s)&&(r[s]=t[s]);return r},fk=(t,i)=>function(){return i||(0,t[K6(t)[0]])((i={exports:{}}).exports,i),i.exports},p3=(t,i)=>{for(var r in i)pk(t,r,{get:i[r],enumerable:!0})},CsA=(t,i,r,s)=>{if(i&&typeof i=="object"||typeof i=="function")for(let g of K6(i))h3.call(t,g)||g===r||pk(t,g,{get:()=>i[g],enumerable:!(s=q6(i,g))||s.enumerable});return t},Tw=(t,i,r)=>(r=t!=null?gsA(EsA(t)):{},CsA(pk(r,"default",{value:t,enumerable:!0}),t)),ss=(t,i,r,s)=>{for(var g,B=q6(i,r),Q=t.length-1;Q>=0;Q--)(g=t[Q])&&(B=g(i,r,B)||B);return B&&pk(i,r,B),B},OA=(t,i,r)=>wj(t,typeof i!="symbol"?i+"":i,r),mk=fk({"../node_modules/.pnpm/eventemitter3@4.0.7/node_modules/eventemitter3/index.js"(t,i){var r=Object.prototype.hasOwnProperty,s="~";function g(){}function B(M,v,U){this.fn=M,this.context=v,this.once=U||!1}function Q(M,v,U,AA,z){if(typeof U!="function")throw new TypeError("The listener must be a function");var sA=new B(U,AA||M,z),eA=s?s+v:v;return M._events[eA]?M._events[eA].fn?M._events[eA]=[M._events[eA],sA]:M._events[eA].push(sA):(M._events[eA]=sA,M._eventsCount++),M}function f(M,v){--M._eventsCount===0?M._events=new g:delete M._events[v]}function m(){this._events=new g,this._eventsCount=0}Object.create&&(g.prototype=Object.create(null),new g().__proto__||(s=!1)),m.prototype.eventNames=function(){var M,v,U=[];if(this._eventsCount===0)return U;for(v in M=this._events)r.call(M,v)&&U.push(s?v.slice(1):v);return Object.getOwnPropertySymbols?U.concat(Object.getOwnPropertySymbols(M)):U},m.prototype.listeners=function(M){var v=s?s+M:M,U=this._events[v];if(!U)return[];if(U.fn)return[U.fn];for(var AA=0,z=U.length,sA=new Array(z);AA1&&(Q[m[0]]=void 0),Q};t.parseParams=function(Q){return Q.split(/;\s?/).reduce(B,{})},t.parseFmtpConfig=t.parseParams,t.parsePayloads=function(Q){return Q.toString().split(" ").map(Number)},t.parseRemoteCandidates=function(Q){for(var f=[],m=Q.split(" ").map(i),M=0;M=U)return AA;var z=v[M];switch(M+=1,AA){case"%%":return"%";case"%s":return String(z);case"%d":return Number(z);case"%v":return""}})},B=function(m,M,v){var U=[m+"="+(M.format instanceof Function?M.format(M.push?v:v[M.name]):M.format)];if(M.names)for(var AA=0;AA({type:"object",required:i,properties:{canvasColor:{required:!1,type:["string",CanvasGradient,CanvasPattern]},width:{required:!0,type:"number",notLessThanZero:!0,min:1,max:3840},height:{required:!0,type:"number",notLessThanZero:!0,min:1,max:3840},frameRate:{required:!1,type:"number",notLessThanZero:!0,min:1,max:60}},validate(r,s,g){const{RtcError:B,ErrorCode:Q,ErrorCodeDictionary:f}=t.errorModule;if(!r)return;const{width:m,height:M}=r;if(m&&M&&m*M>8294400)throw new B({code:Q.INVALID_PARAMETER,message:"The mix resolution cannot be set higher than 3840 * 2160."})}}),z6=t=>({required:!1,type:["string",HTMLElement,null],validate(i,r,s){const{RtcError:g,ErrorCode:B,ErrorCodeDictionary:Q}=t.errorModule;if(t.utils.isString(i)&&!document.getElementById(i))throw new g({code:B.INVALID_PARAMETER,extraCode:Q.INVALID_ELEMENT_ID,fnName:s,messageParams:{key:r}})}}),Dk=(t,i=!0)=>({type:"object",required:i,properties:cr({},dsA),validate(r,s,g){const{RtcError:B,ErrorCode:Q,ErrorCodeDictionary:f}=t.errorModule;if(r){if(r.fillMode&&!["contain","cover","fill"].includes(r.fillMode))throw new B({code:Q.INVALID_PARAMETER,extraCode:f.INVALID_PARAMETER_TYPE,message:"The fillMode parameter must be 'contain', 'cover' or 'fill'",fnName:g});if(r.rotation&&![0,90,180,270].includes(r.rotation))throw new B({code:Q.INVALID_PARAMETER,extraCode:f.INVALID_PARAMETER_TYPE,message:"The rotation parameter must be 0, 90, 180 or 270",fnName:g})}}}),Z6=t=>({type:"array",required:!1,arrayItem:{type:"object",properties:{id:{required:!0,type:"string"},cameraId:{required:!1,type:"string"},videoTrack:{required:!1,instanceof:MediaStreamTrack},profile:{required:!1,type:["string","object"],properties:{width:{type:"number"},height:{type:"number"},frameRate:{type:"number"},bitrate:{type:"number"}}},layout:cr({},Dk(t))}}}),X6=t=>({type:"array",required:!1,arrayItem:{type:"object",properties:{id:{required:!0,type:"string"},profile:{required:!1,type:["string","object"],properties:{width:{type:"number"},height:{type:"number"},frameRate:{type:"number"},bitrate:{type:"number"}}},captureElement:{required:!1,type:HTMLElement},preferDisplaySurface:{required:!1,type:"string"},layout:cr({},Dk(t))},validate(i,r,s){const{RtcError:g,ErrorCode:B,ErrorCodeDictionary:Q}=t.errorModule;if(!t.rtcDectection.isScreenCaptureApiAvailable())throw new g({code:B.ENV_NOT_SUPPORTED,fnName:s,extraCode:Q.NOT_SUPPORTED_SCREEN_SHARE})}}}),$6=t=>({type:"array",required:!1,arrayItem:{type:"object",properties:{id:{required:!0,type:"string"},content:{required:!0,type:"string"},font:{required:!1,type:"string"},color:{required:!1,type:["string",CanvasGradient,CanvasPattern]},layout:cr({},Dk(t))}}}),A9=t=>({type:"array",required:!1,arrayItem:{type:"object",properties:{id:{required:!0,type:"string"},url:{required:!0,type:"string"},layout:cr({},Dk(t))}}}),e9=t=>({type:"array",required:!1,arrayItem:{type:"object",properties:{id:{required:!0,type:"string"},url:{required:!0,type:"string"},layout:cr({},Dk(t))}}});function hsA(t){return{name:"VideoMixerOptions",type:"object",required:!0,allowEmpty:!1,properties:{view:cr({},z6(t)),canvasInfo:cr({},W6(t,!0)),camera:cr({},Z6(t)),screen:cr({},X6(t)),text:cr({},$6(t)),image:cr({},A9(t)),video:cr({},e9(t))},validate(i,r,s,g){const{RtcError:B,ErrorCode:Q,ErrorCodeDictionary:f}=t.errorModule;if(t.environment.isMobile())throw new B({code:Q.ENV_NOT_SUPPORTED,message:"VideoMixer is not supported on mobile devices currently"});const{onScreenShareStop:m}=i;if(m&&!t.utils.isFunction(m))throw new B({code:Q.INVALID_PARAMETER,extraCode:f.INVALID_PARAMETER_TYPE,fnName:s,messageParams:{key:"onScreenShareStop",value:typeof m,rule:{type:"Function"}}})}}}function psA(t){return{name:"VideoMixerOptions",type:"object",required:!1,allowEmpty:!1,properties:{view:cr({},z6(t)),canvasInfo:cr({},W6(t)),camera:cr({},Z6(t)),screen:cr({},X6(t)),text:cr({},$6(t)),image:cr({},A9(t)),video:cr({},e9(t))}}}function fsA(t){return{name:"StopVideoMixerOptions",required:!1}}var t9=(t=>(t[t.INVALID_PARAMETER=4096]="INVALID_PARAMETER",t[t.INVALID_OPERATION=4097]="INVALID_OPERATION",t[t.NOT_SUPPORTED=4098]="NOT_SUPPORTED",t[t.DEVICE_NOT_FOUND=4099]="DEVICE_NOT_FOUND",t[t.INITIALIZE_FAILED=4100]="INITIALIZE_FAILED",t[t.SIGNAL_CHANNEL_SETUP_FAILED=16385]="SIGNAL_CHANNEL_SETUP_FAILED",t[t.SIGNAL_CHANNEL_ERROR=16386]="SIGNAL_CHANNEL_ERROR",t[t.ICE_TRANSPORT_ERROR=16387]="ICE_TRANSPORT_ERROR",t[t.JOIN_ROOM_FAILED=16388]="JOIN_ROOM_FAILED",t[t.CREATE_OFFER_FAILED=16389]="CREATE_OFFER_FAILED",t[t.SIGNAL_CHANNEL_RECONNECTION_FAILED=16390]="SIGNAL_CHANNEL_RECONNECTION_FAILED",t[t.UPLINK_RECONNECTION_FAILED=16391]="UPLINK_RECONNECTION_FAILED",t[t.DOWNLINK_RECONNECTION_FAILED=16392]="DOWNLINK_RECONNECTION_FAILED",t[t.REMOTE_STREAM_NOT_EXIST=16400]="REMOTE_STREAM_NOT_EXIST",t[t.CLIENT_BANNED=16448]="CLIENT_BANNED",t[t.SERVER_TIMEOUT=16449]="SERVER_TIMEOUT",t[t.SUBSCRIPTION_TIMEOUT=16450]="SUBSCRIPTION_TIMEOUT",t[t.PLAY_NOT_ALLOWED=16451]="PLAY_NOT_ALLOWED",t[t.DEVICE_AUTO_RECOVER_FAILED=16452]="DEVICE_AUTO_RECOVER_FAILED",t[t.START_PUBLISH_CDN_FAILED=16453]="START_PUBLISH_CDN_FAILED",t[t.STOP_PUBLISH_CDN_FAILED=16454]="STOP_PUBLISH_CDN_FAILED",t[t.START_MIX_TRANSCODE_FAILED=16455]="START_MIX_TRANSCODE_FAILED",t[t.STOP_MIX_TRANSCODE_FAILED=16456]="STOP_MIX_TRANSCODE_FAILED",t[t.NOT_SUPPORTED_H264=16457]="NOT_SUPPORTED_H264",t[t.SWITCH_ROLE_FAILED=16458]="SWITCH_ROLE_FAILED",t[t.API_CALL_TIMEOUT=16459]="API_CALL_TIMEOUT",t[t.SCHEDULE_FAILED=16460]="SCHEDULE_FAILED",t[t.API_CALL_ABORTED=16461]="API_CALL_ABORTED",t[t.SPC_INITIALIZED_FAILED=16462]="SPC_INITIALIZED_FAILED",t[t.VIDEO_MANAGER_ERROR=16463]="VIDEO_MANAGER_ERROR",t[t.SWITCH_ROOM_FAILED=16464]="SWITCH_ROOM_FAILED",t[t.VIDEO_ENCODE_FAILED=16465]="VIDEO_ENCODE_FAILED",t[t.AUDIO_ENCODE_FAILED=16466]="AUDIO_ENCODE_FAILED",t[t.UNKNOWN=65535]="UNKNOWN",t))(t9||{}),xa=t9,msA=function(t){for(const i in xa)if(xa[i]===t)return i;return"UNKNOWN"},DsA=class extends Error{constructor({name:t="RtcError",message:i,code:r=xa.UNKNOWN,extraCode:s=0,constraint:g}){const B=`<${msA(r)} 0x${r.toString(16)}>`,Q=`${i}${g?` constraint: ${g}`:""}${i?.includes(B)?"":` ${B}`}`;super(Q),OA(this,"code"),OA(this,"extraCode"),OA(this,"message"),OA(this,"originMessage"),OA(this,"name"),OA(this,"constraint"),this.code=r,this.extraCode=s,this.name=t,this.message=Q,this.constraint=g,this.originMessage=i}getCode(){return this.code}getExtraCode(){return this.extraCode}toString(){return this.originMessage}},Ws=DsA,ysA=0,m3=function(){return Date.now()+ysA},i9=function(){const t=new Date;return t.setTime(m3()),t.toLocaleString()},RsA=function(t){let i=String(t.getMilliseconds());return"padStart"in String.prototype&&(i=i.toString().padStart(3,"0")),`${t.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/,"$1")}:${i}`},MsA={};p3(MsA,{REPORT_TYPE:()=>y9,buildSSOPackage:()=>M3,bytes2ms:()=>AgA,calculateScaleResolutionDownNumber:()=>m9,concatArrayBuffers:()=>RgA,convertObjectNumberToInt:()=>p9,copyProperties:()=>$sA,deepClone:()=>P2,deepCloneBasic:()=>Lj,deepMerge:()=>Q9,delay:()=>Rw,fibonacci:()=>R3,formatedTime:()=>dgA,getConstructorName:()=>ngA,getContainerFromElement:()=>ugA,getEnv:()=>qsA,getFirst16Bits:()=>wgA,getInternalVersion:()=>IgA,getLast16Bits:()=>MgA,getLoggerUrl:()=>D3,getMediaStreamTrackInfo:()=>mgA,getMuteStateFromFlag:()=>u9,getNetworkType:()=>y3,getNumNetworkType:()=>XsA,getReconnectionTimeout:()=>igA,getStringByteLength:()=>hgA,getTestSignalDomain:()=>jsA,getTurnServer:()=>lgA,getUint32Version:()=>h9,getValueType:()=>BD,getViewListFromView:()=>BgA,glog:()=>tgA,ipv4ToUint32:()=>CgA,isArray:()=>dC,isAudioWorkletSupported:()=>agA,isBoolean:()=>rD,isConstructor:()=>B9,isEmpty:()=>EgA,isFunction:()=>oD,isLangChinese:()=>Bp,isMediaStreamTrack:()=>ogA,isNumber:()=>uD,isObject:()=>$m,isOverseaSdkAppId:()=>Y2,isPlainObject:()=>yw,isPortrait:()=>d9,isPromise:()=>C9,isRemoteTrack:()=>rgA,isRotate90Or270:()=>D9,isSetSinkIdSupported:()=>sgA,isString:()=>pC,isUndefined:()=>Fr,isVideoMixerOutputTrack:()=>w3,loadImage:()=>pgA,loadVideo:()=>DgA,ms2bytes:()=>egA,ms2samples:()=>l9,normalizeUrl:()=>fgA,performanceNow:()=>Ns,promiseAny:()=>ggA,samples2ms:()=>E9,setNetworkTypeFromWebRTC:()=>ZsA,stringify:()=>up,stringifyIncludeValue:()=>bj,throttlePromise:()=>f9});var x2="5.0.0",o9=typeof importScripts<"u",r9=typeof registerProcessor<"u",wsA="web.sdk.qcloud.com",Sj=`https://${wsA}/trtc/webrtc/doc`,f5="https://cloud.tencent.com/document/product/647/85386",m5="https://trtc.io/document/56025",SsA="https://yun.tim.qq.com",vsA="https://apisgp.my-imcloud.com",NsA="trtc_error_assistance",n9={LOG:"jssdk_log"},_K={QCLOUD:"qcloud"},iw=(t=>(t[t.TRACE=0]="TRACE",t[t.DEBUG=1]="DEBUG",t[t.INFO=2]="INFO",t[t.WARN=3]="WARN",t[t.ERROR=4]="ERROR",t[t.NONE=5]="NONE",t))(iw||{}),a9={unknown:0,wifi:1,"4g":2,"3g":3,"2g":4,wired:5,"5g":6},TsA=6048e5,GsA={"480p_2":{width:640,height:480,frameRate:15,bitrate:500}},ksA=GsA["480p_2"],gt={CANVAS:"canvas",AUDIO:"audio",VIDEO:"video",SCREEN:"screen",SMALL:"small",BIG:"big",AUXILIARY:"auxiliary",SMALL_VIDEO:"smallVideo",FACING_MODE_USER:"user",FACING_MODE_ENVIRONMENT:"environment",MUTE:"mute",UNMUTE:"unmute",ENDED:"ended",PLAYING:"playing",PAUSE:"pause",ERROR:"error",LOADSTART:"loadstart",LOADEDDATA:"loadeddata",LOADEDMETADATA:"loadedmetadata",AUDIO_INPUT:"audioinput",VIDEO_INPUT:"videoinput",DETAIL:"detail",TEXT:"text",MAIN:"main",BACKUP:"backup",BANNED:"banned",KICK:"kick",USER_TIME_OUT:"user_time_out",ROOM_DISBAND:"room_disband",SEI_MESSAGE:"sei-message",ADD:"add",REMOVE:"remove",REPLACE:"replace",TRACK:"track",SUBSCRIBE:"subscribe",UNSUBSCRIBE:"unsubscribe",TRANSCEIVER_DIRECTION_SENDONLY:"sendonly",TRANSCEIVER_DIRECTION_RECVONLY:"recvonly",ENTER_PICTURE_IN_PICTURE:"enterpictureinpicture",LEAVE_PICTURE_IN_PICTURE:"leavepictureinpicture",FULLSCREEN_CHANGE:"fullscreenchange",RESIZE:"resize",TIME_UPDATE:"timeupdate"},D5=1,_sA=2,bsA=4,y5=8,R5=64,M5=16,LsA=256,VG={PLAYER_ERROR:"player-error",LOAD_WORKLET:"load-worklet",GET_USER_MEDIA_RETRY:"getUserMedia-retry"},FsA="unified-plan",ow=5,s9="default",o2=2e3,g9=["width","height","frameRate","facingMode","sampleRate","sampleSize","channelCount","deviceId","min","max"],UsA={alpha:!0,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0,powerPreference:"low-power"},OsA=function(t,i,r,s){return new(r||(r=Promise))(function(g,B){function Q(M){try{m(s.next(M))}catch(v){B(v)}}function f(M){try{m(s.throw(M))}catch(v){B(v)}}function m(M){var v;M.done?g(M.value):(v=M.value,v instanceof r?v:new r(function(U){U(v)})).then(Q,f)}m((s=s.apply(t,[])).next())})},vj=Symbol(32),Nj=Symbol(16),Tj=Symbol(8),pw=class{constructor(t){this.g=t,this.consumed=0,t&&(this.need=t.next().value)}setG(t){this.g=t,this.demand(t.next().value,!0)}consume(){this.buffer&&this.consumed&&(this.buffer.copyWithin(0,this.consumed),this.buffer=this.buffer.subarray(0,this.buffer.length-this.consumed),this.consumed=0)}demand(t,i){return i&&this.consume(),this.need=t,this.flush()}read(t){return OsA(this,void 0,void 0,function*(){return this.lastReadPromise&&(yield this.lastReadPromise),this.lastReadPromise=new Promise((i,r)=>{var s;this.reject=r,this.resolve=g=>{delete this.lastReadPromise,delete this.resolve,delete this.need,i(g)},this.demand(t,!0)||(s=this.pull)===null||s===void 0||s.call(this,t)})})}readU32(){return this.read(vj)}readU16(){return this.read(Nj)}readU8(){return this.read(Tj)}close(){var t;this.g&&this.g.return(),this.buffer&&this.buffer.subarray(0,0),(t=this.reject)===null||t===void 0||t.call(this,new Error("EOF")),delete this.lastReadPromise}flush(){if(!this.buffer||!this.need)return;let t=null;const i=this.buffer.subarray(this.consumed);let r=0;const s=g=>i.length<(r=g);if(typeof this.need=="number"){if(s(this.need))return;t=i.subarray(0,r)}else if(this.need===vj){if(s(4))return;t=i[0]<<24|i[1]<<16|i[2]<<8|i[3]}else if(this.need===Nj){if(s(2))return;t=i[0]<<8|i[1]}else if(this.need===Tj){if(s(1))return;t=i[0]}else if("buffer"in this.need){if("byteOffset"in this.need){if(s(this.need.byteLength-this.need.byteOffset))return;new Uint8Array(this.need.buffer,this.need.byteOffset).set(i.subarray(0,r)),t=this.need}else if(this.g)return void this.g.throw(new Error("Unsupported type"))}else{if(s(this.need.byteLength))return;new Uint8Array(this.need).set(i.subarray(0,r)),t=this.need}return this.consumed+=r,this.g?this.demand(this.g.next(t).value,!0):this.resolve&&this.resolve(t),t}write(t){if(t instanceof Uint8Array?this.malloc(t.length).set(t):"buffer"in t?this.malloc(t.byteLength).set(new Uint8Array(t.buffer,t.byteOffset,t.byteLength)):this.malloc(t.byteLength).set(new Uint8Array(t)),!this.g&&!this.resolve)return new Promise(i=>this.pull=i);this.flush()}writeU32(t){this.malloc(4).set([t>>24&255,t>>16&255,t>>8&255,255&t]),this.flush()}writeU16(t){this.malloc(2).set([t>>8&255,255&t]),this.flush()}writeU8(t){this.malloc(1)[0]=t,this.flush()}malloc(t){if(this.buffer){const i=this.buffer.length,r=i+t;if(r<=this.buffer.buffer.byteLength-this.buffer.byteOffset)this.buffer=new Uint8Array(this.buffer.buffer,this.buffer.byteOffset,r);else{const s=new Uint8Array(r);s.set(this.buffer),this.buffer=s}return this.buffer.subarray(i,r)}return this.buffer=new Uint8Array(t),this.buffer}};pw.U32=vj,pw.U16=Nj,pw.U8=Tj;var xsA=128;function bK(t){const i=new pw;for(;t>=128;)i.malloc(1)[0]=255&t|xsA,t>>>=7;return i.malloc(1)[0]=255&t,i.buffer||new Uint8Array(0)}function Gj(t,i=0){const r=new pw,s=i<<3;switch(typeof t){case"boolean":const g=r.malloc(2);g[0]=s,g[1]=t?1:0;break;case"number":r.malloc(1)[0]=s,r.write(bK(t));break;case"string":r.malloc(1)[0]=2|s;const B=new TextEncoder().encode(t);r.write(bK(B.length));const Q=r.malloc(B.length);for(let m=0;m>>24&255),this.buffer.push(t>>>16&255),this.buffer.push(t>>>8&255),this.buffer.push(255&t)}writeInt16(t){this.buffer.push(t>>>8&255),this.buffer.push(255&t)}writeByte(t){this.buffer.push(255&t)}writeBytes(t){for(let i=0;i>>24&255,t[r+1]=i>>>16&255,t[r+2]=i>>>8&255,t[r+3]=255&i}function sE(t,i){return t[i]<<24|t[i+1]<<16|t[i+2]<<8|t[i+3]}function v5(t,i){return t[i]}function BG(t,i,r){return new TextDecoder().decode(YsA(t,i,r))}function YsA(t,i,r){return t.slice(i,i+r)}var LK=0,kj=2654435769,_j=16,N5=4,qG=2,KG=7;function PsA(t,i,r,s="AVQualityReportSvc.C2S",g=2e3,B=2,Q=30){return{version:g,encryption:B,d2:"",d2Len:0,uinType:Q,uin:"",uinLen:0,reqHead:{seqNumber:r,appId:t,appidAtThird:new Uint8Array(0),a2:"",a2Len:0,serviceCmd:s,serviceCmdLen:0,cookie:"",cookieLen:0,imei:"",imeiLen:0,ksid:"",ksidLen:0,clientVersionInfo:"",clientVersionInfoLen:0},busiBuff:i}}function JsA(t,i){const r=new w5,s=PsA(i,t,LK);LK=LK+1&2147483647,r.writeInt32(0),r.writeInt32(s.version),r.writeByte(s.encryption);const g=new TextEncoder().encode(s.d2);r.writeInt32(g.length+4),g&&r.writeBytes(g),r.writeByte(s.uinType);const B=new TextEncoder().encode(s.uin);r.writeInt32(B.length+4),B.length&&r.writeBytes(B);const Q=new w5;Q.writeInt32(0),Q.writeInt32(s.reqHead.seqNumber),Q.writeInt32(s.reqHead.appId),Q.writeByte(s.reqHead.appId>>>24&255),Q.writeByte(s.reqHead.appId>>>16&255),Q.writeByte(s.reqHead.appId>>>8&255),Q.writeByte(255&s.reqHead.appId);for(let wA=4;wA<16;wA++)Q.writeByte(0);const f=new TextEncoder().encode(s.reqHead.a2);Q.writeInt32(f.length+4),f.length&&Q.writeBytes(f);const m=new TextEncoder().encode(s.reqHead.serviceCmd);Q.writeInt32(m.length+4),m.length&&Q.writeBytes(m);const M=new TextEncoder().encode(s.reqHead.cookie);Q.writeInt32(M.length+4),M.length&&Q.writeBytes(M);const v=new TextEncoder().encode(s.reqHead.imei);Q.writeInt32(v.length+4),v.length&&Q.writeBytes(v);const U=new TextEncoder().encode(s.reqHead.ksid);Q.writeInt32(U.length+4),U.length&&Q.writeBytes(U);const AA=new TextEncoder().encode(s.reqHead.clientVersionInfo);Q.writeInt16(AA.length+2),AA.length&&Q.writeBytes(AA);const z=Q.length;Q.data[0]=z>>>24&255,Q.data[1]=z>>>16&255,Q.data[2]=z>>>8&255,Q.data[3]=255&z,pC(t)&&(t=new TextEncoder().encode(t)),Q.writeInt32(t.length+4),t.length&&Q.writeBytes(t);let sA=new Uint8Array(Q.data),eA=null;s.encryption===1?eA=new TextEncoder().encode(s.uin):s.encryption===2&&(eA=new Uint8Array(16)),eA&&(sA=HsA(sA,eA)),r.writeBytes(sA);const X=new Uint8Array(r.data),QA=X.length;return X[0]=QA>>>24&255,X[1]=QA>>>16&255,X[2]=QA>>>8&255,X[3]=255&QA,X}function HsA(t,i){const r=t.length;let s=(r+1+qG+KG)%8;s&&(s=8-s);const g=new Uint8Array(r+1+qG+KG+s);let B=0;const Q=new Uint8Array(8),f=new Uint8Array(8),m=new Uint8Array(8);let M=0;Q[0]=248&Math.floor(256*Math.random())|s,M=1;for(let U=0;U>>=0,g+=(B<<4)+Q[0]^B+f^(B>>>5)+Q[1],g>>>=0,B+=(g<<4)+Q[2]^g+f^(g>>>5)+Q[3],B>>>=0;S5(r,g,s),S5(r,B,s+4)}var qsA=function(){return new URLSearchParams(location.search).get("trtc_env")||""},KsA=".rtc.qq.com",jsA=function(t){return t.includes(".")?t:`${t}${KsA}`},Y2=t=>Number(t)<14e8,D3=function(t,i){let r;return r=Y2(t)?vsA:SsA,`${r}/v5/AVQualityReportSvc/C2S?random=${Math.floor(Math.random()*2**31)}&sdkappid=${t}&cmdtype=${i}`},I9="unknown";function y3(){zsA();const{userAgent:t,connection:i}=navigator;let r=(t.match(/NetType\/\S+/)||[])[0]||"";r=r.toLowerCase().replace("nettype/",""),r==="3gnet"&&(r="3g");const s=i&&i.type&&i.type.toLowerCase();let g=i&&i.effectiveType&&i.effectiveType.toLowerCase();return g==="slow-2"&&(g="2g"),s?c9(s,g):I9}function WsA(){qi.warn("netType changed",y3())}var T5=!1;function zsA(){var t;T5||(T5=!0,(t=navigator.connection)==null||t.addEventListener("typechange",WsA))}function c9(t,i){if(a9[t])return t;switch(t){case"cellular":case"wimax":return i||"unknown";case"ethernet":return"wired";default:return"unknown"}}function ZsA(t){I9=c9(t)}function XsA(){return a9[y3()]}function $sA(t,i){for(const r of Reflect.ownKeys(i))if(r!=="constructor"&&r!=="prototype"&&r!=="name"){const s=Object.getOwnPropertyDescriptor(i,r)||"";Object.defineProperty(t,r,s)}return t}function AgA(t,i=48e3){return E9(t/4,i)}function E9(t,i=48e3){return 1e3*t/i}function egA(t,i=48e3){return 4*l9(t,i)}function l9(t,i=48e3){return t*i/1e3}var tgA=typeof window<"u"&&typeof window.glog=="function"?window.glog:()=>{},Bp=()=>{let t=navigator.language;return t=t.substring(0,2),t==="zh"},yw=function(t){if(!t||typeof t!="object"||Object.prototype.toString.call(t)!="[object Object]")return!1;const i=Object.getPrototypeOf(t);if(i===null)return!0;const r=Object.prototype.hasOwnProperty.call(i,"constructor")&&i.constructor;return typeof r=="function"&&r instanceof r&&Function.prototype.toString.call(r)===Function.prototype.toString.call(Object)};function R3(t,i=1,r=1){return t<=1?r:R3(t-1,r,i+r)}function igA(t){return t>8?3e4:1e3*R3(t)}function BD(t){return Reflect.apply(Object.prototype.toString,t,[]).replace(/^\[object\s(\w+)\]$/,"$1").toLowerCase()}var oD=t=>typeof t=="function",Fr=t=>t===void 0,pC=t=>typeof t=="string",uD=t=>typeof t=="number",rD=t=>typeof t=="boolean",$m=t=>BD(t)==="object",dC=t=>BD(t)==="array",ogA=t=>BD(t)==="MediaStreamTrack".toLowerCase(),rgA=t=>t.isRemote,C9=t=>BD(t)==="promise",B9=t=>oD(t)&&t.prototype.constructor===t,ngA=t=>B9(t)?t.prototype.constructor.name:"",agA=typeof AudioWorkletNode<"u",sgA=typeof HTMLMediaElement<"u"&&"setSinkId"in HTMLMediaElement.prototype;function ggA(t){return new Promise((i,r)=>{const s=[];t.forEach(g=>{g.then(i).catch(B=>{s.push(B),s.length===t.length&&r(s)})})})}function Ns(){return performance&&performance.now?Math.floor(performance.now()):Date.now()}var G5=t=>+t<10?`0${t}`:t,IgA=t=>{const i=t.match(/^\d+\.\d+\.\d+/)[0];if(!i)return t;const r=i.split("."),s=G5(r[1])+G5(r[2]);return r[1]-15>0&&(r[1]="15"),r[2]-15>0&&(r[2]="15"),`${r.join(".")}.${s}`},cgA=Object.prototype.hasOwnProperty;function EgA(t){if(t==null)return!0;if(typeof t=="boolean")return!1;if(typeof t=="number")return t===0;if(typeof t=="string"||typeof t=="function"||Array.isArray(t))return t.length===0;if(t instanceof Error)return t.message==="";if(yw(t))switch(Object.prototype.toString.call(t)){case"[object File]":case"[object Map]":case"[object Set]":return t.size===0;case"[object Object]":for(const i in t)if(cgA.call(t,i))return!1;return!0}return!1}function u9(t,i){return{userId:i,hasAudio:!!(t&y5),hasVideo:!!(t&D5),hasAuxiliary:!!(t&bsA),hasSmall:!!(t&_sA),audioMuted:!!(t&R5),videoMuted:!!(t&M5),audioAvailable:!(!(t&y5)||t&R5),videoAvailable:!(!(t&D5)||t&M5),hasDatachannel:!!(t&LsA)}}function lgA(t){const i={urls:t.url.startsWith("turn:")||t.url.startsWith("turns:")?t.url:`turn:${t.url}`};return Fr(t.username)||Fr(t.credential)||(i.username=t.username,i.credential=t.credential,i.credentialType="password",Fr(t.credentialType)||(i.credentialType=t.credentialType)),i}function CgA(t,i=!0){if(!pC(t))return 0;const r=t.split(".");return i?(Number(r[0])<<24|Number(r[1])<<16|Number(r[2])<<8|Number(r[3]))>>>0:(Number(r[3])<<24|Number(r[2])<<16|Number(r[1])<<8|Number(r[0]))>>>0}var Q9=function(t,i,r,s){if(!$m(t)||!$m(i))return 0;let g=0;const B=Object.keys(i);let Q;for(let f=0,m=B.length;f{i[s]=P2(r)}),i}if($m(t)){const i={};return Object.keys(t).forEach(r=>{i[r]=P2(t[r])}),i}return t}var BgA=t=>{let i=[];if(dC(t))i=[...t];else if(pC(t)){const r=document.getElementById(t);r&&i.push(r)}else t&&i.push(t);return i},ugA=t=>pC(t)?document.getElementById(t):t,QgA=t=>{const i=r=>r<10?`0${r}`:`${r}`;return`${t.getFullYear()}/${t.getMonth()+1}/${t.getDate()} ${i(t.getHours())}:${i(t.getMinutes())}:${i(t.getSeconds())}`},dgA=()=>QgA(new Date);function up(t,{keysToInclude:i,keysToExclude:r}){try{if(dC(t))return`[${t.map(Q=>up(Q,{keysToInclude:i,keysToExclude:r})).join(",")}]`;if(!yw(t)||!dC(i)&&!dC(r))return JSON.stringify(t);const s={},g=new Set(i),B=new Set(r);return Object.keys(t).forEach(Q=>{(B.size===0&&g.has(Q)||g.size===0&&!B.has(Q))&&(s[Q]=yw(t[Q])||dC(t[Q])?JSON.parse(up(t[Q],{keysToExclude:r,keysToInclude:i})):t[Q])}),JSON.stringify(s)}catch{return"{}"}}function bj(t,i=!1){const r=[];return Object.keys(t).forEach(s=>{i===t[s]&&r.push(s)}),up(t,{keysToInclude:r})}function hgA(t){return t.replace(/[\u4e00-\u9fa5]/g,"aa").length}var d9=()=>{var t,i,r,s;return(t=window.screen)!=null&&t.orientation?!!((s=(r=(i=window.screen)==null?void 0:i.orientation)==null?void 0:r.type)!=null&&s.includes("portrait")):window.orientation===0||window.orientation===180},pgA=async t=>new Promise((i,r)=>{let s;if(pC(t))s=new Image,s.crossOrigin="anonymous",s.src=t;else if(s=t,s.complete)return void i(s);s.onload=()=>i(s),s.onerror=()=>{r(new Ws({code:xa.INVALID_PARAMETER,message:`load image failed, url: ${t}`}))}}),h9=t=>{const i=t.split(".");return+i[0]<<24|+i[1]<<16|+i[2]<<8|+i[3]},p9=t=>(Object.keys(t).forEach(i=>{uD(t[i])&&(i.startsWith("uint")||i.startsWith("int"))?t[i]=Math.floor(t[i]):(yw(t[i])||dC(t[i]))&&p9(t[i])}),t);function Rw(t,i){return new Promise(r=>{const s=setTimeout(r,t);i&&i(s)})}function f9(t,i){let r=null;return function(...s){return r||(r=t.apply(i||this,s),r.finally(()=>r=null),r)}}function fgA(t){return t.replace(/(^|[^:])\/{2,}/g,"$1/")}function mgA(t){var i;try{const{width:r,height:s,frameRate:g,sampleRate:B,sampleSize:Q,channelCount:f}=(i=t.getSettings)==null?void 0:i.call(t),m=t.kind===gt.AUDIO?`${B}x${Q}@${f}`:`${r}x${s}@${g}`,M=t.stats?` stats: ${JSON.stringify(t.stats).replaceAll('"',"")}`:"";return`${t.id} ${t.readyState} muted:${t.muted} ${t.kind} ${t.label} ${m}${M}`}catch{return""}}function m9(t,i){return t.width*t.height===i.width*i.height?1:d9()&&i.width>i.height&&t.height>i.width?Math.max(t.width/i.height,t.height/i.width,1):Math.max(t.width/i.width,t.height/i.height,1)}function D9(t){return t===90||t===270}async function DgA(t){return new Promise((i,r)=>{const s=document.createElement("video");s.crossOrigin="anonymous",s.src=t,s.muted=!0,s.loop=!0,s.playsInline=!0,s.play().then(()=>i(s)),s.onerror=()=>{r(s.error)}})}function Lj(t,i=new WeakMap){if(typeof t!="object"||t===null)return t;if(i.has(t))return i.get(t);if(Array.isArray(t)){const r=[];return i.set(t,r),t.forEach((s,g)=>{r[g]=Lj(s,i)}),r}if(Object.prototype.toString.call(t)==="[object Object]"){const r={};return i.set(t,r),Reflect.ownKeys(t).forEach(s=>{r[s]=Lj(t[s],i)}),r}return t}var y9=(t=>(t[t.END_REPORT=2001]="END_REPORT",t[t.LOG=2002]="LOG",t[t.KEY_METRIC_REPORT=2003]="KEY_METRIC_REPORT",t))(y9||{});function ygA(t,i,r,s){let g={data:t,random:Math.floor(Math.random()*2147483648),sdkAppId:r};return Fr(s)||(g=lB(cr({},g),{gzip:+s})),{uint32_sdkappid:0,uint64_from_uin:0,uint32_timestamp:0,uint32_seq:0,msg_common_info:{msg_device_info:{enum_device_type:0,str_device_brand:"",str_device_model:"",str_device_board:"",str_device_cpu_abi:""},msg_system_info:{enum_os_type:0,str_os_version:"",msg_network_info:0},msg_network_info:{enum_network_type:0}},msg_report_content:{uint32_type:i,bytes_report_data:JSON.stringify(g)}}}function M3(t,i,r,s){try{const g=ygA(t,i,r,s);return JsA(Gj(g),r)}catch{return JSON.stringify(t)}}function RgA(t,i){const r=new Uint8Array(t.byteLength+i.byteLength);return r.set(new Uint8Array(t),0),r.set(new Uint8Array(i),t.byteLength),r.buffer}function MgA(t){return(65535&t)>>>0}function wgA(t){return(4294901760&t)>>>0}function w3(t){return!!(t&&t instanceof CanvasCaptureMediaStreamTrack&&t.canvas.id.includes("trtc_mix"))}function SgA(t){const i=vgA(t);return i?.busiBuff}function vgA(t){try{const i={};let r=0;i.totalLength=sE(t,r),r+=4,i.version=sE(t,r),r+=4,i.encryption=v5(t,r),r+=1,i.uinType=v5(t,r),r+=1,i.uinLength=sE(t,r),r+=4,i.uin=i.uinLength>4?BG(t,r,i.uinLength-4):"",r+=i.uinLength-4;const s=t.slice(r);if(i.encryption===2){const g=new Uint8Array(16).fill(0);t=NgA(s,g),i.decrypted=!0,r=0}else t=s,r=0;return i.rspHeadLength=sE(t,r),r+=4,i.seqNo=sE(t,r),r+=4,i.retCode=sE(t,r),r+=4,i.retStrLength=sE(t,r),r+=4,i.retStr=i.retStrLength?BG(t,r,i.retStrLength-4):"",r+=i.retStrLength-4,i.serviceCmdLength=sE(t,r),r+=4,i.serviceCmd=i.serviceCmdLength?BG(t,r,i.serviceCmdLength-4):"",r+=i.serviceCmdLength-4,i.cookieLength=sE(t,r),r+=4,i.cookie=i.cookieLength?BG(t,r,i.cookieLength-4):"",r+=i.cookieLength-4,i.flag=sE(t,r),r+=4,i.busiBuffLength=sE(t,r),r+=4,i.busiBuff=i.busiBuffLength?BG(t,r,i.busiBuffLength-4):"",r+=i.busiBuffLength-4,i}catch{}}function R9(t,i){let r=t[0]<<24|t[1]<<16|t[2]<<8|t[3],s=t[4]<<24|t[5]<<16|t[6]<<8|t[7];r>>>=0,s>>>=0;let g=kj*_j>>>0;for(let B=0;B<_j;B++)s-=(r<>>5)+i[3],s>>>=0,r-=(s<>>5)+i[1],r>>>=0,g-=kj,g>>>=0;return new Uint8Array([r>>>24&255,r>>>16&255,r>>>8&255,255&r,s>>>24&255,s>>>16&255,s>>>8&255,255&s])}function NgA(t,i){let r=0;const s=new Uint8Array(8).fill(0);let g=R9(new Uint8Array(t.slice(0,8)),i);const B=7&g[0],Q=t.length-1-B-qG-KG,f=new Uint8Array(Q);let m=0,M=s,v=t.slice(0,8);r=8;let U=1;U+=B;for(let z=1;z<=qG;)if(U<8)U++,z++;else if(U===8){const sA=UK(t,r,M,v,g,i);M=sA.ivPreCrypt,v=sA.ivCurCrypt,g=sA.debiBuf,r=sA.bufPos,U=0}let AA=Q;for(;AA>0;)if(U<8)f[m++]=g[U]^M[U],U++,AA--;else if(U===8){const z=UK(t,r,M,v,g,i);M=z.ivPreCrypt,v=z.ivCurCrypt,g=z.debiBuf,r=z.bufPos,U=0}for(let z=1;z<=KG;)if(U<8)g[U],M[U],U++,z++;else if(U===8){if(r>=t.length)break;const sA=UK(t,r,M,v,g,i);if(!sA.success)break;M=sA.ivPreCrypt,v=sA.ivCurCrypt,g=sA.debiBuf,r=sA.bufPos,U=0}return f}function UK(t,i,r,s,g,B){if(i+8>t.length)return{success:!1};const Q=new Uint8Array(s),f=t.slice(i,i+8),m=new Uint8Array(8);for(let M=0;M<8;M++)m[M]=g[M]^f[M];return{success:!0,ivPreCrypt:Q,ivCurCrypt:f,debiBuf:R9(m,B),bufPos:i+8}}var k5=typeof TextDecoder<"u"?new TextDecoder:void 0;function M9({url:t,body:i,method:r="POST",timeout:s,priority:g}){return new Promise((B,Q)=>{if("fetch"in window)return fetch(t,{method:r,body:i,priority:g}).then(m=>m.clone().json().then(M=>({data:M}),()=>m.arrayBuffer().then(M=>({data:SgA(new Uint8Array(M))||(k5?k5.decode(M):M)})))).then(B,Q);const f=new XMLHttpRequest;f.onreadystatechange=()=>{if(f.readyState===4)if(f.status>=200&&f.status<300)try{const m=JSON.parse(f.response);B({data:m})}catch{B({data:f.response})}else Q({status:f.status,statusText:f.statusText||"request failed!"})},f.timeout=s||5e3,f.open(r,t,!0),f.send(i)})}var TgA=Object.prototype.hasOwnProperty,rw=t=>typeof t=="function",WM=t=>t===void 0,GgA=t=>typeof t=="boolean",OK=t=>t.isRemote,kgA=function(t){if(!t||typeof t!="object"||Object.prototype.toString.call(t)!="[object Object]")return!1;const i=Object.getPrototypeOf(t);if(i===null)return!0;const r=Object.prototype.hasOwnProperty.call(i,"constructor")&&i.constructor;return typeof r=="function"&&r instanceof r&&Function.prototype.toString.call(r)===Function.prototype.toString.call(Object)};function _gA(t){if(t==null)return!0;if(typeof t=="boolean")return!1;if(typeof t=="number")return t===0;if(typeof t=="string"||typeof t=="function"||Array.isArray(t))return t.length===0;if(t instanceof Error)return t.message==="";if(kgA(t))switch(Object.prototype.toString.call(t)){case"[object File]":case"[object Map]":case"[object Set]":return t.size===0;case"[object Object]":for(const i in t)if(TgA.call(t,i))return!1;return!0}return!1}var bgA=0,LgA=1,_5=2;function FgA({retryFunction:t,settings:i,onError:r,onRetrying:s,onRetryFailed:g,onRetrySuccess:B,context:Q}){return function(...f){const{retries:m=5,timeout:M=1e3}=i;let v=0,U=-1,AA=bgA;const z=async(sA,eA)=>{const X=Q||this;try{const QA=await t.apply(X,f);v>0&&B&&B.call(this,v),v=0,sA(QA)}catch(QA){const wA=()=>{clearTimeout(U),v=0,AA=_5,eA(QA)},HA=()=>{AA!==_5&&v<(rw(m)?m():m)?(v++,AA=LgA,rw(s)&&s.call(this,v,wA),U=window.setTimeout(()=>{U=-1,z(sA,eA)},rw(M)?M(v):M)):(wA(),rw(g)&&g.call(this,QA))};rw(r)?r.call(this,{error:QA,retry:HA,reject:eA,retryFuncArgs:f,retriedCount:v}):HA()}};return new Promise(z)}}var S3=FgA,xK=class w9{constructor(i){OA(this,"_parentPath"),OA(this,"userId"),OA(this,"remoteUserId"),OA(this,"id"),OA(this,"sdkAppId"),OA(this,"type"),OA(this,"isLocal"),this.id=i.id,this.userId=i.userId,this.sdkAppId=i.sdkAppId,this.remoteUserId=i.remoteUserId,this.isLocal=!GgA(i.isLocal)||i.isLocal,this.type=this.isLocal?"":i.type}getFullId(){return this._parentPath&&this.id?`${this._parentPath}-${this.id}`:this._parentPath?this._parentPath:this.id}createChild(i){const r=new w9({id:i.id,userId:WM(i.userId)?this.userId:i.userId,sdkAppId:WM(i.sdkAppId)?this.sdkAppId:i.sdkAppId,type:WM(i.type)?this.type:i.type,isLocal:WM(i.isLocal)?this.isLocal:i.isLocal,remoteUserId:WM(i.remoteUserId)?this.remoteUserId:i.remoteUserId});return r.bindParent(this),r}bindParent(i){const r=i.getFullId();this._parentPath!==r&&(this.debug(`bind logger parent: ${i.id}`),this._parentPath=r,this.userId=i.userId||this.userId,this.sdkAppId=i.sdkAppId||this.sdkAppId)}setUserId(i){this.userId=i}setSdkAppId(i){this.sdkAppId=i}log(i,r){const s=this.isLocal?this.userId:this.remoteUserId,g=this.getFullId();r.unshift(`[${this.isLocal?"↑":"↓"}${this.type&&this.type!=="main"?"*":""}${g}${s?`|${s}`:""}]`),qi.log(i,r,WM(this.userId)||_gA(this.userId),this.userId,this.sdkAppId)}info(...i){this.log(2,i)}debug(...i){this.log(1,i)}warn(...i){this.log(3,i)}error(...i){this.log(4,i)}},Fu=typeof navigator>"u"?"":navigator.userAgent,bo=t=>new RegExp(t,"i").test(Fu),cs=t=>{if(bo(t)){const i=new RegExp(`${t}\\/([\\d.]+)`),r=Fu.match(i);if(r&&r[1])return r[1]}return""},mY=t=>{if(bo(t)){const i=new RegExp(`${t}\\/(\\d+)`),r=Fu.match(i);if(r&&r[1])return parseFloat(r[1])}return NaN},b5=/AppleWebKit\/([\d.]+)/i.exec(Fu);b5&&parseFloat(b5[1]);var v3=bo("iPad"),S9=typeof navigator<"u"&&navigator.maxTouchPoints&&navigator.maxTouchPoints>2&&bo("Macintosh"),DY=bo("iPhone")&&!v3,UgA=bo("iPod"),UI=DY||v3||UgA||S9,J2=()=>{try{return UI&&navigator.maxTouchPoints>1&&navigator.vendor.includes("Apple")}catch{return UI}},hl=bo("Android"),v9=function(){if(hl){const t=Fu.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i);if(t){const i=t[1]&&parseFloat(t[1]),r=t[2]&&parseFloat(t[2]);if(i&&r)return parseFloat(`${t[1]}.${t[2]}`);if(i)return i}}return NaN}();hl&&bo("webkit")&&v9<2.3;var Ql=bo("Firefox"),N9=cs("Firefox"),T9=mY("Firefox"),yk=bo("Edge"),G9=cs("Edge"),yY=bo("Edg"),k9=cs("Edg"),OgA=mY("Edg"),N3=bo("SogouMobileBrowser"),_9=cs("SogouMobileBrowser"),T3=bo("MetaSr\\s"),b9=cs("MetaSr\\s"),Id=bo("TBS"),L9=cs("TBS"),Gw=bo("XWEB"),F9=cs("XWEB");bo("MSIE\\s8\\.0");var xgA=bo("MSIE\\/\\d+");(function(){if(xgA){const t=/MSIE\s(\d+)\.\d/.exec(Fu);let i=t&&parseFloat(t[1]);return!i&&/Trident\/7.0/i.test(Fu)&&/rv:11.0/.test(Fu)&&(i=11),i}return NaN})();var Rk=bo("(micromessenger|webbrowser)"),U9=cs("MicroMessenger"),RY=!Id&&bo("MQQBrowser")&&bo("COVC"),MY=!Id&&bo("MQQBrowser")&&!bo("COVC"),H2=MY||RY?cs("MQQBrowser"):"",G3=!Id&&bo(" QQBrowser"),O9=cs(" QQBrowser"),k3=!Id&&bo("QQBrowserLite"),x9=cs("QQBrowserLite"),_3=!Id&&bo("MQBHD"),Y9=cs("MQBHD"),P9=bo("Windows"),wY=!UI&&bo("MAC OS X"),J9=!hl&&bo("Linux"),H9=bo("CrOS");bo("MicroMessenger");var YgA=bo("UCBrowser");bo("Electron");var b3=bo("MiuiBrowser"),V9=cs("MiuiBrowser"),L3=bo("HuaweiBrowser"),q9=bo("Huawei")||bo("HUAWEI"),PgA=bo("Honor")||bo("HONOR"),K9=cs("HuaweiBrowser"),F3=bo("SamsungBrowser"),j9=cs("SamsungBrowser"),SY=bo("HeyTapBrowser"),W9=cs("HeyTapBrowser"),U3=bo("VivoBrowser"),z9=cs("VivoBrowser"),O3=bo("OpenHarmony");cs("OpenHarmony");var Z9=()=>mY("Chrome"),V2=bo("CriOS"),pp=bo("Chrome"),x3=!yk&&!T3&&!N3&&!Id&&!Gw&&!yY&&!G3&&!b3&&!L3&&!F3&&!SY&&!U3&&pp,JgA=bo("HeadlessChrome"),fp=Z9(),YK=pp&&fp>=128&&fp<=143,X9=cs("Chrome");mY("Electron");var IE=!pp&&!MY&&!RY&&!k3&&!_3&&bo("Safari"),$9=IE||UI,Mk=cs("Version"),_u=(()=>{if(S9)return Mk;if(UI){const t=Fu.match(/OS (\d+)_(\d+)/i);if(t&&t[1]){let i=t[1];return t[2]&&(i+=`.${t[2]}`),i}}return""})();function HgA(t,i){const r=t.split(".").map(g=>Number(g)),s=i.split(".").map(g=>Number(g));for(let g=0;gQ)return!1}return!1}function AX(t,i,r=!1){const s=t.split(".").map(B=>Number(B)),g=i.split(".").map(B=>Number(B));for(let B=0;Bf)return!0;if(Q{const t=Number(_u.split(".")[0]);return t===14||t===13})(),KgA=V2&&Mk==="11.1.1",q2=typeof location<"u"&&(location.protocol==="file:"||location.hostname==="localhost"||location.hostname==="127.0.0.1"),zM=(()=>{let t;return()=>{if(t===void 0)try{t=!!window.localStorage}catch{t=!1}return t}})(),nD=jgA();function jgA(){const t=new Map([[Ql,["Firefox",N9]],[yY,["Edg",k9]],[x3,["Chrome",X9]],[V2,["ChiOS",cs("CriOS")]],[IE&&!V2,["Safari",Mk]],[Id,["TBS",L9]],[Gw,["XWEB",F9]],[Rk&&DY,["WeChat",U9]],[G3,["QQ(Win)",O9]],[MY,["QQ(Mobile)",H2]],[RY,["QQ(Mobile X5)",H2]],[k3,["QQ(Mac)",x9]],[_3,["QQ(iPad)",Y9]],[b3,["MI",V9]],[L3,["HW",K9]],[F3,["Samsung",j9]],[SY,["OPPO",W9]],[U3,["VIVO",z9]],[yk,["EDGE",G9]],[N3,["SogouMobile",_9]],[T3,["Sogou",b9]]]);let i="unknown",r="unknown";return t.has(!0)&&([i,r]=t.get(!0)),{name:i,version:r}}function WgA(){return hl||UI||DY||v3||O3}var zgA="";function eX(){return ZgA()||""}function ZgA(){const t=Fu.match(/;\s*([^;)]+)\s+Build\//);return t?.[1]?t[1].trim():null}var L5=new Map([[hl,"Android"],[UI,"iOS"],[P9,"Windows"],[wY,"MacOS"],[J9,"Linux"],[H9,"ChromeOS"]]),tX=function(){return L5.get(!0)?L5.get(!0):"unknown"};function Y3(){return P9?1:hl?2:wY?3:UI?4:J9?5:H9?6:O3?7:0}function XgA(){return Rk||Gw?4:pp?1:IE?2:Ql?3:0}var iX=()=>{let t=tX();return UI?t+=`/${_u}`:hl&&(t+=`/${v9}`),t+=`/${nD.name}/${IE&&!V2?nD.version:nD.version.split(".")[0]}`,t},$gA=Tw(mk()),AIA=new $gA.default,Eo=AIA,oX=(t=>(t.ROOM_DESTROY="1",t.JOIN_START="21",t.JOIN_SCHEDULE_SUCCESS="22",t.JOIN_SIGNAL_CONNECTION_START="23",t.JOIN_SIGNAL_CONNECTION_END="24",t.JOIN_SEND_CMD="25",t.JOIN_RECEIVED_CMD_RES="26",t.JOIN_SUCCESS="27",t.JOIN_FAILED="28",t.LEAVE_START="51",t.LEAVE_SEND_CMD="52",t.LEAVE_SUCCESS="53",t.PUBLISH_START="61",t.SEND_FIRST_VIDEO_FRAME="62",t.PUBLISH_FAILED="63",t.SUBSCRIBE_START="81",t.SUBSCRIBE_SUCCESS="82",t.SUBSCRIBE_FAILED="84",t.UNSUBSCRIBE_SUCCESS="83",t.LOCAL_TRACK_CAPTURE_START="101",t.LOCAL_TRACK_CAPTURE_SUCCESS="102",t.LOCAL_TRACK_CAPTURE_FAILED="103",t.LOCAL_TRACK_PUBLISHED="104",t.LOCAL_TRACK_UNPUBLISHED="105",t.LOCAL_TRACK_REPLACED="106",t.SWITCH_DEVICE_SUCCESS="107",t.TRACK_MUTED="108",t.TRACK_UNMUTED="109",t.REMOTE_TRACK_SUBSCRIBED="110",t.REMOTE_TRACK_UNSUBSCRIBED="111",t.LOCAL_TRACK_RECAPTURE="112",t.LOCAL_AUDIO_STARTED="113",t.LOCAL_AUDIO_STOPPED="114",t.REMOTE_AUDIO_STARTED="115",t.REMOTE_AUDIO_STOPPED="116",t.LOCAL_TRACK_STOPPED="117",t.LOCAL_VIDEO_TRACK_PREPROCESSED="118",t.PLAY_TRACK_START="151",t.PLAYER_STATE_CHANGED="152",t.VIDEO_LOADED_DATA="153",t.AUTOPLAY_DIALOG_CLICK_CONFIRM="154",t.AUDIO_CONTEXT_LONG_SUSPENDED="155",t.REMOTE_VIDEO_PLAY_START="156",t.REMOTE_VIDEO_PLAY_FINISH="157",t.SIGNAL_CONNECTION_STATE_CHANGED="201",t.PEER_CONNECTION_STATE_CHANGED="202",t.SINGLE_CONNECTION_STAT="203",t.SPC_RECONNECTED="204",t.HEARTBEAT_REPORT="251",t.RECEIVED_PUBLISHED_USER_LIST="252",t.REMOTE_PUBLISH_STATE_CHANGED="253",t.AUDIO_LEVEL_INTERVAL="260",t.NETWORK_QUALITY="261",t.VIDEO_CODEC_IMPLEMENTATION_CHANGED="262",t.QUALITY_LIMITATION_CHANGED="263",t.LOG="264",t.AUDIO_PROCESSOR_DEBUG="265",t.SSO_SWITCH="266",t.SEI_MESSAGE="267",t.USER_PAUSE_IN_PIP="268",t.USER_RESUME_IN_PIP="269",t.ENTER_PICTURE_IN_PICTURE="270",t.LEAVE_PICTURE_IN_PICTURE="271",t.SWITCH_ROOM_START="401",t.SWITCH_ROOM_SUCCESS="407",t.SWITCH_ROOM_FAILED="408",t))(oX||{}),nr=oX,eIA=class{constructor(){OA(this,"enable",!1),OA(this,"ssoFailCount",0),Eo.on("22",({schedule:t})=>{var i;(i=t?.config)!=null&&i.sso&&Eo.emit("266",{enable:!0})}),Eo.on("266",({enable:t})=>{this.enable=t})}handleUploadFailed(){this.ssoFailCount++,this.ssoFailCount>3&&Eo.emit("266",{enable:!1})}},Fj=new eIA,tIA="%cTRTC%c%s",iIA="padding: 1px 4px;border-radius: 3px;color: #fff;background: #1E88E5;",oIA="display: inline",rX=class nX{constructor(){OA(this,"_isEnableUploadLog",!0),OA(this,"_localJoinedUser",new Map),OA(this,"_queue",[]),OA(this,"_timeoutId",-1),OA(this,"_logLevel",1),OA(this,"_logLevelToUpload",2),o9||r9||(this.checkURLParam(),this.installEvents())}get isAbleToUpload(){return this._isEnableUploadLog&&this._timeoutId!==-1}installEvents(){Eo.on(nr.JOIN_SCHEDULE_SUCCESS,({schedule:i})=>{var r;(r=i?.config)!=null&&r.logLevelToUpload&&iw[i.config.logLevelToUpload]&&(this._logLevelToUpload=i.config.logLevelToUpload)}),Eo.on(nr.JOIN_START,({params:i})=>{this.addJoinedUser({userId:i.userId,sdkAppId:i.sdkAppId}),this.startUpload()}),Eo.on(nr.LEAVE_SUCCESS,({room:i})=>{this.deleteJoinedUser(i.userId)})}startUpload(){this._timeoutId===-1&&this.uploadInterval()}addJoinedUser(i){this._localJoinedUser.set(i.userId,i),this.startUpload()}deleteJoinedUser(i){this._localJoinedUser.delete(i)}uploadInterval(){this.upload().catch(()=>{}),this._timeoutId=window.setTimeout(()=>this.uploadInterval(),5e3)}getLogsToUpload(){const i={map:new Map,splicedQueue:[]};if(this._queue[0].forAllJoinedClients&&this._localJoinedUser.size===0)return i;let r=0;for(;r{i.map.has(g)?i.map.get(g).logs.push(s):i.map.set(g,{userId:g,sdkAppId:B,logs:[s]})});else if(pC(s.userId)&&uD(s.sdkAppId)){const{userId:g,sdkAppId:B}=s;i.map.has(g)?i.map.get(g).logs.push(s):i.map.set(g,{userId:g,sdkAppId:B,logs:[s]})}}return i.map.size>0&&(i.splicedQueue=this._queue.splice(0,r)),i}async upload(){if(this._queue.length===0||!this._isEnableUploadLog)return;const{map:i,splicedQueue:r}=this.getLogsToUpload();if(i.size===0)return;try{const g=[...i.values()];for(let B=0;BAA.log).join(` +`)},v=JSON.stringify(M),U=Fj.enable?M3(M,2002,f):v;await this.uploadLogWithRetry(U,f,U instanceof Uint8Array,v),m.forEach(AA=>AA.uploaded=!0)}}catch{}const s=r.filter(g=>!g.uploaded);s.length>0&&(this._queue=s.concat(this._queue))}uploadLogWithRetry(i,r,s,g){return S3({retryFunction:()=>M9({url:D3(r,n9.LOG),body:i,timeout:5e3,priority:"low"}).then(B=>{s&&B.data!=="ok"&&(Fj.handleUploadFailed(),this.uploadLogWithRetry(g,r,!1,g))}),settings:{retries:3,timeout:2e3},onError:({retry:B})=>{B()}})()}getPrefix(i){const r=new Date;return r.setTime(m3()),`[${RsA(r)}] <${iw[i]}>`}getLogLevel(){return this._logLevel}setLogLevel(i){Fr(iw[i])||(this._logLevel!==i&&this.info("setLogLevel",i),this._logLevel=i)}enableUploadLog(){this._isEnableUploadLog=!0}disableUploadLog(){this.warn("disableUploadLog"),this._isEnableUploadLog=!1}logChunkToString(i){if(pC(i))return i;try{return i instanceof Error?i.toString():JSON.stringify(i)}catch{return""}}addLogToQueue(i,r,s=!0,g,B){const Q={log:r.reduce((f,m)=>`${f} ${this.logChunkToString(m)}`.trim(),""),level:i,userId:g,sdkAppId:B,forAllJoinedClients:s};Eo.emit(nr.LOG,{log:Q}),this._isEnableUploadLog&&i>=this._logLevelToUpload&&this._queue.push(Q)}log(i,r,s=!0,g,B){var Q;if(r.unshift(this.getPrefix(i)),this.addLogToQueue(i,r,s,g,B),i{const i=16*Math.random()|0;return(t=="x"?i:3&i|8).toString(16)})},aX=nIA,aIA=class{constructor(){OA(this,"_prefix","TRTC"),OA(this,"_queue",new Map)}getRealKey(t){return`${this._prefix}_${t}`}checkStorage(){zM()&&(setInterval(this.doFlush.bind(this),2e4),Object.keys(localStorage).filter(t=>{if(t.startsWith(this._prefix))try{const i=localStorage.getItem(t);if(!i)return!1;const r=JSON.parse(i);if(r&&r.expiresInlocalStorage.removeItem(t)))}doFlush(){if(zM())try{for(const[t,i]of this._queue)localStorage.setItem(t,JSON.stringify(i))}catch(t){qi.warn(t)}}getItem(t){if(!zM())return null;try{const i=localStorage.getItem(this.getRealKey(t));if(!i)return null;const r=JSON.parse(i);return r&&r.expiresIn>=Date.now()?r.value:null}catch(i){qi.warn(i)}}setItem(t,i){if(zM())try{const r={expiresIn:Date.now()+TsA,value:i};this._queue.set(this.getRealKey(t),r)}catch(r){qi.warn(r)}}deleteItem(t){if(!zM())return!1;try{return t=this.getRealKey(t),this._queue.delete(t),localStorage.removeItem(t),!0}catch(i){return qi.warn(i),!1}}clear(){if(zM())try{localStorage.clear()}catch(t){qi.warn(t)}}},sX=new aIA,sIA={};p3(sIA,{HTTPS_API:()=>fIA,IS_GET_CAPABILITIES_FROM_INPUTDEVICE_SUPPORTED:()=>DX,IS_GET_CAPABILITIES_SUPPORTED:()=>mX,IS_GET_SETTINGS_SUPPORTED:()=>W2,IS_GET_SYNCHRONIZATION_SOURCES_SUPPORTED:()=>NIA,IS_INSERTABLE_STREAM_SUPPORTED:()=>yX,IS_JITTER_BUFFER_TARGET_SUPPORTED:()=>LIA,IS_RTC_RTP_SENDER_SUPPORTED:()=>wk,IS_SCRIPT_TRANSFORM_SUPPORTED:()=>RX,IS_SEI_SUPPORTED:()=>TIA,IS_SPC_SUPPORTED:()=>MIA,basis:()=>kIA,capabilityCheck:()=>_IA,checkSystemRequirementsInternal:()=>EX,decodeSupportStatus:()=>cX,detectH264SupportedByFakeStreaming:()=>lX,detectVideoCodecCapabilities:()=>FIA,detectVideoDecoderCapabilities:()=>TX,detectVideoEncoderCapabilities:()=>NX,encodeSupportStatus:()=>V3,getBrowserInfo:()=>CIA,getDisplayResolution:()=>CX,getH264ProfileLevelIds:()=>GX,isAddTransceiverSupported:()=>NY,isBrowserSupported:()=>P3,isCanvasCaptureStreamAPISupported:()=>QX,isCanvasSmallStreamSupported:()=>dX,isGetReceiversSupported:()=>yIA,isGetSendersSupported:()=>fX,isGetTransceiversSupported:()=>RIA,isGetUserMediaSupported:()=>BX,isMediaDevicesSupported:()=>H3,isMediaSessionSupported:()=>wX,isMediaStreamTrackGeneratorSupported:()=>uIA,isMediaStreamTrackProcessorSupported:()=>BIA,isReplaceTrackSupported:()=>SIA,isRequestVideoFrameCallbackSupported:()=>j3,isSIMDSupported:()=>GIA,isScaleResolutionDownBySupported:()=>hX,isScreenCaptureApiAvailable:()=>q3,isSelectedCandidatePair:()=>mIA,isSetParametersSupported:()=>vIA,isSetSinkIdSupported:()=>hIA,isSmallStreamSupported:()=>pX,isStopTransceiverSupported:()=>wIA,isTRTCSupported:()=>dIA,isUnifiedPlanDefault:()=>DIA,isUsedInHttpProtocol:()=>vY,isWebAudioSupported:()=>uX,isWebCodecSupported:()=>MX,isWebCodecsSupported:()=>J3,isWebRTCSupported:()=>K3,isWebTransportSupported:()=>SX});var K2={PLAY_FAILED:"PLAY_FAILED",NOT_SUPPORTED_HTTP:"NOT_SUPPORTED_HTTP",MICROPHONE_NOT_FOUND:"MICROPHONE_NOT_FOUND",CAMERA_NOT_FOUND:"CAMERA_NOT_FOUND"},Iw={AVOID_REPEATED_CALL:t=>`previous ${t.name}() is ongoing, please avoid repeated calls.`,INVALID_PARAMETER_REQUIRED:({key:t,rule:i,fnName:r,value:s})=>`'${t||i.name}' is a required param when calling ${r}(), received: ${s}.`,INVALID_PARAMETER_TYPE({key:t,rule:i,fnName:r,value:s}){const g=`${t||i.name}`;let B="";return B=Array.isArray(i.type)?i.type.join("|"):i.type,`'${g}' must be type of ${B} when calling ${r}(), received type: ${BD(s)}.`},INVALID_PARAMETER_EMPTY:({key:t,rule:i,fnName:r,value:s})=>`'${t||i.name}' cannot be '${s}' when calling ${r}().`,INVALID_PARAMETER_INSTANCE:({key:t,rule:i,fnName:r,value:s})=>`'${`${t||i.name}`}' must be instanceof ${`${i.instanceOf.name||i.instanceOf}`} when calling ${r}(), received type: ${BD(s)}.`,INVALID_PARAMETER_RANGE:({key:t,rule:i,fnName:r,value:s})=>`'${t||i.name}' must be one of ${i.values.join("|")} when calling ${r}(), received: ${s}.`,INVALID_PARAMETER_MIN:({key:t,rule:i,fnName:r,value:s})=>`the min value of ${t||i.name} is ${i.min}, received: ${s}.`,INVALID_PARAMETER_MAX:({key:t,rule:i,fnName:r,value:s})=>`the max value of ${t||i.name} is ${i.max}, received: ${s}.`,API_CALL_TIMEOUT:t=>`${t.commandDesc||t.command} timeout observed.`,SIGNAL_CHANNEL_RECONNECTION_FAILED:"signal channel reconnection failed, please check your network.",SIGNAL_CHANNEL_SETUP_FAILED:t=>`SignalChannel setup failure: (errorCode: ${t.errorCode}, errorMsg: ${t.errorMsg} }).`,ERROR_MESSAGE(t){let i=`${t.type} failed`;return t.message&&(i=`${i}: ${t.message}.`),i},EXCHANGE_SDP_TIMEOUT:"exchange sdp timeout.",DOWNLINK_RECONNECTION_FAILED:"downlink reconnection failed, please check your network and re-join room.",EXCHANGE_SDP_FAILED:t=>`exchange sdp failed ${t.errMsg}.`,UPDATE_OFFER_TIMEOUT:"update offer timeout observed.",UPLINK_RECONNECTION_FAILED:"uplink reconnection failed, please check your network and publish again.",INVALID_RECORDID:"recordId must be an integer number.",INVALID_PURE_AUDIO:"pureAudioPushMode must be 1 or 2.",INVALID_STREAMID:"streamId must be a sting literal within 64 bytes, and not be empty.",INVALID_USER_DEFINE_RECORDID:"userDefineRecordId must be a sting literal contains (a-zA-Z),(0-9), underline and hyphen, within 64 bytes, and not be empty.",INVALID_USER_DEFINE_PUSH_ARGS:"userDefinePushArgs must be a sting literal within 256 bytes, and not be empty.",INVALID_PROXY:'proxy server url must start with "wss://".',INVALID_JOIN:"duplicate join() called.",INVALID_ROOMID_STRING:t=>`'${t}' must be validate string when useStringRoomId is true.`,INVALID_ROOMID_INTEGER:t=>`'${t}' must be an integer between [1, 4294967294] when useStringRoomId is false.`,INVALID_SIGNAL_CHANNEL:"SignalChannel is not ready yet.",JOIN_ROOM_TIMEOUT:"join room timeout.",JOIN_ROOM_FAILED:({error:t,code:i})=>`Failed to join room - ${t} code: ${i}`,REJOIN_ROOM_FAILED:t=>`reJoin room: ${t.roomId} failed, please check your network.`,INVALID_DESTROY:"please call leave() before destroy().",INVALID_PUBLISH:"please call join() before publish().",INVALID_UNPUBLISH:"stream has not been published yet.",INVALID_AUDIENCE:'no permission to publish() under live/audience, please call switchRole("anchor") firstly before publish().',INVALID_INITIALIZE:"cannot publish stream because stream is not initialized, is switching device, or has been closed.",INVALID_DUPLICATE_PUBLISHING:t=>`duplicate ${t} stream publishing, please unpublish your prev ${t} stream and then re-publish.`,INVALID_SUBSCRIBE_UNDEFINED:"stream is undefined or null.",INVALID_SUBSCRIBE_LOCAL:"stream cannot be LocalStream.",INVALID_REMOTE_STREAM:"remoteStream does not exist because it has been unpublished by remote peer.",SUBSCRIBE_FAILED:({message:t,userId:i,streamType:r})=>`failed to subscribe ${i} ${r} stream, reason: ${t}.`,INVALID_ROLE:"switchRole can only be called in live mode.",INVALID_PARAMETER_SWITCH_ROLE:"role could only be set to a value as anchor or audience.",INVALID_OPERATION_SWITCH_ROLE:"please call join() before switchRole().",SWITCH_ROLE_TIMEOUT:"switchRole timeout.",SWITCH_ROLE_FAILED:t=>`switchRole failed, errCode: ${t.code} errMsg: ${t.message}.`,CLIENT_BANNED:t=>`client was banned because of ${t.message}.`,INVALID_OPERATION_START_PUBLISH_CDN:"please call startPublishCDNStream() after join room and publish the local stream.",INVALID_OPERATION_STOP_PUBLISH_CDN:"please call startPublishCDNStream() before stopPublishCDNStream().",START_PUBLISH_CDN_FAILED:t=>`startPublishCDNStream failed, errMsg: ${t.message}.`,STOP_PUBLISH_CDN_FAILED:t=>`stopPublishCDNStream failed, errMsg: ${t.message}.`,INVALID_STREAM_ID:t=>`'${t}' can only consist of uppercase and lowercase english letters (a-zA-Z), numbers (0-9), hyphens and underscores.`,START_MIX_TRANSCODE:"please call startMixTranscode() after join().",STOP_MIX_TRANSCODE:"please call stopMixTranscode() after startMixTranscode().",INVALID_AUDIO_VOLUME:"interval must be a number.",ENABLE_SMALL_STREAM_PUBLISHED:"Cannot enable small stream after localStream published.",DISABLE_SMALL_STREAM_PUBLISHED:"Cannot disable small stream after localStream published.",NOT_SUPPORTED_SMALL_STREAM:"your browser does not support opening small stream.",INVALID_SMALL_STREAM_PROFILE:"small stream profile is invalid.",INVALID_PARAMETER_REMOTE_STREAM:"remoteStream is invalid.",INVALID_OPERATION_CHANGE_SMALL:"cannot switch to the small stream without subscribing to the video of remoteStream.",REMOTE_NOT_PUBLISH_SMALL_STREAM:"remote peer does not publish small stream.",INVALID_SWITCH_DEVICE:"cannot switch device on current stream.",INVALID_SWITCH_DEVICE_PUBLISHING:"cannot switch device when publishing localStream.",INVALID_REPLACE_TRACK:"cannot replace track when publishing localStream.",INVALID_INITIALIZE_LOCAL_STREAM:"local stream has not initialized yet.",INVALID_ADD_TRACK_REPETITIVE:"previous addTrack is ongoing, please avoid repetitive execution.",INVALID_ADD_TRACK_REMOVING:"cannot add track when a track is removing.",INVALID_ADD_TRACK_PUBLISHING:"cannot add track when publishing localStream.",INVALID_STREAM_INITIALIZED:"your local stream haven't been initialized yet.",INVALID_ADD_TRACK_NUMBER:"a Stream has at most one audio track and one video track.",INVALID_REMOVE_AUDIO_TRACK:"remove audio track is not supported on your browser.",INVALID_REMOVE_AUDIO_ADDING:"cannot remove track when a track is adding.",INVALID_REMOVE_AUDIO_ON:"previous removeTrack is ongoing, please avoid repetitive execution.",INVALID_REMOVE_TRACK_PUBLISHING:"cannot remove track when publishing localStream.",INVALID_REMOVE_TRACK_NOT_TRACK:"localStream has not this track.",INVALID_REMOVE_TRACK_NUMBER:"remove the only video track is not supported, please use replaceTrack or muteVideo.",INVALID_REPLACE_TRACK_NO_TRACK:t=>`cannot replace ${t.kind} track because stream has not ${t.kind} track`,NOT_BUG_PACKAGE:"You need to buy packages, refer to tencent console.",START_MIX_TRANSCODE_FAILED:t=>`startMixTranscode failed, errMsg: ${t.message}.`,STOP_MIX_TRANSCODE_FAILED:t=>`stopMixTranscode failed, errMsg: ${t.message}.`,MIX_TRANSCODE_NOT_STARTED:"mixTranscode has not been started.",CANNOT_LESS_THAN_ZERO:({key:t,rule:i,fnName:r,value:s})=>`'${t||i.name}' cannot be less than 0 when calling ${r}().`,MIX_PARAMS_VIDEO_FRAMERATE:"'config.videoFramerate' should be an integer between 0 and 30, excluding 0.",MIX_PARAMS_VIDEO_GOP:"'config.videoGOP' should be an integer between 1 and 8.",MIX_PARAMS_AUDIO_BITRATE:"'config.audioBitrate' should be an integer between 32 and 192.",MIX_PARAMS_USER_Z_ORDER:t=>`'${t}' is required and must be between 1 and 15.`,MIX_PARAMS_NOT_SELF:"'config.mixUsers' must contain self.",MIX_PARAMS_USER_STREAM:"'config.videoWidth' and 'config.videoHeight' of output stream should be contain all mix stream.",INVALID_PLAY:"duplicate play() call observed, please stop() firstly.",INVALID_ELEMENT_ID:({key:t,fnName:i})=>`'${t}' is not found in the document object when calling ${i}().`,INVALID_ELEMENT_ID_TYPE:({key:t,fnName:i,type:r})=>`the element corresponding to '${t}' must be instanceof HTMLElement when calling ${i}(), received: ${r}.`,PLAY_FAILED:t=>`${t.media} play failed, browser exception: ${t.error.toString()}`,INVALID_USERID:"userId cannot be all spaces.",INVALID_CREATE_STREAM_SOURCE:"LocalStream must be created by createStream() with either audio/video or audioSource/videoSource, but can not be mixed with audio/video and audioSource/videoSource.",INVALID_CREATE_STREAM_SCREEN:"screen/video cannot be both true.",INVALID_CREATE_STREAM_AUDIO:"audio/screenAudio cannot be both true.",INVALID_CREATE_STREAM_SCREEN_AUDIO:"when screen is true, screenAudio can be configured.",NOT_SUPPORTED_HTTP:"http protocol does not support the ability to capture microphone, camera and screen. please use https to deploy your page.",NOT_SUPPORTED_WEBRTC:"your browser or environment does not support full WebRTC capabilities.",NOT_SUPPORTED_PROFILE:"your browser does not support setVideoProfile.",NOT_SUPPORTED_MEDIA:"your browser or environment does not support navigator.mediaDevices.",NOT_SUPPORTED_H264ENCODE:"your device does not support H.264 encoding.",NOT_SUPPORTED_H264DECODE:"your device does not support H.264 decoding.",NOT_SUPPORTED_TRACK:t=>`${t}Track is not supported on your browser.`,NOT_SUPPORTED_SWITCH_DEVICE:"switchDevice is not supported on your browser.",NOT_SUPPORTED_CAPTURE:"Your browser or environment does not support screen sharing, please check whether the browser version.",MICROPHONE_NOT_FOUND:"no microphone detected, please check your microphone.",CAMERA_NOT_FOUND:"no camera detected, please check your camera.",SIGNAL_RESPONSE_FAILED:t=>`${t.signalResponse} failed, response code is ${t.code} , errMsg: ${t.message}.`,CATCH_HANDLER_ERROR:({name:t,event:i})=>`an error was caught in ${t}.on('${i}', handler), please check your code in 'handler'.`,API_NOT_EXIST:({name:t})=>`experimental api ${t} does not exist.`,REPEAT_JOIN:t=>"please avoid repeated join.",CONNECTION_CLOSED:"remoteStream has been unsubscribed or unpublished by remote user.",SUBSCRIBE_ALL_FALSE:"cannot subscribe when both audio & video are false, use client.unsubscribe() instead",CLIENT_DESTROYED:({funName:t})=>`failed to call ${t}() because client was destroyed.`,SEI_NOT_SUPPORT:t=>"not support to sendSEIMessage"+(t===!1?" without using h264 codec":""),SEI_DISABLED:"SEI is disabled",SEI_BEFORE_PUBLISH:"please call sendSEIMessage() after publish() success",SEI_NOT_VIDEO:"cannot send sei when localStream has not video.",CALL_FREQUENCY_LIMIT:({isSize:t,name:i,timesInSecond:r,maxSizeInSecond:s})=>`api ${i} call ${t?"size":"times"} is over ${t?`${s} bytes`:r} in a second.`,CONNECTION_ABORTED:t=>`connection aborted due to: ${t}`,API_CALL_ABORTED(t){let i;return i=t.message.includes("REMOTE_STREAM_NOT_EXIST")?`Subscribe ${t.userId} ${t.streamType} stream aborted, reason: remote user ${t.userId} unpublished stream.`:`API aborted, reason: ${t.message}`,i},DUPLICATE_AUX:"only one auxiliary stream can be published in a room.",NOT_SUPPORTED_AUX:"publish auxiliary stream is not supported on your browser.",INVALID_PARAMETER_STREAMTYPE:t=>`'streamType' is required when 'userId' is not '*', calling ${t}()`,SWITCH_PLAYBACK_QUALITY_TIMEOUT:t=>`switchPlaybackQuality timeout: waiting for first frame of user ${t.userId}.`},F5=(t,i)=>i?`${Sj}/${t}/${i}`:`${Sj}/${t}/index.html`,gIA=()=>{if(window.TRTC_ERROR_INFO&&window.TRTC_ERROR_LINK)return{TRTC_ERROR_INFO:window.TRTC_ERROR_INFO,TRTC_ERROR_LINK:window.TRTC_ERROR_LINK};let t=localStorage==null?void 0:localStorage.getItem(NsA);if(t){t=JSON.parse(t);const i=document.createElement("script");i.type="text/javascript",i.text=t.message,document.body.appendChild(i);const r=window.TRTC_ERROR_INFO,s=window.TRTC_ERROR_LINK;return document.body.removeChild(i),{TRTC_ERROR_INFO:r,TRTC_ERROR_LINK:s}}return{}};function j2(t){const{key:i,data:r,link:s,addDocLink:g=!0}=t;let B="",Q="",f="";oD(Iw[i])?B=Iw[i](r):pC(Iw[i])&&(B=Iw[i]);const{TRTC_ERROR_INFO:m,TRTC_ERROR_LINK:M}=gIA();s?f=`${s.className}.html#${s.fnName}`:M&&M[i]&&(oD(M[i])?f=M[i](r):pC(M[i])&&(f=M[i]));let v=B;return Bp()&&(m&&m[i]&&(oD(m[i])?Q=m[i](r):pC(m[i])&&(Q=m[i])),Q&&(v=g?`${Q} +请查看文档: ${F5("zh-cn",f)} + +`:`${Q} + +`,v+=B)),g&&(v+=` +Refer to: ${F5("en",f)} +`),v}var U5=Tw(QsA()),IIA=1,cIA=0,gX=class{constructor(t=!0){OA(this,"countMap",new Map),OA(this,"distributionMap",new Map),OA(this,"version"),OA(this,"log",qi.createLogger({id:"kv"})),t&&(Eo.on("102",({track:i,cost:r})=>{this.addSuccessEvent({key:i.kind===gt.AUDIO?501700:511700,cost:r})}),Eo.on("103",({track:i,error:r})=>{this.addFailedEvent({key:i.kind===gt.AUDIO?501700:511700,error:r})}),Eo.on("266",({enable:i})=>{this.log.info((i?"enable":"disable")+" sso"),i?this.addSuccessEvent({key:525701}):this.addFailedEvent({key:525701})}))}getReportData(t,i){const r={msg_sdk_basic_info:{uint32_sdk_version:h9(this.version||x2),uint32_terminal_type:15,bytes_device_name:"",bytes_os_version:"",uint32_framework:30,uint32_network_type:0},stats_count:[...this.countMap.entries()].map(([s,g])=>({uint32_key:s,uint32_count:g})),stats_distribution:[...this.distributionMap.entries()].map(([s,g])=>({uint32_key:s,distribution_items:[...g.entries()].map(([B,Q])=>({uint32_item_key:B,uint32_item_value:Q}))})),str_user_sig:t,bytes_report_token:i};return this.countMap.clear(),this.distributionMap.clear(),r}clear(){this.countMap.clear(),this.distributionMap.clear()}isEnumKey(t){const i=+String(t).slice(-3);return i>=700&&i<799}isErrorCodeKey(t){const i=+String(t).slice(-3);return i>=600&&i<699}isCountKey(t){const i=+String(t).slice(-3);return i>=0&&i<599}isNumberKey(t){const i=+String(t).slice(-3);return i>=800&&i<899}addCount({key:t,useUV:i=!1}){this.isCountKey(t)?i&&this.countMap.has(t)||this.countMap.set(t,(this.countMap.get(t)||0)+1):this.log.debug(`${t} is not count key, last 3 number should be 0~599`)}addEnum({key:t,value:i,useUV:r=!0}){var s;if(!this.isEnumKey(t))return this.log.debug(`${t} is not enum key, last 3 number should be 700~799`);if(r&&this.countMap.has(t))return;this.countMap.set(t,(this.countMap.get(t)||0)+1);const g=((s=this.distributionMap)==null?void 0:s.get(t))||new Map;g.set(i,(g.get(i)||0)+1),this.distributionMap.set(t,g)}addNumber({key:t,value:i,split:r=100,useUV:s=!1,max:g=5e3}){var B;if(!this.isNumberKey(t))return this.log.debug(`${t} is not number key, last 3 number should be 800~899`);if(s&&this.countMap.has(t))return;i>g&&(i=g),this.countMap.set(t,(this.countMap.get(t)||0)+1);const Q=((B=this.distributionMap)==null?void 0:B.get(t))||new Map;let f=0;if(uD(r))f=Math.floor(i/r);else for(let m=r.length-1;m>0;m--)if(i>r[m]){f=m;break}Q.set(f,(Q.get(f)||0)+1),this.distributionMap.set(t,Q)}addSuccessEvent({key:t,cost:i,timeKey:r,split:s}){if(t&&(this.addEnum({key:t,value:IIA,useUV:!1}),i)){const g=+String(t).slice(-3);g<800&&g>=700?this.addNumber({key:r||t+100,value:i,split:s}):r||this.log.debug(`time stat ignored, ${t}`)}}addFailedEvent({key:t,error:i}){if(!t)return;let r=xa.UNKNOWN;i&&(uD(i)?r=i:Fr(i.extraCode)&&Fr(i.code)||(r=i.extraCode||i.code)),this.addEnum({key:t,value:cIA,useUV:!1}),this.addEnum({key:t,value:Math.abs(r),useUV:!1})}},IX=(t=>(t[t.DECODER_TYPE=514700]="DECODER_TYPE",t[t.DECODER_HW_SW=514701]="DECODER_HW_SW",t[t.DECODE_RESULT=514702]="DECODE_RESULT",t[t.DECODE_FAILED_OS=514703]="DECODE_FAILED_OS",t[t.DOWNGRADE_RESULT=514704]="DOWNGRADE_RESULT",t[t.DOWNGRADE_WEBCODECS_VIDEO=514705]="DOWNGRADE_WEBCODECS_VIDEO",t[t.DOWNGRADE_WEBCODECS_2D=514706]="DOWNGRADE_WEBCODECS_2D",t[t.DOWNGRADE_WASM_WEGBL=514707]="DOWNGRADE_WASM_WEGBL",t[t.DOWNGRADE_WASM_VIDEO=514708]="DOWNGRADE_WASM_VIDEO",t[t.DOWNGRADE_WASM_2D=514709]="DOWNGRADE_WASM_2D",t[t.DECODE_H264_RESULT=514710]="DECODE_H264_RESULT",t[t.DECODE_H265_RESULT=514711]="DECODE_H265_RESULT",t[t.DECODE_VP8_RESULT=514712]="DECODE_VP8_RESULT",t[t.DECODE_CAPABILITIES=514713]="DECODE_CAPABILITIES",t[t.H264_PROFILE_LEVEL_ID_HIGH=514714]="H264_PROFILE_LEVEL_ID_HIGH",t[t.H264_PROFILE_LEVEL_ID_MAIN=514715]="H264_PROFILE_LEVEL_ID_MAIN",t[t.RENDER_FREEZE_RATE=514850]="RENDER_FREEZE_RATE",t[t.DATA_FREEZE_RATE=514851]="DATA_FREEZE_RATE",t[t.VIDEO_CONSUME_RENDER_RATE=514852]="VIDEO_CONSUME_RENDER_RATE",t))(IX||{}),EIA=new gX(!0);new gX(!1);var qr=EIA,Oo={result:!1,detail:{isBrowserSupported:!1,isWebRTCSupported:!1,isWebCodecsSupported:!1,isMediaDevicesSupported:!1,isScreenShareSupported:!1,isSmallStreamSupported:!1,isH264EncodeSupported:!1,isVp8EncodeSupported:!1,isH265EncodeSupported:!1,isH264DecodeSupported:!1,isVp8DecodeSupported:!1,isH265DecodeSupported:!1}},lIA=new Map([[Ql,["Firefox",N9]],[yY,["Edg",k9]],[x3,["Chrome",X9]],[IE,["Safari",Mk]],[Id,["TBS",L9]],[Gw,["XWEB",F9]],[Rk&&DY,["WeChat",U9]],[G3,["QQ(Win)",O9]],[MY,["QQ(Mobile)",H2]],[RY,["QQ(Mobile X5)",H2]],[k3,["QQ(Mac)",x9]],[_3,["QQ(iPad)",Y9]],[b3,["MI",V9]],[L3,["HW",K9]],[F3,["Samsung",j9]],[SY,["OPPO",W9]],[U3,["VIVO",z9]],[yk,["EDGE",G9]],[N3,["SogouMobile",_9]],[T3,["Sogou",b9]]]);function CIA(){const t=lIA.get(!0);return{browserName:t?t[0]:"unknown",browserVersion:t?t[1]:"unknown"}}var P3=function(){return!YgA&&!yk&&!(yY&&OgA<80)&&!(Ql&&T9<56)},J3=function(){return["VideoDecoder","VideoEncoder","AudioEncoder","AudioDecoder"].every(t=>t in window)},H3=function(){if(!navigator.mediaDevices)return vY()||qi.error(Iw.NOT_SUPPORTED_MEDIA),!1;const t=["getUserMedia","enumerateDevices"];return t.filter(i=>i in navigator.mediaDevices).length===t.length},O5=!1;function vY(){return location.protocol==="http:"&&!q2&&(O5||qi.error(j2({key:K2.NOT_SUPPORTED_HTTP})),O5=!0,!0)}var BIA=function(){return window?.OffscreenCanvas&&window?.MediaStreamTrackProcessor&&window?.MediaStreamTrackGenerator},uIA=function(){return!!window?.MediaStreamTrackGenerator},V3=async function(){var t,i,r;if(Oo.detail.isH264EncodeSupported&&Oo.detail.isVp8EncodeSupported)return{isH264EncodeSupported:Oo.detail.isH264EncodeSupported,isVp8EncodeSupported:Oo.detail.isVp8EncodeSupported,isH265EncodeSupported:Oo.detail.isH265EncodeSupported};let s,g=!1,B=!1,Q=!1;try{const f=new RTCPeerConnection,m=document.createElement(gt.CANVAS);m.getContext("2d");const M=m.captureStream(0);return f.addTrack(M.getVideoTracks()[0],M),s=await f.createOffer(),g=((t=s.sdp)==null?void 0:t.toLowerCase().indexOf("h264"))!==-1,B=((i=s.sdp)==null?void 0:i.toLowerCase().indexOf("vp8"))!==-1,Q=((r=s.sdp)==null?void 0:r.toLowerCase().indexOf("h265"))!==-1,f.close(),{isH264EncodeSupported:g,isVp8EncodeSupported:B,isH265EncodeSupported:Q}}catch{return{isH264EncodeSupported:!1,isVp8EncodeSupported:!1,isH265EncodeSupported:!1}}},cX=async function(){var t;if(Oo.detail.isH264DecodeSupported&&Oo.detail.isVp8DecodeSupported)return{isH264DecodeSupported:Oo.detail.isH264DecodeSupported,isVp8DecodeSupported:Oo.detail.isVp8DecodeSupported,isH265DecodeSupported:Oo.detail.isH265DecodeSupported};let i,r=!1,s=!1;try{const g=new RTCPeerConnection;NY()?(g.addTransceiver(gt.VIDEO,{direction:"recvonly"}),i=await g.createOffer()):i=await g.createOffer({offerToReceiveVideo:!0}),i.sdp.toLowerCase().indexOf("h264")!==-1&&(r=!0),i.sdp.toLowerCase().indexOf("vp8")!==-1&&(s=!0);const B=((t=i.sdp)==null?void 0:t.toLowerCase().indexOf("h265"))!==-1;return g.close(),{isH264DecodeSupported:r,isVp8DecodeSupported:s,isH265DecodeSupported:B}}catch{return{isH264DecodeSupported:!1,isVp8DecodeSupported:!1,isH265DecodeSupported:!1}}};async function QIA(){const[t,i]=await Promise.all([V3(),cX()]);return{encode:{h264:t.isH264EncodeSupported,vp8:t.isVp8EncodeSupported,h265:t.isH265EncodeSupported},decode:{h264:i.isH264DecodeSupported,vp8:i.isVp8DecodeSupported,h265:i.isH265DecodeSupported}}}var EX=f9(async t=>{const i=Date.now(),r=K3(),s=H3(),g=J3();if(Oo.detail.isWebRTCSupported=r,Oo.detail.isMediaDevicesSupported=s,Oo.detail.isWebCodecsSupported=g,Oo.detail.isScreenShareSupported=q3(),Oo.detail.isSmallStreamSupported=pX(),t===37)return Object.assign(Oo.detail,await pIA()),Oo.detail.isBrowserSupported=g,Oo.result=s&&g,Oo.result||qi.error(`${navigator.userAgent} ${bj(Oo.detail,!1)}`),P5(t),qr.addNumber({key:523800,value:Date.now()-i}),Oo;if(Oo.result&&Oo.detail.isH264EncodeSupported&&Oo.detail.isVp8EncodeSupported&&Oo.detail.isH265EncodeSupported&&Oo.detail.isH264DecodeSupported&&Oo.detail.isVp8DecodeSupported&&Oo.detail.isH265DecodeSupported)return Oo;const B=P3(),{encode:Q,decode:f}=await QIA();let{h264:m,vp8:M}=Q,{h264:v}=f;const{h265:U}=Q,{vp8:AA,h265:z}=f;if(!m||!M){const sA=await V3();qi.warn(`detect encode again h264:${m} vp8:${M} result: ${JSON.stringify(sA)}`),m=sA.isH264EncodeSupported,M=sA.isVp8EncodeSupported}if(m&&v&&hl&&pp&&!Gw&&!Id&&(!SY||fp!==115)){const{encode:sA,decode:eA}=await lX();m=sA,v=eA}return Oo.result=B&&r&&s&&(m||M)&&(v||AA),Oo.detail.isBrowserSupported=B,Oo.detail.isWebRTCSupported=r,Oo.detail.isH264EncodeSupported=m,Oo.detail.isVp8EncodeSupported=M,Oo.detail.isH265EncodeSupported=U,Oo.detail.isH264DecodeSupported=v,Oo.detail.isVp8DecodeSupported=AA,Oo.detail.isH265DecodeSupported=z,Oo.result||qi.error(`${navigator.userAgent} ${bj(Oo.detail,!1)}`),P5(),qr.addNumber({key:523800,value:Date.now()-i}),Oo}),dIA=function(){return Oo.result},q3=function(){return!(!navigator.mediaDevices||!navigator.mediaDevices.getDisplayMedia)},hIA=typeof HTMLMediaElement<"u"&&"setSinkId"in HTMLMediaElement.prototype,x5=null;async function lX(t=2e3){return x5||(x5=new Promise(async i=>{const r={encode:!1,decode:!1};let s=()=>{};try{const g=document.createElement("canvas"),B=g.getContext("2d");g.width=640,g.height=480;const Q=setInterval(()=>{B.fillText("test",Math.floor(640*Math.random()),Math.floor(480*Math.random()))},66);let f=-1,m=-1;s=()=>{clearInterval(f),clearInterval(Q),clearTimeout(m),v.close(),U.close(),M.getTracks().forEach(X=>X.stop())},m=setTimeout(()=>{s(),i(r)},t);const M=g.captureStream(),v=new RTCPeerConnection({}),U=new RTCPeerConnection({offerToReceiveAudio:!0,offerToReceiveVideo:!0});v.addEventListener("icecandidate",X=>U.addIceCandidate(X.candidate)),U.addEventListener("icecandidate",X=>v.addIceCandidate(X.candidate)),v.addTrack(M.getVideoTracks()[0],M);const AA=await v.createOffer();await v.setLocalDescription(AA),await U.setRemoteDescription(AA);const z=await U.createAnswer(),sA=U5.default.parse(z.sdp),eA=sA.media[0].rtp.findIndex(X=>X.codec==="H264");sA.media[0].rtp=[sA.media[0].rtp[eA]],sA.media[0].fmtp=sA.media[0].fmtp.filter(X=>X.payload===sA.media[0].rtp[0].payload),sA.media[0].rtcpFb&&(sA.media[0].rtcpFb=sA.media[0].rtcpFb.filter(X=>X.payload===sA.media[0].rtp[0].payload)),z.sdp=U5.default.write(sA),await U.setLocalDescription(z),await v.setRemoteDescription(z),f=setInterval(async()=>{r.encode&&r.decode&&(s(),i(r));const[X,QA]=await Promise.all([v.getSenders()[0].getStats(),U.getReceivers()[0].getStats()]);r.encode||X.forEach(wA=>{wA.type==="outbound-rtp"&&(wA.mediaType===gt.VIDEO||wA.kind===gt.VIDEO)&&wA.bytesSent>0&&(r.encode=!0)}),r.decode||QA.forEach(wA=>{wA.type==="inbound-rtp"&&(wA.mediaType===gt.VIDEO||wA.kind===gt.VIDEO)&&wA.bytesReceived>0&&(r.decode=!0)})},100)}catch(g){s(),qi.warn("detectH264Supported failed",g),i({encode:!0,decode:!0})}}).then(i=>(i.encode||(i.decode=!0),i.encode&&i.decode||qi.warn(`detectH264Supported encode: ${i.encode} decode: ${i.decode} ${zgA}`),i)))}var Y5=null;async function pIA(){return Y5||(Y5=new Promise(async t=>{const i={isH264EncodeSupported:!1,isH264DecodeSupported:!1,isVp8EncodeSupported:!1,isVp8DecodeSupported:!1};if(!J3())return void t(i);let r=null,s=null,g=null;const B=()=>{g&&clearTimeout(g),r=null,s=null};try{r=document.createElement("canvas"),s=r.getContext("2d"),r.width=320,r.height=240;let Q=0;const f=()=>{s&&r&&(s.fillStyle=`hsl(${Q%360}, 50%, 50%)`,s.fillRect(0,0,r.width,r.height),s.fillStyle="white",s.font="20px Arial",s.fillText(`Frame ${Q}`,10,30),Q++)};g=setTimeout(()=>{B(),t(i)},5e3);const m=[{type:"h264",encodeConfig:{codec:"avc1.42E01E",avc:{format:"annexb"},width:320,height:240,bitrate:1e6},decodeConfig:{codec:"avc1.42E01E",avc:{format:"annexb"}}},{type:"vp8",encodeConfig:{codec:"vp8",width:320,height:240,bitrate:1e6},decodeConfig:{codec:"vp8"}}];(await Promise.all(m.map(async M=>{const v={type:M.type,encodeSupported:!1,decodeSupported:!1};let U;try{U=await new Promise(async(AA,z)=>{try{const sA=new VideoEncoder({output:X=>{AA(X),v.encodeSupported=!0},error:z});sA.configure(M.encodeConfig),f();const eA=new VideoFrame(r,{timestamp:0});sA.encode(eA,{keyFrame:!0}),eA.close(),await sA.flush(),sA.close()}catch(sA){z(sA)}})}catch(AA){return qi.warn(`${M.type} encoder error:`,AA),v}try{await new Promise(async(AA,z)=>{try{const sA=new VideoDecoder({output:eA=>{v.decodeSupported=!0,AA(0),eA.close()},error:z});sA.configure(M.decodeConfig),sA.decode(U),await sA.flush(),sA.close()}catch(sA){z(sA)}})}catch(AA){qi.warn(`${M.type} decoder error:`,AA)}return v}))).forEach(M=>{M.type==="h264"?(i.isH264EncodeSupported=M.encodeSupported,i.isH264DecodeSupported=M.decodeSupported):M.type==="vp8"&&(i.isVp8EncodeSupported=M.encodeSupported,i.isVp8DecodeSupported=M.decodeSupported)}),B(),t(i)}catch(Q){B(),qi.warn("detectWebCodecsSupported failed:",Q),t(i)}}))}var fIA=(t,i,r)=>{location.protocol!=="http:"||q2||(t[i]=()=>{throw new Ws({code:xa.INVALID_OPERATION,message:Iw.NOT_SUPPORTED_HTTP})})},mIA=function(t){return!(t.type!=="candidate-pair"||!t.nominated||t.state!=="in-progress"&&t.state!=="succeeded")&&!(rD(t.selected)&&!t.selected)};function CX(){let t="";return screen.width&&(t+=`${screen.width?screen.width*window.devicePixelRatio:""} * ${screen.height?screen.height*window.devicePixelRatio:""}`),t}function BX(){return navigator.getUserMedia||navigator.mediaDevices&&navigator.mediaDevices.getUserMedia}function uX(){const t={isSupported:!1},i=["AudioContext","webkitAudioContext","mozAudioContext","msAudioContext"];for(let r=0;r=86,RX="RTCRtpScriptTransform"in window,TIA=wk&&(yX||RX),K3=function(){return["RTCPeerConnection","webkitRTCPeerConnection","RTCIceGatherer"].filter(t=>t in window).length>0};function MX(){const t={AudioDecoder:!1,AudioEncoder:!1,VideoDecoder:!1,VideoEncoder:!1,ImageDecoder:!1};return Fr(window.AudioDecoder)||(t.AudioDecoder=!0),Fr(window.AudioEncoder)||(t.AudioEncoder=!0),Fr(window.VideoDecoder)||(t.VideoDecoder=!0),Fr(window.VideoEncoder)||(t.VideoEncoder=!0),Fr(window.ImageDecoder)||(t.ImageDecoder=!0),t}function wX(){return"mediaSession"in navigator&&!Fr(navigator.mediaSession.setActionHandler)}function SX(){return!Fr(window.WebTransport)}function GIA(){return typeof WebAssembly<"u"&&WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]))}function kIA(){const t={browser:`${nD.name}/${nD.version}`,os:tX(),displayResolution:CX(),isScreenShareSupported:q3(),isWebRTCSupported:K3(),isGetUserMediaSupported:BX(),isWebAudioSupported:uX(),isWebSocketsSupported:"WebSocket"in window&&window.WebSocket.CLOSING===2,isWebCodecSupported:MX(),isMediaSessionSupported:wX(),isWebTransportSupported:SX()};return navigator.userAgent.includes("miniProgram")&&(t.browser=`mini/${t.browser}`),t}var vX="checkResult";function P5(t=30){sX.setItem(vX+t,{ua:navigator.userAgent,checkResult:Oo})}function _IA(t){vY();const i=sX.getItem(vX+t);i&&i.ua===navigator.userAgent&&i.checkResult&&bIA(i.checkResult.detail,Oo.detail)&&(Oo=i.checkResult),EX(t)}function bIA(t,i){return!!$m(t)&&Object.keys(i).every(r=>r in t)}function j3(){return"requestVideoFrameCallback"in HTMLVideoElement.prototype}var LIA="RTCRtpReceiver"in window&&"jitterBufferTarget"in window.RTCRtpReceiver.prototype;function J5(t){return{h264:1,h265:2,vp8:3,vp9:4,av1:5}[t]}var H5=!1;async function FIA(){var t;try{if(H5||!((t=navigator?.mediaCapabilities)!=null&&t.encodingInfo))return;const i=Y3(),r=XgA();if(i===0||r===0)return;H5=!0;const s=["H264","VP8","VP9","AV1","H265"],[g,B]=await Promise.all([NX(s),TX(s)]);g&&Object.keys(g).forEach(m=>{const M=J5(m.toLowerCase());qr.addEnum({key:513707,value:+`${M}${+g[m].supported}${+g[m].powerEfficient}${i}${r}`,useUV:!1})}),B&&Object.keys(B).forEach(m=>{const M=J5(m.toLowerCase());qr.addEnum({key:514713,value:+`${M}${+B[m].supported}${+B[m].powerEfficient}${i}${r}`,useUV:!1})});const{sender:Q,receiver:f}=GX();qr.addEnum({key:513708,value:+`${i}${r}${+Q.high}`,useUV:!1}),qr.addEnum({key:513709,value:+`${i}${r}${+Q.main}`,useUV:!1}),qr.addEnum({key:514714,value:+`${i}${r}${+f.high}`,useUV:!1}),qr.addEnum({key:514715,value:+`${i}${r}${+f.main}`,useUV:!1})}catch(i){qi.info("detectVideoCodecCapabilities failed",i)}}async function NX(t,i=1920,r=1080,s=30,g=3e3){const B={};try{for(const Q of t){const f=await navigator.mediaCapabilities.encodingInfo({type:"webrtc",video:{contentType:`video/${Q}`,width:i,height:r,bitrate:g,framerate:s}});B[Q]=f}}catch{}return B}async function TX(t,i=1920,r=1080,s=30,g=3e3){const B={};try{for(const Q of t){const f=await navigator.mediaCapabilities.decodingInfo({type:"webrtc",video:{contentType:`video/${Q}`,width:i,height:r,bitrate:g,framerate:s}});B[Q]=f}}catch{}return B}function GX(){const t={sender:{base:!1,main:!1,high:!1},receiver:{base:!1,main:!1,high:!1}};try{if(RTCRtpSender&&typeof RTCRtpSender.getCapabilities=="function"){const i=RTCRtpSender.getCapabilities("video");i&&i.codecs&&i.codecs.filter(r=>r.mimeType.toLowerCase()==="video/h264").forEach(r=>{if(r.sdpFmtpLine){const s=r.sdpFmtpLine.match(/profile-level-id=([0-9a-fA-F]+)/);if(s&&s[1])switch(s[1].slice(0,2)){case"42":t.sender.base=!0;break;case"4d":t.sender.main=!0;break;case"64":t.sender.high=!0}}})}if(RTCRtpReceiver&&typeof RTCRtpReceiver.getCapabilities=="function"){const i=RTCRtpReceiver.getCapabilities("video");i&&i.codecs&&i.codecs.filter(r=>r.mimeType.toLowerCase()==="video/h264").forEach(r=>{if(r.sdpFmtpLine){const s=r.sdpFmtpLine.match(/profile-level-id=([0-9a-fA-F]+)/);if(s&&s[1])switch(s[1].slice(0,2)){case"42":t.receiver.base=!0;break;case"4d":t.receiver.main=!0;break;case"64":t.receiver.high=!0}}})}}catch(i){qi.warn("get H264 profile levelId failed",i)}return t}var UIA=Tw(mk()),V5=Symbol("instance"),r2=Symbol("cacheResult"),PK=class{constructor(t,i,r){this.oldState=t,this.newState=i,this.action=r,this.aborted=!1}abort(t){this.aborted=!0,WG.call(t,this.oldState,new Error(`action '${this.action}' aborted`))}toString(){return`${this.action}ing`}},JK=class extends Error{constructor(t,i,r){super(i),this.state=t,this.message=i,this.cause=r}};function OIA(t){return typeof t=="object"&&t&&"then"in t}var jG=new Map;function FI(t,i,r={}){return(s,g,B)=>{const Q=r.action||g;if(!r.context){const m=jG.get(s)||[];jG.has(s)||jG.set(s,m),m.push({from:t,to:i,action:Q})}const f=B.value;B.value=function(...m){let M=this;if(r.context&&(M=Lr.get(typeof r.context=="function"?r.context.call(this,...m):r.context)),M.state===i)return r.sync?M[r2]:Promise.resolve(M[r2]);M.state instanceof PK&&M.state.action==r.abortAction&&M.state.abort(M);let v=null;Array.isArray(t)?t.length==0?M.state instanceof PK&&M.state.abort(M):typeof M.state=="string"&&t.includes(M.state)||(v=new JK(M._state,`${M.name} ${Q} to ${i} failed: current state ${M._state} not from ${t.join("|")}`)):t!==M.state&&(v=new JK(M._state,`${M.name} ${Q} to ${i} failed: current state ${M._state} not from ${t}`));const U=X=>{if(r.fail&&r.fail.call(this,X),r.sync){if(r.ignoreError)return X;throw X}return r.ignoreError?Promise.resolve(X):Promise.reject(X)};if(v)return U(v);const AA=M.state,z=new PK(AA,i,Q);WG.call(M,z);const sA=X=>{var QA;return M[r2]=X,z.aborted||(WG.call(M,i),(QA=r.success)===null||QA===void 0||QA.call(this,M[r2])),X},eA=X=>(WG.call(M,AA,X),U(X));try{const X=f.apply(this,m);return OIA(X)?X.then(sA).catch(eA):r.sync?sA(X):Promise.resolve(sA(X))}catch(X){return eA(new JK(M._state,`${M.name} ${Q} from ${t} to ${i} failed: ${X}`,X instanceof Error?X:new Error(String(X))))}}}}var xIA=typeof window<"u"&&window.__AFSM__?(r,s)=>{window.dispatchEvent(new CustomEvent(r,{detail:s}))}:typeof importScripts<"u"?(r,s)=>{postMessage({type:r,payload:s})}:()=>{};function WG(t,i){const r=this._state;this._state=t;const s=t.toString();t&&this.emit(s,r),this.emit(Lr.STATECHANGED,t,r,i),this.updateDevTools({value:t,old:r,err:i instanceof Error?i.message:String(i)})}var Lr=class lC extends UIA.default{constructor(i,r,s){super(),this.name=i,this.groupName=r,this._state=lC.INIT,i||(i=Date.now().toString(36)),s?Object.setPrototypeOf(this,s):s=Object.getPrototypeOf(this),r||(this.groupName=this.constructor.name);const g=s[V5];g?this.name=g.name+"-"+g.count++:s[V5]={name:this.name,count:0},this.updateDevTools({diagram:this.stateDiagram})}get stateDiagram(){const i=Object.getPrototypeOf(this),r=jG.get(i)||[];let s=new Set,g=[],B=[];const Q=new Set,f=Object.getPrototypeOf(i);jG.has(f)&&(f.stateDiagram.forEach(M=>s.add(M)),f.allStates.forEach(M=>Q.add(M))),r.forEach(({from:M,to:v,action:U})=>{typeof M=="string"?g.push({from:M,to:v,action:U}):M.length?M.forEach(AA=>{g.push({from:AA,to:v,action:U})}):B.push({to:v,action:U})}),g.forEach(({from:M,to:v,action:U})=>{Q.add(M),Q.add(v),Q.add(U+"ing"),s.add(`${M} --> ${U}ing : ${U}`),s.add(`${U}ing --> ${v} : ${U} 🟢`),s.add(`${U}ing --> ${M} : ${U} 🔴`)}),B.forEach(({to:M,action:v})=>{s.add(`${v}ing --> ${M} : ${v} 🟢`),Q.forEach(U=>{U!==M&&s.add(`${U} --> ${v}ing : ${v}`)})});const m=[...s];return Object.defineProperties(i,{stateDiagram:{value:m},allStates:{value:Q}}),m}static get(i){let r;return typeof i=="string"?(r=lC.instances.get(i),r||lC.instances.set(i,r=new lC(i,void 0,Object.create(lC.prototype)))):(r=lC.instances2.get(i),r||lC.instances2.set(i,r=new lC(i.constructor.name,void 0,Object.create(lC.prototype)))),r}static getState(i){var r;return(r=lC.get(i))===null||r===void 0?void 0:r.state}updateDevTools(i={}){xIA(lC.UPDATEAFSM,Object.assign({name:this.name,group:this.groupName},i))}get state(){return this._state}set state(i){WG.call(this,i)}};Lr.STATECHANGED="stateChanged",Lr.UPDATEAFSM="updateAFSM",Lr.INIT="[*]",Lr.ON="on",Lr.OFF="off",Lr.instances=new Map,Lr.instances2=new WeakMap;var W3=typeof window<"u",q5=W3&&window.requestIdleCallback||function(t){const i=Date.now();return setTimeout(()=>{t({didTimeout:!1,timeRemaining:()=>Math.max(0,50-(Date.now()-i))})},1e3)},YIA=W3&&window.cancelIdleCallback||function(t){clearTimeout(t)},K5=W3&&(window.cancelAnimationFrame||window.mozCancelAnimationFrame),SG=class pc{static generateTaskID(){return this.currentTaskID++}static run(i,r,s){s?.fps&&(s.delay=s.delay||Number((1e3/s.fps).toFixed(2))),s=cr(cr({},i==="interval"?{delay:2e3,count:0,backgroundTask:!0}:i==="ric"?{delay:1e4,count:0}:i==="raf"?{fps:60,delay:16.6,count:0,backgroundTask:!0}:{delay:2e3,count:0,backgroundTask:!0}),s);const g=lB(cr({taskID:this.generateTaskID(),loopCount:0,intervalID:null,timeoutID:null,rafID:null,ricID:null,taskName:i,callback:r},s),{delay:s.delay});return this.taskMap.set(g.taskID,g),this[i](g),g.taskID}static interval(i){return i.intervalID=setInterval(()=>{i.callback(),i.loopCount+=1,pc.isBreakLoop(i)},i.delay)}static intervalInWorker(i){pc.sharedWorker||(pc.sharedWorker=new Worker(URL.createObjectURL(new Blob([` + const timers = new Map(); + self.onmessage = function(e) { + const { taskId, delay, type } = e.data; + if (type === 'start') { + timers.set(taskId, setInterval(() => { + self.postMessage({ type: 'tick', taskId }); + }, delay)); + } else if (type === 'stop') { + clearInterval(timers.get(taskId)); + timers.delete(taskId); + } + }; + `],{type:"application/javascript"}))),pc.sharedWorker.onmessage=r=>{var s;if(r.data.type==="tick"){const g=pc.workerTasks.get(r.data.taskId);g&&(pc.isBreakLoop(g)?((s=pc.sharedWorker)==null||s.postMessage({type:"stop",taskId:g.taskID}),pc.workerTasks.delete(g.taskID)):(g.callback(),g.loopCount+=1))}}),pc.workerTasks.set(i.taskID,i),pc.sharedWorker.postMessage({taskId:i.taskID,delay:i.delay,type:"start"})}static timeout(i){const r=()=>{if(i.callback(),i.loopCount+=1,!pc.isBreakLoop(i))return i.timeoutID=setTimeout(r,i.delay)};return i.timeoutID=setTimeout(r,i.delay)}static ric(i){let r,s=Ns();const g=()=>{if(r=Ns()-s,r>=i.delay&&(s=Ns()-Math.floor(r%i.delay),i.callback(),i.loopCount+=1),!pc.isBreakLoop(i))return i.ricID=q5(g,{timeout:i.delay})};return i.ricID=q5(g,{timeout:i.delay})}static raf(i){let r,s=Ns();const g=()=>{if(document.hidden&&i.backgroundTask)return r=Ns()-s,s=Ns(),i.callback(),i.loopCount+=1,pc.isBreakLoop(i)?void 0:i.timeoutID=setTimeout(g,i.delay-Math.floor(r%i.delay));if(r=Ns()-s,r>=i.delay&&(s=Ns()-Math.floor(r%i.delay),i.callback(),i.loopCount+=1),!pc.isBreakLoop(i))return i.rafID=requestAnimationFrame(g)};if(i.rafID=requestAnimationFrame(g),i.backgroundTask){const B=()=>{if(document.hidden){const Q=Ns()-s;Q>=i.delay?g():i.timeoutID=setTimeout(g,i.delay-Q)}};document.addEventListener("visibilitychange",B),i.onVisibilitychange=B,document.hidden&&B()}return i.taskID}static hasTask(i){return this.taskMap.has(i)}static clearTask(i){if(!this.taskMap.has(i))return!0;const{intervalID:r,timeoutID:s,rafID:g,ricID:B,onVisibilitychange:Q}=this.taskMap.get(i);return r&&clearInterval(r),s&&clearTimeout(s),g&&K5&&K5(g),B&&YIA(B),Q&&document.removeEventListener("visibilitychange",Q),this.taskMap.delete(i),!0}static isBreakLoop(i){return!this.hasTask(i.taskID)||i.count!==0&&i.loopCount>=i.count&&(this.clearTask(i.taskID),!0)}};OA(SG,"taskMap",new Map),OA(SG,"currentTaskID",1),OA(SG,"sharedWorker",null),OA(SG,"workerTasks",new Map);var PIA=SG,ku=PIA,vr={LOAD_START:gt.LOADSTART,LOADED_DATA:gt.LOADEDDATA,LOADED_META_DATA:gt.LOADEDMETADATA,MEDIA_TRACK_CHANGED:"media-track-changed",PLAYER_STATE_CHANGED:"player-state-changed",ERROR:"error",AUTOPLAY_FAILED:"autoplay-failed",RESIZE:gt.RESIZE,TIME_UPDATE:"time-update",LEAVE_PICTURE_IN_PICTURE:gt.LEAVE_PICTURE_IN_PICTURE,ENTER_PICTURE_IN_PICTURE:gt.ENTER_PICTURE_IN_PICTURE,USER_RESUME_IN_PIP_OR_FULL_SCREEN:"user-resume-in-pip-or-full-screen",USER_PAUSE_IN_PIP_OR_FULL_SCREEN:"user-pause-in-pip-or-full-screen",ENTER_FULL_SCREEN:"enter-full-screen",LEAVE_FULL_SCREEN:"leave-full-screen",VOLUME_CHANGE:"volume-change",FIRST_FRAME_RENDER:"first-frame-render"},Uj={};p3(Uj,{create:()=>z3,remove:()=>gk});var zG=new WeakMap;function z3(t,i){zG.has(t)||zG.set(t,[]);const r=zG.get(t),s={add:(g,B)=>("addEventListener"in i?(r.push(i.removeEventListener.bind(i,g,B)),i.addEventListener(g,B)):(r.push(i.off.bind(i,g,B)),i.on(g,B)),s)};return s}function gk(t){const i=zG.get(t);i&&(i.forEach(r=>r()),zG.delete(t))}var JIA=class{constructor(){OA(this,"_roomIdMap",new Map),OA(this,"_configs"),typeof registerProcessor>"u"&&(this._configs={sdkAppId:"",userId:"",version:x2,env:_K.QCLOUD,browserVersion:nD.name+nD.version,ua:navigator.userAgent})}setConfig({sdkAppId:t,env:i,userId:r,roomId:s}){t!==this._configs.sdkAppId&&(this._configs.sdkAppId=String(t)),this._configs.env=i,this._configs.userId=r,this._roomIdMap.set(r,String(s))}logSuccessEvent(t){!q2&&qi.isAbleToUpload&&this._configs.env===_K.QCLOUD&&this.uploadEventToKibana(lB(cr({},t),{result:"success"}))}logFailedEvent(t){if(q2||!qi.isAbleToUpload)return;const{eventType:i,code:r,error:s,userId:g}=t,B={roomId:this._roomIdMap.get(g||this._configs.userId),userId:g,eventType:i,result:"failed",code:r||s?.extraCode||s?.code||xa.UNKNOWN};this._configs.env===_K.QCLOUD&&this.uploadEventToKibana(lB(cr({},B),{error:s}))}uploadEventToKibana(t){let i=`stat-${t.eventType}-${t.result}`;t.eventType!=="delta-join"&&t.eventType!=="delta-leave"&&t.eventType!=="delta-publish"||(i=`${t.eventType}:${t.delta}`),this.uploadEvent({log:i,userId:t.userId}),t.result==="failed"&&(i=`stat-${t.eventType}-${t.result}-${t.code}`,this.uploadEvent({log:i,userId:t.userId,error:t.error}))}uploadEvent({log:t,userId:i,error:r}){const s={timestamp:i9(),sdkAppId:this._configs.sdkAppId,userId:i||this._configs.userId,version:x2,log:t};r&&(s.errorInfo=r.message,r.stack&&(s.errorInfo+=` +${r.stack}`));const g=Fj.enable?M3(s,2002,Number(this._configs.sdkAppId)):JSON.stringify(s);this.sendRequest(D3(this._configs.sdkAppId,n9.LOG),g)}sendRequest(t,i){setTimeout(()=>M9({url:t,body:i,priority:"low"}).catch(()=>{}),2e3)}},fC=new JIA,Jm=new WeakMap;function HIA({settings:t={retries:5,timeout:2e3},onError:i,onRetrying:r,onRetryFailed:s}){return function(g,B,Q){const f=S3({retryFunction:Q.value,settings:t,onError({error:m,retry:M,reject:v,retryFuncArgs:U}){var AA;i?i.call(this,m,()=>{var z;(z=Jm.get(g))!=null&&z.has(B)?M():v(m)},v,U):(AA=Jm.get(g))!=null&&AA.has(B)?M():v(m)},onRetrying(m,M){var v;rw(r)&&r.call(this,m,M),(v=Jm.get(g))!=null&&v.has(B)&&(Jm.get(g).get(B).stopRetry=M)},onRetryFailed:s});return Q.value=function(...m){const M=Jm.get(g);return M?M.set(B,{args:m}):Jm.set(g,new Map([[B,{args:m}]])),f.apply(this,m).finally(()=>{var v;return(v=Jm.get(g))==null?void 0:v.delete(B)})},Q}}var jm=class extends Lr{constructor(t,i){super(t.id,`${i}-player`),this.options=t,this.kind=i,OA(this,"id"),OA(this,"element",null),OA(this,"track"),OA(this,"url"),OA(this,"attr"),OA(this,"mode"),OA(this,"muted"),OA(this,"_log"),OA(this,"isPausedByUserCall",!1),OA(this,"_pausedRetryCount"),OA(this,"_isElementPlayingFired",!1),OA(this,"_interval"),OA(this,"_delayDestroyTimeoutId",0),OA(this,"_playSuccessResolve"),OA(this,"_isReplayByRecreateMediaStreamCalled",!1),OA(this,"isPlayCalled",!1),OA(this,"isInAutoPlayFailedState",!1),OA(this,"isBindAutoPlayEvent",!1),this.id=t.id,this._log=t.log,this.track=t.track,this.muted=t.muted,this._pausedRetryCount=ow,this._state="STOPPED",this.bindTrackEvents(),this._log.info(`create ${i}-player ${this.id}`)}get isPlaying(){var t;return this._state==="PLAYING"&&((t=this.element)==null?void 0:t.paused)===!1}get isPaused(){var t;return this._state==="PAUSED"||((t=this.element)==null?void 0:t.paused)===!0}get isStopped(){return this._state==="STOPPED"}setAttr(t){this.attr=t}setUrl(t){this.track&&(this.unbindTrackEvents(),this.element&&(this.element.srcObject=null),this.track=null),t!==this.url&&(this.url=t,t!==null&&this.element&&(this.element.crossOrigin="anonymous",this.element.src=t))}async play(){if(!this.isPlaying)try{this.isPlayCalled=!0,this._delayDestroyTimeoutId&&(clearTimeout(this._delayDestroyTimeoutId),this._delayDestroyTimeoutId=0,this.bindTrackEvents(),this.bindElementEvents()),this.bindAutoPlayEvent(),await new Promise((t,i)=>{this._playSuccessResolve=t,this.element.play().then(t,i)})}catch(t){const i=j2({key:K2.PLAY_FAILED,data:{media:this.kind,error:t}});if(this._log.warn(t),i.includes("NotAllowedError"))throw this.isInAutoPlayFailedState=!0,new Ws({code:xa.PLAY_NOT_ALLOWED,message:i})}}stop(t=0){var i;this.isPlayCalled=!1,this.isPausedByUserCall=!1,this._isElementPlayingFired=!1,this.unbindEvents(),t>0&&!$9?this._delayDestroyTimeoutId||((i=this.element)==null||i.remove(),this._log.info(`destroy element after 3 * ${t}`),this._delayDestroyTimeoutId=setTimeout(()=>this.destroyElement(),3*t)):this.destroyElement(),this.handleStopped(gt.ENDED),this._interval>0&&ku.clearTask(this._interval)}destroyElement(){this.element&&(this._log.debug("destroy element"),this.element.remove(),this.element.src="",this.element.srcObject=null,this.element=null),clearTimeout(this._delayDestroyTimeoutId),this._delayDestroyTimeoutId=0}pause(){this._log.info("pause"),this.isPausedByUserCall=!0,this.doPause()}doPause(){var t;(t=this.element)==null||t.pause()}resume(t=!1){return this.isPausedByUserCall=!1,this.doResume(t)}doResume(t=!1){return this._log.info("resume"),this.isPausedByUserCall||this.isPlaying?Promise.resolve():VgA?this.replay():this.play().catch(()=>{})}setMuted(t){this.element&&(this.element.muted=t),this.muted=t}replay(){return this.stop(),this.play().catch(()=>{})}bindElementEvents(){if(this.element){const t=this.handleElementEvent.bind(this);return z3(this.element,this.element).add(gt.PLAYING,t).add(gt.ENDED,t).add(gt.PAUSE,t).add(gt.ERROR,t).add(gt.LOADSTART,t).add(gt.LOADEDDATA,t).add(gt.LOADEDMETADATA,t)}}bindTrackEvents(t=this.track){if(t){const i=this.handleTrackEvent.bind(this);Uj?.create(t,t).add(gt.ENDED,i).add(gt.MUTE,i).add(gt.UNMUTE,i),t.readyState===gt.ENDED&&this.handleTrackEvent({type:gt.ENDED}),t.muted&&this.handleTrackEvent({type:gt.MUTE})}}bindAutoPlayEvent(){this.isBindAutoPlayEvent||(this._log.warn("bindAutoPlayEvent"),Eo.on(nr.AUTOPLAY_DIALOG_CLICK_CONFIRM,this.resume,this),this.isBindAutoPlayEvent=!0)}unbindTrackEvents(t=this.track){t&&gk(t)}unbindEvents(){this.element&&gk(this.element),this.unbindTrackEvents(),Eo.off(nr.AUTOPLAY_DIALOG_CLICK_CONFIRM,this.resume,this),this.isBindAutoPlayEvent=!1}handleElementEvent(t){switch(t.type){case gt.PLAYING:Ik()||(this.isInAutoPlayFailedState=!1),this._isElementPlayingFired=!0,this._log.info(`${this.kind} player is playing`),this.handlePlaying(gt.PLAYING),this._interval&&(ku.clearTask(this._interval),this._interval=-1);break;case gt.ENDED:this._log.info(`${this.kind} player is ended`),this.handleStopped(gt.ENDED);break;case gt.PAUSE:this._log.info(`${this.kind} player is paused`),this.handlePaused(gt.PAUSE);break;case gt.ERROR:if(this.element&&this.element.error){this.handlePaused(gt.ERROR);const{code:i,message:r}=this.element.error;this._log.error(`${this.kind} ${this._log.isLocal?"local":"remote"} MediaError code: ${i} message: ${r} userAgent: ${navigator.userAgent}`),fC.uploadEvent({log:`stat-${this.kind}-${VG.PLAYER_ERROR}-${i}-${navigator.userAgent}`,error:this.element.error}),PgA||q9?this.emit(vr.ERROR,this.element.error):this.replayByRecreateMediaStream(this.element.error)}break;case gt.LOADEDDATA:this.kind===gt.VIDEO&&this.emit(vr.LOADED_DATA);break;case gt.LOADEDMETADATA:this.kind===gt.VIDEO&&this.emit(vr.LOADED_META_DATA);break;case gt.LOADSTART:this.emit(vr.LOAD_START)}}replayByRecreateMediaStream(t){if(!this._isReplayByRecreateMediaStreamCalled)return this._isReplayByRecreateMediaStreamCalled=!0,this.doReplayByRecreateMediaStream(1e3).then(()=>{this._log.warn("replayByRecreateMediaStream success"),fC.uploadEvent({log:"stat-replayByRecreateMediaStream-success"}),qr.addSuccessEvent({key:this.kind===gt.AUDIO?506700:516700})}).catch(()=>{var i;this._log.error("replayByRecreateMediaStream failed"),fC.uploadEvent({log:"stat-replayByRecreateMediaStream-failed"}),qr.addFailedEvent({key:this.kind===gt.AUDIO?506700:516700,error:(i=this.element)==null?void 0:i.error}),this.emit(vr.ERROR,t)})}doReplayByRecreateMediaStream(t){return this._log.warn(`delay ${t}ms to recreate mediaStream`),new Promise((i,r)=>{Rw(t).then(()=>{this.element&&(this.element.srcObject=null,this.element.srcObject=new MediaStream([this.track]),this._log.warn("recreated mediaStream"),this.element.onerror=()=>{var s,g,B;this._log.warn(`element onerror ${(g=(s=this.element)==null?void 0:s.error)==null?void 0:g.code} fired after recreated mediaStream`),r((B=this.element)==null?void 0:B.error)}),Rw(5e3).then(()=>{var s,g;this.isPlaying&&!((s=this.element)!=null&&s.error)||r((g=this.element)==null?void 0:g.error),i()})})}).finally(()=>{this.element&&(this.element.onerror=null)})}async handleTrackEvent(t){const i=t.type;switch(this.options.enableLogTrackState&&this._log[i===gt.UNMUTE?"info":"warn"](`track ${i}`),i){case gt.ENDED:this.handleStopped(gt.ENDED);break;case gt.MUTE:this.handlePaused(gt.MUTE);break;case gt.UNMUTE:this.mode>0?this.handlePlaying(this.mode.toString()):this.element&&(this.element.paused&&!this.isPausedByUserCall&&(this._log.warn("track unmuted and element is paused, resume"),await this.doResume()),this.element&&!this.element.paused&&this._isElementPlayingFired&&this.handlePlaying(gt.UNMUTE))}}handlePlaying(t){var i;return this._log.debug("handlePlaying",t),(i=this._playSuccessResolve)==null||i.call(this,t),t}handlePaused(t){return this._log.debug("handlePaused",t),t}handleStopped(t){return this._log.debug("handleStopped",t),t}getElement(){return this.element}};OA(jm,"PlayerEvent",vr),ss([HIA({settings:{retries:2,timeout:0},onError(t,i,r,s){s[0]=(s[0]||1e3)+1e3,i()}})],jm.prototype,"doReplayByRecreateMediaStream"),ss([FI([],"PLAYING",{sync:!0,success(t){this.emit(vr.PLAYER_STATE_CHANGED,{type:this.kind,state:"PLAYING",reason:t})}})],jm.prototype,"handlePlaying"),ss([FI("PLAYING","PAUSED",{ignoreError:!0,sync:!0,success(t){this.emit(vr.PLAYER_STATE_CHANGED,{type:this.kind,state:"PAUSED",reason:t})}})],jm.prototype,"handlePaused"),ss([FI([],"STOPPED",{sync:!0,success(t){this.emit(vr.PLAYER_STATE_CHANGED,{type:this.kind,state:"STOPPED",reason:t})}})],jm.prototype,"handleStopped");var cd="trtc_autoplay",HK=`${cd}_mask`,uG=`${cd}_wrapper`,j5=`${cd}_header`,VK=`${cd}_content`,n2=`${cd}_action_wrapper`,qK=`${cd}_question`,KK=`${cd}_collapse`,a2=`${cd}_action_confirm`,W5=`${cd}_detail`,z5="#2473E8",Z3="dialog",VIA=`${Z3}-show`,qIA=`${Z3}-1`,KIA=`${Z3}-2`,Z5=!1,Oj=!1,Ik=()=>Oj,kX=`${Sj}/${Bp()?"zh-cn":"en"}/tutorial-21-advanced-auto-play-policy.html`,X5=`
${Bp()?"其他方案?":"Any other solution?"}`,jIA=Bp()?`浏览器自动播放策略:在用户与页面产生交互(点击、触摸)之前,浏览器禁止播放有声媒体。该弹窗用于帮助用户恢复音视频播放。${X5}`:`Autoplay Policy: Before user interacts with the web page (clicking, touching), page will not be allowed to play media with sound. This Dialog is used to help users resume playback. ${X5}`,WIA=class{constructor(){if(OA(this,"content","音视频播放被浏览器拦截,请点击“恢复播放”。"),OA(this,"_dialogNode",null),OA(this,"_bodyPosition",""),OA(this,"_showDetail",!1),OA(this,"_isCollapseClicked",!1),OA(this,"_isQuestionClicked",!1),Bp()||(this.content='Media playback failed. Click the "Resume" to resume playback.'),!Z5){const t=document.createElement("style");t.innerHTML=`.${HK}{position:fixed;top:0;left:0;right:0;bottom:0;width:100vw;height:100vh;display:flex;justify-content:center;align-items:center;background:rgba(0,0,0,0.5);z-index:1500;}.${HK} div:not(.${n2}){display:block !important;}.${uG}{padding:14px;background:#fff;border-radius:3px;box-shadow:0px 3px 15px #434343;border:1px solid #d1cfcf;max-width:500px;}.${uG} a{color:${z5};}.${j5}{overflow:hidden;text-overflow:ellipsis;font-size:16px;font-weight:600;}.${VK}{margin:8px 0;}.${n2}{width:100%;display:flex !important;align-items:center;justify-content:right;float:right;}.${KK}{margin-right:auto;cursor:pointer}.${qK}{height:100%;line-height:16px;cursor:pointer;}.${a2}{margin-left:8px;color:#fff;background:${z5};padding:4px 12px;outline:none;border:1px solid;border-radius:3px;font-weight:bold;}.${a2}:hover{opacity:0.9;}.${KK},.${a2},.${VK},.${qK}{font-size:14px;}@media screen and (max-width:750px){.${uG}{width:80vw;}}`,document.head.appendChild(t),Z5=!0}this.addDiaLog()}createDiaLog(){const t=document.createElement("template");t.innerHTML=`
${location.host}
${this.content}
`.trim();const i=document.createElement("button");i.className=a2,i.innerText=Bp()?"恢复播放":"Resume",i.onclick=this.onConfirm.bind(this);const r=document.createElement("div");r.className=qK,r.innerHTML=` + + + + + + `,r.onclick=this.onQuestionClick.bind(this);const s=document.createElement("div");s.className=KK,s.innerText=Bp()?"详情 >":"Detail >",s.onclick=this.onCollapseClick.bind(this);const g=t.content.firstChild,B=g.querySelector(`.${n2}`);return B.appendChild(s),B.appendChild(r),B.appendChild(i),g}addDiaLog(){Ik()||(Oj=!0,this._dialogNode=this.createDiaLog(),document.body.appendChild(this._dialogNode),this._dialogNode.onclick=this.onConfirm.bind(this),this._dialogNode.querySelector(`.${uG}`).onclick=t=>t.stopPropagation(),this._bodyPosition=document.body.style.position,document.body.style.position="fixed",qi.info("show autoplay dialog"),fC.uploadEvent({log:VIA}))}deleteDialog(){this._dialogNode&&(document.body.removeChild(this._dialogNode),document.body.style.position=this._bodyPosition,this._dialogNode=null,Oj=!1),ck=null}onConfirm(){qi.warn("confirm clicked, try resume stream"),Eo.emit(nr.AUTOPLAY_DIALOG_CLICK_CONFIRM),this.deleteDialog()}onCollapseClick(){const t=this._dialogNode.querySelector(`.${W5}`);t.style.visibility=this._showDetail?"hidden":"visible",t.style.height=`${this._showDetail?0:"fit-content"}`,this._showDetail=!this._showDetail,this._isCollapseClicked||fC.uploadEvent({log:qIA}),this._isCollapseClicked=!0}onQuestionClick(){window.open(kX,"_blank"),this._isQuestionClicked||fC.uploadEvent({log:KIA}),this._isQuestionClicked=!0}},ck=null;function zIA(){ck||(ck=new WIA)}function ZIA(){ck&&ck.deleteDialog()}var ZG,Ip=class extends jm{constructor(t){super(t,gt.VIDEO),OA(this,"stat",{}),OA(this,"_calculateTimeout",-1),OA(this,"viewMirror",!1),OA(this,"objectFit","cover"),OA(this,"container"),OA(this,"canvas"),OA(this,"shouldRenderAlpha",!1),OA(this,"_preSize",{width:0,height:0}),OA(this,"posterImg"),OA(this,"pipWindow"),OA(this,"enterPIPPromise"),OA(this,"_originContainerPosition"),OA(this,"_isResettingSrcObject",!1),OA(this,"_wrapper",null),OA(this,"_useWrapper",!1),OA(this,"_isFirstFrameRenderEmitted",!1),this.mode=t.canvas?1:0,this.container=t.container,this.canvas=t.canvas,Fr(t.viewMirror)||(this.viewMirror=t.viewMirror),Fr(t.objectFit)||(this.objectFit=t.objectFit),this.initializeElement()}get isPlaying(){var t;return this._state==="PLAYING"&&(!this.element||!this.element.paused)&&((t=this.track)==null?void 0:t.readyState)==="live"&&!this.track.muted}initializeElement(){const t=document.createElement(gt.VIDEO);this.track&&this.mode!==2&&(t.srcObject=new MediaStream([this.track])),t.muted=!0,t.setAttribute("id",`video_${this.id}`),t.setAttribute("style",this.styleAttribute),this.canvas&&this.canvas.setAttribute("style",this.styleAttribute),t.setAttribute("autoplay","autoplay"),t.setAttribute("playsinline","playsinline"),this.element=t,hl&&(t.poster="data:,"),this._appendToWrapper(),this.bindElementEvents(),this.calculateStat(),this._bindFirstFrameRenderEvent(t)}_bindFirstFrameRenderEvent(t){const i=()=>{if(this._isFirstFrameRenderEmitted)return;this._isFirstFrameRenderEmitted=!0;const r=t.videoWidth||0,s=t.videoHeight||0;this._log.info(`first frame render: ${r}x${s}`),this.emit(vr.FIRST_FRAME_RENDER,{width:r,height:s})};typeof t.requestVideoFrameCallback=="function"?t.requestVideoFrameCallback(i):t.addEventListener("loadeddata",i,{once:!0})}get styleAttribute(){let t=this._useWrapper?`grid-area:1/1;width:100%;height:100%;object-fit:${this.objectFit};${this.shouldRenderAlpha?"":"background-color:black"};`:`width:100%;height:100%;object-fit:${this.objectFit};${this.shouldRenderAlpha?"":"background-color:black"};`;return this.viewMirror&&(t+="transform:scaleX(-1);"),t}setLiveMode(t){if(this._useWrapper!==t&&(this._useWrapper=t,this.elementToRender&&this.elementToRender.setAttribute("style",this.styleAttribute),this.container&&this.elementToRender))if(t){const i=this._getOrCreateWrapper();i.insertBefore(this.elementToRender,i.firstChild)}else this.container.appendChild(this.elementToRender),this._cleanupWrapper()}setContainer(t){if(this.container===t)return;const i=this._wrapper,r=this.container;this.container=t,this._pausedRetryCount=ow,this.track&&this.elementToRender&&this._appendToWrapper(),i&&r&&r!==this.container&&i.isConnected&&i.children.length===0&&i.remove()}_getOrCreateWrapper(){if(!this.container)throw new Error("[VideoPlayer] container is required");let t=this.container.querySelector("[data-trtc-video-wrapper]");return t||(t=document.createElement("div"),t.setAttribute("data-trtc-video-wrapper","true"),t.style.cssText="display:grid;width:100%;height:100%;",this.container.appendChild(t)),this._wrapper=t,t}_appendToWrapper(t){const i=t??this.elementToRender;if(this.container&&i)if(this._useWrapper){const r=this._getOrCreateWrapper();r.insertBefore(i,r.firstChild)}else this.container.appendChild(i)}bindElementEvents(){const t=super.bindElementEvents();this.handleElementEvent=this.handleElementEvent.bind(this),this.handleFullscreenChange=this.handleFullscreenChange.bind(this),this.handleVolumeChange=this.handleVolumeChange.bind(this),t&&t.add(gt.ENTER_PICTURE_IN_PICTURE,this.handleElementEvent).add(gt.LEAVE_PICTURE_IN_PICTURE,this.handleElementEvent).add(gt.RESIZE,this.handleElementEvent),this.element&&(this.element.addEventListener(gt.FULLSCREEN_CHANGE,this.handleFullscreenChange),this.element.addEventListener("webkitbeginfullscreen",this.handleFullscreenChange),this.element.addEventListener("webkitendfullscreen",this.handleFullscreenChange),this.element.addEventListener("volumechange",this.handleVolumeChange))}handleTrackEvent(t){var i;return t.type===gt.MUTE&&((i=this.stat)!=null&&i.fps&&(this.stat.fps=0),this.isFullscreen()&&this.resetSrcObjectToReplay()),super.handleTrackEvent(t)}handleFullscreenChange(){this.isFullscreen()?(this._log.info("enter fullscreen"),this.emit(vr.ENTER_FULL_SCREEN)):(this._log.info("leave fullscreen"),this.emit(vr.LEAVE_FULL_SCREEN))}handleVolumeChange(){var t;(this.isPictureInPicture()||this.isFullscreen())&&this.emit(vr.VOLUME_CHANGE,{muted:(t=this.element)==null?void 0:t.muted})}handleElementEvent(t){var i,r,s,g,B,Q;if(this.mode===2)return;super.handleElementEvent(t);const f=t.type,m=this.isPictureInPicture(),M=this.isFullscreen(),v=t.isTrusted&&(m&&IE||M);if(f===gt.PLAYING&&v&&!this._isResettingSrcObject&&(this._log.warn("user resume in "+(M?"fullscreen":"pip")),this.emit(vr.USER_RESUME_IN_PIP_OR_FULL_SCREEN)),f===gt.PAUSE&&(v&&(this._log.warn("user pause in "+(M?"fullscreen":"pip")),this.emit(vr.USER_PAUSE_IN_PIP_OR_FULL_SCREEN)),this.container&&!this.container.isConnected&&(this._log.warn(`${this.kind} player has been remove, element ID: ${this.container.id}`),Rw(500).then(()=>{var U;(U=this.container)!=null&&U.isConnected&&(this._pausedRetryCount=ow,this._log.info(`view container ${this.container.id} is in dom, reset pausedRetryCount`))})),this._pausedRetryCount>0&&!Ik()&&!this.isPausedByUserCall&&!v&&(this._log.info(`[${ow-this._pausedRetryCount+1}/${ow}] ${this.kind} player auto resume when paused`),this.doResume(),this._pausedRetryCount--),UI&&!v&&(this._interval=ku.run("timeout",()=>{this.element&&this._state==="PAUSED"&&!this.isPausedByUserCall&&this.doResume()},{delay:3e3})),this.stat.fps&&(this.stat.fps=0)),this.viewMirror&&this.element){const U=this.element.style.transform;f===gt.ENTER_PICTURE_IN_PICTURE?this.element.style.transform=U.replace("scaleX(-1)",""):f!==gt.LEAVE_PICTURE_IN_PICTURE||U.includes("scaleX")||(this.element.style.transform=`${U} scaleX(-1)`)}f===gt.RESIZE&&(this._preSize.height===((i=this.element)==null?void 0:i.videoHeight)&&this._preSize.width===((r=this.element)==null?void 0:r.videoWidth)||(this._log.info(`video size changed to ${(s=this.element)==null?void 0:s.videoWidth}x${(g=this.element)==null?void 0:g.videoHeight}`),this._preSize.height=((B=this.element)==null?void 0:B.videoHeight)||0,this._preSize.width=((Q=this.element)==null?void 0:Q.videoWidth)||0,this.emit(vr.RESIZE,{newWidth:this._preSize.width,newHeight:this._preSize.height}))),f===gt.LEAVE_PICTURE_IN_PICTURE&&(this._log.warn("exit pip"),this.isPaused&&!this.isPausedByUserCall&&(this._log.warn("resume after exit pip"),this.doResume()),this.resetSrcObjectToReplay(),this.emit(vr.LEAVE_PICTURE_IN_PICTURE)),f===gt.ENTER_PICTURE_IN_PICTURE&&this.emit(vr.ENTER_PICTURE_IN_PICTURE)}resetSrcObjectToReplay(){hl&&YK&&this.isPlayCalled&&this.element&&this.track&&!this.isPausedByUserCall&&(this._log.warn("reset srcObject to replay for android chromium"),this._isResettingSrcObject=!0,this.element.srcObject=new MediaStream([this.track]),this.element.play().catch(t=>{this._log.warn("play failed after reset srcObject",t)}).finally(()=>{this._isResettingSrcObject=!1}))}setCanvas(t,i=1){var r,s;this.canvas!==t&&((r=this.canvas)==null||r.remove(),t?.setAttribute("style",this.styleAttribute),this.canvas=t,this.mode=t?i:0,this.mode===2&&this.setTrack(t.captureStream().getVideoTracks()[0]),t?((s=this.element)==null||s.remove(),this._appendToWrapper(t)):this.element&&this._appendToWrapper(this.element))}setAttr(t){const i=Object.assign({autoplay:"autoplay",playsinline:"playsinline",muted:!0},t);i.style=Object.assign({width:"100%",height:"100%"},i.style),super.setAttr(i)}get mirror(){return this.viewMirror}setRect(t,i){this.elementToRender&&(this.elementToRender.style.width=`${t}px`,this.elementToRender.style.height=`${i}px`)}setViewMirror(t){this.elementToRender&&(this.elementToRender.style.transform=t?"scaleX(-1)":""),this.viewMirror=t}setObjectFit(t){this.elementToRender&&(this.elementToRender.style.objectFit=`${t}`),this.objectFit=t}setPoster(t,i=!1){return new Promise(r=>{if(!this.element||(this._log.info("setPoster",t.slice(0,10)),t===""?this.element.removeAttribute("poster"):this.element.poster=t,!(i&&(IE||Ql))))return r();if(t==="")return this.removePosterImg(),r();if(this.posterImg)return r();const s=document.createElement("img");s.src=t;const g=window.getComputedStyle(this.element),B=g.objectFit||this.objectFit;let Q=1;if(this._useWrapper){const f=parseInt(g.zIndex,10);isNaN(f)||(Q=f+1)}s.style.cssText=this._useWrapper?`grid-area:1/1;z-index:${Q};width:100%;height:100%;object-fit:${B};`:`position:absolute;top:0;left:0;width:100%;height:100%;object-fit:${B};`,s.onload=async()=>{try{s.decode&&await s.decode(),this.container&&!this._useWrapper&&window.getComputedStyle(this.container).position==="static"&&(this._originContainerPosition=this.container.style.position,this.container.style.position="relative"),this.posterImg=s;const f=this._useWrapper?this._wrapper:this.container;f?.appendChild(s),J2()&&QD<=17&&this.elementToRender&&(this.elementToRender.style.visibility="hidden")}catch(f){this._log.warn("decode poster image error",f)}return r()},s.onerror=()=>(this._log.warn("load poster image error"),r())})}removePosterImg(){this.posterImg&&(J2()&&QD<=17&&this.elementToRender&&(this.elementToRender.style.visibility=""),this.posterImg.remove(),URL.revokeObjectURL(this.posterImg.src),this._useWrapper||!this.container||Fr(this._originContainerPosition)||this.container.style.position!=="relative"||(this.container.style.position=this._originContainerPosition),delete this.posterImg)}get hasPoster(){var t;return!!this.posterImg||!!((t=this.element)!=null&&t.getAttribute("poster"))}async pause(t=!0){super.pause(),this.isPictureInPicture()||this.hasPoster||!(YK||t&&(Ql||IE))||await this.setPoster(this.getVideoFrame(),!0)}resume(t=!1){return super.resume(t).then(()=>{var i;(this.posterImg||(i=this.element)!=null&&i.poster)&&this.setPoster("",!0)})}doResume(t=!1){return this.isPaused&&t&&this.element&&this.track&&YK&&this.track.kind==="video"&&(this.element.srcObject=new MediaStream([this.track])),super.doResume()}stop(t=0){var i;this.isPictureInPicture()&&this.exitPictureInPicture().catch(r=>{}),this.isFullscreen()&&this.exitFullscreen().catch(r=>{}),this.element&&(this.element.removeEventListener(gt.FULLSCREEN_CHANGE,this.handleFullscreenChange),this.element.removeEventListener("webkitbeginfullscreen",this.handleFullscreenChange),this.element.removeEventListener("webkitendfullscreen",this.handleFullscreenChange),this.element.removeEventListener("volumechange",this.handleVolumeChange)),this._isFirstFrameRenderEmitted=!1,super.stop(t),(i=this.canvas)==null||i.remove(),this.removePosterImg(),this._useWrapper&&this._cleanupWrapper()}_cleanupWrapper(){this._wrapper&&this._wrapper.children.length===0&&this._wrapper.remove(),this._wrapper=null}play(t){if(Fr(t?.isLiveStream)||this.setLiveMode(t.isLiveStream),this.element){if(this.elementToRender&&this.container)if(this._useWrapper){const i=this._getOrCreateWrapper();this.elementToRender.parentElement!==i&&i.insertBefore(this.elementToRender,i.firstChild)}else this.elementToRender.parentElement!==this.container&&this.container.append(this.elementToRender)}else this.initializeElement();return this.mode===2?Promise.resolve():super.play()}get elementToRender(){return this.canvas||this.element}setTrack(t){t!==this.track&&(this.unbindTrackEvents(),this.track=t,this.emit(vr.MEDIA_TRACK_CHANGED,t),t!==null&&(this.bindTrackEvents(),this.element&&this.mode!==2&&(this.element.srcObject=new MediaStream([t]),this.element.remove()),this._appendToWrapper()))}getVideoFrame(){if(this.canvas)return this.canvas.toDataURL("image/png");if(!this.element)return"";const t=document.createElement("canvas");return t.width=this.element.videoWidth,t.height=this.element.videoHeight,t.getContext("2d").drawImage(this.element,0,0),t.toDataURL("image/png")}getElement(){return this.element}calculateStat(){try{if(j3()&&this.element&&this._calculateTimeout<0){let t=0,i=null;const r=(s,g)=>{this.stat.width=g.width,this.stat.height=g.height,i&&(this.stat.fps=Math.round((g.presentedFrames-i.presentedFrames)/(s-t)*1e3)),t=s,i=g,this._calculateTimeout=-1,this.element&&(this._calculateTimeout=setTimeout(()=>{var B;return(B=this.element)==null?void 0:B.requestVideoFrameCallback(r)},2e3))};this.element.requestVideoFrameCallback(r)}}catch(t){this._log.warn("init stat failed",t)}}async enterFullscreen(){const t=this.elementToRender;if(!t)throw this._log.warn("no element to render, cannot enter fullscreen"),new Error("No element available for fullscreen");if(UI&&this.isPictureInPicture()){this._log.info("exit pip before entering fullscreen");try{await this.exitPictureInPicture()}catch(i){this._log.warn("exit pip failed before fullscreen:",i)}}try{if(t.requestFullscreen)await t.requestFullscreen();else if(t.webkitRequestFullscreen)await t.webkitRequestFullscreen();else if(t.webkitEnterFullscreen)await t.webkitEnterFullscreen();else if(t.mozRequestFullScreen)await t.mozRequestFullScreen();else{if(!t.msRequestFullscreen)throw new Error("Fullscreen API not supported");await t.msRequestFullscreen()}this._log.info("entered fullscreen mode")}catch(i){throw this._log.error("failed to enter fullscreen:",i),i}}async exitFullscreen(){try{if(!this.isFullscreen())return;if(document.exitFullscreen)await document.exitFullscreen();else if(document.webkitExitFullscreen)await document.webkitExitFullscreen();else if(document.mozCancelFullScreen)await document.mozCancelFullScreen();else{if(!document.msExitFullscreen)throw new Error("Exit fullscreen API not supported");await document.msExitFullscreen()}this._log.info("exited fullscreen mode")}catch(t){throw this._log.error("failed to exit fullscreen:",t),t}}isFullscreen(){const t=this.elementToRender;return t?this.element&&this.element.webkitDisplayingFullscreen?!this.isPictureInPicture():(document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement)===t:!1}async toggleFullscreen(){this.isFullscreen()?await this.exitFullscreen():await this.enterFullscreen()}async enterPictureInPicture(){this.enterPIPPromise=this._enterPictureInPicture();try{return await this.enterPIPPromise}finally{delete this.enterPIPPromise}}async _enterPictureInPicture(){try{if(!this.element)throw new Error("No video element available for pip");if(this.canvas&&this.mode!==1)throw new Error("pip is not supported for canvas-only mode");const{element:t}=this;if(t.requestPictureInPicture){this._log.info("requestPictureInPicture");const i=await t.requestPictureInPicture();return this.pipWindow=i,this._log.info("entered pip mode"),this.elementToRender===this.canvas&&(this.canvas.remove(),this._appendToWrapper(this.element)),i}if(t.webkitSetPresentationMode)return this._log.info("webkitSetPresentationMode"),await t.webkitSetPresentationMode("picture-in-picture"),this._log.info("entered pip mode (webkit)"),{};throw new Error("pip API not supported")}catch(t){throw this._log.error("failed to enter pip:",t.name,t.message),t}}async exitPictureInPicture(){var t;try{if(!this.isPictureInPicture())return;if(delete this.pipWindow,document.pictureInPictureElement&&document.exitPictureInPicture)await document.exitPictureInPicture(),this.elementToRender===this.canvas&&((t=this.element)==null||t.remove(),this._pausedRetryCount=ow,this._appendToWrapper(this.canvas)),this._log.info("exited pip mode");else{if(!this.element||!this.element.webkitSetPresentationMode)throw new Error("Exit pip API not supported or not in PiP mode");await this.element.webkitSetPresentationMode("inline"),this._log.info("exited pip mode (webkit)")}}catch(i){throw this._log.error("failed to exit pip:",i),i}}isPictureInPicture(){if(!this.element)return!1;const{element:t}=this;return document.pictureInPictureElement?document.pictureInPictureElement===t:!!t.webkitPresentationMode&&t.webkitPresentationMode==="picture-in-picture"}async togglePictureInPicture(){this.isPictureInPicture()?await this.exitPictureInPicture():await this.enterPictureInPicture()}};async function XIA(t,i){if(!t.audioWorklet)return Promise.reject("audioWorklet is not supported");try{await t.audioWorklet.addModule(i),qi.info("worklet addModule success")}catch(r){throw qi.info(`worklet addModule catch error. ${r.message}`),r}}typeof AudioContext<"u"?ZG=AudioContext:typeof webkitAudioContext<"u"?ZG=webkitAudioContext:typeof mozAudioContext<"u"&&(ZG=mozAudioContext);var LI,$IA=1500,$5=-1,s2=0,XG=-1,xj=!1,A8=0,e8=-1,t8=-1;function _X(){try{if(LI)return;(LI=new ZG({sampleRate:48e3})).onstatechange=()=>{qi.info(`context state: ${LI.state}${LI.state!=="running"?` visibilityState: ${document.visibilityState}`:""}`),fw()},clearTimeout($5)}catch(t){qi.error(`initAudioContext failed: ${t} typeof AudioContextClass: ${typeof ZG}`),$5=setTimeout(_X,1e3)}}_X();var fw=()=>{LI.state==="suspended"?(s2=Ns(),AcA(),z2(),document.addEventListener("click",fw)):LI.state==="interrupted"?z2():(s2&&(qr.addNumber({key:507800,value:Ns()-s2,split:[0,500,1e3,1500,2e3,3e3,4e3,5e3,1e4,3e4],max:6e4}),s2=0),ecA(),document.removeEventListener("visibilitychange",fw),document.removeEventListener("click",fw))},jK=0,WK=-1;function z2(){return new Promise((t,i)=>{if(LI.state==="running")return t();Date.now()-jK<1e3?(clearTimeout(WK),WK=setTimeout(()=>{jK=Date.now(),LI.resume().then(t,i)},1e3)):(clearTimeout(WK),jK=Date.now(),LI.resume().then(t,i))}).catch(t=>{qi.warn(`context resume failed: ${t}`),document.addEventListener("visibilitychange",fw)})}function AcA(){XG===-1&&(XG=setTimeout(()=>{LI.state==="suspended"&&(xj=!0,Eo.emit("155",{isSuspended:!0}))},$IA))}function ecA(){XG!==-1&&(clearTimeout(XG),XG=-1,xj&&(xj=!1,Eo.emit("155",{isSuspended:!1})))}function tcA(){if(!UI||t8!==-1)return;const t=()=>{Ns()-A8<500||(LI&&LI.state==="running"&&LI.currentTime===e8&&(qi.warn("context is fake running, auto resume"),LI.suspend().catch(i=>{qi.warn(`context suspend failed: ${i}`)})),e8=LI.currentTime,A8=Ns())};t8=setInterval(()=>{t()},2e3),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&t()})}document.addEventListener("click",fw);var mp=t=>LI,aD=class{constructor(t){this.name=t,OA(this,"node"),OA(this,"node2"),OA(this,"pre",new Set),OA(this,"next",new Set),OA(this,"context"),OA(this,"connectedNodes",new Set),OA(this,"nextInputChannelMap",new Map),OA(this,"_channelCount",1)}get channelCount(){return this._channelCount}set channelCount(t){this._channelCount=t,this.setChannelCount(this.node,t),this.setChannelCount(this.node2,t),this.next.forEach(i=>i.channelCount=t)}setChannelCount(t,i){!t||t instanceof ScriptProcessorNode||(t.channelCountMode="explicit",t.channelCount=i||this.channelCount||1)}setContext(t){this.context=t,this.node&&t.addMixWeight()}removeContext(){var t;this.node&&((t=this.context)==null||t.reduceMixWeight()),delete this.context}replaceNode(t){var i;if(t!==this.node)try{this.node?this._disconnect():(i=this.context)==null||i.addMixWeight(),this.node=t,this.setChannelCount(this.node),this.preNodeReconnect(),this.reconnect()}catch(r){qi.error(r)}}setNode(t,i){var r;if(!this.node)try{(r=this.context)==null||r.addMixWeight(),this.node=t,this.setChannelCount(this.node),i&&(this.node2=i,this.setChannelCount(this.node2)),this.preNodeReconnect(),this.reconnect(),qr.addSuccessEvent({key:502701})}catch(s){qi.error(s),qr.addFailedEvent({key:502701,error:s})}}deleteNode(){var t;if(this.node)try{this._disconnect(),delete this.node,delete this.node2,(t=this.context)==null||t.reduceMixWeight(),this.preNodeReconnect(),qr.addSuccessEvent({key:502702})}catch(i){qi.error(i),qr.addFailedEvent({key:502702,error:i})}}preNodeReconnect(){this.pre.forEach(t=>{t.node?t.reconnect():t.preNodeReconnect()})}connectNext(t){this.next.forEach(i=>{const r=this.nextInputChannelMap.get(i);t._connect(i.node,r)||i.connectNext(t)})}_connect(t,i=0){return!(!this.node||!t)&&((this.node2||this.node).connect(t,0,i),this.connectedNodes.add(t),!0)}_disconnect(){this.connectedNodes.forEach(t=>{var i;return(i=this.node2||this.node)==null?void 0:i.disconnect(t)}),this.connectedNodes.clear()}reconnect(){this._disconnect(),this.connectNext(this)}pipeTo(t,i=0){return this.next.add(t),t.pre.add(this),this.nextInputChannelMap.set(t,i),t}},icA=class extends aD{constructor(t=256){super(),this.fftSize=t,OA(this,"dataArray",new Uint8Array(0))}setNode(t){t.fftSize=this.fftSize,this.dataArray=new Uint8Array(t.frequencyBinCount),super.setNode(t)}getByteTimeDomainData(){var t;return(t=this.node)==null||t.getByteTimeDomainData(this.dataArray),this.dataArray}get level(){var t;return(t=this.node)==null||t.getByteTimeDomainData(this.dataArray),Math.max(...this.dataArray)/128-1}get timeDomainPathData(){const t=this.getByteTimeDomainData();let i=0,r=0,s=`M${i},${r}`;for(let g=0;gthis.initAudioWorklet()).catch(i=>(this._log.error(`volumeMeter preload error: ${i}`),this.initScriptProcessor()))}initAudioWorklet(){if(!this._audioWorkletNode)try{this._audioWorkletNode=new AudioWorkletNode(Ad.audioContext,"volume-meter");let i=!1;this._audioWorkletNode.port.onmessage=r=>{Ad.lastMessageTime=Date.now(),this._volume=r.data.volume||0,this._volumeDb=r.data.volumeDb||0,!i&&r.data.cacheLen&&r.data.outputLen&&(this._log.warn("worklet play success"),i=!0)},this.handleAudioLevelInterval({interval:this._interval})}catch(i){this._log.error(`volumeMeter init audio worklet error: ${i}`),fC.logFailedEvent({userId:this._log.userId,eventType:VG.LOAD_WORKLET,error:i}),this.initScriptProcessor()}}initScriptProcessor(){if(!this._scriptProcessorNode)try{this._scriptProcessorNode=mp("volume-meter").createScriptProcessor(2048,1,1),this._scriptProcessorNode.onaudioprocess=i=>{Ad.lastMessageTime=Date.now();const r=i.inputBuffer.getChannelData(0);let s=0;for(let g=0;g>2);t.copyTo(r,{planeIndex:0}),this.node.port.postMessage({name:"chunk",data:r},[r.buffer]),t.close()}}},acA=Tw(mk()),r8=t=>i=>i.deviceId===t,zK=class{constructor(t,i){OA(this,"kind"),OA(this,"type"),OA(this,"devices",[]),this.kind=t,this.type=i}update(t,i){const r=t.filter(s=>s.kind===`${this.kind}${this.type.toLocaleLowerCase()}`);this.devices.length===1&&bX(this.devices[0])||i&&(r.forEach(s=>{if(s.deviceId&&!this.devices.find(r8(s.deviceId))){const g=`${this.kind}${this.type}Added`;qi.warn(`${g}: ${JSON.stringify(s)}`),i.emit(g,s)}}),this.devices.forEach(s=>{if(s.deviceId&&!r.find(r8(s.deviceId))){const g=`${this.kind}${this.type}Removed`;qi.warn(`${g}: ${JSON.stringify(s)}`),i.emit(g,s)}})),this.devices=r}hasDevice(t){return!!this.devices.find(i=>i.deviceId===t)}},scA=class extends acA.EventEmitter{constructor(){super(),OA(this,"audioInputs",new zK(gt.AUDIO,"Input")),OA(this,"videoInputs",new zK(gt.VIDEO,"Input")),OA(this,"audioOutputs",new zK(gt.AUDIO,"Output")),this.init(),navigator.mediaDevices&&(navigator.mediaDevices.addEventListener&&navigator.mediaDevices.addEventListener("devicechange",()=>this.update()),"ondevicechange"in navigator.mediaDevices||ku.run("interval",()=>{this.update()},{delay:1e4}))}init(){Yj().then(t=>{this.audioInputs.update(t),this.videoInputs.update(t),this.audioOutputs.update(t)})}async update(t=0){const i=await Yj(t);return this.audioInputs.update(i,this),this.videoInputs.update(i,this),this.audioOutputs.update(i,this),this}hasBlueTooth(){var t;if(1e3*((t=mp())==null?void 0:t.outputLatency)>150)return!0;const i=["bluetooth","air","wireless","bt","tws","buds","headset","headphone"];return this.audioOutputs.devices.some(r=>i.some(s=>r.label.toLowerCase().includes(s)))||this.audioInputs.devices.some(r=>i.some(s=>r.label.toLowerCase().includes(s)))}},Tu=r9||o9?null:new scA;function bX(t){return t.deviceId===t.groupId&&t.groupId===""}async function Yj(t=0){if(vY()||!H3())return[];let i=await navigator.mediaDevices.enumerateDevices();if(t!==0){const r={audio:!1,video:!1};if(i.forEach(s=>{bX(s)&&(s.kind===gt.AUDIO_INPUT?r.audio=!0:s.kind===gt.VIDEO_INPUT&&(r.video=!0))}),t===2&&(r.audio=!1),t===1&&(r.video=!1),r.audio||r.video){let s;try{s=await navigator.mediaDevices.getUserMedia(r),r.audio&&z2()}catch(g){qi.debug("capture before getDevices failed: ",g)}i=await navigator.mediaDevices.enumerateDevices(),s?.getTracks().forEach(g=>g.stop())}}return i.map((r,s)=>{const g={kind:r.kind,deviceId:r.deviceId,groupId:r.groupId,label:r.label||`${r.kind}_${s}`};return r.deviceId.length>0&&X3.add(`${r.deviceId}_${r.kind}`),r.getCapabilities&&(g.getCapabilities=()=>r.getCapabilities()),g})}function Ek(t=!1){return Tu.update(t?1:0).then(i=>i.audioInputs.devices)}function sD(t=!1){return Tu.update(t?2:0).then(i=>i.videoInputs.devices)}var n8=!1;async function gcA(){try{n8||(n8=!0,qi.info(`speakers:${(await IcA()).map(t=>` ${t.deviceId.slice(0,8)}: ${t.label}`)}`))}catch{}}async function IcA(t=!1){return(UI||IE)&&(t=!1),Tu.update(t?1:0).then(i=>i.audioOutputs.devices)}var y2,X3=new Set;function ccA(t){if(t instanceof CanvasCaptureMediaStreamTrack||!(t instanceof MediaStreamTrack))return!1;const i=t.label.toLocaleLowerCase();if(i.includes("camera")||i.includes("webcam"))return!0;const r=`${(t?.getSettings()||{}).deviceId}_${gt.VIDEO_INPUT}`;return!!X3.has(r)}function EcA(t){if(t instanceof CanvasCaptureMediaStreamTrack||!(t instanceof MediaStreamTrack))return!1;const i=t.label.toLocaleLowerCase();if(i.includes("mic")||i.includes("麦克风"))return!0;const r=`${(t?.getSettings()||{}).deviceId}_${gt.AUDIO_INPUT}`;return!!X3.has(r)}async function lcA(t,i){const r=(await Ek()).find(s=>s.deviceId===s9);return!i&&r?.groupId===t||r?.groupId===t&&r.label===i}async function CcA({newDeviceId:t,oldDeviceId:i,oldGroupId:r,oldLabel:s,kind:g}){return t===i&&(g!==gt.AUDIO||t!==s9||await lcA(r,s))}var BcA=class extends ocA{constructor(t){super(),this.log=t,OA(this,"volumeMeter"),OA(this,"volumeMeterAfter3A"),OA(this,"volumeDestination"),OA(this,"analyser",new icA),this.volumeMeter=new o8({log:this.log}),this.volumeMeterAfter3A=new o8({log:this.log}),this.volumeDestination=new aD,this.volumeMeter.pipeTo(this.volumeDestination)}destroy(){this.gain.deleteNode(),this.volumeMeter.deleteNode(),this.analyser.deleteNode(),this.source.deleteNode(),this.destination.deleteNode(),this.volumeDestination.deleteNode()}},ucA=class extends jm{constructor(t){super(t,gt.AUDIO),OA(this,"_outputDeviceId"),OA(this,"_floatVolume",1),OA(this,"_destination"),OA(this,"pipeline"),OA(this,"volumeMeterMode","worklet"),OA(this,"enableVolumeControlInIOS"),this.enableVolumeControlInIOS=t.enableVolumeControlInIOS,this.mode=0,t.url&&(this.url=t.url),this.pipeline=new BcA(this._log)}setTrack(t){}get duration(){var t;return Math.floor(1e3*(((t=this.element)==null?void 0:t.duration)||0))}get currentTime(){var t;return Math.floor(1e3*(((t=this.element)==null?void 0:t.currentTime)||0))}set currentTime(t){this.element&&(this.element.currentTime=t/1e3)}getMediaStream(){return this.pipeline.stream||(this.track?new MediaStream([this.track]):null)}initializeElement(t){if((_u==="15.2"||_u==="15.3"||_u==="15.4")&&this.muted)return void this._log.info("audioElement is muted.");this._log.info("audio player initializeElement");const i=y2||new Audio;i.setAttribute("autoplay","autoplay"),i.srcObject=this.getMediaStream(),i.muted=this.muted,this.url&&(i.crossOrigin="anonymous",i.src=this.url),this.element=i,this.setVolume(uD(t)?t/100:this._floatVolume),i===y2&&(y2=void 0),this.options.enableTimeupdateEvent&&(this.element.ontimeupdate=()=>this.emit(vr.TIME_UPDATE,this.currentTime)),this.bindElementEvents()}async play(t){if(this.track||this.url){try{!this.pipeline.source.node&&this.track&&this.pipeline.replaceSource(this.track),this.element||this.initializeElement(t?.volume),this._outputDeviceId&&await this.setSinkId(this._outputDeviceId),this.volumeMeterMode==="worklet"?(this.pipeline.volumeMeter.init(),this.pipeline.volumeMeterAfter3A.init()):this.volumeMeterMode==="analyser"&&this.pipeline.analyser.setNode(mp("player").createAnalyser()),gcA()}catch(i){throw this._log.warn(`audio play error: ${i}`),AX(_u,"18.7",!0)&&this.bindAutoPlayEvent(),i}return super.play()}}stop(t=0){this.pipeline.destroy(),super.stop(t)}setVolume(t){this._floatVolume=t,this.element&&(this.element.volume=t)}async setSinkId(t){var i,r;this._outputDeviceId!==t&&(this._outputDeviceId=t),this.element&&this.element.sinkId!==t&&await((r=(i=this.element).setSinkId)==null?void 0:r.call(i,t))}get useDestination(){return!!this.pipeline.stream}setLoop(t){this.element&&(this.element.loop=t)}getAudioLevel(){return this.pipeline.volumeMeter.getCalculatedVolume()}getInternalAudioLevel(){return this.pipeline.volumeMeter.getInternalAudioLevel()}getInternalAudioLevelAfter3A(){return this.pipeline.volumeMeterAfter3A.getInternalAudioLevel()}},QcA=class extends ucA{constructor(t){super(t),OA(this,"_sourceElement"),OA(this,"_output",new aD),this.pipeline.source.pipeTo(this.pipeline.gain),this.pipeline.gain.pipeTo(this.pipeline.volumeMeter).pipeTo(this._output),this.pipeline.gain.pipeTo(this.pipeline.destination)}setOutput(){this.mode=1,this._output.setNode(mp().destination)}write(t){this.pipeline.volumeMeter.write(t)}setTrack(t){var i,r,s;((r=(i=this.element)==null?void 0:i.error)==null?void 0:r.code)!==MediaError.MEDIA_ERR_DECODE&&this.track!==t&&(this.unbindTrackEvents(),this.track=t,this.emit(vr.MEDIA_TRACK_CHANGED,t),t?(this.bindTrackEvents(),this._sourceElement?this._sourceElement.srcObject=new MediaStream([t]):!this.useDestination&&this.element&&(this.element.srcObject=new MediaStream([t])),this.pipeline.source.channelCount=((s=t.getSettings())==null?void 0:s.channelCount)||1,this.pipeline.replaceSource(t)):this.pipeline.source.deleteNode())}setVolume(t){var i;const r=t<=1&&!J2();if(!(this._floatVolume===t&&(r&&((i=this.element)==null?void 0:i.volume)===t||!r&&this.pipeline.volume===t)))if(this._floatVolume=t,this.useDestination)this.pipeline.setVolume(t),this._log.info(`set pipeline volume: ${t}`);else if(r)this.element?(this._log.info(`set element volume: ${t}`),this.element.volume=t):this._log.info("set element volume: no element");else{if(J2()){if(!this.enableVolumeControlInIOS)return;tcA()}if(Ql&&!this.pipeline.source.node)return void this._log.warn("set pipeline volume failed: no source node");this._log.info(`start set pipeline volume: ${t}`),this.pipeline.setVolume(t),this.element&&!this._sourceElement&&(this._destination||(this._destination=mp().createMediaStreamDestination()),this.pipeline.destination.setNode(this._destination),gk(this.element),this._sourceElement=this.element,this._sourceElement.muted=!0,this.element=null,this.play().catch(s=>{this.emit(vr.AUTOPLAY_FAILED,s)}))}}stop(t=0){this.pipeline.destroy();const i=this._sourceElement||this.element;i&&$9&&(y2=i),this._sourceElement&&(this._sourceElement.srcObject=null,delete this._sourceElement),super.stop(t)}},$3=class extends Lr{constructor({userId:t,sdkAppId:i,mediaType:r,room:s,PlayerClass:g=r===1?QcA:Ip}){var B;super(),OA(this,"id",aX()),OA(this,"userId",""),OA(this,"isRemote"),OA(this,"mediaType"),OA(this,"room"),OA(this,"user"),OA(this,"_log"),OA(this,"_inputTrack"),OA(this,"_outputTrack"),OA(this,"isPlayCalled"),OA(this,"container",null),OA(this,"player"),OA(this,"subVideoPlayerMap"),OA(this,"muted",!1),OA(this,"abortCtrl"),OA(this,"objectFit","cover"),OA(this,"mirror"),OA(this,"rotation"),OA(this,"isScreen",!1),OA(this,"manager"),OA(this,"trackSettings"),OA(this,"isFirstVideoFrameEmitted",!1),this.userId=t||"",this.mediaType=r,this._log=qi.createLogger({parent:s?.getLogger(),id:`${this.kind[0]}t`,userId:(B=s||this.room)==null?void 0:B.userId,remoteUserId:this instanceof AD?void 0:this.userId,sdkAppId:i,type:this.mediaType===2?"auxiliary":"main",isLocal:this instanceof AD}),this.player=new g({id:this.userId||this.id,track:null,muted:!1,container:null,log:this._log,enableVolumeControlInIOS:s?.enableVolumeControlInIOS}),this.player.on(vr.PLAYER_STATE_CHANGED,Q=>{if(Eo.emit(nr.PLAYER_STATE_CHANGED,cr({track:this},Q)),this.emit("player-state-changed",Q),Q.state==="PLAYING"&&this.room){let f=!0;for(const{remoteAudioTrack:m,remoteVideoTrack:M,remoteAuxiliaryTrack:v}of[...this.room.remotePublishedUserMap.values()])if(m.isAvailable&&!m.player.isPlaying||M.isAvailable&&!M.player.isPlaying||v.isAvailable&&!v.player.isPlaying){f=!1;break}f&&Ik()&&ZIA()}}),this.kind===gt.VIDEO&&(this.player.on(vr.LOADED_DATA,()=>{this.emitFirstVideoFrameEvent(vr.LOADED_DATA),Eo.emit(nr.VIDEO_LOADED_DATA,{track:this})}),this.player.on(vr.LOADED_META_DATA,()=>{this.emitFirstVideoFrameEvent(vr.LOADED_META_DATA)}),this.player.on(vr.MEDIA_TRACK_CHANGED,Q=>{var f;(f=this.subVideoPlayerMap)==null||f.forEach(m=>m.setTrack(Q))}),this.player.on(vr.RESIZE,Q=>{this.emitFirstVideoFrameEvent(vr.RESIZE),this.emit("video-size-changed",cr({userId:this.userId,streamType:this.mediaType===2?"auxiliary":"main"},Q))}),this.player.on(vr.FIRST_FRAME_RENDER,Q=>{this.emit("first-frame-render",lB(cr({},Q),{streamType:this.streamType,userId:this.isRemote?this.userId:""}))})),this.onTrackMuted=this.onTrackMuted.bind(this),this.onTrackUnmuted=this.onTrackUnmuted.bind(this),this.onTrackEnded=this.onTrackEnded.bind(this),this.onPlayerError&&this.player.on(vr.ERROR,this.onPlayerError.bind(this)),this.player.on(vr.AUTOPLAY_FAILED,this.handleAutoPlayFailed,this)}get log(){return this._log||qi}get kind(){return this.mediaType===1?gt.AUDIO:gt.VIDEO}get isAudio(){return this.kind===gt.AUDIO}get strMediaType(){return this.mediaType===4?gt.VIDEO:this.mediaType===2?gt.SCREEN:gt.AUDIO}get streamType(){return 2&this.mediaType?"auxiliary":"main"}get isMediaTrackActive(){return!!this.mediaTrack&&!this.mediaTrack.muted&&this.mediaTrack.readyState==="live"&&this.mediaTrack.enabled}async play(t,i){const r=dC(t)?t[0]:t;if(this.isPlayCalled)return this.log.info(`play update options: ${JSON.stringify(i)}`),i&&!Fr(i.muted)&&this.setPlayerMute(i.muted),i&&!Fr(i.objectFit)&&(this.objectFit=i.objectFit),void(this.player instanceof Ip&&(this.player.setObjectFit(this.objectFit),this.container!==r&&r&&(dC(t)&&t.length>=1&&this.container&&t.includes(this.container)&&this.container.contains(this.player.elementToRender)?(t.splice(t.indexOf(this.container),1),t.unshift(this.container)):(this.container=r,this.player.setContainer(r))),dC(t)&&t.length>=1&&await this.playSubContainer(t.slice(1),i)));if(i&&!Fr(i.muted)?this.setPlayerMute(i.muted):this.isRemote&&this.kind!==gt.VIDEO||this.setPlayerMute(!0),i&&!Fr(i.objectFit)&&(this.objectFit=i.objectFit),this.player instanceof Ip&&(Fr(i?.isLiveStream)||this.player.setLiveMode(i.isLiveStream),this.player.setObjectFit(this.objectFit),i&&!Fr(i.poster)&&this.player.setPoster(i.poster)),this.isPlayCalled=!0,r&&(this.container=r,this.player instanceof Ip&&this.player.setContainer(r)),Eo.emit(nr.PLAY_TRACK_START,{track:this}),this._outputTrack){this._log.info(`play with options: ${JSON.stringify(i)}`);try{this.player.setTrack(this.playerMediaTrack),await this.player.play(i),dC(t)&&t.length>1&&await this.playSubContainer(t.slice(1),i)}catch(s){throw this.handleAutoPlayFailed(s),s}}else this.log.info("play has not mediaTrack, abort")}setMirror(t,i){if(this.isScreen||this.kind!==gt.VIDEO||Fr(t)||t===this.mirror)return;this.mirror=t;let r=this.player;i&&(r=i);const s=this.manager;if(rD(this.mirror))return r.setViewMirror(this.mirror),void(!this.isRemote&&s&&(s.mirror=!1));switch(this.mirror){case"view":s&&(s.mirror=!1),r.setViewMirror(!0);break;case"publish":s&&(s.mirror=!0),r.setViewMirror(!0);break;case"both":s&&(s.mirror=!0),r.setViewMirror(!1)}}async playSubContainer(t,i){if(!this._outputTrack||this.kind===gt.AUDIO)return;this.subVideoPlayerMap||(this.subVideoPlayerMap=new Map),this.subVideoPlayerMap.forEach((s,g)=>{var B;t.find(Q=>g===Q)||(s.stop(),(B=this.subVideoPlayerMap)==null||B.delete(g))});for(const[s,g]of t.entries()){const B=this.subVideoPlayerMap.get(g);B?i&&(Fr(i.objectFit)||B.setObjectFit(i.objectFit)):this.subVideoPlayerMap.set(g,new Ip({id:this.userId||this.id,track:this.playerMediaTrack,container:g,muted:this.player.muted,objectFit:this.objectFit,log:this.log.createChild({id:`vp-sub${s+1}`})}))}const r=[...this.subVideoPlayerMap.values()];for(const s of r)s.setViewMirror(this.player.mirror),await s.play()}setAudioOutput(t){return this.player.setSinkId(t)}setAudioVolume(t){this.player.setVolume(t)}getAudioLevel(){return this.player.getAudioLevel()||0}getInternalAudioLevel(){var t;return((t=this.player)==null?void 0:t.getInternalAudioLevel())||0}stop(t=!1){this.isPlayCalled&&(this.isPlayCalled=!1,this.isFirstVideoFrameEmitted=!1,this.player&&(this.log.info(`stop ${this.kind} player`),this.player.stop(OK(this)&&!t?this.jitterBufferDelay:0)),this.subVideoPlayerMap&&this.subVideoPlayerMap.size>0&&this.subVideoPlayerMap.forEach(i=>{i.stop()}),this.container=null)}async resume(){var t;this.isPlayCalled&&await((t=this.player)==null?void 0:t.resume())}close(){this._toInitState(),this.log.info("close"),this.isPlayCalled&&this.stop(!0)}_toInitState(){}setMute(t){this.muted=t,this._inputTrack&&(this._inputTrack.enabled=!t),this._outputTrack&&(this._outputTrack.enabled=!t),this.emit(t?"mute":"unmute",this),Eo.emit(t?nr.TRACK_MUTED:nr.TRACK_UNMUTED,{track:this})}setPlayerMute(t){this.player.setMuted(t)}get mediaTrack(){return this._inputTrack||null}get outMediaTrack(){return this._outputTrack||null}get playerMediaTrack(){return this.outMediaTrack}installTrackEvent(t){z3(t,t).add(gt.MUTE,this.onTrackMuted).add(gt.UNMUTE,this.onTrackUnmuted).add(gt.ENDED,this.onTrackEnded),t.muted&&this.onTrackMuted(),t.readyState===gt.ENDED&&this.onTrackEnded()}uninstallTrackEvent(t){gk(t)}setInputMediaStreamTrack(t){var i;const r=this._inputTrack;if(t!==r)return this._inputTrack=t,this.trackSettings=(i=t.getSettings)==null?void 0:i.call(t),t.enabled=!this.muted,r&&this.uninstallTrackEvent(r),this.installTrackEvent(t),this.emit("input-media-track-changed",t||null,r||null),this.manager?this.manager.changeInput(this):this.setOutputMediaStreamTrack(t)}setOutputMediaStreamTrack(t){var i;const r=this._outputTrack;this instanceof GY&&w3(r)||t!==r&&(this.isRemote?this.log.debug("setOutputMediaStreamTrack",t.label):this.log.info("setOutputMediaStreamTrack",(i=t.getSettings)==null?void 0:i.call(t).deviceId,t.label),this._outputTrack=t,this._inputTrack&&(this._outputTrack.contentHint=this._inputTrack.contentHint,this._outputTrack.enabled=this._inputTrack.enabled),this.updatePlayingState(!!t),this.emit("output-media-track-changed",t))}setMediaType(t){this.mediaType=t}updatePlayingState(t){var i,r;if(this.isPlayCalled){if(t){if(this.player.setTrack(this.playerMediaTrack),this.player.isStopped)return this.player.play().catch(s=>this.handleAutoPlayFailed(s)),void this.log.info(`playing state updated, play ${this.kind}`)}else if(!this.player.isStopped)return OK(this)&&this.isAudio&&((i=this.user)!=null&&i.muteState.hasAudio)&&((r=this.user)!=null&&r.muteState.audioMuted)?void 0:(this.player.stop(OK(this)?this.jitterBufferDelay:0),void this.log.info(`playing state updated, stop ${this.kind}`))}this.log.debug(`updatePlayingState abort ${this.isPlayCalled} ${t} ${this.player.isStopped}`)}async handleAutoPlayFailed(t){var i;this.log.warn("handleAutoPlayFailed",t);const r=()=>{this.resume().then(()=>{document.removeEventListener("click",r,!0)})};if(this.room&&this.room.enableAutoPlayDialog){if((Gw||Rk)&&(await Rw(100),(i=this.player)==null?void 0:i.isPlaying))return;zIA()}else document.addEventListener("click",r,!0);Eo.once(nr.LOCAL_TRACK_CAPTURE_SUCCESS,({track:s})=>{s.kind==="audio"&&Ik()&&!this.player.isPlaying&&this.isRemote&&this.isAvailable&&r()}),this.emit("error",t)}getVideoFrame(){return this.player instanceof Ip?this.player.getVideoFrame():""}emitFirstVideoFrameEvent(t){var i,r,s;if(this.isFirstVideoFrameEmitted)return;const g=(i=this.mediaTrack)==null?void 0:i.getSettings();let B=g?.width||((r=this.player.element)==null?void 0:r.videoWidth)||0,Q=g?.height||((s=this.player.element)==null?void 0:s.videoHeight)||0;(t!==vr.RESIZE||B||Q)&&(t!==vr.LOADED_META_DATA||B||Q)&&(t!==vr.LOADED_DATA||B||Q||this._log.warn("the dimension of video is 0x0 in first-video-frame event"),this.isFirstVideoFrameEmitted=!0,D9(this.rotation)&&([B,Q]=[Q,B]),this.emit("first-video-frame",{width:B,height:Q,streamType:this.streamType,userId:this.isRemote?this.userId:""}))}onTrackMuted(){this._log.warn(`${this.kind} track is unable to provide media output`)}onTrackUnmuted(){this._log.info(`${this.kind} track is able to provide media output`)}onTrackEnded(){this._log.warn(`${this.kind} track ended`)}};ss([FI([],Lr.INIT,{sync:!0})],$3.prototype,"_toInitState");var dcA=Object.prototype.hasOwnProperty;function hcA(t){if(t==null)return!0;if(typeof t=="boolean")return!1;if(typeof t=="number")return t===0;if(typeof t=="string"||typeof t=="function"||Array.isArray(t))return t.length===0;if(t instanceof Error)return t.message==="";if(yw(t))switch(Object.prototype.toString.call(t)){case"[object File]":case"[object Map]":case"[object Set]":return t.size===0;case"[object Object]":for(const i in t)if(dcA.call(t,i))return!1;return!0}return!1}var Z2=hcA,pcA=async function(t){const i=mcA(t);qi.info(`getUserMedia with constraints: ${JSON.stringify(i)}`);let r=[],s=[];const g=["label","deviceId","groupId"];if(i.audio&&(r=await Ek(),qi.info(`microphones: ${up(r.map(B=>lB(cr({},B),{groupId:B.groupId.substring(0,8)})),{keysToInclude:g})}`)),i.video&&(s=await sD(),qi.info(`cameras: ${up(s,{keysToInclude:g})}`),!rD(i.video)&&i.video.facingMode==="user"&&!i.video.deviceId)){const B=s.filter(Q=>!Q.label.includes("infrared")).find(Q=>Q.label.includes("facing front"));B&&(i.video.deviceId=B.deviceId,qi.info(`exclude infrared camera: ${JSON.stringify(i)}`))}try{const B=await navigator.mediaDevices.getUserMedia(i);return mX&&B.getTracks().forEach(Q=>{var f;const m=Q.getCapabilities();qi.info(`${Q.kind} capabilities: ${up(m,{keysToInclude:g9})}`),Fr(t.echoCancellation)||((f=m.echoCancellation)==null?void 0:f.indexOf(t.echoCancellation))!==-1||qi.warn(`Invalid argument for 'echoCancellation'. Expected one of [${JSON.stringify(m.echoCancellation)}], but received '${t.echoCancellation}'`)}),i.audio&&z2(),B}catch(B){let{message:Q}=B;throw B.name==="NotFoundError"&&(t.video&&s&&s.length===0&&(Q=j2({key:K2.CAMERA_NOT_FOUND})),t.audio&&r&&r.length===0&&(Q=j2({key:K2.MICROPHONE_NOT_FOUND}))),new Ws({code:xa.INITIALIZE_FAILED,name:B.name,message:Q,constraint:B.constraint})}},fcA=S3({retryFunction:pcA,settings:{retries:3,timeout:500},onError:({error:t,retry:i,reject:r,retryFuncArgs:s,retriedCount:g})=>{const B=g+1;t.name==="NotReadableError"||t.name==="OverconstrainedError"||t.name==="AbortError"?(B===1?(s[0].video&&(s[0].maxResolution=!1,(!IE||s[0].width*s[0].height<=2073600)&&s[0].frameRate&&(s[0].frameRate=s[0].frameRate>10?10:5)),s[0].retryWhenExactFailed&&s[0].useExactDeviceId&&(s[0].useExactDeviceId=!1)):B===2?s[0].useDeviceIdOnly=!0:B!==3||s[0].useExactDeviceId||(s[0].useTrueAsConstraint=!0),i()):r(t),s[0].microphoneId&&a8(s[0].microphoneId,!1),s[0].cameraId&&a8(s[0].cameraId,!0)},onRetrying:t=>{qi.warn(`getUserMedia NotReadableError observed, retrying [${t}/3]`)},onRetryFailed:t=>{fC.logFailedEvent({eventType:VG.GET_USER_MEDIA_RETRY,error:t})},onRetrySuccess:t=>{fC.logSuccessEvent({eventType:VG.GET_USER_MEDIA_RETRY}),fC.uploadEvent({log:`stat-${VG.GET_USER_MEDIA_RETRY}-success-${t}`})}});async function a8(t,i){const r=(i?await sD():await Ek()).find(s=>s.deviceId===t);r&&oD(r.getCapabilities)&&qi.warn(up(r.getCapabilities(),{keysToInclude:g9}))}function mcA(t){return{audio:DcA(t),video:ycA(t)}}function DcA(t){if(!t.audio)return!1;if(t.useTrueAsConstraint)return!0;const i={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0,sampleRate:t.sampleRate};return!Z2(t.microphoneId)&&(i.deviceId=t.useExactDeviceId?{exact:t.microphoneId}:t.microphoneId,t.useDeviceIdOnly)?i:(uD(t.channelCount)&&(i.channelCount=t.channelCount),(rD(t.echoCancellation)||t.echoCancellation==="remote-only"||t.echoCancellation==="all")&&(i.echoCancellation=t.echoCancellation),rD(t.noiseSuppression)&&!t.noiseSuppression&&(i.noiseSuppression=!1),rD(t.autoGainControl)&&!t.autoGainControl&&(i.autoGainControl=!1),!!Z2(i)||i)}function ycA(t){if(!t.video)return!1;if(t.useTrueAsConstraint)return!0;const{maxResolution:i=!0}=t,r={};return t.cameraId?r.deviceId=t.useExactDeviceId?{exact:t.cameraId}:t.cameraId:t.facingMode&&(r.facingMode=t.facingMode),t.useDeviceIdOnly&&!Z2(r)?r:(t.width&&(r.width={ideal:t.width},i&&!Ql&&(r.width.max=t.width)),t.height&&(r.height={ideal:t.height},i&&!Ql&&(r.height.max=t.height)),Ql&&wY&&t.width&&t.height&&t.width*t.height<101376&&(r.width=t.width,r.height=t.height),t.frameRate&&(r.frameRate=t.frameRate),!!Z2(r)||r)}var RcA=fcA;function LX(t){return TY((i,r)=>async function(...s){const g=await i.apply(this,s);return await t.call(this,...s),g})}function TY(t){return function(i,r,s){return s.value=t(s.value,r),s}}var McA=(()=>{let t=!1,i=document.visibilityState;return()=>{document.visibilityState!==i&&qi.info(`visibility change: ${document.visibilityState}`),t||(document.addEventListener("visibilitychange",()=>{qi.info(`visibility change: ${document.visibilityState}`),i=document.visibilityState}),t=!0)}})(),wcA=0,ScA=class{constructor(t){OA(this,"log"),OA(this,"isRunning",!1),OA(this,"queue",[]);let i="fq"+ ++wcA;t&&(i+=`|${t}`),this.log=qi.createLogger({id:i})}get length(){return this.queue.length}get lastQueueItem(){return this.length===0?null:this.queue[this.length-1]}push(t,i=!1){var r,s;const g=cr({},t),B=new Promise((Q,f)=>{g.resolve=Q,g.reject=f});return g.promise=B,i?this.length<=1?this.queue.push(g):(s=(r=this.lastQueueItem)==null?void 0:r.promise)==null||s.then(g.resolve,g.reject):this.queue.push(g),this.log.debug(`push ${this.length}`,t.funcName,t.args),this.isRunning||this.callNext(),B}shift(){const t=this.queue.shift();return this.log.debug(`shift ${this.length}`,t?.funcName,t?.args),t}callNext(){if(this.isRunning||this.length===0)return;const{fn:t,args:i,context:r,resolve:s,reject:g,funcName:B}=this.queue[0];this.log.debug("callNext",this.length,B,i),this.isRunning=!0,t.apply(r,i).then(s,g).finally(()=>{this.isRunning=!1,this.shift(),this.callNext()})}},s8=new WeakMap;function vcA(t=!1){return function(i,r,s){const g=s.value;return s.value=function(...B){const Q=s8.get(this)||new ScA;return s8.set(this,Q),Q.push({fn:g,args:B,context:this,funcName:r},t)},s}}function FX(t,i){return TY((r,s)=>function(...g){const B=t;try{const Q=r.apply(this,g),f=Ns();return C9(Q)?Q.then(m=>(i?qr.addSuccessEvent({key:B,cost:Ns()-f}):qr.addSuccessEvent({key:B}),m)).catch(m=>{throw qr.addFailedEvent({key:B,error:m}),m}):(qr.addSuccessEvent({key:B}),Q)}catch(Q){throw qr.addFailedEvent({key:B,error:Q}),Q}})}function Rg(...t){}var NcA=t=>t();function TcA(){this.dispose()}var GcA=()=>typeof __FASTRX_DEVTOOLS__<"u",kcA=1,Mw=class extends Function{toString(){return`${this.name}(${this.args.length?[...this.args].join(", "):""})`}subscribe(t){const i=new bcA(t,this,this.streamId++);return js.subscribe({id:this.id,end:!1},{nodeId:i.sourceId,streamId:i.id}),this(i),i}},AW=class{constructor(){this.defers=new Set,this.disposed=!1}next(t){}complete(){this.dispose()}error(t){this.dispose()}get bindDispose(){return()=>this.dispose()}dispose(){this.disposed=!0,this.complete=Rg,this.error=Rg,this.next=Rg,this.dispose=Rg,this.subscribe=Rg,this.doDefer()}subscribe(t){return t instanceof Mw?t.subscribe(this):t(this),this}get bindSubscribe(){return t=>this.subscribe(t)}doDefer(){this.defers.forEach(NcA),this.defers.clear()}defer(t){this.defers.add(t)}removeDefer(t){this.defers.delete(t)}reset(){this.disposed=!1,delete this.complete,delete this.next,delete this.dispose,delete this.next,delete this.subscribe}resetNext(){delete this.next}resetComplete(){delete this.complete}resetError(){delete this.error}},BB=class extends AW{constructor(t){super(),this.sink=t,t.defer(this.bindDispose)}next(t){this.sink.next(t)}complete(){this.sink.complete()}error(t){this.sink.error(t)}},_cA=class extends AW{constructor(t,i=Rg,r=Rg,s=Rg){if(super(),this._next=i,this._error=r,this._complete=s,this.then=Rg,t instanceof Mw){const g={toString:()=>"subscribe",id:0,source:t};this.defer(()=>{js.defer(g,0)}),js.create(g),js.pipe(g),this.sourceId=g.id,this.subscribe(t),js.subscribe({id:g.id,end:!0}),i==Rg?this._next=B=>js.next(g,0,B):this.next=B=>{js.next(g,0,B),i(B)},s==Rg?this._complete=()=>js.complete(g,0):this.complete=()=>{this.dispose(),js.complete(g,0),s()},r==Rg?this._error=B=>js.complete(g,0,B):this.error=B=>{this.dispose(),js.complete(g,0,B),r(B)}}else this.subscribe(t)}next(t){this._next(t)}complete(){this.dispose(),this._complete()}error(t){this.dispose(),this._error(t)}};function QC(t,...i){return i.reduce((r,s)=>s(r),t)}function dl(t,i,r){if(GcA()){const s=Object.defineProperties(Object.setPrototypeOf(t,Mw.prototype),{streamId:{value:0,writable:!0,configurable:!0},name:{value:i,writable:!0,configurable:!0},args:{value:r,writable:!0,configurable:!0},id:{value:0,writable:!0,configurable:!0}});js.create(s);for(let g=0;g{if(s instanceof Mw){const g=dl(B=>{const Q=new t(B,...r);Q.sourceId=g.id,Q.subscribe(s)},i,arguments);return g.source=s,js.pipe(g),g}return g=>s(new t(g,...r))}}}function ip(t,i){window.postMessage({source:"fastrx-devtools-backend",payload:{event:t,payload:i}})}var bcA=class extends BB{constructor(t,i,r){super(t),this.source=i,this.id=r,this.sourceId=t.sourceId,this.defer(()=>{js.defer(this.source,this.id)})}next(t){js.next(this.source,this.id,t),this.sink.next(t)}complete(){js.complete(this.source,this.id),this.sink.complete()}error(t){js.complete(this.source,this.id,t),this.sink.error(t)}},js={addSource(t,i){ip("addSource",{id:t.id,name:t.toString(),source:{id:i.id,name:i.toString()}})},next(t,i,r){ip("next",{id:t.id,streamId:i,data:r&&r.toString()})},subscribe({id:t,end:i},r){ip("subscribe",{id:t,end:i,sink:{nodeId:r&&r.nodeId,streamId:r&&r.streamId}})},complete(t,i,r){ip("complete",{id:t.id,streamId:i,err:r?r.toString():null})},defer(t,i){ip("defer",{id:t.id,streamId:i})},pipe(t){ip("pipe",{name:t.toString(),id:t.id,source:{id:t.source.id,name:t.source.toString()}})},update(t){ip("update",{id:t.id,name:t.toString()})},create(t){t.id||(t.id=kcA++),ip("create",{name:t.toString(),id:t.id})}},LcA=class extends AW{constructor(t){super(),this.source=t,this.sinks=new Set}add(t){t.defer(()=>this.remove(t)),this.sinks.add(t).size===1&&(this.reset(),this.subscribe(this.source))}remove(t){this.sinks.delete(t),this.sinks.size===0&&this.dispose()}next(t){this.sinks.forEach(i=>i.next(t))}complete(){this.sinks.forEach(t=>t.complete()),this.sinks.clear()}error(t){this.sinks.forEach(i=>i.error(t)),this.sinks.clear()}};function UX(){return t=>{const i=new LcA(t);if(t instanceof Mw){const r=dl(s=>{i.add(s)},"share",arguments);return i.sourceId=r.id,r.source=t,js.pipe(r),r}return dl(i.add.bind(i),"share",arguments)}}function OX(...t){return dl(i=>{const r=new BB(i);let s=t.length;r.complete=()=>{--s===0&&i.complete()},t.forEach(r.bindSubscribe)},"merge",arguments)}function FcA(...t){return dl(i=>{const r=new Map;t.forEach(s=>{const g=new BB(i);r.set(s,g),g.complete=()=>{r.delete(s),r.size===0?i.complete():g.dispose()},g.next=B=>{r.delete(s),r.forEach(Q=>Q.dispose()),g.resetNext(),g.resetComplete(),g.next(B)}}),t.forEach(s=>r.get(s).subscribe(s))},"race",arguments)}function UcA(...t){return i=>dl((r,s=0,g=t.length)=>{for(;s{r.next=g=>s.next(g),r.complete=()=>s.complete(),r.error=g=>s.error(g),t&&s.subscribe(t)},"subject",i));return r.next=Rg,r.complete=Rg,r.error=Rg,r}function OcA(t){return dl(i=>{let r=0;const s=setInterval(()=>i.next(r++),t);return i.defer(()=>{clearInterval(s)}),"interval"},"interval",arguments)}function xcA(t,i){return dl(r=>{let s=0;const g=setTimeout(()=>{r.removeDefer(B),r.next(s++),i||r.complete()},t),B=()=>clearTimeout(g);r.defer(B)},"timer",arguments)}function ZK(t,i){return r=>{const s=g=>r.next(g);r.defer(()=>i(s)),t(s)}}function Rc(t,i){if("on"in t&&"off"in t)return dl(ZK(r=>t.on(i,r),r=>t.off(i,r)),"fromEvent",arguments);if("addListener"in t&&"removeListener"in t)return dl(ZK(r=>t.addListener(i,r),r=>t.removeListener(i,r)),"fromEvent",arguments);if("addEventListener"in t)return dl(ZK(r=>t.addEventListener(i,r),r=>t.removeEventListener(i,r)),"fromEvent",arguments);throw"target is not a EventDispachter"}function YcA(){return dl(t=>t.complete(),"empty",arguments)}var PcA=class extends BB{constructor(t,i,r){super(t),this.filter=i,this.thisArg=r}next(t){this.filter.call(this.thisArg,t)&&this.sink.next(t)}},mw=pD(PcA,"filter"),JcA=class extends BB{constructor(t,i){super(t),this.count=i}next(t){this.sink.next(t),--this.count===0&&(this.doDefer(),this.complete())}},HcA=pD(JcA,"take"),VcA=class extends BB{constructor(t,i){super(t);const r=new BB(t);r.next=()=>{r.doDefer(),t.complete()},r.complete=TcA,r.subscribe(i)}},ww=pD(VcA,"takeUntil"),qcA=class extends BB{constructor(t,i){super(t),this.f=i}next(t){this.f(t)||(this.next=super.next,this.next(t))}},KcA=pD(qcA,"skipWhile"),jcA=class extends BB{constructor(t,i,r){super(t),this.mapper=i,this.thisArg=r}next(t){super.next(this.mapper.call(this.thisArg,t))}},YX=pD(jcA,"map"),WcA=class extends BB{constructor(t,i,r){super(t),this.data=i,this.context=r}next(t){const i=this.context.combineResults;i?this.sink.next(i(this.data,t)):this.sink.next(t)}tryComplete(){this.context.resetComplete(),this.dispose()}},zcA=class PX extends BB{constructor(i,r,s){super(i),this.makeSource=r,this.combineResults=s,this.index=0}subInner(i,r){const s=this.currentSink=new r(this.sink,i,this);this.complete===PX.prototype.complete&&(this.complete=this.tryComplete),s.complete=s.tryComplete,s.subscribe(this.makeSource(i,this.index++))}complete(){this.sink.complete()}tryComplete(){this.currentSink.resetComplete(),this.dispose()}},g8=class extends WcA{},JX=class extends zcA{next(t){this.subInner(t,g8),this.next=i=>{this.currentSink.dispose(),this.subInner(i,g8)}}},ZcA=pD(JX,"switchMap");function XcA(t){return(i,r)=>t(()=>i,r)}var HX=XcA(pD(JX,"switchMapTo")),dD=(t=Rg,i=Rg,r=Rg)=>s=>new _cA(s,t,i,r),VX=(t=>(t[t.AUTO_SWITCH_NEW_DEVICE=0]="AUTO_SWITCH_NEW_DEVICE",t[t.WAIT_CURRENT_DEVICE=1]="WAIT_CURRENT_DEVICE",t))(VX||{}),AD=class extends $3{constructor(t,i){super({mediaType:t,PlayerClass:i}),OA(this,"isRemote",!1),OA(this,"deviceId"),OA(this,"groupId",""),OA(this,"label",""),OA(this,"sourceTrack"),OA(this,"enableAutoSwitchWhenRecapturing",!0),OA(this,"_isRecapturing",!1),OA(this,"_lastRecaptureTime",0),OA(this,"_onMuteTimeoutId",-1),OA(this,"_encodeCheckTimeoutId",-1),OA(this,"recaptureMode",0),OA(this,"profile"),OA(this,"retryEncodeFailed")}get enableEncodeFrame(){return!1}get isPublishing(){return this.state.toString()==="publishing"}get isPublished(){return this.state==="publish"}get isUseCustomSource(){return!(!this.mediaTrack||this.sourceTrack===this.mediaTrack)}encodeFrame(t,i){throw new Error("Method not implemented.")}installTrackEvent(t){t.addEventListener(gt.MUTE,this.onTrackMuted),t.addEventListener(gt.UNMUTE,this.onTrackUnmuted),t.addEventListener(gt.ENDED,this.onTrackEnded),t.muted&&this.onTrackMuted(),t.readyState===gt.ENDED&&this.onTrackEnded()}uninstallTrackEvent(t){t.removeEventListener(gt.MUTE,this.onTrackMuted),t.removeEventListener(gt.UNMUTE,this.onTrackUnmuted),t.removeEventListener(gt.ENDED,this.onTrackEnded)}setStateToReady(){}async capture(t,i=!1){var r,s;const g=this.sourceTrack;try{const B=Ns();let Q;Eo.emit(nr.LOCAL_TRACK_CAPTURE_START,{track:this}),t.customSource?(Q=new MediaStream,Q.addTrack(t.customSource)):(i||(r=this.sourceTrack)==null||r.stop(),Q=await RcA(t));const f=Q.getTracks()[0];return await this.setInputMediaStreamTrack(f),t.customSource||(this.sourceTrack=f,this.updateDeviceIdInUse(),this.listenDeviceChange()),Eo.emit(nr.LOCAL_TRACK_CAPTURE_SUCCESS,{track:this,cost:Ns()-B,profile:this.profile,room:(s=this.manager)==null?void 0:s.room}),Q}catch(B){throw Eo.emit(nr.LOCAL_TRACK_CAPTURE_FAILED,{track:this,error:B}),this.log.error(`getUserMedia error observed ${B}`),B}finally{i&&g?.stop()}}setOutputMediaStreamTrack(t){var i;if(super.setOutputMediaStreamTrack(t),this.setStateToReady(),this.isPublishing||this.isPublished)return(i=this.room)==null?void 0:i.replaceTrack(this)}get hasFlag(){var t,i;const r=u9(((t=this.room)==null?void 0:t.localPublishFlag)||0,((i=this.room)==null?void 0:i.userId)||"");return this.mediaType===4&&r.hasVideo||this.mediaType===1&&r.hasAudio||this.mediaType===2&&r.hasAuxiliary}async publish(t,i){return this.room=t,this.room.localTracks.add(this),this.emit("4",{mediaType:this.strMediaType,state:"starting",prevState:"stopped"}),this.userId=t.userId,this._log.bindParent(t.getLogger()),await i,this._checkPublishFlag(t)}_checkPublishFlag(t){return new Promise(async(i,r)=>{var s,g,B,Q,f;const m=()=>r(new Ws({code:xa.API_CALL_ABORTED,message:"publish aborted"}));if(this.hasFlag||this.muted?i():(this.state!==Lr.INIT&&this.state!=="ready"||m(),QC(Rc(t,"local-publish-flag-changed"),mw(()=>this.hasFlag),ww(OX(Rc(this,Lr.INIT),Rc(this,"ready"))),dD(i,r,m))),(B=(g=(s=this.room)==null?void 0:s.networkQuality)==null?void 0:g.hadRecentBadUplink)==null?void 0:B.call(g,2))return i();const M=t.heartbeatCount,v=((f=(Q=this.mediaTrack)==null?void 0:Q.stats)==null?void 0:f.totalFrames)||0;this._encodeCheckTimeoutId=setTimeout(async()=>{var U,AA,z,sA,eA,X,QA,wA;if((z=(AA=(U=this.room)==null?void 0:U.networkQuality)==null?void 0:AA.hadRecentBadUplink)!=null&&z.call(AA,2)||t.heartbeatCount-M<3)return i();if((this.isPublished||this.isPublishing)&&this.isMediaTrackActive){if((sA=this.mediaTrack)!=null&&sA.stats){const ue=this.mediaTrack.stats.totalFrames||0;ue-v===0&&this.log.warn("capture totalFrames is 0 during encode check, totalFrames",ue)}const HA=this.kind===gt.AUDIO,VA=this.stat.bytesSent>0;if(qr[VA?"addSuccessEvent":"addFailedEvent"]({key:HA?503700:513702}),!HA){const ue={H264:513704,H265:513705,VP8:513706}[((X=(eA=this.room)==null?void 0:eA.videoCodec)==null?void 0:X.toUpperCase())||"H264"];ue&&qr[VA?"addSuccessEvent":"addFailedEvent"]({key:ue})}if(!VA){if(qr.addEnum({key:HA?503701:513703,value:Y3()}),fC.uploadEvent({log:`stat-encode-failed-${this.kind}-${eX()||iX()}`,userId:this.userId}),this.log.warn(HA?"encode failed":`${(wA=(QA=this.room)==null?void 0:QA.videoCodec)==null?void 0:wA.toUpperCase()} encode failed`),this.retryEncodeFailed&&(this.log.warn("retry encode"),await this.retryEncodeFailed(this),this.stat.bytesSent>0||this.hasFlag||(await Rw(5e3),this.stat.bytesSent>0||this.hasFlag)))return i();this.emit("6",this),r(new Ws({message:`${this.strMediaType} encode failed`,code:HA?xa.AUDIO_ENCODE_FAILED:xa.VIDEO_ENCODE_FAILED}))}}},1e4)})}unpublish(){this.room&&this.room.localTracks.delete(this),this.log.info("unpublish"),Eo.emit(nr.LOCAL_TRACK_UNPUBLISHED,{track:this})}async updateDeviceIdInUse(){if(this.sourceTrack&&W2){const{deviceId:t,groupId:i}=this.sourceTrack.getSettings(),{label:r}=this.sourceTrack;await CcA({newDeviceId:t,oldDeviceId:this.deviceId,oldGroupId:this.groupId,oldLabel:this.label,kind:this.kind})||(this.deviceId=t,this.label=r,i&&(this.groupId=i),Yj().then(s=>{const g=s.find(B=>{let Q=B.deviceId===t;return i&&(Q=Q&&B.groupId===i),Q});g&&this.emit("2",g)}))}}setProfile(t){this.log.info("setProfile",t),Object.assign(this.profile,t)}isNeedToRecapture(t=!1){return!(!this.deviceId||!this.sourceTrack||this.kind===gt.AUDIO&&!EcA(this.sourceTrack)||this.kind===gt.VIDEO&&!ccA(this.sourceTrack)||this._isRecapturing||t&&wY&&IE)}onTrackMuted(){super.onTrackMuted(),McA(),this.isNeedToRecapture(!0)&&(Date.now()-this._lastRecaptureTimethis.onTrackMuted(),o2):this._onMuteTimeoutId=setTimeout(async()=>{var t;if((t=this.sourceTrack)!=null&&t.muted){if((UI||hl)&&document.visibilityState!=="visible")return;this.recapture(await this.getRecoverCaptureDeviceId())}},5e3))}onTrackUnmuted(){super.onTrackUnmuted(),this._onMuteTimeoutId>0&&clearTimeout(this._onMuteTimeoutId)}async onTrackEnded(){if(super.onTrackEnded(),this.isNeedToRecapture()&&this.recaptureMode===0){if(Date.now()-this._lastRecaptureTimethis.onTrackEnded(),o2);this.emit("7"),this.recapture(await this.getRecoverCaptureDeviceId())}}async recapture(t,i=!1){var r;if(this._isRecapturing||!this.sourceTrack)return;this.log.warn("recapture trying");const s=this.sourceTrack;i||(r=this.sourceTrack)==null||r.stop(),this._isRecapturing=!0,this._lastRecaptureTime=Date.now();const g={useExactDeviceId:!0};if(t==="user"||t==="environment")g.facingMode=t;else{let B;(this.kind==="audio"?await Ek():await sD()).find(Q=>Q.deviceId===t)&&(B=t),g.deviceId=B}return this.capture(g,i).then(()=>{this._isRecapturing=!1,this.log.warn("recapture success"),this.emit("1",{deviceId:this.deviceId}),Eo.emit(nr.LOCAL_TRACK_RECAPTURE,{track:this})}).catch(B=>{this._isRecapturing=!1,this.log.warn(`recapture failed ${B.message}`),this.emit("5",B),Eo.emit(nr.LOCAL_TRACK_RECAPTURE,{track:this,error:B})}).finally(()=>{i&&s?.stop()})}async getRecoverCaptureDeviceId(){const t=this instanceof GY;if(t&&this.facingMode)return this.facingMode;let{deviceId:i}=this;if(i){const r=(vG.get(i)||0)+1;if(vG.set(i,r),r>=3&&this.enableAutoSwitchWhenRecapturing){const s=t?(await sD()).find(g=>!vG.has(g.deviceId)):(await Ek()).find(g=>!vG.has(g.deviceId));s&&(this.log.warn(`${i} capture fail ${r} times, change new ${s.deviceId}`),i=s.deviceId)}}return i}stopCapture(){var t;this.sourceTrack&&(this.sourceTrack.stop(),Eo.emit(nr.LOCAL_TRACK_STOPPED,{track:this}),this.uninstallTrackEvent(this.sourceTrack)),this._inputTrack&&this.uninstallTrackEvent(this._inputTrack),(t=this.manager)==null||t.removeInput(this),this._onMuteTimeoutId&&clearTimeout(this._onMuteTimeoutId)}close(){super.close(),this.stopCapture()}};ss([FI(Lr.INIT,"ready",{ignoreError:!0,sync:!0})],AD.prototype,"setStateToReady"),ss([vcA()],AD.prototype,"capture"),ss([FI("ready","publish",{ignoreError:!0,success(){Eo.emit(nr.LOCAL_TRACK_PUBLISHED,{track:this,room:this.room}),this.emit("4",{mediaType:this.strMediaType,state:"started",prevState:"starting"}),this.log.info("published")},fail(t){var i;(i=this.room)==null||i.localTracks.delete(this);let r="error";const s=t instanceof Ws?t:t.cause instanceof Ws?t.cause:t;let g=!1;s instanceof Ws&&(s.message.includes("timeout")?r="timeout":s.code===xa.API_CALL_ABORTED&&(g=!0,r="api-call")),this.emit("4",{mediaType:this.strMediaType,state:"stopped",prevState:"starting",reason:r,error:s}),this.log[g?"info":"error"]("publish failed",s)}}),FX(521714,!1)],AD.prototype,"publish"),ss([TY(t=>async function(){const i=this.state==="publish"?"started":"starting";t.call(this),this.emit("4",{mediaType:this.strMediaType,state:"stopped",prevState:i,reason:"api-call"}),clearTimeout(this._encodeCheckTimeoutId)}),FI([],"ready",{sync:!0})],AD.prototype,"unpublish");var vG=new Map;Eo.on(nr.SWITCH_DEVICE_SUCCESS,t=>{t.track.deviceId&&vG.delete(t.track.deviceId)});var $cA=class{constructor(t,i=!1){this.dataView=t,this.isSEI&&(i?this.addPreventionByte():this.removePreventionByte())}addPreventionByte(){const{seiPayloadStartIndex:t}=this,i=this.dataView.byteLength-2,r=[];let s=0;for(let B=t;B<=i;B++){const Q=this.dataView.getInt8(B);switch(Q){case 0:case 1:case 2:case 3:s===2&&(r.push(3),s=0),Q===0?s+=1:s=0,r.push(Q);break;default:s=0,r.push(Q)}}r.push(this.dataView.getInt8(this.dataView.byteLength-1));const g=new DataView(new Uint8Array([...new Uint8Array(this.dataView.buffer).slice(0,t),...r]).buffer);this.dataView=g}removePreventionByte(){const{seiPayloadStartIndex:t}=this,i=this.dataView.byteLength-1,r=[];let s=0;for(let B=t;B<=i;B++)switch(this.dataView.getInt8(B)){case 0:s++,r.push(this.dataView.getInt8(B));break;case 3:s!==2&&r.push(this.dataView.getInt8(B)),s=0;break;default:r.push(this.dataView.getInt8(B)),s=0}const g=new DataView(new Uint8Array([...new Uint8Array(this.dataView.buffer).slice(0,t),...r]).buffer);this.dataView=g}get seiPayloadStartIndex(){let t=6;for(let i=6;i=this.dataView.byteLength?0:31&this.dataView.getUint8(t)}getStartCodeLength(){return this.dataView.byteLength>=4&&this.dataView.getUint8(0)===0&&this.dataView.getUint8(1)===0&&this.dataView.getUint8(2)===0&&this.dataView.getUint8(3)===1?4:this.dataView.byteLength>=3&&this.dataView.getUint8(0)===0&&this.dataView.getUint8(1)===0&&this.dataView.getUint8(2)===1?3:0}get isIDR(){return this.naluType===5}get isSPS(){return this.naluType===7}get isPPS(){return this.naluType===8}get isSEI(){return this.naluType===6}},AEA=class{constructor(){OA(this,"_seiMessageList",[]),OA(this,"_smallSeiMessageList",[]),OA(this,"_seiPayloadType",243)}encodeSEINalu(t){const i=t.byteLength,r=parseInt(String(i/255),10),s=i%255,g=[];g.push(0,0,0,1,6,this._seiPayloadType);for(let Q=0;Q0&&t.data.byteLength>0){const s=9-this.getNaluCount(t.data);if(s<=0)return 0;const g=r.splice(0,s).reverse().map(this.encodeSEINalu.bind(this)),B=g.reduce((v,U)=>v+U.dataView.byteLength,0),Q=new ArrayBuffer(B+t.data.byteLength),f=new DataView(Q),m=new DataView(t.data);let M=0;for(let v=0;v{var s;if(this.isAllowed2k4k(this.profile))this.room&&this.settings.height>=1440&&this.state==="publish"&&this.room.sendAbilityStatus({"2k4k":1});else{const g=Y2(((s=this.room)==null?void 0:s.sdkAppId)||0)?m5:f5;this.log.warn(`Resolution is reset to 1080p, need to upgrade ability here ${g}`),this.setProfile(lB(cr({},this.profile),{width:1920,height:1080})),this.applyProfile()}};this.on("input-media-track-changed",r),this.on("publish",r),this.handleCameraAdded=this.handleCameraAdded.bind(this),this.handleCameraRemoved=this.handleCameraRemoved.bind(this)}get facingMode(){if(W2&&this.mediaTrack)return this.mediaTrack.getSettings().facingMode}get contentHint(){var t;return((t=this._inputTrack)==null?void 0:t.contentHint)||""}get isQosClearFirst(){var t;return((t=this._inputTrack)==null?void 0:t.contentHint)==="detail"}get hasSmall(){var t;return!!((t=this.manager)!=null&&t.hasSmall)}async setMute(t){var i,r,s;if(pC(t)){if(this.muteImage===t)return;await((i=this.manager)==null?void 0:i.deleteWatermark("mute")),await((r=this.manager)==null?void 0:r.setWatermark({x:0,y:0,width:this.settings.width,height:this.settings.height,type:"mute",zIndex:999,imageUrl:t,fillVideo:!0})),this.muteImage=t,super.setMute(!1)}else this.muteImage&&(await((s=this.manager)==null?void 0:s.deleteWatermark("mute")),this.muteImage=void 0),super.setMute(t)}async capture({deviceId:t,facingMode:i,useExactDeviceId:r=!0,customSource:s,retryWhenExactFailed:g=!0}){const B={audio:!1,video:!0,facingMode:i||this.facingMode,cameraId:t,width:this.profile.width,height:this.profile.height,frameRate:this.profile.frameRate,useExactDeviceId:r,retryWhenExactFailed:g,customSource:s};if(B.facingMode==="environment"){const Q=await this.getDeviceIdWhenUsingBackCamera();Q&&(B.cameraId=Q)}return super.capture(B)}setProfile(t){var i;const r=this.fallbackProfile(t);if(r.bitrate&&(this.isNeedToSetBandwidth=r.bitrate!==this.profile.bitrate),this.isAllowed2k4k(this.profile))super.setProfile(r);else{const s=Y2(((i=this.room)==null?void 0:i.sdkAppId)||0)?m5:f5;this.log.warn(`Resolution is reset to 1080p, need to upgrade ability here ${s}`),super.setProfile(lB(cr({},this.profile),{width:1920,height:1080}))}}async applyProfile(){var t,i;if(!this.mediaTrack)return;const{width:r=0,height:s=0}=(this.sourceTrack||this.mediaTrack).getSettings(),g=r*s,B=this.settings,Q=B.height!==this.profile.height||B.width!==this.profile.width||B.frameRate!==this.profile.frameRate;if(Q&&(QD===16&&this.deviceId?await this.recapture(this.deviceId):(w3(this.outMediaTrack)?await((t=this.outMediaTrack)==null?void 0:t.applyConstraints({width:this.profile.width,height:this.profile.height,frameRate:this.profile.frameRate})):await((i=this.sourceTrack||this.mediaTrack)==null?void 0:i.applyConstraints({width:this.profile.width,height:this.profile.height,frameRate:this.profile.frameRate})),this.manager&&this.manager.changeInput(this)),this.room&&this.settings.height>=1440&&this.state==="publish"&&this.room.sendAbilityStatus({"2k4k":1})),this.isNeedToSetBandwidth&&this.room&&this.room.setBandWidth){this.isNeedToSetBandwidth=!1;const{width:f=0,height:m=0}=(this.sourceTrack||this.mediaTrack).getSettings(),M=f*m;return Q&&M&&g&&M===g?void this.log.warn("set bandwidth failed: resolution is not changed"):this.room.setBandWidth({bandwidth:this.profile.bitrate,type:gt.VIDEO,videoType:gt.BIG})}}get settings(){const t={width:this.profile.width,height:this.profile.height,frameRate:this.profile.frameRate},i=this.sourceTrack||this.mediaTrack;return W2&&i&&Object.assign(t,i.getSettings()),t}get scaleResolutionDownBy(){return this._scaleResolutionDownBy?this._scaleResolutionDownBy:m9(this.settings,this.profile)}isAllowed2k4k(t){var i;return!this.room||!this.room.scheduleResult||!!this.isScreen||t.height*t.width<3686400||((i=this.room.scheduleResult.trtcAutoConf)==null?void 0:i["2k4k"])===1}isNeedToSwitchDevice(t){return!(!this.mediaTrack||this.deviceId===t||this.facingMode===t)}async switchDevice(t){try{if(!this.isNeedToSwitchDevice(t)&&!this.isUseCustomSource)return;const i={useExactDeviceId:!0,retryWhenExactFailed:!1};t==="user"||t==="environment"?i.facingMode=t:i.deviceId=t,this.sourceTrack&&this.sourceTrack.stop(),await this.capture(i),Eo.emit(nr.SWITCH_DEVICE_SUCCESS,{track:this}),this.log.info("switch camera success")}catch(i){throw this.log.error(`switch camera failed ${i}`),this.deviceId&&this.recapture(this.deviceId),i}}async getDeviceIdWhenUsingBackCamera(){let t;try{if(q9&&!O3&&DX){const i=(await sD(!0)).map(s=>{var g;return lB(cr({},s),{capabilities:(g=s.getCapabilities)==null?void 0:g.call(s)})}).filter(s=>{var g,B;return(B=(g=s.capabilities)==null?void 0:g.facingMode)==null?void 0:B.includes("environment")});let r=i[0];i.forEach(s=>{var g,B,Q,f;const{capabilities:m}=s;((g=m.width)!=null&&g.max&&((B=m.height)!=null&&B.max)?m.width.max*m.height.max:0)>((Q=r.capabilities.width)!=null&&Q.max&&((f=r.capabilities.height)!=null&&f.max)?r.capabilities.width.max*r.capabilities.height.max:0)&&(r=s)}),r?.capabilities&&(this._log.info("use max resolution back camera",r),t=r.deviceId)}}catch(i){this._log.warn("get max res camera failed",i)}return t}async updateSmallConfig(t){var i,r;this._log.info(`update small stream config: ${JSON.stringify(t)}`);const s=!this.small;this.small=this.fallbackProfile(t,!0),await((i=this.manager)==null?void 0:i.update()),s&&await((r=this.room)==null?void 0:r.enableSmall(!0)),this.log.info("update small stream config success")}fallbackProfile(t,i=!1){const r=t.width>t.height,s=cr({},t);return t.width*t.height<=19200&&hl&&pp&&(this.log.warn(`${i?"small ":""}resolution is ${t.width}*${t.height}, fallback to 240*180 for android chrome`),s.width=r?240:180,s.height=r?180:240,s.bitrate=Math.max(t.bitrate,150)),t.width*t.height>921600&&qgA&&(s.width=r?1280:720,s.height=r?720:1280,this.log.warn("reset to 1280 * 720 on iOS 13~14")),HgA(_u,"14.3")&&AX(_u,"14.0",!0)&&this.on("7",()=>{const g=this.profile.width>this.profile.height;this.profile.width*this.profile.height>307200?(this.profile.width=g?640:480,this.profile.height=g?480:640,this.log.warn("reduce the resolution to 480p on iOS 14.0 ~ 14.2")):this.profile.width*this.profile.height>230400&&(this.profile.width=g?640:360,this.profile.height=g?360:640,this.log.warn("reduce the resolution to 360p on iOS 14.0 ~ 14.2"))}),!i&&this.avoidCropping&&(pp||Ql)&&!WgA()&&t.width*t.height<=230400&&t.width/t.height===16/9&&(this._scaleResolutionDownBy=1280/t.width,s.width=1280,s.height=720,this.log.warn(`capture 720p, scale: ${this._scaleResolutionDownBy}`)),s}stopSmall(){var t,i;this.small&&(delete this.small,(t=this.manager)==null||t.update(),(i=this.room)==null||i.enableSmall(!1))}listenDeviceChange(){Tu&&!Tu.listeners("videoInputRemoved").includes(this.handleCameraRemoved)&&Tu.on("videoInputRemoved",this.handleCameraRemoved,this)}async handleCameraRemoved(t){if(t.deviceId===this.deviceId){let i=this.recaptureMode===1;if(this.log.warn(`RecaptureMode: ${VX[this.recaptureMode]}. Current camera is lost: ${JSON.stringify(t)}`),this.recaptureMode===0){ns(this.userId,{eventId:2003,param1:7,streamType:2});const r=await sD();r[0]?this.recapture(r[0].deviceId):i=!0}i&&Tu.on("videoInputAdded",this.handleCameraAdded,this)}}async handleCameraAdded(t){this.recaptureMode===1&&t.deviceId!==this.deviceId||(Tu.off("videoInputAdded",this.handleCameraAdded,this),this.log.warn(`camera added: ${JSON.stringify(t)}`),this.recapture(t.deviceId))}encodeFrame(t,i){if(!this.manager)return t;const r=i?8:this.mediaType;return this.manager.encodePipeline.reduceRight((s,g)=>g?g({frame:s,mediaType:r}):s,t)}get enableEncodeFrame(){return!!this.manager&&this.manager.encodePipeline.some(t=>t)}play(t,i){return Fr(this.mirror)&&!this.isScreen&&this.setMirror("view"),super.play(t,i)}close(){Tu.off("videoInputAdded",this.handleCameraAdded,this),Tu.off("videoInputRemoved",this.handleCameraRemoved,this),super.close()}async recapture(t){try{await super.recapture(t)}catch(i){const r=(await sD()).find(s=>s.deviceId!==t);if(!r)throw i;await super.recapture(r.deviceId)}}setContentHint(t){this.mediaTrack&&"contentHint"in this.mediaTrack&&(this.mediaTrack.contentHint!==t&&(this.log.info(`setContentHint ${t}`),this.mediaTrack.contentHint=t),this.outMediaTrack&&this.outMediaTrack.contentHint!==t&&(this.outMediaTrack.contentHint=t))}setRotation(t){this.manager&&(this.isScreen||Fr(t)||t!==this.rotation&&(this.rotation=t,this.manager.rotation=t))}};ss([LX(function(t){this.setContentHint(t.contentHint||"motion")})],GY.prototype,"capture");var eEA=[-1,-1,1,-1,-1,1,1,1],tEA=[0,0,1,0,0,1,1,1],NG=class Pj extends Lr{constructor(i,r){if(super(),this.context=i,OA(this,"name"),OA(this,"input"),OA(this,"output"),OA(this,"texture"),OA(this,"ctx2d",null),OA(this,"fbo"),OA(this,"width",0),OA(this,"height",0),OA(this,"x",0),OA(this,"y",0),OA(this,"program"),OA(this,"vertexShader"),OA(this,"fragmentShader"),OA(this,"totalFrames",0),OA(this,"dropFrames",0),OA(this,"matchInputSize",!0),OA(this,"texCoordBuffer"),OA(this,"positionBuffer"),OA(this,"lastInfo",{name:"",timestamp:0,totalFrames:0,x:0,y:0,width:0,height:0,fps:0}),OA(this,"cost",0),OA(this,"_canvas",null),OA(this,"_image"),OA(this,"log"),this.context.on("disconnect",this.close,this),this.name=r.name,this.log=r.logger,this.matchInputSize=r.matchInputSize!==!1,this.width=r.width||i.width,this.height=r.height||i.height,this._image=r.image,i instanceof Ck)i.ctx&&r.create2d&&(typeof OffscreenCanvas=="function"&&QD!==16?this._canvas=new OffscreenCanvas(this.width,this.height):(this._canvas=document.createElement("canvas"),this._canvas.width=this.width,this._canvas.height=this.height),this.ctx2d=this._canvas.getContext("2d"),this._image=this._canvas);else try{const s=i.ctx;this.texCoordBuffer=this.createBuffer(tEA),this.positionBuffer=this.createBuffer(eEA),r.createTexture!==!1&&(this.texture=s.createTexture(),this.useTexture(),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MIN_FILTER,s.LINEAR),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MAG_FILTER,s.LINEAR),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_S,s.CLAMP_TO_EDGE),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_T,s.CLAMP_TO_EDGE),s.pixelStorei(s.UNPACK_ALIGNMENT,1)),r.useFbo&&(this.fbo=s.createFramebuffer(),this.useBufferFrame(),this.useTexture(),s.texImage2D(s.TEXTURE_2D,0,s.RGBA,this.width,this.height,0,s.RGBA,s.UNSIGNED_BYTE,null),s.framebufferTexture2D(s.FRAMEBUFFER,s.COLOR_ATTACHMENT0,s.TEXTURE_2D,this.texture,0)),r.useDefaultProgram?this.program=i.defaultProgam:(r.vertexShaderSource||r.fragmentShaderSource)&&(this.vertexShader=r.vertexShaderSource?i.createShader(s.VERTEX_SHADER,r.vertexShaderSource):i.defaultVShader,this.fragmentShader=r.fragmentShaderSource?i.createShader(s.FRAGMENT_SHADER,r.fragmentShaderSource):i.defaultFShader,this.program=i.createProgram(this.vertexShader,this.fragmentShader))}catch(s){this.context.destroy(new Ws({code:xa.VIDEO_MANAGER_ERROR,extraCode:3,message:`create video node ${this.name} error ${s.message||s}`}))}}get image(){return this._image}set image(i){this._image=i}createFramebuffer(i){const r=this.context.ctx,s=r.createFramebuffer();return r.bindFramebuffer(r.FRAMEBUFFER,s),r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,i,0),s}connect(i,...r){return i.addInput(this,...r),this.output=i,i}addInput(i,...r){this.input=i,this.matchInputSize&&i.width&&i.height&&this.resize(i.width,i.height)}requestFrame(i){const r=Date.now();return!!(this.context instanceof Jj&&this.render(i)||this.context instanceof Ck&&this.render2d(i))&&(this.totalFrames++,this.cost=Date.now()-r,!0)}render2d(i){var r;return!!((r=this.input)!=null&&r.requestFrame(i))&&this.draw2d(this.input.image,0,0,this.width,this.height)}update(i=0){var r;(r=this.output)==null||r.update(i)}disconnect(...i){var r;(r=this.output)==null||r.removeInput(this,...i),delete this.output}removeInput(i,...r){delete this.input}close(){var i,r;if(this.context.off("disconnect",this.close,this),(i=this.output)==null||i.removeInput(this),delete this.output,(r=this.input)==null||r.disconnect(),this.context instanceof Jj){const s=this.context.ctx;s.deleteBuffer(this.texCoordBuffer),s.deleteBuffer(this.positionBuffer),this.fbo&&s.deleteFramebuffer(this.fbo),this.texture&&s.deleteTexture(this.texture),this.vertexShader&&this.vertexShader!==this.context.defaultVShader&&s.deleteShader(this.vertexShader),this.fragmentShader&&this.fragmentShader!==this.context.defaultFShader&&s.deleteShader(this.fragmentShader),this.program&&this.program!==this.context.defaultProgam&&s.deleteProgram(this.program)}this._canvas&&(this._canvas.width=0,this._canvas.height=0,this.ctx2d=null),this.removeAllListeners()}useTexture(){this.useTextures(this.texture)}useInputTexture(){var i;this.useTextures((i=this.input)==null?void 0:i.texture)}useTextures(...i){const r=this.context.ctx;i.forEach((s,g)=>{s&&(r.activeTexture(r.TEXTURE0+g),r.bindTexture(r.TEXTURE_2D,s))})}useProgram(){this.context.ctx.useProgram(this.program)}useBufferFrame(){const i=this.context.ctx;i.bindFramebuffer(i.FRAMEBUFFER,this.fbo||null)}createBuffer(i){const r=this.context.ctx,s=r.createBuffer();return r.bindBuffer(r.ARRAY_BUFFER,s),r.bufferData(r.ARRAY_BUFFER,new Float32Array(i),r.STATIC_DRAW),s}setTexBuffer(i){const r=this.context.ctx;r.bindBuffer(r.ARRAY_BUFFER,this.texCoordBuffer),r.bufferData(r.ARRAY_BUFFER,new Float32Array(i),r.STATIC_DRAW)}setPosBuffer(i){const r=this.context.ctx;r.bindBuffer(r.ARRAY_BUFFER,this.positionBuffer),r.bufferData(r.ARRAY_BUFFER,new Float32Array(i),r.STATIC_DRAW)}changeBufferData(i,r){const s=this.context.ctx;s.bindBuffer(s.ARRAY_BUFFER,i),s.bufferData(s.ARRAY_BUFFER,new Float32Array(r),s.STATIC_DRAW)}setAttributes(...i){const r=this.context.ctx;i.forEach((s,g)=>{r.enableVertexAttribArray(g),r.bindBuffer(r.ARRAY_BUFFER,s),r.vertexAttribPointer(g,2,r.FLOAT,!1,0,0)})}getVertexPoint(i,r){return[i/this.width*2-1,r/this.height*2-1]}layout2texCoords(i){return[...this.getVertexPoint(i.x,i.y),...this.getVertexPoint(i.x+i.width,i.y),...this.getVertexPoint(i.x,i.y+i.height),...this.getVertexPoint(i.x+i.width,i.y+i.height)]}resize(i,r){if(this.width!==i||this.height!==r){if(this.width=i,this.height=r,this._canvas&&(this._canvas.width=i,this._canvas.height=r),this.texture&&this.fbo){this.useTexture();const s=this.context.ctx;s.texImage2D(s.TEXTURE_2D,0,s.RGBA,i,r,0,s.RGBA,s.UNSIGNED_BYTE,null)}this.output&&this.output.matchInputSize&&this.output.resize(i,r)}}draw(i,r){this.setAttributes(i||this.positionBuffer,r||this.texCoordBuffer);const s=this.context.ctx;s.drawArrays(s.TRIANGLE_STRIP,0,4)}draw2d(i,r,s,g,B,Q,f,m,M){const v=!(Fr(Q)||Fr(f)||Fr(m)||Fr(M));return!(!this.ctx2d||!i)&&(i instanceof ImageData?(v?this.ctx2d.putImageData(i,r,s,Q,f,m,M):this.ctx2d.putImageData(i,r,s),this.emit(Pj.RENDER,this.ctx2d.canvas)):(v?this.ctx2d.drawImage(i,Q,f,m,M,r,s,g,B):this.ctx2d.drawImage(i,r,s,g,B),this.emit(Pj.RENDER,i)),typeof VideoFrame<"u"&&i instanceof VideoFrame&&i.close(),!0)}drawBackGround2d(i){this.ctx2d&&(this.ctx2d.save(),this.ctx2d.fillStyle=i,this.ctx2d.fillRect(0,0,this.width,this.height),this.ctx2d.restore())}getInfo(){var i;const{totalFrames:r,x:s,y:g,width:B,height:Q,name:f,cost:m}=this,M=Date.now(),v=(r-this.lastInfo.totalFrames)/((M-this.lastInfo.timestamp)/1e3)|0;return this.lastInfo={totalFrames:r,x:s,y:g,width:B,height:Q,timestamp:M,fps:v,name:f,cost:m},cr({parent:(i=this.input)==null?void 0:i.getInfo()},this.lastInfo)}createTexture(i){const r=this.context.ctx,s=r.createTexture();return this.useTextures(s),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.pixelStorei(r.UNPACK_ALIGNMENT,1),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,i),s}};OA(NG,"RENDER","render"),ss([FI(Lr.INIT,"connected",{sync:!0})],NG.prototype,"connect"),ss([FI("connected",Lr.INIT,{ignoreError:!0,sync:!0})],NG.prototype,"disconnect"),ss([FI([],"closed",{sync:!0})],NG.prototype,"close");var X2=NG,iEA=QC(OcA(250),YX(()=>performance.now()),UX()),oEA=t=>i=>{const r=performance.now();QC(iEA,KcA(s=>s-r{if(t!==this.context.frameRate&&(ku.clearTask(this._intervalId),this.start(this.context.frameRate)),this.requestFrame(this._sequence++),this.checkGLError&&this.context instanceof Jj){const i=this.context.ctx.getError();i&&this.context.destroy(new Ws({code:xa.VIDEO_MANAGER_ERROR,extraCode:5,message:`${this.name} req ${this._sequence} render ${this.totalFrames} faild ${i}`}))}},{fps:this.context.frameRate})}render(t){var i;return!!((i=this.input)!=null&&i.requestFrame(t))&&(this.useProgram(),this.useBufferFrame(),this.useInputTexture(),this.draw(),this.emit(X2.RENDER,this.context._canvas),!0)}addInput(t,...i){super.addInput(t,...i),this.start(this.context.frameRate)}update(t=0){this.state!=="closed"&&(this._intervalId&&(ku.clearTask(this._intervalId),this._intervalId=0,t===1&&(this.log.info(`${this.name} use requestVideoFrameCallback`),this.checkVisibilityChange=()=>{document.hidden&&(this.start(this.context.frameRate),this.log.info(`${this.name} use timer`),document.removeEventListener("visibilitychange",this.checkVisibilityChange))},document.addEventListener("visibilitychange",this.checkVisibilityChange))),this.requestFrame(this._sequence++))}removeInput(t){super.removeInput(t),ku.clearTask(this._intervalId)}resize(t,i){super.resize(t,i),this.context.setSize(t,i)}close(){super.close(),ku.clearTask(this._intervalId),document.removeEventListener("visibilitychange",this.checkVisibilityChange)}},aEA=class extends nEA{constructor(t,i){super(t,i),OA(this,"_videoTrack"),OA(this,"_muteOb"),OA(this,"_closedOb",Rc(this,"closed")),OA(this,"_subscription"),OA(this,"_canvasContainer"),Number(Mk)<17&&(this._canvasContainer=document.createElement("div"),this._canvasContainer.style.display="none"),[this._videoTrack]=t.canvas.captureStream().getVideoTracks(),this._muteOb=Rc(this._videoTrack,"mute"),QC(Rc(this._videoTrack,"ended"),ww(this._closedOb),dD(()=>{this.context.destroy(new Ws({code:xa.VIDEO_MANAGER_ERROR,extraCode:8,message:"video track ended"}))}))}enableCheckMute(){this._subscription=QC(this._muteOb,ww(this._closedOb),HX(oEA(5e3)),mw(()=>{var t;return!!((t=this._videoTrack)!=null&&t.muted)&&!document.hidden}),dD(()=>{this.context.destroy(new Ws({code:xa.VIDEO_MANAGER_ERROR,extraCode:7,message:"video track muted"}))}))}disableCheckMute(){var t;(t=this._subscription)==null||t.dispose()}get videoTrack(){return this._videoTrack}putCanvasIntoDom(){this.context._canvas&&this._canvasContainer&&(document.getElementById(this.context._canvas.id)||(this.log.info(`${this.name} put canvas to body`),document.body.appendChild(this._canvasContainer),this._canvasContainer.appendChild(this.context._canvas)))}render(t){return this.putCanvasIntoDom(),super.render(t)}render2d(t){return this.putCanvasIntoDom(),super.render2d(t)}close(){var t,i;super.close(),(t=this._videoTrack)==null||t.stop(),delete this._videoTrack,(i=this._canvasContainer)==null||i.remove()}},qX=class extends X2{constructor(t,i){super(t,cr({name:"imageSource"},i)),OA(this,"_lastImage"),OA(this,"_totalFrames",0),OA(this,"_autoResize",!1),OA(this,"_canvasRendered"),OA(this,"videoCallbackId",0),OA(this,"waitingFirstFrame",!0),OA(this,"shouldUpdate",!0),this._autoResize=i?.autoResize!==!1,QD===16&&(this._canvasRendered=xX(),QC(this._canvasRendered,UcA(this._image),ZcA(r=>r instanceof HTMLCanvasElement?Rc(r,"rendered"):YcA()),ww(Rc(this,"closed")),dD(()=>{this.update()})))}onFirstFrame(){this.waitingFirstFrame=!1}tryVideoFrameCallback(){if(!this.shouldUpdate)return;const t=this.image;this.videoCallbackId&&t.cancelVideoFrameCallback(this.videoCallbackId),j3()&&!document.hidden&&(this.videoCallbackId=t.requestVideoFrameCallback((i,r)=>{this.waitingFirstFrame&&this.onFirstFrame(),document.hidden||(this._totalFrames=r.presentedFrames,this.update(1))}))}_render(t,i){var r;let{width:s,height:g}=this;const{image:B}=this;if(B instanceof HTMLVideoElement){if(this.tryVideoFrameCallback(),{videoWidth:s,videoHeight:g}=B,!s||!g)return!1;B.width=s,B.height=g}else if(B instanceof HTMLImageElement||B instanceof ImageData||B instanceof ImageBitmap){if({width:s,height:g}=B,B!==this._lastImage)this._lastImage=B;else if(s===this.width&&g===this.height)return!0}else B instanceof HTMLCanvasElement||B instanceof OffscreenCanvas?({width:s,height:g}=B,this._lastImage=B):typeof VideoFrame<"u"&&B instanceof VideoFrame&&({displayWidth:s,displayHeight:g}=B,(r=this._lastImage)==null||r.close(),this._lastImage=B);if(!this._autoResize)return!0;if(this.width===s&&this.height===g&&this.totalFrames){if(i){this.useTexture();const Q=this.context.ctx;Q.texSubImage2D(Q.TEXTURE_2D,0,0,0,Q.RGBA,Q.UNSIGNED_BYTE,B)}}else{if(i){this.useTexture();const Q=this.context.ctx;Q.texImage2D(Q.TEXTURE_2D,0,Q.RGBA,Q.RGBA,Q.UNSIGNED_BYTE,B)}this.resize(s,g)}return!0}get image(){return this._image}set image(t){var i;(i=this._canvasRendered)==null||i.next(t),this._image=t}render(t){return this._render(t,!0)}render2d(t){return this._render(t,!1)}},KX=class extends qX{constructor(t,i,r){super(t,r),this._player=i,this.name="videoPlayerSource",QC(Rc(this._player,vr.PLAYER_STATE_CHANGED),ww(Rc(this,"closed")),mw(({state:s})=>s==="PLAYING"),dD(()=>{this.tryVideoFrameCallback()}))}get image(){return this._player.element}},sEA=class extends KX{get available(){return this._player.isPlaying&&!this.waitingFirstFrame}constructor(t,i,r){super(t,new Ip({id:r.name,track:i,muted:!0,container:null,objectFit:"contain",log:r.logger}),r),this.name="videoTrackSource",this._player.play()}replaceTrack(t){this.waitingFirstFrame=!0,this._player.setTrack(t),this._player.play()}close(){super.close(),this._player.stop()}},gEA=class extends X2{constructor(t,i,r){super(t,lB(cr({name:"textSource"},r),{create2d:!0})),OA(this,"hasChange",!0),OA(this,"content",""),this.ctx2d.textBaseline="top",this.content=i.content||"",i.font&&(this.font=i.font),i.color&&(this.color=i.color)}set font(t){this.ctx2d&&(this.ctx2d.font=t,this.hasChange=!0)}get font(){var t;return((t=this.ctx2d)==null?void 0:t.font)||""}set color(t){this.ctx2d&&(this.ctx2d.fillStyle=t,this.hasChange=!0)}get color(){var t;return((t=this.ctx2d)==null?void 0:t.fillStyle)||""}render2d(t){return!(!this.ctx2d||!this.hasChange)&&(this.ctx2d.clearRect(0,0,this.width,this.height),this.drawMultilineText(0,0),this.hasChange=!1,!0)}render(t){return!1}resize(t,i){if(!this.ctx2d)return;const{color:r,font:s}=this;super.resize(t,i),this.color=r,this.font=s}drawMultilineText(t=0,i=0,r=1.2){if(!this.ctx2d)return;const s=this.ctx2d.measureText(this.content);i+=s.fontBoundingBoxAscent||s.actualBoundingBoxAscent||0;const g=this.font.match(/(\d+)px/),B=(g?parseInt(g[1],10):16)*r,Q=this.content.split(` +`);for(let f=0;f{this.destroy(new Ws({code:xa.VIDEO_MANAGER_ERROR,extraCode:4,message:"webgl context lost"}))})}destroy(t){let i="";return t&&(i=t.message,this.error=t,qr.addFailedEvent({key:512702,error:t})),this.disconnect(),this.log.info(`video context destroy${i}`?`: ${i}`:""),this.ctx&&(this.ctx.deleteShader(this.defaultVShader),this.ctx.deleteShader(this.defaultFShader),this.ctx.deleteProgram(this.defaultProgam),delete this.ctx),t}set width(t){var i;(i=this.ctx)==null||i.viewport(0,0,t,this.height),super.width=t,this._canvas2d&&(this._canvas2d.width=t)}set height(t){var i;(i=this.ctx)==null||i.viewport(0,0,this.width,t),super.height=t,this._canvas2d&&(this._canvas2d.height=t)}setSize(t,i){var r;(r=this.ctx)==null||r.viewport(0,0,t,i),super.setSize(t,i),this._canvas2d&&(this._canvas2d.width=t,this._canvas2d.height=i)}createShader(t,i){const r=this.ctx,s=r.createShader(t);return r.shaderSource(s,i),r.compileShader(s),s}createProgram(t,i){const r=this.ctx,s=r.createProgram();return r.attachShader(s,t),r.attachShader(s,i),r.linkProgram(s),r.getProgramParameter(s,r.LINK_STATUS)||this.log.error(r.getProgramInfoLog(s)),s}};OA(TG,"UNAVAILABLE","unavailable"),ss([FI(Lr.INIT,"created",{sync:!0,fail(t){this.log.error("video gl context create failed",t.cause),qr.addFailedEvent({key:512700,error:t.cause||t})},success(){this.log.info("video context created use webgl"),qr.addSuccessEvent({key:512700})}})],TG.prototype,"create"),ss([FI("created",Lr.INIT,{ignoreError:!0,sync:!0,success(t){t&&this.emit(TG.UNAVAILABLE,t),this.removeAllListeners()}})],TG.prototype,"destroy");var Jj=TG,Ck=class extends lk{constructor(){super(...arguments),OA(this,"ctx")}create(t){if(this.hasAlpha=t.alpha,this._canvas=document.createElement("canvas"),this._canvas.id=`trtc_${this.name}_${lk._ids++}`,this.ctx=this._canvas.getContext("2d",{alpha:t.alpha,willReadFrequently:t.willReadFrequently}),!this.ctx)throw new Ws({code:xa.VIDEO_MANAGER_ERROR,extraCode:2,message:"2d context not supported"});this._canvas.addEventListener("contextlost",()=>{this.log.error("2d context lost")}),this._canvas.addEventListener("contextrestored",()=>{this.log.warn("2d context restored")})}destroy(t){let i="";t&&(i=t.message,this.error=t,qr.addFailedEvent({key:512703,error:t})),this.disconnect(),this.log.info("video context destroy "+(i?`: ${i}`:"")),delete this.ctx,this._canvas&&(this._canvas.remove(),this._canvas.width=0,this._canvas.height=0,delete this._canvas),this.removeAllListeners(),qr.addSuccessEvent({key:512703})}};ss([FI(Lr.INIT,"created",{sync:!0,fail(t){this.log.error("video 2d context create failed",t.cause),qr.addFailedEvent({key:512701,error:t.cause||t})},success(){this.log.info("video context created use 2d"),qr.addSuccessEvent({key:512701})}})],Ck.prototype,"create"),ss([FI("created",Lr.INIT,{ignoreError:!0,sync:!0})],Ck.prototype,"destroy");var eW=aX();if(typeof navigator<"u"&&navigator.mediaDevices&&"setCaptureHandleConfig"in navigator.mediaDevices)try{navigator.mediaDevices.setCaptureHandleConfig({handle:eW,exposeOrigin:!0,permittedOrigins:["*"]})}catch{}var EEA=async function(t){let i=null;const r=BEA(t);qi.info(`getDisplayMedia with constraints: ${JSON.stringify(r)}`);const s=await navigator.mediaDevices.getDisplayMedia(r);t.systemAudio&&s.getAudioTracks().length===0&&(x3&&fp<74||IE||Ql)&&qi.warn("Your browser not support capture system audio");const g=s.getVideoTracks()[0];if(g){if(t.frameRate)try{await g.applyConstraints({frameRate:{min:t.frameRate,ideal:t.frameRate},width:t.width,height:t.height})}catch(B){qi.warn(`screen applyConstraints failed: ${B}`)}t.captureElement&&await lEA(g,t.captureElement)}if(t.audio){const B=CEA(t);qi.info(`getUserMedia with constraints: ${JSON.stringify(B)}`),i=await navigator.mediaDevices.getUserMedia(B),s.addTrack(i.getAudioTracks()[0])}return s};async function lEA(t,i){var r;if("CropTarget"in window&&"fromElement"in CropTarget&&oD(t.cropTo))try{if(((r=t.getCaptureHandle())==null?void 0:r.handle)!==eW)return;const s=await CropTarget.fromElement(i);await t.cropTo(s)}catch(s){qi.warn(`cropTo target failed ${s}`)}}function CEA(t){const i={echoCancellation:t.echoCancellation,autoGainControl:t.autoGainControl,noiseSuppression:t.noiseSuppression,sampleRate:t.sampleRate,channelCount:t.channelCount};return Fr(t.microphoneId)||(i.deviceId=t.microphoneId),{audio:i,video:!1}}function BEA(t){const i={preferCurrentTab:t.preferDisplaySurface==="current-tab"||!!t.captureElement,systemAudio:"include",selfBrowserSurface:"include",surfaceSwitching:"include"},r={width:IE?{max:t.width}:{ideal:t.width,max:t.width},height:IE?{max:t.height}:{ideal:t.height,max:t.height},frameRate:t.frameRate,displaySurface:t.preferDisplaySurface||"monitor"};if(i.video=r,t.systemAudio){const{echoCancellation:s=!0,noiseSuppression:g=!1,autoGainControl:B=!1}=t;i.audio={echoCancellation:s,noiseSuppression:g,autoGainControl:B,sampleRate:48e3}}return i}var uEA=EEA,QEA=class extends GY{constructor(t){super(t,2),OA(this,"profile",{width:1920,height:1080,frameRate:5,bitrate:1600}),OA(this,"objectFit","contain"),OA(this,"isScreen",!0),this._log.id=`s-${this._log.id}`}get isShareCurrentTab(){var t,i;try{return eW===((i=(t=this.mediaTrack)==null?void 0:t.getCaptureHandle())==null?void 0:i.handle)}catch{return}}async capture({systemAudio:t=!1,autoGainControl:i,echoCancellation:r,noiseSuppression:s,audioTrack:g,videoTrack:B,captureElement:Q,preferDisplaySurface:f}){var m;try{const M=Ns();let v;return B||g?(v=new MediaStream,B&&v.addTrack(B),g&&v.addTrack(g)):(v=await uEA({audio:!1,systemAudio:t,width:this.profile.width,height:this.profile.height,frameRate:this.profile.frameRate,autoGainControl:i,echoCancellation:r,noiseSuppression:s,captureElement:Q,preferDisplaySurface:f}),this.sourceTrack=v.getVideoTracks()[0]),await this.setInputMediaStreamTrack(v.getVideoTracks()[0]),Eo.emit(nr.LOCAL_TRACK_CAPTURE_SUCCESS,{track:this,cost:Ns()-M,profile:this.profile,room:(m=this.manager)==null?void 0:m.room}),v}catch(M){throw this.log.error(`getDisplayMedia error observed ${M}`),M instanceof Ws?M:new Ws({code:xa.INITIALIZE_FAILED,name:M.name,message:M.message})}}async switchDevice(t){throw new Error("Method not implemented.")}};function dEA(t=30,i=2){return TY((r,s)=>function(...g){return new Promise((B,Q)=>{const f=setTimeout(()=>{const m=new Ws({code:xa.API_CALL_TIMEOUT,message:`checkPendingPromise ${s}() timeout ${t}s`});(this.log||this._log||qi).warn(m),i===2?Q(m):i===1&&B()},1e3*t);this._checkPendingPromiseSet||(this._checkPendingPromiseSet=new Set),this._checkPendingPromiseSet.add(f),r.apply(this,g).then(B,Q).finally(()=>{clearTimeout(f),this._checkPendingPromiseSet&&f&&this._checkPendingPromiseSet.delete(f)})})})}ss([LX(function(t){this.setContentHint(t.contentHint||"detail")})],QEA.prototype,"capture");var ZM=class Hj extends $3{constructor(i,r,s){super({userId:r.userId,sdkAppId:i.sdkAppId,mediaType:s,room:i}),this.room=i,this.user=r,OA(this,"tinyId"),OA(this,"isRemote",!0),OA(this,"jitterBufferDelay",0),OA(this,"availableState"),OA(this,"remotePublishState"),OA(this,"_triggerCheckDecodeSubject",xX(Rc(this,Hj.STATE_SUBSCRIBE))),OA(this,"ignoreUpdatePlayingState"),this.tinyId=r.tinyId,this.availableState=new Lr(`${r.userId}-${this.mediaType}-available`,"remote-track-available"),this.remotePublishState=new Lr(`${r.userId}-${this.mediaType}-remote-publish`,"remote-track-publish"),QC(OX(Rc(this,Lr.STATECHANGED),Rc(this.remotePublishState,Lr.STATECHANGED)),YX(()=>this.isRemotePublished&&(this.isSubscribed||this.isSubscribing)),dD(f=>{this.availableState.state!==(f?Lr.ON:Lr.OFF)&&(this.availableState.state=f?Lr.ON:Lr.OFF),this.isRemotePublished&&this.ignoreUpdatePlayingState||this.updatePlayingState(f)}));const g=QC(Rc(this.player,vr.ERROR),mw(f=>f.code===MediaError.MEDIA_ERR_DECODE)),B=QC(xcA(5e3),mw(()=>this.ignoreDecodeError||!this.isSubscribed||!this.isPlayCalled||!this.stat.bytesReceived||!this.isRemotePublished?!1:!(this.player.isPlaying||(this.kind===gt.AUDIO?this.getAudioLevel()>0:this.stat.framesDecoded>0))||(this.reportDecodeResult(!0),!1))),Q=QC(FcA(g,B),ww(Rc(this,Lr.INIT)));QC(this._triggerCheckDecodeSubject,mw(()=>!this.ignoreDecodeError),HX(Q),dD(f=>{this.reportDecodeResult(!1,f)}))}setMute(i){this.isRemotePublished&&super.setMute(i)}setInputMediaStreamTrack(i){super.setInputMediaStreamTrack(i),this.isRemotePublished&&this.isSubscribed&&this.player.setTrack(this.outMediaTrack)}checkDecodeResult(){this._triggerCheckDecodeSubject.next(!0)}waitHasMediaTrack(){return new Promise(i=>{this.mediaTrack?i():this.once("input-media-track-changed",i)})}get ignoreDecodeError(){var i,r,s,g;return(g=(s=(r=(i=this.room)==null?void 0:i.networkQuality)==null?void 0:r.hadRecentBadDownlink)==null?void 0:s.call(r,2))!=null&&g||this.player.isInAutoPlayFailedState}get isSubscribing(){return this.state.toString()==="subscribeing"}get isSubscribed(){return this.state===Hj.STATE_SUBSCRIBE}get isAvailable(){return this.availableState.state===Lr.ON}get isNeedPlay(){return this.isAvailable&&this.isPlayCalled}subscribe(i){return i}unsubscribe(){this.streamType==="main"&&this.kind==="video"&&this.room.changeType(!1,this.user)}reportDecodeResult(i,r){var s,g;const B=this.kind===gt.AUDIO;if(qr[i?"addSuccessEvent":"addFailedEvent"]({key:B?504700:514702}),!B){const Q=((s=this.room)==null?void 0:s.downlinkVideoCodec.toUpperCase())||"H264";qr[i?"addSuccessEvent":"addFailedEvent"]({key:IX[`DECODE_${Q}_RESULT`]}),i||this.log.warn(`${(g=this.room)==null?void 0:g.downlinkVideoCodec} decode failed`)}i||(qr.addEnum({key:B?504701:514703,value:Y3()}),fC.uploadEvent({log:`stat-decode-failed-${this.kind}-${eX()||iX()}`,userId:this.room.userId}),this._log.warn(`decode failed: isPlaying: ${this.player.isPlaying} ${this.kind===gt.AUDIO?`audioLevel: ${this.getAudioLevel()}`:`framesDecoded: ${this.stat.framesDecoded>0}`}`),this.emit("decode-failed",{error:r}))}updatePlayingState(i){if(this.player.isPlayCalled&&this.player.setTrack(this.playerMediaTrack),this.isPlayCalled&&this.player.isStopped===i){if(i&&(!this.isSubscribed||!this.isRemotePublished||!this.outMediaTrack))return void this.log.info(`abort play, isSubscribed: ${this.isSubscribed} isAvailable: ${this.isRemotePublished} hasTrack: ${!!this.outMediaTrack} `);super.updatePlayingState(i)}}close(){super.close(),this.outMediaTrack&&this.uninstallTrackEvent(this.outMediaTrack)}onFlagChanged(){this.remotePublishState.state=this.isRemotePublished?Lr.ON:Lr.OFF,this.emit("remote-publish-changed",this.isRemotePublished)}onTrackMuted(){this.isNeedPlay&&super.onTrackMuted()}onTrackUnmuted(){this.isNeedPlay&&super.onTrackUnmuted()}onTrackEnded(){this.isNeedPlay&&super.onTrackEnded()}};OA(ZM,"STATE_SUBSCRIBE","subscribe"),ss([dEA(5,1)],ZM.prototype,"waitHasMediaTrack"),ss([FI(Lr.INIT,ZM.STATE_SUBSCRIBE,{success(){this.log.info("subscribed"),Eo.emit(nr.REMOTE_TRACK_SUBSCRIBED,{track:this})},ignoreError:!0}),FX(521716,!1)],ZM.prototype,"subscribe"),ss([FI(ZM.STATE_SUBSCRIBE,Lr.INIT,{sync:!0,success(){this.log.info("unsubscribed"),Eo.emit(nr.REMOTE_TRACK_UNSUBSCRIBED,{track:this})}})],ZM.prototype,"unsubscribe");var XK=new Map;function ns(t,i){const r=lB(cr({},i),{timestamp:m3()});XK.has(t)?XK.get(t).push(r):XK.set(t,[r])}Eo.on(nr.JOIN_SUCCESS,({room:t})=>{ns(t.userId,{eventId:32788})}),Eo.on(nr.LEAVE_START,({room:t})=>{ns(t.userId,{eventId:32789})}),Eo.on(nr.LOCAL_TRACK_PUBLISHED,({track:t})=>{if(t.room){let i=32769;t.mediaType===4?i=32768:t.mediaType===2&&(i=32805),ns(t.room.userId,{eventId:i})}}),Eo.on(nr.LOCAL_TRACK_UNPUBLISHED,({track:t})=>{if(t.room){let i=32771;t.mediaType===4?i=32770:t.mediaType===2&&(i=32806),ns(t.room.userId,{eventId:i})}}),Eo.on(nr.TRACK_MUTED,({track:t})=>{t.room&&(t.kind===gt.AUDIO?ns(t.room.userId,{eventId:t.isRemote?32785:32772,remoteUserId:t.isRemote?t.userId:void 0}):ns(t.room.userId,{eventId:t.isRemote?32784:32773,remoteUserId:t.isRemote?t.userId:void 0}))}),Eo.on(nr.TRACK_UNMUTED,({track:t})=>{t.room&&(t.kind===gt.AUDIO?ns(t.room.userId,{eventId:t.isRemote?32787:32774,remoteUserId:t.isRemote?t.userId:void 0}):ns(t.room.userId,{eventId:t.isRemote?32786:32775,remoteUserId:t.isRemote?t.userId:void 0}))}),Eo.on(nr.REMOTE_TRACK_SUBSCRIBED,({track:t})=>{t.room&&(t.mediaType===1&&ns(t.room.userId,{eventId:32777,remoteUserId:t.userId}),t.mediaType===4&&ns(t.room.userId,{eventId:32776,remoteUserId:t.userId}),t.mediaType===8&&ns(t.room.userId,{eventId:32803,remoteUserId:t.userId}))}),Eo.on(nr.REMOTE_TRACK_UNSUBSCRIBED,({track:t})=>{t.room&&(t.mediaType===1&&ns(t.room.userId,{eventId:32779,remoteUserId:t.userId}),t.mediaType===4&&ns(t.room.userId,{eventId:32778,remoteUserId:t.userId}),t.mediaType===8&&ns(t.room.userId,{eventId:32804,remoteUserId:t.userId}))}),Eo.on(nr.SWITCH_DEVICE_SUCCESS,({track:t})=>{t.room&&ns(t.room.userId,{eventId:t.kind===gt.VIDEO?32780:32781})}),Eo.on(nr.LOCAL_TRACK_REPLACED,({track:t})=>{t.room&&ns(t.room.userId,{eventId:t.kind===gt.VIDEO?32782:32783})}),Eo.on(nr.SIGNAL_CONNECTION_STATE_CHANGED,({room:t,prevState:i,state:r})=>{let s;switch(r){case"CONNECTED":s=i==="RECONNECTING"?32795:32791;break;case"DISCONNECTED":s=i==="RECONNECTING"?32796:32790;break;case"RECONNECTING":s=32794}s&&ns(t.userId,{eventId:s})}),Eo.on(nr.PEER_CONNECTION_STATE_CHANGED,({room:t,prevState:i,state:r,remoteUserId:s})=>{const g=!!s;let B;switch(r){case"CONNECTED":B=i==="RECONNECTING"?g?32801:32798:g?32793:32792;break;case"DISCONNECTED":i==="RECONNECTING"&&(B=g?32802:32799);break;case"RECONNECTING":B=g?32800:32797}B&&ns(t.userId,{eventId:B,remoteUserId:s})}),Eo.on(nr.VIDEO_CODEC_IMPLEMENTATION_CHANGED,({implementation:t,userId:i,remoteUserId:r,codec:s,isHWCodec:g,prevImplementation:B,streamType:Q})=>{let f=g?1:0;B||(f=g?3:2);const m={H264:0,H265:1,VP8:2}[s.toUpperCase()],M={eventId:4004,param1:f,param2:m,streamType:Q||2};r&&(M.remoteUserId=r,M.eventId=4005),ns(i,M),qr.addEnum({key:r?514701:513701,value:f}),qr.addEnum({key:r?514700:513700,value:m})}),Eo.on(nr.LOCAL_TRACK_RECAPTURE,({track:t,error:i})=>{if(t.userId){const r={eventId:2003,param1:0};t.kind===gt.AUDIO?(r.streamType=1,i&&(r.param1=2)):(r.streamType=t.streamType==="auxiliary"?7:2,i&&(r.param1=8)),ns(t.userId,r)}});Tw(mk());Tw(mk());var $K=0,jX=class WX{constructor(i){this.core=i,OA(this,"seq"),OA(this,"log"),OA(this,"localMixVideoTrack",null),OA(this,"systemAudioTrackList",{}),OA(this,"_mixVideoConfig"),OA(this,"onScreenShareStop"),OA(this,"eventListeners",new Map),$K+=1,this.seq=$K,this.log=i.log.createChild({id:`${this.getAlias()}${$K}`}),this.log.info("created")}getName(){return WX.Name}getAlias(){return"vmix"}getValidateRule(i){switch(i){case"start":return hsA(this.core);case"update":return psA(this.core);case"stop":return fsA(this.core)}}getGroup(){return"vmix"}async start(i){this.localMixVideoTrack||(this.localMixVideoTrack=new this.core.LocalMixVideoTrack(this.core.room.videoManager)),this._mixVideoConfig={canvasInfo:{width:1920,height:1080}},i=this.core.utils.deepCloneBasic(i);const{view:r,onScreenShareStop:s}=i,g=await this.parseMixOptions(i);return s&&(this.onScreenShareStop=s,this._mixVideoConfig.onScreenShareStop=s),this._updatePreview({view:r,track:this.localMixVideoTrack}),this.core.utils.isUndefined(r)||(this._mixVideoConfig.view=r),await this.localMixVideoTrack.startMix(),{track:this.localMixVideoTrack.outMediaTrack,systemAudioTrackList:this.systemAudioTrackList,result:g}}async update(i){const{RtcError:r,ErrorCode:s}=this.core.errorModule;if(!this.localMixVideoTrack)throw new r({code:s.INVALID_OPERATION,message:"mixTrack doesn't initialize!"});i=this.core.utils.deepCloneBasic(i);const{view:g}=i,B=await this.parseMixOptions(i);return await this._updatePreview({view:g,track:this.localMixVideoTrack,prevConfig:this._mixVideoConfig}),this.core.utils.isUndefined(g)||(this._mixVideoConfig.view=g),{track:this.localMixVideoTrack.outMediaTrack,systemAudioTrackList:this.systemAudioTrackList,result:B}}stop(){var i;this.eventListeners.forEach((r,s)=>{this.removeEventListeners(s)}),this.eventListeners.clear(),(i=this.localMixVideoTrack)==null||i.close(),this.localMixVideoTrack=null,Object.values(this.systemAudioTrackList).forEach(r=>r.stop()),this.systemAudioTrackList={},delete this.onScreenShareStop,delete this._mixVideoConfig}async parseMixOptions(i){const{RtcError:r,ErrorCode:s}=this.core.errorModule;if(!this.localMixVideoTrack||!this._mixVideoConfig)return{successOptions:{},failedDetails:[]};const g=[],B=cr({},i),{canvasInfo:Q,camera:f,screen:m,text:M,image:v,video:U}=i;Q&&this.parseCanvasOptions(Q);let AA=0,z=0;const sA=[{key:"camera",options:f,parser:this.parseCameraOptions.bind(this)},{key:"screen",options:m,parser:this.parseScreenOptions.bind(this)},{key:"text",options:M,parser:this.parseTextOptions.bind(this)},{key:"image",options:v,parser:this.parseImageOptions.bind(this)},{key:"video",options:U,parser:this.parseVideoOptions.bind(this)}];for(const{key:eA,options:X,parser:QA}of sA)if(X){AA++;const wA=await QA(this.localMixVideoTrack,X,this._mixVideoConfig[eA]||[]);this._mixVideoConfig[eA]=wA.finalOptions,B[eA]=wA.finalOptions,wA.errors.length>0&&(g.push(...wA.errors),wA.errors.length===X.length&&z++)}if(z>0&&z===AA)throw new r({code:s.INVALID_PARAMETER,message:"all sources mix failed",data:{failedDetails:g}});return{successOptions:B,failedDetails:g}}parseCanvasOptions(i){if(!this.localMixVideoTrack||!this._mixVideoConfig)return;const{canvasColor:r,width:s,height:g,frameRate:B}=i;r&&this.localMixVideoTrack.setMixBackground(r),B&&this.localMixVideoTrack.setFps(B),this.localMixVideoTrack.resizeMixCanvas(s,g),this._mixVideoConfig.canvasInfo=i}prepareSourceOptions(i,r){const s=new Set(i.map(g=>g.id));return{removeIdList:r.filter(g=>!s.has(g.id)).map(g=>g.id),preOptionsMap:new Map(r.map(g=>[g.id,g]))}}recordSourceError(i,r,s,g,B){B.push({id:i,error:r}),s.has(i)&&g.push(s.get(i))}async parseCameraOptions(i,r,s=[]){const{removeIdList:g,preOptionsMap:B}=this.prepareSourceOptions(r,s);this.log.debug("videomixer removeIdList",r,g,B);for(const m of g)i.removeCameraSource(m),this.removeEventListeners(m);const Q=[],f=[];for(const m of r)try{await this.processSingleCameraSource(i,m),Q.push(m)}catch(M){this.recordSourceError(m.id,M,B,Q,f)}return{finalOptions:Q,errors:f}}async processSingleCameraSource(i,r){const{id:s}=r;this.resolveCameraInternalTrack(i,r),i.inputLocalVideoTracks.has(s)?await this.updateExistingCameraSource(i,r):await this.addNewCameraSource(i,r)}async updateExistingCameraSource(i,r){var s,g;const{id:B,layout:Q,profile:f}=r,m=(s=i.inputLocalVideoTracks.get(B))==null?void 0:s.mediaTrack;await this.updateCameraProfile(r);const M=(g=i.inputLocalVideoTracks.get(B))==null?void 0:g.mediaTrack,v=this.resolveVideoProfile(f);M!==m?i.updateCameraSource(B,Q,M,v):i.updateCameraSource(B,Q,null,v)}resolveCameraInternalTrack(i,r){var s;const{id:g,layout:B,profile:Q,useInternalTrack:f}=r;if(f){if(i.inputLocalVideoTracks.get(g))return r;this.log.debug("resolve camera internal track",r,r.id,r.videoTrack),(s=this.core.trtc.localVideoTrack)!=null&&s.sourceTrack?(this.log.debug("resolve camera internal track outMediaTrack:",this.core.trtc.localVideoTrack.outMediaTrack,"sourceTrack:",this.core.trtc.localVideoTrack.sourceTrack),r.videoTrack=this.core.trtc.localVideoTrack.outMediaTrack,r.profile=this.core.trtc.localVideoTrack.profile):r.videoTrack=this.createPlaceholderVideoTrack(),this.removeEventListeners(g);const m=v=>{var U,AA;const z=i.inputLocalVideoTracks.get(g);this.log.debug(`camera internal track preprocessed event from ${(U=v.room)==null?void 0:U.userId} to ${this.core.room.userId}, is same instance:${v.room===this.core.room} ,new track:`,v.mediaTrack,z?.mediaTrack,i.outMediaTrack),((AA=v.mediaTrack)==null?void 0:AA.kind)!==gt.AUDIO&&z?.mediaTrack!==v.mediaTrack&&i.outMediaTrack!==v.mediaTrack&&v.room===this.core.room?z&&v.mediaTrack&&i.updateCameraSource(g,B,v.mediaTrack):this.log.debug("camera internal track preprocessed event return")},M=v=>{var U,AA,z,sA,eA,X,QA,wA;const HA=i.inputLocalVideoTracks.get(g);this.log.debug(`camera internal track stopped ${((U=v.track)==null?void 0:U.mediaTrack)===HA?.mediaTrack||((AA=v.track)==null?void 0:AA.outMediaTrack)===HA?.mediaTrack||((z=v.track)==null?void 0:z.outMediaTrack)===i.outMediaTrack}`,(sA=v.track)==null?void 0:sA.mediaTrack,(eA=v.track)==null?void 0:eA.outMediaTrack,HA?.mediaTrack,i.outMediaTrack),!HA||((X=v.track)==null?void 0:X.mediaTrack)!==HA?.mediaTrack&&((QA=v.track)==null?void 0:QA.outMediaTrack)!==HA?.mediaTrack&&((wA=v.track)==null?void 0:wA.outMediaTrack)!==i.outMediaTrack||i.updateCameraSource(g,B,this.createPlaceholderVideoTrack())};this.core.innerEmitter.on("118",m),this.core.innerEmitter.on("117",M),this.eventListeners.has(g)||this.eventListeners.set(g,{}),this.eventListeners.get(g).captureSuccess=()=>{this.core.innerEmitter.off("118",m)},this.eventListeners.get(g).trackStop=()=>{this.core.innerEmitter.off("117",M)}}return r}async addNewCameraSource(i,r){const{id:s,layout:g,useInternalTrack:B}=r,Q=await this.captureCamera(r);try{i.addCameraSource(s,Q,g)}catch(f){throw Q.close(),f}}resolveVideoProfile(i){if(!this.core.utils.isUndefined(i))return this.core.utils.isString(i)?this.core.constants.videoProfileMap[i]:i}async parseScreenOptions(i,r,s=[]){const{removeIdList:g,preOptionsMap:B}=this.prepareSourceOptions(r,s);for(const m of g)i.removeScreenSource(m),this.removeSystemAudioTrack(m),this.removeEventListeners(m);const Q=[],f=[];for(const m of r)try{await this.processSingleScreenSource(i,m,B),Q.push(m)}catch(M){this.recordSourceError(m.id,M,B,Q,f)}return{finalOptions:Q,errors:f}}async processSingleScreenSource(i,r,s){const{id:g,layout:B,useInternalTrack:Q}=r;this.resolveScreenInternalTrack(i,r);const f=s.get(g),m=i.inputLocalScreenTracks.has(g),M=!f?.systemAudio&&r.systemAudio;m&&!M?this.updateExistingScreenSource(i,g,B,f,r):await this.addNewScreenSource(i,r,f)}updateExistingScreenSource(i,r,s,g,B){i.updateScreenSource(r,s),g?.systemAudio&&!B.systemAudio&&this.removeSystemAudioTrack(r)}resolveScreenInternalTrack(i,r){var s,g;const{id:B,layout:Q,useInternalTrack:f}=r;if(f){if(i.inputLocalScreenTracks.get(B))return r;this.log.debug("resolve screen internal track",r,r.id,r.videoTrack),(s=this.core.trtc.localScreenTrack)!=null&&s.sourceTrack?(r.videoTrack=this.core.trtc.localScreenTrack.sourceTrack,r.profile=this.core.trtc.localScreenTrack.profile,(g=this.core.trtc.localScreenAudioTrack)!=null&&g.mediaTrack&&(r.audioTrack=this.core.trtc.localScreenAudioTrack.mediaTrack),delete r.captureElement,delete r.preferDisplaySurface,delete r.systemAudio):r.videoTrack=this.createPlaceholderVideoTrack(),this.removeEventListeners(B);const m=v=>{var U,AA,z,sA,eA,X,QA;const wA=i.inputLocalScreenTracks.get(B);this.log.debug(`screen internal track capture success event from ${(U=v.room)==null?void 0:U.userId} to ${this.core.room.userId}, is same instance:${v.room===this.core.room}, isScreen:${(AA=v.track)==null?void 0:AA.isScreen} kind:${(z=v.track)==null?void 0:z.kind}`,wA,v.track.sourceTrack),(sA=v.track)!=null&&sA.isScreen&&((eA=v.track)==null?void 0:eA.kind)!==gt.AUDIO&&wA&&(this.log.debug("screen internal track capture success event ",(X=v.track)==null?void 0:X.sourceTrack),(QA=v.track)!=null&&QA.sourceTrack&&i.updateScreenSource(B,Q,v.track.sourceTrack))},M=v=>{var U,AA;const z=i.inputLocalScreenTracks.get(B);this.log.debug(`screen internal track stopped, is same track:${((U=v.track)==null?void 0:U.sourceTrack)===z?.mediaTrack}, isScreen:${v.track.isScreen}`),v.track.isScreen&&((AA=v.track)==null?void 0:AA.sourceTrack)===z?.mediaTrack&&i.updateScreenSource(B,Q,this.createPlaceholderVideoTrack())};this.core.innerEmitter.on("102",m),this.core.innerEmitter.on("117",M),this.eventListeners.has(B)||this.eventListeners.set(B,{}),this.eventListeners.get(B).captureSuccess=()=>{this.core.innerEmitter.off("102",m)},this.eventListeners.get(B).trackStop=()=>{this.core.innerEmitter.off("117",M)}}return r}async addNewScreenSource(i,r,s){const{id:g,layout:B}=r,Q=await this.captureScreen(r);!s?.systemAudio&&r.systemAudio&&i.inputLocalScreenTracks.has(g)&&i.removeScreenSource(g);try{i.addScreenSource(g,Q,B)}catch(f){throw Q.close(),f}}async parseTextOptions(i,r,s=[]){const{removeIdList:g,preOptionsMap:B}=this.prepareSourceOptions(r,s);for(const m of g)i.removeTextSource(m);const Q=[],f=[];for(const m of r)try{B.has(m.id)?i.updateTextSource(m):i.addTextSource(m),Q.push(m)}catch(M){this.recordSourceError(m.id,M,B,Q,f)}return{finalOptions:Q,errors:f}}async parseImageOptions(i,r,s=[]){const{removeIdList:g,preOptionsMap:B}=this.prepareSourceOptions(r,s);for(const m of g)i.removeImageSource(m);const Q=[],f=[];for(const m of r)try{await this.processSingleImageSource(i,m,B),Q.push(m)}catch(M){this.recordSourceError(m.id,M,B,Q,f)}return{finalOptions:Q,errors:f}}async processSingleImageSource(i,r,s){const{id:g,url:B,layout:Q}=r,f=s.get(g);if(f){let m;f.url!==B&&(m=await this.core.utils.loadImage(B)),i.updateImageSource(g,Q,m)}else{const m=await this.core.utils.loadImage(B);i.addImageSource(g,m,Q)}}async parseVideoOptions(i,r,s=[]){const{removeIdList:g,preOptionsMap:B}=this.prepareSourceOptions(r,s);for(const m of g)i.removeVideoSource(m);const Q=[],f=[];for(const m of r)try{await this.processSingleVideoSource(i,m,B),Q.push(m)}catch(M){this.recordSourceError(m.id,M,B,Q,f)}return{finalOptions:Q,errors:f}}async processSingleVideoSource(i,r,s){const{id:g,url:B,layout:Q}=r,f=s.get(g);if(f){let m;f.url!==B&&(m=await this.core.utils.loadVideo(B)),i.updateVideoSource(g,Q,m)}else{const m=await this.core.utils.loadVideo(B);i.addVideoSource(g,m,Q)}}createPlaceholderVideoTrack(){const i=document.createElement("canvas");i.width=1,i.height=1;const r=i.getContext("2d");if(!r)return i.captureStream(30).getVideoTracks()[0];let s=null;const g=1e3/30,B=i.captureStream(30).getVideoTracks()[0],Q=()=>{r.fillStyle="rgba(255, 255, 255, 0)",r.fillRect(0,0,i.width,i.height),B.readyState==="live"&&(s=setTimeout(Q,g))};Q();const f=B.stop.bind(B);return B.stop=()=>{s&&(clearTimeout(s),s=null),f()},B}removeEventListeners(i){const r=this.eventListeners.get(i);r&&(r.captureSuccess&&r.captureSuccess(),r.trackStop&&r.trackStop(),this.eventListeners.delete(i))}async captureCamera(i){const{id:r,cameraId:s,videoTrack:g,profile:B}=i,Q=new this.core.LocalVideoTrack;Q.log.id+=`-${r}`;const f={};if(s?f.deviceId=s:this.core.utils.isUndefined(g)||(f.customSource=g),!this.core.utils.isUndefined(B)){const m=this.resolveVideoProfile(B);m&&Q.setProfile(m)}return await Q.capture(f),Q}async updateCameraProfile(i){var r;const{id:s,cameraId:g,videoTrack:B,profile:Q}=i,f=(r=this.localMixVideoTrack)==null?void 0:r.inputLocalVideoTracks.get(s);if(f&&(g?await f.switchDevice(g):this.core.utils.isUndefined(B)||await f.setInputMediaStreamTrack(B),!this.core.utils.isUndefined(Q))){const m=this.resolveVideoProfile(Q);m&&f.setProfile(m),g&&f.isNeedToSwitchDevice(g)||await f.applyProfile()}}async captureScreen(i){const{id:r,profile:s,captureElement:g,preferDisplaySurface:B,systemAudio:Q,videoTrack:f,audioTrack:m}=i,M=new this.core.LocalScreenTrack;M.log.id+=`-${r}`;const v={captureElement:g,preferDisplaySurface:B,systemAudio:Q,videoTrack:f,audioTrack:m};if(!this.core.utils.isUndefined(s))if(this.core.utils.isString(s)){const AA=this.core.constants.screenProfileMap[s];AA&&M.setProfile(AA)}else M.setProfile(s);const U=await M.capture(v);return Q&&U.getAudioTracks().length>0?(this.systemAudioTrackList[r]=U.getAudioTracks()[0],this.log.info(`${r} system audio track captured`)):this.removeSystemAudioTrack(r),M.mediaTrack.addEventListener(this.core.constants.NAME.ENDED,()=>{this.handleScreenShareEnded(r)}),M}handleScreenShareEnded(i){var r,s,g;(r=this.localMixVideoTrack)==null||r.removeScreenSource(i),(s=this._mixVideoConfig)!=null&&s.screen&&(this._mixVideoConfig.screen=this._mixVideoConfig.screen.filter(B=>B.id!==i)),(g=this.onScreenShareStop)==null||g.call(this,i)}async _updatePreview({view:i,track:r,prevConfig:s}){if(this.core.utils.isUndefined(i)&&s?.view){const g=this.core.utils.getViewListFromView(s.view);return void(g.length>0&&await r.play(g))}if(!this.core.utils.isUndefined(i)){const g=this.core.utils.getViewListFromView(i);g.length>0?await r.play(g):r.stop()}}removeSystemAudioTrack(i){const r=this.systemAudioTrackList[i];r&&(r.stop(),this.log.info(`${i} system audio track stop`),delete this.systemAudioTrackList[i])}};OA(jX,"Name","VideoMixer");var zX=jX,hEA=zX;const pEA=Object.freeze(Object.defineProperty({__proto__:null,VideoMixer:zX,default:hEA},Symbol.toStringTag,{value:"Module"})),fEA=hk(pEA);var mEA=fG.exports,I8;function DEA(){return I8||(I8=1,function(t,i){(function(r,s){s(i,vrA(),enA,VaA,AsA,ssA,fEA)})(mEA,function(r,s,g,B,Q,f,m){function M(L){return L&&typeof L=="object"&&"default"in L?L:{default:L}}var v=M(s),U=M(m),AA=function(L,w){return AA=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(q,y){q.__proto__=y}||function(q,y){for(var T in y)Object.prototype.hasOwnProperty.call(y,T)&&(q[T]=y[T])},AA(L,w)},z=function(){return z=Object.assign||function(L){for(var w,q=1,y=arguments.length;q=0;CA--)(T=L[CA])&&($=(V<3?T($):V>3?T(w,q,$):T(w,q))||$);return V>3&&$&&Object.defineProperty(w,q,$),$}function eA(L,w,q,y){return new(q||(q=Promise))(function(T,V){function $(KA){try{NA(y.next(KA))}catch(C){V(C)}}function CA(KA){try{NA(y.throw(KA))}catch(C){V(C)}}function NA(KA){var C;KA.done?T(KA.value):(C=KA.value,C instanceof q?C:new q(function(E){E(C)})).then($,CA)}NA((y=y.apply(L,[])).next())})}function X(L,w){var q,y,T,V,$={label:0,sent:function(){if(1&T[0])throw T[1];return T[1]},trys:[],ops:[]};return V={next:CA(0),throw:CA(1),return:CA(2)},typeof Symbol=="function"&&(V[Symbol.iterator]=function(){return this}),V;function CA(NA){return function(KA){return function(C){if(q)throw new TypeError("Generator is already executing.");for(;V&&(V=0,C[0]&&($=0)),$;)try{if(q=1,y&&(T=2&C[0]?y.return:C[0]?y.throw||((T=y.return)&&T.call(y),0):y.next)&&!(T=T.call(y,C[1])).done)return T;switch(y=0,T&&(C=[2&C[0],T.value]),C[0]){case 0:case 1:T=C;break;case 4:return $.label++,{value:C[1],done:!1};case 5:$.label++,y=C[1],C=[0];continue;case 7:C=$.ops.pop(),$.trys.pop();continue;default:if(T=$.trys,!((T=T.length>0&&T[T.length-1])||C[0]!==6&&C[0]!==2)){$=0;continue}if(C[0]===3&&(!T||C[1]>T[0]&&C[1]=L.length&&(L=void 0),{value:L&&L[y++],done:!L}}};throw new TypeError(w?"Object is not iterable.":"Symbol.iterator is not defined.")}function wA(L,w,q){if(q||arguments.length===2)for(var y,T=0,V=w.length;T0&&ei[0]<4?1:+(ei[0]+ei[1])),!Es&&kg&&(!(ei=kg.match(/Edge\/(\d+)/))||ei[1]>=74)&&(ei=kg.match(/Chrome\/(\d+)/))&&(Es=+ei[1]);var Ba=Es,Mr=Gr.String,Cs=!!Object.getOwnPropertySymbols&&!$o(function(){var L=Symbol("symbol detection");return!Mr(L)||!(Object(L)instanceof Symbol)||!Symbol.sham&&Ba&&Ba<41}),Va=Cs&&!Symbol.sham&&typeof Symbol.iterator=="symbol",P=Object,F=Va?function(L){return typeof L=="symbol"}:function(L){var w=qo("Symbol");return fo(w)&&Gg(w.prototype,P(L))},EA=String,RA=TypeError,GA=function(L){if(fo(L))return L;throw RA(function(w){try{return EA(w)}catch{return"Object"}}(L)+" is not a function")},WA=function(L,w){var q=L[w];return Fo(q)?void 0:GA(q)},Ce=TypeError,ge=Object.defineProperty,we=function(L,w){try{ge(Gr,L,{value:w,configurable:!0,writable:!0})}catch{Gr[L]=w}return w},_e="__core-js_shared__",Ke=Gr[_e]||we(_e,{}),Bt=ue(function(L){(L.exports=function(w,q){return Ke[w]||(Ke[w]=q!==void 0?q:{})})("versions",[]).push({version:"3.32.1",mode:"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.32.1/LICENSE",source:"https://github.com/zloirock/core-js"})}),Rt=Object,Ye=function(L){return Rt(Ha(L))},nt=ao({}.hasOwnProperty),ii=Object.hasOwn||function(L,w){return nt(Ye(L),w)},oi=0,Ko=Math.random(),Kt=ao(1 .toString),ro=function(L){return"Symbol("+(L===void 0?"":L)+")_"+Kt(++oi+Ko,36)},ks=Gr.Symbol,Zr=Bt("wks"),In=Va?ks.for||ks:ks&&ks.withoutSetter||ro,xr=function(L){return ii(Zr,L)||(Zr[L]=Cs&&ii(ks,L)?ks[L]:In("Symbol."+L)),Zr[L]},sI=TypeError,jo=xr("toPrimitive"),OI=function(L,w){if(!en(L)||F(L))return L;var q,y=WA(L,jo);if(y){if(q=Gi(y,L,w),!en(q)||F(q))return q;throw sI("Can't convert object to primitive value")}return function(T,V){var $,CA;if(fo($=T.toString)&&!en(CA=Gi($,T))||fo($=T.valueOf)&&!en(CA=Gi($,T)))return CA;throw Ce("Can't convert object to primitive value")}(L)},_g=function(L){var w=OI(L,"string");return F(w)?w:w+""},gI=Gr.document,ml=en(gI)&&en(gI.createElement),ua=function(L){return ml?gI.createElement(L):{}},II=!sn&&!$o(function(){return Object.defineProperty(ua("div"),"a",{get:function(){return 7}}).a!==7}),ZA=Object.getOwnPropertyDescriptor,Ag={f:sn?ZA:function(L,w){if(L=Gs(L),w=_g(w),II)try{return ZA(L,w)}catch{}if(ii(L,w))return gn(!Gi(gr.f,L,w),L[w])}},cI=sn&&$o(function(){return Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype!==42}),Bs=String,eg=TypeError,kr=function(L){if(en(L))return L;throw eg(Bs(L)+" is not an object")},EI=TypeError,Gt=Object.defineProperty,Dl=Object.getOwnPropertyDescriptor,xI="enumerable",_s="configurable",tg="writable",ka={f:sn?cI?function(L,w,q){if(kr(L),w=_g(w),kr(q),typeof L=="function"&&w==="prototype"&&"value"in q&&tg in q&&!q[tg]){var y=Dl(L,w);y&&y[tg]&&(L[w]=q.value,q={configurable:_s in q?q[_s]:y[_s],enumerable:xI in q?q[xI]:y[xI],writable:!1})}return Gt(L,w,q)}:Gt:function(L,w,q){if(kr(L),w=_g(w),kr(q),II)try{return Gt(L,w,q)}catch{}if("get"in q||"set"in q)throw EI("Accessors not supported");return"value"in q&&(L[w]=q.value),L}},wc=sn?function(L,w,q){return ka.f(L,w,gn(1,q))}:function(L,w,q){return L[w]=q,L},lE=Function.prototype,qa=sn&&Object.getOwnPropertyDescriptor,CE=ii(lE,"name"),yC={CONFIGURABLE:CE&&(!sn||sn&&qa(lE,"name").configurable)},us=ao(Function.toString);fo(Ke.inspectSource)||(Ke.inspectSource=function(L){return us(L)});var lI,ig,yl,_a=Ke.inspectSource,Qs=Gr.WeakMap,Rl=fo(Qs)&&/native code/.test(String(Qs)),YI=Bt("keys"),vo=function(L){return YI[L]||(YI[L]=ro(L))},Qa={},BE="Object already initialized",cn=Gr.TypeError,kt=Gr.WeakMap;if(Rl||Ke.state){var Gn=Ke.state||(Ke.state=new kt);Gn.get=Gn.get,Gn.has=Gn.has,Gn.set=Gn.set,lI=function(L,w){if(Gn.has(L))throw cn(BE);return w.facade=L,Gn.set(L,w),w},ig=function(L){return Gn.get(L)||{}},yl=function(L){return Gn.has(L)}}else{var PI=vo("state");Qa[PI]=!0,lI=function(L,w){if(ii(L,PI))throw cn(BE);return w.facade=L,wc(L,PI,w),w},ig=function(L){return ii(L,PI)?L[PI]:{}},yl=function(L){return ii(L,PI)}}var Sc={get:ig,enforce:function(L){return yl(L)?ig(L):lI(L,{})}},tn=ue(function(L){var w=yC.CONFIGURABLE,q=Sc.enforce,y=Sc.get,T=String,V=Object.defineProperty,$=ao("".slice),CA=ao("".replace),NA=ao([].join),KA=sn&&!$o(function(){return V(function(){},"length",{value:8}).length!==8}),C=String(String).split("String"),E=L.exports=function(h,D,N){$(T(D),0,7)==="Symbol("&&(D="["+CA(T(D),/^Symbol\(([^)]*)\)/,"$1")+"]"),N&&N.getter&&(D="get "+D),N&&N.setter&&(D="set "+D),(!ii(h,"name")||w&&h.name!==D)&&(sn?V(h,"name",{value:D,configurable:!0}):h.name=D),KA&&N&&ii(N,"arity")&&h.length!==N.arity&&V(h,"length",{value:N.arity});try{N&&ii(N,"constructor")&&N.constructor?sn&&V(h,"prototype",{writable:!1}):h.prototype&&(h.prototype=void 0)}catch{}var O=q(h);return ii(O,"source")||(O.source=NA(C,typeof D=="string"?D:"")),h};Function.prototype.toString=E(function(){return fo(this)&&y(this).source||_a(this)},"toString")}),Ml=function(L,w,q,y){y||(y={});var T=y.enumerable,V=y.name!==void 0?y.name:w;if(fo(q)&&tn(q,V,y),y.global)T?L[w]=q:we(w,q);else{try{y.unsafe?L[w]&&(T=!0):delete L[w]}catch{}T?L[w]=q:ka.f(L,w,{value:q,enumerable:!1,configurable:!y.nonConfigurable,writable:!y.nonWritable})}return L},ba=Math.ceil,da=Math.floor,on=Math.trunc||function(L){var w=+L;return(w>0?da:ba)(w)},Xr=function(L){var w=+L;return w!=w||w===0?0:on(w)},wl=Math.max,bs=Math.min,vc=Math.min,CI=function(L){return L>0?vc(Xr(L),9007199254740991):0},uE=function(L){return CI(L.length)},RC=function(L){return function(w,q,y){var T,V=Gs(w),$=uE(V),CA=function(NA,KA){var C=Xr(NA);return C<0?wl(C+KA,0):bs(C,KA)}(y,$);if(L&&q!=q){for(;$>CA;)if((T=V[CA++])!=T)return!0}else for(;$>CA;CA++)if((L||CA in V)&&V[CA]===q)return L||CA||0;return!L&&-1}},Nc={indexOf:RC(!1)}.indexOf,Sl=ao([].push),JI=function(L,w){var q,y=Gs(L),T=0,V=[];for(q in y)!ii(Qa,q)&&ii(y,q)&&Sl(V,q);for(;w.length>T;)ii(y,q=w[T++])&&(~Nc(V,q)||Sl(V,q));return V},bg=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],QE=bg.concat("length","prototype"),vl={f:Object.getOwnPropertyNames||function(L){return JI(L,QE)}},Tc={f:Object.getOwnPropertySymbols},lo=ao([].concat),ds=qo("Reflect","ownKeys")||function(L){var w=vl.f(kr(L)),q=Tc.f;return q?lo(w,q(L)):w},QB=function(L,w,q){for(var y=ds(w),T=ka.f,V=Ag.f,$=0;$$;)ka.f(L,q=T[$++],y[q]);return L},bc={f:Nl},VI=qo("document","documentElement"),BI="prototype",pE="script",Lc=vo("IE_PROTO"),uI=function(){},Fg=function(L){return"<"+pE+">"+L+""},ja=function(L){L.write(Fg("")),L.close();var w=L.parentWindow.Object;return L=null,w},Fs=function(){try{Ka=new ActiveXObject("htmlfile")}catch{}var L,w,q;Fs=typeof document<"u"?document.domain&&Ka?ja(Ka):(w=ua("iframe"),q="java"+pE+":",w.style.display="none",VI.appendChild(w),w.src=String(q),(L=w.contentWindow.document).open(),L.write(Fg("document.F=Object")),L.close(),L.F):ja(Ka);for(var y=bg.length;y--;)delete Fs[BI][bg[y]];return Fs()};Qa[Lc]=!0;var No,Fc,Ug=Object.create||function(L,w){var q;return L!==null?(uI[BI]=kr(L),q=new uI,uI[BI]=null,q[Lc]=L):q=Fs(),w===void 0?q:bc.f(q,w)},vC=Gr.RegExp,fE=$o(function(){var L=vC(".","s");return!(L.dotAll&&L.exec(` +`)&&L.flags==="s")}),Tl=Gr.RegExp,Ou=$o(function(){var L=Tl("(?b)","g");return L.exec("b").groups.a!=="b"||"b".replace(L,"$c")!=="bc"}),fB=Sc.get,xu=Bt("native-string-replace",String.prototype.replace),Og=RegExp.prototype.exec,QI=Og,pi=ao("".charAt),mB=ao("".indexOf),Gl=ao("".replace),kl=ao("".slice),NC=(Fc=/b*/g,Gi(Og,No=/a/,"a"),Gi(Og,Fc,"a"),No.lastIndex!==0||Fc.lastIndex!==0),_l=hB.BROKEN_CARET,xg=/()??/.exec("")[1]!==void 0;(NC||xg||_l||fE||Ou)&&(QI=function(L){var w,q,y,T,V,$,CA,NA=this,KA=fB(NA),C=rg(L),E=KA.raw;if(E)return E.lastIndex=NA.lastIndex,w=Gi(QI,E,C),NA.lastIndex=E.lastIndex,w;var h=KA.groups,D=_l&&NA.sticky,N=Gi(Wr,NA),O=NA.source,Y=0,j=C;if(D&&(N=Gl(N,"y",""),mB(N,"g")===-1&&(N+="g"),j=kl(C,NA.lastIndex),NA.lastIndex>0&&(!NA.multiline||NA.multiline&&pi(C,NA.lastIndex-1)!==` +`)&&(O="(?: "+O+")",j=" "+j,Y++),q=new RegExp("^(?:"+O+")",N)),xg&&(q=new RegExp("^"+O+"$(?!\\s)",N)),NC&&(y=NA.lastIndex),T=Gi(Og,D?q:NA,j),D?T?(T.input=kl(T.input,Y),T[0]=kl(T[0],Y),T.index=NA.lastIndex,NA.lastIndex+=T[0].length):NA.lastIndex=0:NC&&T&&(NA.lastIndex=NA.global?T.index+T[0].length:y),xg&&T&&T.length>1&&Gi(xu,T[0],q,function(){for(V=1;V=CA?L?"":void 0:(y=jI(V,$))<55296||y>56319||$+1===CA||(T=jI(V,$+1))<56320||T>57343?L?TC(V,$):y:L?ha(V,$,$+2):T-56320+(y-55296<<10)+65536}},pa={charAt:wB(!0)}.charAt,sg=function(L,w,q){return w+(q?pa(L,w).length:1)},GC=TypeError,bl=function(L,w){var q=L.exec;if(fo(q)){var y=Gi(q,L,w);return y!==null&&kr(y),y}if(po(L)==="RegExp")return Gi(qI,L,w);throw GC("RegExp#exec called on incompatible receiver")};(function(L,w,q,y){var T=xr(L),V=!$o(function(){var KA={};return KA[T]=function(){return 7},""[L](KA)!==7}),$=V&&!$o(function(){var KA=!1,C=/a/;return L==="split"&&((C={}).constructor={},C.constructor[MB]=function(){return C},C.flags="",C[T]=/./[T]),C.exec=function(){return KA=!0,null},C[T](""),!KA});if(!V||!$||q){var CA=wr(/./[T]),NA=w(T,""[L],function(KA,C,E,h,D){var N=wr(KA),O=C.exec;return O===qI||O===Yg.exec?V&&!D?{done:!0,value:CA(C,E,h)}:{done:!0,value:N(E,C,h)}:{done:!1}});Ml(String.prototype,L,NA[0]),Ml(Yg,T,NA[1])}})("match",function(L,w,q){return[function(y){var T=Ha(this),V=Fo(y)?void 0:WA(y,L);return V?Gi(V,y,T):new RegExp(y)[L](rg(T))},function(y){var T=kr(this),V=rg(y),$=q(w,T,V);if($.done)return $.value;if(!T.global)return bl(T,V);var CA=T.unicode;T.lastIndex=0;for(var NA,KA=[],C=0;(NA=bl(T,V))!==null;){var E=rg(NA[0]);KA[C]=E,E===""&&(T.lastIndex=sg(V,CI(T.lastIndex),CA)),C++}return C===0?null:KA}]});var Mn=Array.isArray||function(L){return po(L)==="Array"},WI=TypeError,RE=function(L){if(L>9007199254740991)throw WI("Maximum allowed index exceeded");return L},dI=function(L,w,q){var y=_g(w);y in L?ka.f(L,y,gn(0,q)):L[y]=q},fs=function(){},Uc=[],ms=qo("Reflect","construct"),zI=/^\s*(?:class|function)\b/,xn=ao(zI.exec),Yu=!zI.exec(fs),Wo=function(L){if(!fo(L))return!1;try{return ms(fs,Uc,L),!0}catch{return!1}},Oc=function(L){if(!fo(L))return!1;switch(_c(L)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return Yu||!!xn(zI,_a(L))}catch{return!0}};Oc.sham=!0;var ME,Pg=!ms||$o(function(){var L;return Wo(Wo.call)||!Wo(Object)||!Wo(function(){L=!0})||L})?Oc:Wo,gg=xr("species"),En=Array,Ds=function(L,w){return new(function(q){var y;return Mn(q)&&(y=q.constructor,(Pg(y)&&(y===En||Mn(y.prototype))||en(y)&&(y=y[gg])===null)&&(y=void 0)),y===void 0?En:y}(L))(0)},Wa=xr("species"),Ll=xr("isConcatSpreadable"),SB=Ba>=51||!$o(function(){var L=[];return L[Ll]=!1,L.concat()[0]!==L}),Pu=function(L){if(!en(L))return!1;var w=L[Ll];return w!==void 0?!!w:Mn(L)};Ir({target:"Array",proto:!0,arity:1,forced:!(SB&&(ME="concat",Ba>=51||!$o(function(){var L=[];return(L.constructor={})[Wa]=function(){return{foo:1}},L[ME](Boolean).foo!==1})))},{concat:function(L){var w,q,y,T,V,$=Ye(this),CA=Ds($),NA=0;for(w=-1,y=arguments.length;w=5||Math.abs(y)>=5?(document.removeEventListener("mousemove",this.onMouseMove5px,!1),document.removeEventListener("mouseup",this.onMouseUp5px,!1),document.addEventListener("mousemove",this.onMouseMove,!1),document.addEventListener("mouseup",this.onMouseUp,!1)):Za.debug("".concat(this.logPrefix,"on Movable mouse move less than 5px"))},L.prototype.onMouseUp5px=function(){document.removeEventListener("mousemove",this.onMouseMove5px,!1),document.removeEventListener("mouseup",this.onMouseUp5px,!1)},L.prototype.onMouseMove=function(w){if(this.movable&&this.container){var q=w.screenX-this.moveStartOfLeft,y=w.screenY-this.moveStartOfTop,T=this.originLeft+q,V=this.originTop+y,$=this.movable.offsetWidth,CA=this.movable.offsetHeight,NA=this.container.offsetWidth,KA=this.container.offsetHeight;this.options.canExceedContainer||(T<0?T=0:T>NA-$&&(T=NA-$),V<0?V=0:V>KA-CA&&(V=KA-CA)),!this.options.calcPositionOnly&&this.movable&&(this.movable.style.left="".concat(T,"px"),this.movable.style.top="".concat(V,"px")),this.emit("move",T,V)}else Za.debug("".concat(this.logPrefix,"onMouseMove error:No 'movable' and 'container'."))},L.prototype.onMouseUp=function(){document.removeEventListener("mousemove",this.onMouseMove,!1),document.removeEventListener("mouseup",this.onMouseUp,!1),this.originLeft=0,this.originTop=0,this.moveStartOfLeft=0,this.moveStartOfTop=0},L.prototype.on=function(w,q){var y=this.callbacksMap.get(w);y?y.push(q):this.callbacksMap.set(w,[q])},L.prototype.off=function(w,q){var y=this.callbacksMap.get(w);y&&(y=y.filter(function(T){return T!=q}),this.callbacksMap.set(w,y))},L.prototype.emit=function(w){for(var q=[],y=1;y ").concat(w)),this.enabled=w,this.movable&&(this.movable.style.cursor=w?"move":"default",Za.debug("".concat(this.logPrefix,"setEnabled: cursor updated to '").concat(w?"move":"default","'")))},L.prototype.isEnabled=function(){return this.enabled},L}();(function(L){L[L.Both=0]="Both",L[L.Corner=1]="Corner",L[L.Edge=2]="Edge"})(Zn||(Zn={}));var Yl="trtc-resizable-top-left-anchor",UE="trtc-resizable-top-anchor",OE="trtc-resizable-top-right-anchor",Ac="trtc-resizable-left-anchor",ec="trtc-resizable-right-anchor",Xn="trtc-resizable-bottom-left-anchor",kn="trtc-resizable-bottom-anchor",ys="trtc-resizable-bottom-right-anchor",ln={resizeAnchor:{position:"absolute",width:"".concat(8,"px"),height:"".concat(8,"px"),border:"1px solid #3D7EFD",backgroundColor:"#FFFFFF"},topLeftAnchor:{top:"-".concat(4,"px"),left:"-".concat(4,"px"),cursor:"nw-resize"},topAnchor:{top:"-".concat(4,"px"),left:"calc(50% - ".concat(4,"px)"),cursor:"n-resize"},topRightAnchor:{top:"-".concat(4,"px"),right:"-".concat(4,"px"),cursor:"ne-resize"},leftAnchor:{top:"calc(50% - ".concat(4,"px)"),left:"-".concat(4,"px"),cursor:"w-resize"},rightAnchor:{top:"calc(50% - ".concat(4,"px)"),right:"-".concat(4,"px"),cursor:"e-resize"},bottomLeftAnchor:{bottom:"-".concat(4,"px"),left:"-".concat(4,"px"),cursor:"sw-resize"},bottomAnchor:{bottom:"-".concat(4,"px"),left:"calc(50% - ".concat(4,"px)"),cursor:"s-resize"},bottomRightAnchor:{bottom:"-".concat(4,"px"),right:"-".concat(4,"px"),cursor:"se-resize"}};function wn(L,w){for(var q in w)L.style[q]=w[q]}var Kg=function(){function L(w,q,y){y===void 0&&(y={keepRatio:!1,stopPropagation:!1,anchorMode:Zn.Both,canExceedContainer:!1}),this.logPrefix="[Resizable]",this.container=null,this.options={keepRatio:!1,stopPropagation:!1,anchorMode:Zn.Both,canExceedContainer:!1},this.callbacksMap=new Map,this.topLeftAnchor=null,this.topAnchor=null,this.topRightAnchor=null,this.leftAnchor=null,this.rightAnchor=null,this.bottomLeftAnchor=null,this.bottomAnchor=null,this.bottomRightAnchor=null,this.currentAnchor=null,this.resizeStartLeft=0,this.resizeStartTop=0,this.originLeft=0,this.originTop=0,this.originWidth=0,this.originHeight=0,this.resizeTarget=w,this.container=q||document.body,this.options={keepRatio:!!y.keepRatio||!1,stopPropagation:!!y.stopPropagation||!1,anchorMode:y.anchorMode||Zn.Both,canExceedContainer:!!y.canExceedContainer||!1},this.mousedown=this.mousedown.bind(this),this.mousemove=this.mousemove.bind(this),this.mouseup=this.mouseup.bind(this),this.currentAnchor=null,this.createResizeAnchor(),this.resizeTarget.classList.add("trtc-resizable"),this.resizeTarget.style.position="absolute",this.resizeTarget.style.border="1px solid #3D7EFD",this.resizeTarget.style.boxSizing="border-box",this.initResizeEvent()}return L.prototype.createResizeAnchor=function(){var w,q,y,T,V,$,CA,NA,KA=document.createElement("div");KA.className="trtc-resizable-resize-anchor ".concat(Yl),wn(KA,Object.assign({},ln.resizeAnchor,ln.topLeftAnchor)),this.topLeftAnchor=KA;var C=document.createElement("div");C.className="trtc-resizable-resize-anchor ".concat(UE),wn(C,Object.assign({},ln.resizeAnchor,ln.topAnchor)),this.topAnchor=C;var E=document.createElement("div");E.className="trtc-resizable-resize-anchor ".concat(OE),wn(E,Object.assign({},ln.resizeAnchor,ln.topRightAnchor)),this.topRightAnchor=E;var h=document.createElement("div");h.className="trtc-resizable-resize-anchor ".concat(Ac),wn(h,Object.assign({},ln.resizeAnchor,ln.leftAnchor)),this.leftAnchor=h;var D=document.createElement("div");D.className="trtc-resizable-resize-anchor ".concat(ec),wn(D,Object.assign({},ln.resizeAnchor,ln.rightAnchor)),this.rightAnchor=D;var N=document.createElement("div");N.className="trtc-resizable-resize-anchor ".concat(Xn),wn(N,Object.assign({},ln.resizeAnchor,ln.bottomLeftAnchor)),this.bottomLeftAnchor=N;var O=document.createElement("div");O.className="trtc-resizable-resize-anchor ".concat(kn),wn(O,Object.assign({},ln.resizeAnchor,ln.bottomAnchor)),this.bottomAnchor=O;var Y=document.createElement("div");Y.className="trtc-resizable-resize-anchor ".concat(ys),wn(Y,Object.assign({},ln.resizeAnchor,ln.bottomRightAnchor)),this.bottomRightAnchor=Y,this.options.anchorMode!==Zn.Both&&this.options.anchorMode!==Zn.Edge||((w=this.resizeTarget)===null||w===void 0||w.appendChild(C),(q=this.resizeTarget)===null||q===void 0||q.appendChild(h),(y=this.resizeTarget)===null||y===void 0||y.appendChild(D),(T=this.resizeTarget)===null||T===void 0||T.appendChild(O)),this.options.anchorMode!==Zn.Both&&this.options.anchorMode!==Zn.Corner||((V=this.resizeTarget)===null||V===void 0||V.appendChild(KA),($=this.resizeTarget)===null||$===void 0||$.appendChild(E),(CA=this.resizeTarget)===null||CA===void 0||CA.appendChild(N),(NA=this.resizeTarget)===null||NA===void 0||NA.appendChild(Y))},L.prototype.initResizeEvent=function(){var w,q,y,T,V,$,CA,NA;(w=this.topLeftAnchor)===null||w===void 0||w.addEventListener("mousedown",this.mousedown,!1),(q=this.topAnchor)===null||q===void 0||q.addEventListener("mousedown",this.mousedown,!1),(y=this.topRightAnchor)===null||y===void 0||y.addEventListener("mousedown",this.mousedown,!1),(T=this.leftAnchor)===null||T===void 0||T.addEventListener("mousedown",this.mousedown,!1),(V=this.rightAnchor)===null||V===void 0||V.addEventListener("mousedown",this.mousedown,!1),($=this.bottomLeftAnchor)===null||$===void 0||$.addEventListener("mousedown",this.mousedown,!1),(CA=this.bottomAnchor)===null||CA===void 0||CA.addEventListener("mousedown",this.mousedown,!1),(NA=this.bottomRightAnchor)===null||NA===void 0||NA.addEventListener("mousedown",this.mousedown,!1)},L.prototype.mousedown=function(w){if(w.button===0){if(w.preventDefault(),this.options.stopPropagation&&w.stopPropagation(),this.currentAnchor=w.target,this.resizeStartLeft=w.screenX,this.resizeStartTop=w.screenY,document.defaultView&&this.resizeTarget){var q=document.defaultView.getComputedStyle(this.resizeTarget);this.originTop=window.parseInt(q.top),this.originLeft=window.parseInt(q.left),this.originWidth=this.resizeTarget.offsetWidth,this.originHeight=this.resizeTarget.offsetHeight,Za.debug("resize origin:",this.originTop,this.originLeft,this.originWidth,this.originHeight)}else Za.debug("".concat(this.logPrefix,"mouseDown 'resizeTarget' is null"));document.addEventListener("mousemove",this.mousemove,!1),document.addEventListener("mouseup",this.mouseup,!1)}},L.prototype.mousemove=function(w){if(this.container&&this.resizeTarget&&this.currentAnchor){var q,y=this.currentAnchor.classList[1],T=this.originLeft,V=this.originTop,$=this.originWidth,CA=this.originHeight;switch(y){case Yl:V=(q=this._resizeTop(w)).top,CA=q.height,T=(q=this._resizeLeft(w)).left,$=q.width,this.options.keepRatio&&($/this.originWidththis.container.offsetWidth-this.originLeft&&($=this.container.offsetWidth-this.originLeft,CA=this.originHeight*$/this.originWidth,V=this.originTop+this.originHeight-CA));break;case OE:V=(q=this._resizeTop(w)).top,CA=q.height,$=this._resizeRight(w),this.options.keepRatio&&($/this.originWidththis.container.offsetHeight-this.originTop&&(CA=this.container.offsetHeight-this.originTop,$=this.originWidth*CA/this.originHeight,T=this.originLeft+this.originWidth-$));break;case ec:$=this._resizeRight(w),this.options.keepRatio&&((CA=$*this.originHeight/this.originWidth)<20?$=(CA=20)*this.originWidth/this.originHeight:!this.options.canExceedContainer&&CA>this.container.offsetHeight-this.originTop&&($=(CA=this.container.offsetHeight-this.originTop)*this.originWidth/this.originHeight));break;case Xn:CA=this._resizeBottom(w),T=(q=this._resizeLeft(w)).left,$=q.width,this.options.keepRatio&&($/this.originWidththis.container.offsetWidth-this.originLeft&&(CA=($=this.container.offsetWidth-this.originLeft)*this.originHeight/this.originWidth));break;case ys:CA=this._resizeBottom(w),$=this._resizeRight(w),this.options.keepRatio&&($/this.originWidththis.originLeft+this.originWidth-20&&(y=this.originLeft+this.originWidth-20,T=20),{left:y,width:T}},L.prototype._resizeTop=function(w){var q=w.screenY-this.resizeStartTop,y=this.originTop+q,T=this.originHeight-q;return!this.options.canExceedContainer&&y<0?(y=0,T=this.originHeight+this.originTop):y>this.originTop+this.originHeight-20&&(y=this.originTop+this.originHeight-20,T=20),{top:y,height:T}},L.prototype._resizeRight=function(w){if(!this.container)return Za.debug("".concat(this.logPrefix,"_resizeRight error. No container:"),this.container),0;var q=w.screenX-this.resizeStartLeft,y=this.originWidth+q;return y<20?y=20:!this.options.canExceedContainer&&y>this.container.offsetWidth-this.originLeft&&(y=this.container.offsetWidth-this.originLeft),y},L.prototype._resizeBottom=function(w){if(!this.container)return Za.debug("".concat(this.logPrefix,"_resizeBottom error. No container:"),this.container),0;var q=w.screenY-this.resizeStartTop,y=this.originHeight+q;return y<20?y=20:!this.options.canExceedContainer&&y>this.container.offsetHeight-this.originTop&&(y=this.container.offsetHeight-this.originTop),y},L.prototype.mouseup=function(){document.removeEventListener("mousemove",this.mousemove,!1),document.removeEventListener("mouseup",this.mouseup,!1),this.currentAnchor=null,this.resizeStartLeft=0,this.resizeStartTop=0,this.originLeft=0,this.originTop=0,this.originWidth=0,this.originHeight=0},L.prototype.on=function(w,q){var y=this.callbacksMap.get(w);y?y.push(q):this.callbacksMap.set(w,[q])},L.prototype.off=function(w,q){var y=this.callbacksMap.get(w);y&&(y=y.filter(function(T){return T!=q}),this.callbacksMap.set(w,y))},L.prototype.emit=function(w){for(var q=[],y=1;yT?y:T,this.previewWidth=this.mixingVideoWidth*this.previewScale,this.previewHeight=this.mixingVideoHeight*this.previewScale,this.previewLeft=(w-this.previewWidth)/2,this.previewTop=(q-this.previewHeight)/2}else console.debug("".concat(this.logPrefix,"calcPreviewScale failed, no HTML element to display"))},L.prototype.updateOverlay=function(){if(this.moveAndResizeOverlay){var w=void 0,q=void 0,y=void 0,T=void 0;if(this.selectedMediaIndex>=0){var V=this.mediaList[this.selectedMediaIndex],$={left:V.rect.left*this.previewScale,top:V.rect.top*this.previewScale,right:V.rect.right*this.previewScale,bottom:V.rect.bottom*this.previewScale};w="".concat($.left+this.previewLeft,"px"),q="".concat($.top+this.previewTop,"px"),y="".concat($.right-$.left,"px"),T="".concat($.bottom-$.top,"px");var CA=V.interaction||{},NA=CA.showBorder!==!1,KA=CA.showResizeAnchors!==!1,C=CA.draggable!==!1,E=CA.canExceedCanvas!==!1;this.logger.debug("".concat(this.logPrefix,"updateOverlay: interaction config -"),{showBorder:NA,showResizeAnchors:KA,draggable:C,canExceedCanvas:E}),this.updateCanExceedContainer(E),this.moveAndResizeOverlay.style.display="block",this.moveAndResizeOverlay.style.border=NA?"1px solid #3D7EFD":"none",this.resizableHandler&&this.resizableHandler.setVisible(KA),this.movableHandler&&(this.logger.debug("".concat(this.logPrefix,"updateOverlay: setting movableHandler.setEnabled(").concat(C,")")),this.movableHandler.setEnabled(C))}else w="".concat(this.previewLeft,"px"),q="".concat(this.previewTop,"px"),y="0px",T="0px",this.moveAndResizeOverlay.style.display="none";this.moveAndResizeOverlay.style.left=w,this.moveAndResizeOverlay.style.top=q,this.moveAndResizeOverlay.style.width=y,this.moveAndResizeOverlay.style.height=T}},L.prototype.onMove=function(w,q){var y;console.debug("".concat(this.logPrefix,"onMove: ").concat(w," ").concat(q));var T=this.mediaList[this.selectedMediaIndex];if(T&&this.moveAndResizeOverlay){var V={left:w-this.previewLeft,top:q-this.previewTop,right:w-this.previewLeft+this.moveAndResizeOverlay.offsetWidth,bottom:q-this.previewTop+this.moveAndResizeOverlay.offsetHeight};this.doAdsorption(V);var $={left:Math.round(V.left/this.previewScale),top:Math.round(V.top/this.previewScale),right:Math.round(V.right/this.previewScale),bottom:Math.round(V.bottom/this.previewScale)};(y=this.eventEmitter)===null||y===void 0||y.emit("onSourceMoved",z({},T),$)}else console.debug("".concat(this.logPrefix,"onMove no selected media"))},L.prototype.doAdsorption=function(w){var q=this.BOUNDARY_ADSORPTION_THRESHOLD;Math.abs(w.left)KA&&(KA=E,NA=w[C])}return NA},L.prototype.emitOnSelect=function(w){var q;if(w){for(var y=this.mediaList.length,T=0;T=C.rect.left&&CA<=C.rect.right&&NA>=C.rect.top&&NA<=C.rect.bottom&&((q=C.interaction)===null||q===void 0?void 0:q.selectable)!==!1&&(this.clickedMediaSources.push(C),this.mediaList[this.selectedMediaIndex]&&C.id===this.mediaList[this.selectedMediaIndex].id&&(this.oldSelectedIndex=this.clickedMediaSources.length-1))}this.mousedownLeft=w.screenX,this.mousedownTop=w.screenY}this.clickedMediaSources.length>0?this.eventButton===2&&this.oldSelectedIndex===-1?(this.newSelected=this.getMaxZOrderMedia(this.clickedMediaSources),console.debug("".concat(this.logPrefix,"onContainerMousedown find clicked media source:"),this.newSelected),this.emitOnSelect(this.newSelected),this.clickedMediaSources.splice(0,this.clickedMediaSources.length)):(document.addEventListener("mousemove",this.onContainerMousemove,!1),document.addEventListener("mouseup",this.onContainerMouseup,!1)):(this.newSelected=null,console.debug("".concat(this.logPrefix,"onContainerMousedown find clicked media source:"),this.newSelected),this.emitOnSelect(null),this.mousedownLeft=null,this.mousedownTop=null,this.eventButton=null)}},L.prototype.onContainerMousemove=function(w){var q;if(w.target&&this.container&&this.mousedownLeft!==null&&this.mousedownTop!==null){var y=w.screenX-this.mousedownLeft,T=w.screenY-this.mousedownTop;(Math.abs(y)>=5||Math.abs(T)>=5)&&(this.oldSelectedIndex>=0?(console.debug("".concat(this.logPrefix,"onContainerMousemove move or resize old selected media source, clear data:"),this.clickedMediaSources,this.oldSelectedIndex),this.clickedMediaSources.splice(0,this.clickedMediaSources.length),this.oldSelectedIndex=-1):this.clickedMediaSources.length>0&&(this.newSelected=this.getMaxZOrderMedia(this.clickedMediaSources),console.debug("".concat(this.logPrefix,"onContainerMousemove find clicked media source:"),this.newSelected),this.emitOnSelect(this.newSelected),this.clickedMediaSources.splice(0,this.clickedMediaSources.length),(q=this.moveAndResizeOverlay)===null||q===void 0||q.dispatchEvent(new MouseEvent("mousedown",{screenX:this.mousedownLeft,screenY:this.mousedownTop,button:this.eventButton}))))}},L.prototype.onContainerMouseup=function(w){if(document.removeEventListener("mousemove",this.onContainerMousemove,!1),document.removeEventListener("mouseup",this.onContainerMouseup,!1),console.debug("".concat(this.logPrefix,"onContainerMouseup data:"),this.clickedMediaSources,this.oldSelectedIndex),w.target&&this.container){if(this.clickedMediaSources.length>0)if(this.oldSelectedIndex>=0){if(this.eventButton===0){var q=(this.oldSelectedIndex+1)%this.clickedMediaSources.length;this.newSelected=this.clickedMediaSources[q],console.debug("".concat(this.logPrefix,"onContainerMouseup find clicked media source:"),this.newSelected),this.emitOnSelect(this.newSelected)}}else this.newSelected=this.getMaxZOrderMedia(this.clickedMediaSources),console.debug("".concat(this.logPrefix,"onContainerMouseup find clicked media source:"),this.newSelected),this.emitOnSelect(this.newSelected)}else console.debug("".concat(this.logPrefix,"onContainerMouseup click outside of mixing video image")),this.emitOnSelect(null);this.mousedownLeft=null,this.mousedownTop=null,this.clickedMediaSources.splice(0,this.clickedMediaSources.length),this.oldSelectedIndex=-1,this.newSelected=null,this.eventButton=null},L.prototype.onRightButtonClicked=function(w){var q;console.debug("".concat(this.logPrefix,"onRightButtonClicked:"),w.target,w.currentTarget,w.buttons),w.preventDefault(),(q=this.eventEmitter)===null||q===void 0||q.emit("onRightButtonClicked",z({},this.mediaList[this.selectedMediaIndex]))},L}(),Hc=function(){function L(w){if(this.logPrefix="[TRTCMediaMixingManager]",this.eventEmitter=new Dt,this.publishParams={videoEncoderParams:{videoResolution:r.TRTCVideoResolution.TRTCVideoResolution_1280_720,resMode:r.TRTCVideoResolutionMode.TRTCVideoResolutionModeLandscape,videoFps:15,videoBitrate:1800},canvasColor:0},this.mediaMixingDesigner=null,this.sourceList=[],this.trtcSourceMap=new Map,this.mixVideoTrack=null,this.selectedSource=null,this.view=null,this.screensWithSystemAudio=new Set,L.mediaMixingManager)return L.mediaMixingManager;L.mediaMixingManager=this,this.logger=w.logger,this.trtc=w.trtc,this.trtcCloud=w.trtcCloud,this.onSourceSelected=this.onSourceSelected.bind(this),this.onSourceMoved=this.onSourceMoved.bind(this),this.onSourceResized=this.onSourceResized.bind(this),this.onRightButtonClicked=this.onRightButtonClicked.bind(this)}return L.prototype.destroy=function(){return eA(this,void 0,Promise,function(){var w,q,y,T,V;return X(this,function($){switch($.label){case 0:this.view=null,$.label=1;case 1:return $.trys.push([1,3,,4]),[4,this.trtc.stopPlugin("VideoMixer")];case 2:return $.sent(),[3,4];case 3:return w=$.sent(),this.logger.error("".concat(this.logPrefix," destroy and stopPlugin error:"),w),[3,4];case 4:if(!(this.screensWithSystemAudio.size>0))return[3,12];$.label=5;case 5:$.trys.push([5,10,,11]),q=0,y=Array.from(this.screensWithSystemAudio),$.label=6;case 6:return q1){var KA=[];this.queue=this.queue.filter(function(C,E){return E===0||C.functionName!==T||(KA.push(C),!1)}),KA.forEach(function(C){C.reject(new Error("aborted by newer task"))})}this.queue.push(CA)}return this.isRunning||this.callNext(),NA},L.prototype.shift=function(){return this.queue.shift()},L.prototype.callNext=function(){var w=this;if(!this.isRunning&&this.length!==0){var q=this.queue[0],y=q.fn,T=q.args,V=q.context,$=q.resolve,CA=q.reject;this.isRunning=!0,y.apply(V,T).then($,CA).finally(function(){w.isRunning=!1,w.shift(),w.callNext()})}},L}(),Vc=new WeakMap,Pl=new WeakMap,ma=new WeakMap;function tc(L,w){return w===void 0&&(w={}),function(q,y,T){var V=T.value,$=w.deduplicate,CA=$!==void 0&&$;return T.value=function(){for(var NA=[],KA=0;KA0;if(w&&!this.isMessageListenerRegistered)return this.trtc.on(v.default.EVENT.REALTIME_TRANSCRIBER_MESSAGE,this.handleMessageEvent),void(this.isMessageListenerRegistered=!0);!w&&this.isMessageListenerRegistered&&(this.trtc.off(v.default.EVENT.REALTIME_TRANSCRIBER_MESSAGE,this.handleMessageEvent),this.isMessageListenerRegistered=!1)},L.prototype.log=function(){for(var w,q,y=[],T=0;T0&&clearTimeout(xE),xE=window.setTimeout(function(){Hl.apply(L,w),xE=-1},qc)}));var YE=new Map,LB=function(L){function w(y){y===void 0&&(y={});var T=L.call(this)||this;T._version="",T._frameWorkType=30,T._component=0,T._language=0,T._networkProxy={},T._localView=null,T._autoRecvAudio=!0,T._autoRecvVideo=!1,T._localTestView=null,T._isVideoPublish=!0,T._localRenderParams={rotation:r.TRTCVideoRotation.TRTCVideoRotation0,fillMode:r.TRTCVideoFillMode.TRTCVideoFillMode_Fill,mirrorType:r.TRTCVideoMirrorType.TRTCVideoMirrorType_Auto},T._encoderMirror=void 0,T._videoProfile={},T._isAudioPublish=!0,T._audioMuteType=!1,T._audioProfile=v.default.TYPE.AUDIO_PROFILE_STANDARD,T._captureVolume=100,T._playoutVolume=100,T._isSharingScreen=!1,T._remoteStreamConfig=new Map,T._remoteStreamMap=new Map,T._cameraList=[],T._microphoneList=[],T._speakerList=[],T._currentCamera={},T._currentMicrophone={},T._currentSpeaker={},T._currentCameraId="",T._currentMicrophoneId="",T._currentSpeakerId="",T._screenShareParams={option:{}},T._isMobile=SE,T._isFrontCamera=!0,T._cameraVideoTrack=null,T._smallStreamVideoProfile=void 0,T._qosPreference=void 0,T._defaultVideoProfile={width:640,height:480,frameRate:15,bitrate:900},T._defaultScreenProfile={width:1920,height:1080,frameRate:15,bitrate:1500},T._defaultSmallVideoProfile={width:160,height:120,frameRate:15,bitrate:200},T._isVirtualBackground=!1,T._isTestVirtualBackground=!1,T._isBeautyEnabled=!1,T._isTestBeautyEnabled=!1,T._remoteStatisticsUserIdList=[],T._hasJoinedRoom=!1,T._isExitingRoom=!1,T._version=_B;var V=y.frameWorkType,$=V===void 0?30:V,CA=y.component,NA=CA===void 0?0:CA,KA=y.language,C=KA===void 0?0:KA;return T._frameWorkType=$,T._component=NA,T._language=C,T._trtc=v.default.create({enableSEI:w.enableSEI,assetsPath:w.assetsPath,enableVolumeControlInIOS:!0,plugins:[U.default,g.LEBPlayer,f.RealtimeTranscriber]}),T._testTrtc=v.default.create(),T._log=v.default._loggerManager,T.logger=new Os(Jl,{seq:Vl++}),T._echoCancellation=void 0,T._noiseSuppression=void 0,T._autoGainControl=void 0,T._addTRTCEvents(),T.handleDeviceChange=T.handleDeviceChange.bind(T),YE.set(T,{fn:T.handleDeviceChange,self:T}),T}var q;return function(y,T){if(typeof T!="function"&&T!==null)throw new TypeError("Class extends value "+String(T)+" is not a constructor or null");function V(){this.constructor=y}AA(y,T),y.prototype=T===null?Object.create(T):(V.prototype=T.prototype,new V)}(w,L),w.getPlugin=function(y){return y==="VirtualBackground"?B.VirtualBackground:y==="BasicBeauty"?Q.BasicBeauty:y==="VideoMixer"?U.default:null},w.getTRTCShareInstance=function(y){return w.shareInstance||(w.shareInstance=new w(y)),w.shareInstance},w.setLogLevel=function(y,T){var V,$=((V={})[r.TRTCLogLevel.TRTCLogLevelVerbose]=0,V[r.TRTCLogLevel.TRTCLogLevelDebug]=1,V[r.TRTCLogLevel.TRTCLogLevelInfo]=2,V[r.TRTCLogLevel.TRTCLogLevelWarn]=3,V[r.TRTCLogLevel.TRTCLogLevelError]=4,V[r.TRTCLogLevel.TRTCLogLevelFatal]=4,V[r.TRTCLogLevel.TRTCLogLevelNone]=5,V),CA=$[y];ho(CA)&&(CA=$[r.TRTCLogLevel.TRTCLogLevelInfo]);var NA=!$t(T)||T;v.default.setLogLevel(CA,NA)},w.destroyTRTCShareInstance=function(){w.shareInstance&&(w.shareInstance._destroy(),w.shareInstance=null),Array.from(w.subCloudMap.keys()).forEach(function(y){return y._destroy()})},w.callExperimentalAPI=function(y){console.log("static ".concat(Ci,".callExperimentalAPI"),y);var T=$r(y);if(T!==y){var V=T.api,$=T.params;if(V&&$)try{switch(V){case"enableSEI":w.enableSEI=$.enable;break;case"setAssetsPath":w.assetsPath=$.assetsPath}}catch(CA){throw CA}}},w.prototype.createSubCloud=function(){if(this!==w.shareInstance)return null;var y=new w;return this._inheritPropertiesToSubCloud(y),this._inheritEventsToSubCloud(y),w.subCloudMap.set(y,y),y},w.prototype.destroy=function(){this!==w.shareInstance?(w.subCloudMap.get(this)&&w.subCloudMap.delete(this),this._destroy()):w.destroyTRTCShareInstance()},w.prototype._destroy=function(){YE.delete(this),this.removeAllListeners(),this._trtc.off("*"),this._trtc.destroy(),this._trtc=null,this._testTrtc.off("*"),this._testTrtc.destroy(),this._testTrtc=null},w.prototype.getSDKVersion=function(){return this._version||""},w.prototype.enterRoom=function(y,T){return eA(this,void 0,Promise,function(){var V,$,CA,NA,KA,C,E,h,D,N,O,Y,j,IA,BA,mA,_A,xA;return X(this,function(Qe){switch(Qe.label){case 0:if(V=y.sdkAppId,$=y.userId,CA=y.userSig,NA=y.roomId,KA=y.strRoomId,C=y.role,E=y.privateMapKey,h=y.businessInfo,D=y.enableAutoPlayDialog,N=y.proxy,O=y.streamId,Y=y.userDefineRecordId,this.logger.update({sdkAppId:V,userId:$}),this.logger.info("".concat(Ci,".enterRoom with params: "),y,T),N&&(this._networkProxy=N),!(V&&$&&CA))return[3,5];Qe.label=1;case 1:return Qe.trys.push([1,3,,4]),j={sdkAppId:V,userId:$,userSig:CA,roomId:NA,strRoomId:KA,role:Vo[C],scene:et[T],autoReceiveAudio:this._autoRecvAudio,autoReceiveVideo:this._autoRecvVideo,frameWorkType:this._frameWorkType,component:this._component,language:this._language},j=E?z(z({},j),{privateMapKey:E}):j,j=h?z(z({},j),{businessInfo:h}):j,IA=D||this._enableAutoPlayDialog,j=$t(IA)?z(z({},j),{enableAutoPlayDialog:IA}):j,j=this._networkProxy?z(z({},j),{proxy:this._networkProxy}):j,j=O?z(z({},j),{streamId:O}):j,j=Y?z(z({},j),{userDefineRecordId:Y}):j,j=this._latencyLevel!==void 0?z(z({},j),{latencyLevel:this._latencyLevel}):j,BA=Qn(),[4,this._trtc.enterRoom(j)];case 2:return Qe.sent(),this._hasJoinedRoom=!0,mA=Qn()-BA,this.emit("onEnterRoom",mA),[3,4];case 3:return _A=Qe.sent(),xA=(xA=this._transformTRTCErrorCode(_A,"enterRoom"))<0?xA:-1,this.emit("onEnterRoom",xA),this._callFunctionErrorManage(_A,"enterRoom"),[3,4];case 4:return[3,6];case 5:this._emitError(Jc),Qe.label=6;case 6:return[2]}})})},w.prototype.exitRoom=function(){return eA(this,void 0,Promise,function(){var y;return X(this,function(T){switch(T.label){case 0:return T.trys.push([0,2,,3]),this.logger.info("".concat(Ci,".exitRoom")),this._isExitingRoom=!0,this._isSharingScreen&&this.stopScreenShare(),this.resetTRTCCloud(),this.stopLocalPreview(),this.stopLocalAudio(),[4,this._trtc.exitRoom()];case 1:return T.sent(),this._hasJoinedRoom=!1,this._isExitingRoom=!1,this._isVideoPublish=!0,this._isAudioPublish=!0,this.emit("onExitRoom",Vg.exitRoom),[3,3];case 2:return y=T.sent(),this._callFunctionErrorManage(y,"exitRoom"),[3,3];case 3:return[2]}})})},w.prototype.switchRole=function(y){return eA(this,void 0,void 0,function(){var T;return X(this,function(V){switch(V.label){case 0:this.logger.info("".concat(Ci,".switchRole with param: "),y),V.label=1;case 1:return V.trys.push([1,3,,4]),[4,this._trtc.switchRole(Vo[y])];case 2:return V.sent(),this.emit("onSwitchRole",0,"switch role success, role = ".concat(y,", ").concat(Vo[y])),[3,4];case 3:return T=V.sent(),this.emit("onSwitchRole",T?.getCode(),T.message),[3,4];case 4:return[2]}})})},w.prototype.setDefaultStreamRecvMode=function(y,T){return eA(this,void 0,void 0,function(){return X(this,function(V){return this.logger.info("".concat(Ci,".setDefaultStreamRecvMode with param: "),{autoRecvAudio:y,autoRecvVideo:T}),$t(y)&&(this._autoRecvAudio=y),$t(T)&&(this._autoRecvVideo=T),[2]})})},w.prototype.resetTRTCCloud=function(){this._setIsAudioPublish(!0),this._setAudioMuteType(!1),this._echoCancellation=void 0,this._noiseSuppression=void 0,this._autoGainControl=void 0,this._isVirtualBackground=!1,this._isTestVirtualBackground=!1,this._remoteStatisticsUserIdList=[],this._resetBeautyStyle()},w.prototype._updateLocalVideo=function(){return eA(this,void 0,void 0,function(){var y;return X(this,function(T){switch(T.label){case 0:return T.trys.push([0,2,,3]),[4,this._trtc.updateLocalVideo(this._generateLocalVideoData())];case 1:return T.sent(),[3,3];case 2:if((y=T.sent()).code!==v.default.ERROR_CODE.OPERATION_ABORT)throw y;return[3,3];case 3:return[2]}})})},w.prototype._updateLocalTestVideo=function(){return eA(this,void 0,void 0,function(){var y;return X(this,function(T){switch(T.label){case 0:return T.trys.push([0,2,,3]),[4,this._testTrtc.updateLocalVideo(this._generateLocalTestVideoData())];case 1:return T.sent(),[3,3];case 2:if((y=T.sent()).code!==v.default.ERROR_CODE.OPERATION_ABORT)throw y;return[3,3];case 3:return[2]}})})},w.prototype._updateLocalScreen=function(){return eA(this,void 0,void 0,function(){var y;return X(this,function(T){switch(T.label){case 0:return T.trys.push([0,2,,3]),[4,this._trtc.updateScreenShare(this._getScreenShareParams())];case 1:return T.sent(),[3,3];case 2:if((y=T.sent()).code!==v.default.ERROR_CODE.OPERATION_ABORT)throw y;return[3,3];case 3:return[2]}})})},w.prototype._updateRemoteVideo=function(y,T){return eA(this,void 0,void 0,function(){var V;return X(this,function($){switch($.label){case 0:if(!this._hasJoinedRoom||this._isExitingRoom)return[2];$.label=1;case 1:return $.trys.push([1,3,,4]),[4,this._trtc.updateRemoteVideo(this._generateRemoteVideoData(y,T))];case 2:return $.sent(),[3,4];case 3:if((V=$.sent()).code!==v.default.ERROR_CODE.OPERATION_ABORT)throw V;return[3,4];case 4:return[2]}})})},w.prototype.startLocalPreview=function(){for(var y=[],T=0;T9)throw new Error("beautyLevel must be between 0 and 9");if(CA<0||CA>9)throw new Error("whitenessLevel must be between 0 and 9");if(NA<0||NA>9)throw new Error("ruddinessLevel must be between 0 and 9");O.label=1;case 1:return O.trys.push([1,8,,9]),E=CA/9,h=NA/9,(C=$/9)===0&&E===0&&h===0?[4,y.stopPlugin(sr)]:[3,3];case 2:return O.sent(),KA?this._isTestBeautyEnabled=!1:this._isBeautyEnabled=!1,[3,7];case 3:return D={beauty:C,brightness:E,ruddy:h},T?[3,5]:[4,y.startPlugin(sr,D)];case 4:return O.sent(),KA?this._isTestBeautyEnabled=!0:this._isBeautyEnabled=!0,[3,7];case 5:return[4,y.updatePlugin(sr,D)];case 6:O.sent(),O.label=7;case 7:return[3,9];case 8:throw N=O.sent(),KA?this.logger.error("".concat(Ci,".").concat("setTestBeautyStyle"," fail: "),N):this.logger.error("".concat(Ci,".").concat("setBeautyStyle"," fail: "),N),N;case 9:return[2]}})})},w.prototype._resetBeautyStyle=function(){return eA(this,void 0,void 0,function(){return X(this,function(y){switch(y.label){case 0:return this._isBeautyEnabled?[4,this._trtc.stopPlugin(sr)]:[3,2];case 1:y.sent(),this._isBeautyEnabled=!1,y.label=2;case 2:return this._isTestBeautyEnabled?[4,this._testTrtc.stopPlugin(sr)]:[3,4];case 3:y.sent(),this._isTestBeautyEnabled=!1,y.label=4;case 4:return[2]}})})},w.prototype.getMicDevicesList=function(){return eA(this,void 0,Promise,function(){var y,T,V;return X(this,function($){switch($.label){case 0:this.logger.info("".concat(Ci,".getMicDevicesList")),$.label=1;case 1:return $.trys.push([1,5,,6]),[4,v.default.getMicrophoneList()];case 2:return y=$.sent(),T=y.map(function(CA){return z(z({},CA),{deviceName:CA.label})}),this._microphoneList=y,JSON.stringify(this._currentMicrophone)!=="{}"?[3,4]:(this._currentMicrophone=this.getDefaultDeviceInfo(y),this._currentMicrophoneId=this._currentMicrophone.deviceId,[4,this.setCurrentMicDevice(this._currentMicrophoneId)]);case 3:$.sent(),$.label=4;case 4:return[2,Promise.resolve(T)];case 5:return V=$.sent(),this._callFunctionErrorManage(V,"getMicDevicesList"),[2,Promise.resolve([])];case 6:return[2]}})})},w.prototype.setCurrentMicDevice=function(y){var T;return eA(this,void 0,Promise,function(){var V;return X(this,function($){switch($.label){case 0:this.logger.info("".concat(Ci,".setCurrentMicDevice with params: "),{micId:y}),$.label=1;case 1:return $.trys.push([1,4,,5]),y?(this._setCurrentMicrophoneId(y),[4,this._updateLocalAudio()]):[2,!1];case 2:return $.sent(),[4,this._updateLocalTestAudio()];case 3:return $.sent(),this._currentMicrophone=this._microphoneList.find(function(CA){return CA.deviceId===y})||{},[3,5];case 4:throw V=$.sent(),this._setCurrentMicrophoneId((T=this._currentMicrophone)===null||T===void 0?void 0:T.deviceId),this._callFunctionErrorManage(V,"setCurrentMicDevice"),V;case 5:return[2]}})})},w.prototype.getCurrentMicDevice=function(){this.logger.info("".concat(Ci,".getCurrentMicDevice"));var y=this._currentMicrophone,T=y.deviceId,V=y.label,$=y.kind,CA=y.groupId;return new qt(T,V,$,V,CA)},w.prototype.getSpeakerDevicesList=function(){return eA(this,void 0,Promise,function(){var y,T,V;return X(this,function($){switch($.label){case 0:this.logger.info("".concat(Ci,".getSpeakerDevicesList")),$.label=1;case 1:return $.trys.push([1,5,,6]),[4,v.default.getSpeakerList()];case 2:return y=$.sent(),T=y.map(function(CA){return z(z({},CA),{deviceName:CA.label})}),this._speakerList=y,JSON.stringify(this._currentSpeaker)!=="{}"?[3,4]:(this._currentSpeaker=this.getDefaultDeviceInfo(y),this._currentSpeakerId=this._currentSpeaker.deviceId,[4,this.setCurrentSpeakerDevice(this._currentSpeakerId)]);case 3:$.sent(),$.label=4;case 4:return[2,Promise.resolve(T)];case 5:return V=$.sent(),this._callFunctionErrorManage(V,"getSpeakerDevicesList"),[2,Promise.resolve([])];case 6:return[2]}})})},w.prototype.setCurrentSpeakerDevice=function(y){return eA(this,void 0,Promise,function(){var T;return X(this,function(V){switch(V.label){case 0:this.logger.info("".concat(Ci,".setCurrentSpeakerDevice with params: "),{speakerId:y}),V.label=1;case 1:return V.trys.push([1,3,,4]),y?[4,v.default.setCurrentSpeaker(y)]:[2,!1];case 2:return V.sent(),this._setCurrentSpeakerId(y),this._currentSpeaker=this._speakerList.find(function($){return $.deviceId===y})||{},[3,4];case 3:throw T=V.sent(),this._callFunctionErrorManage(T,"setCurrentSpeakerDevice"),T;case 4:return[2]}})})},w.prototype.getCurrentSpeakerDevice=function(){this.logger.info("".concat(Ci,".getCurrentSpeakerDevice"));var y=this._currentSpeaker,T=y.deviceId,V=y.label,$=y.kind,CA=y.groupId;return new qt(T,V,$,V,CA)},w.prototype.startCameraDeviceTest=function(y){return eA(this,void 0,void 0,function(){var T;return X(this,function(V){switch(V.label){case 0:if(this.logger.info("".concat(Ci,".startCameraDeviceTest with params: "),y),!y)return[2];this._setLocalTestView(y),V.label=1;case 1:return V.trys.push([1,3,,7]),[4,this._testTrtc.startLocalVideo(this._generateLocalTestVideoData())];case 2:return V.sent(),[3,7];case 3:return(T=V.sent()).code!==v.default.ERROR_CODE.OPERATION_ABORT?[3,5]:[4,this._updateLocalTestVideo()];case 4:return V.sent(),[3,6];case 5:throw this._callFunctionErrorManage(T,"startCameraDeviceTest"),T;case 6:return[3,7];case 7:return[2]}})})},w.prototype.stopCameraDeviceTest=function(){return eA(this,void 0,void 0,function(){return X(this,function(y){switch(y.label){case 0:return this.logger.info("".concat(Ci,".stopCameraDeviceTest")),this._setLocalTestView(null),[4,this._testTrtc.stopLocalVideo()];case 1:return y.sent(),[2]}})})},w.prototype.startMicDeviceTest=function(y){return eA(this,void 0,void 0,function(){var T,V=this;return X(this,function($){switch($.label){case 0:this.logger.info("".concat(Ci,".startMicDeviceTest with params: "),y),$.label=1;case 1:return $.trys.push([1,3,,7]),[4,this._testTrtc.startLocalAudio(this._generateLocalTestAudioData())];case 2:return $.sent(),[3,7];case 3:return(T=$.sent()).code!==v.default.ERROR_CODE.OPERATION_ABORT?[3,5]:[4,this._updateLocalTestAudio()];case 4:return $.sent(),[3,6];case 5:throw this._callFunctionErrorManage(T,"startMicDeviceTest"),T;case 6:return[3,7];case 7:return this._testTrtc.on(v.default.EVENT.AUDIO_VOLUME,function(CA){CA?.result.forEach(function(NA){var KA=NA.userId,C=NA.volume;KA===""&&V.emit("onTestMicVolume",C)})}),[4,this._testTrtc.enableAudioVolumeEvaluation(y)];case 8:return $.sent(),[2]}})})},w.prototype.stopMicDeviceTest=function(){return eA(this,void 0,void 0,function(){return X(this,function(y){switch(y.label){case 0:return this.logger.info("".concat(Ci,".stopMicDeviceTest")),[4,this._testTrtc.stopLocalAudio()];case 1:return y.sent(),[2]}})})},w.prototype.callExperimentalAPI=function(y){return eA(this,void 0,void 0,function(){var T,V,$;return X(this,function(CA){switch(CA.label){case 0:if(this.logger.info("".concat(Ci,".callExperimentalAPI"),y),(T=$r(y))===y)return[2];if(V=T.api,$=T.params,!V||!$)return[2];CA.label=1;case 1:switch(CA.trys.push([1,25,,26]),V){case"setFramework":return[3,2];case"enableAudioAEC":return[3,3];case"enableAudioANS":return[3,4];case"enableAudioAGC":return[3,5];case"KeyMetricsStats":return[3,6];case"setNetworkProxy":return[3,7];case"enableVirtualBackground":return[3,8];case"enableTestVirtualBackground":return[3,10];case"enableTestBeautyStyle":return[3,12];case"setVideoEncodeParamEx":return[3,14];case"enableAutoPlayDialog":return[3,15];case"setAudienceLatencyLevel":return[3,16];case"switchPlaybackQuality":return[3,17];case"requestPictureInPicture":return[3,19];case"exitPictureInPicture":return[3,21]}return[3,23];case 2:return this._handleSetFrameWork($),[3,24];case 3:return this._echoCancellation=!!$.enable,[3,24];case 4:return this._noiseSuppression=!!$.enable,[3,24];case 5:return this._autoGainControl=!!$.enable,[3,24];case 6:return this._handleKeyMetricsStats($),[3,24];case 7:return this._networkProxy=$,[3,24];case 8:return[4,this.setVirtualBackground($)];case 9:return CA.sent(),[3,24];case 10:return[4,this.setTestVirtualBackground($)];case 11:return CA.sent(),[3,24];case 12:return[4,this.setTestBeautyStyle($.style,$.beautyLevel,$.whitenessLevel,$.ruddinessLevel)];case 13:return CA.sent(),[3,24];case 14:return this._setVideoEncodeParamEx($),[3,24];case 15:return this._enableAutoPlayDialog=!!$.enable,[3,24];case 16:return this._latencyLevel=$.latencyLevel,[3,24];case 17:return[4,this._switchPlaybackQuality($)];case 18:return CA.sent(),[3,24];case 19:return[4,this._requestPictureInPicture()];case 20:return CA.sent(),[3,24];case 21:return[4,this._exitPictureInPicture()];case 22:return CA.sent(),[3,24];case 23:return[3,24];case 24:return[3,26];case 25:throw CA.sent();case 26:return[2]}})})},w.prototype._handleSetFrameWork=function(y){var T=y.frameWork,V=y.component,$=y.language;jn(T)&&(this._frameWorkType=T),jn(V)&&(this._component=V),jn($)&&(this._language=$)},w.prototype._handleKeyMetricsStats=function(y){var T=y.key,V=y.opt,$=y.value,CA=y.version,NA=V===Kr;v.default._addKVStat({type:V,key:T,value:$,version:CA,useUV:NA,base:100})},w.prototype._setVideoEncodeParamEx=function(y){return eA(this,void 0,void 0,function(){return X(this,function(T){switch(T.label){case 0:switch(y.streamType){case r.TRTCVideoStreamType.TRTCVideoStreamTypeBig:return[3,1];case r.TRTCVideoStreamType.TRTCVideoStreamTypeSub:return[3,3]}return[3,5];case 1:return[4,this.setVideoEncoderParam(y)];case 2:case 4:return T.sent(),[3,6];case 3:return[4,this.setSubStreamEncoderParam(y)];case 5:return[3,6];case 6:return[2]}})})},w.prototype._switchPlaybackQuality=function(y){return eA(this,void 0,void 0,function(){var T,V,$,CA,NA,KA,C,E;return X(this,function(h){switch(h.label){case 0:if(V=(T=y||{}).quality,$=T.stream_list,CA=$===void 0?[]:$,!V||CA.length===0)return[2];for(NA=null,KA=0,C=CA;KA1&&T[1]),height:+(T.length>2&&T[2])}},w.prototype._getTRTCVideoProfile=function(y,T){T===void 0&&(T={});var V=T.videoWidth,$=T.videoHeight,CA=T.videoResolution,NA=T.videoFps,KA=T.videoBitrate,C=T.resMode,E=T.resolutionMode,h={};switch(y){case r.TRTCVideoStreamType.TRTCVideoStreamTypeSub:h=this._defaultScreenProfile;break;case r.TRTCVideoStreamType.TRTCVideoStreamTypeSmall:h=this._defaultSmallVideoProfile;break;case r.TRTCVideoStreamType.TRTCVideoStreamTypeBig:default:h=this._defaultVideoProfile}if(ho(CA))ho(V)||(h.width=V),ho($)||(h.height=$);else{var D=this._getTRTCResolution(CA);h.width=D.width,h.height=D.height}if(!ho(C)&&C===r.TRTCVideoResolutionMode.TRTCVideoResolutionModePortrait||!ho(E)&&E===r.TRTCVideoResolutionMode.TRTCVideoResolutionModePortrait){var N=h.height,O=h.width;h.width=N,h.height=O}return NA&&(h.frameRate=NA),KA&&(h.bitrate=KA),h},w.prototype._getTRTCStreamType=function(y){var T;return((T={})[r.TRTCVideoStreamType.TRTCVideoStreamTypeBig]=v.default.TYPE.STREAM_TYPE_MAIN,T[r.TRTCVideoStreamType.TRTCVideoStreamTypeSmall]=v.default.TYPE.STREAM_TYPE_MAIN,T[r.TRTCVideoStreamType.TRTCVideoStreamTypeSub]=v.default.TYPE.STREAM_TYPE_SUB,T)[y]},w.prototype._getTRTCFillMode=function(y){var T;return((T={})[r.TRTCVideoFillMode.TRTCVideoFillMode_Fill]=Hg.COVER,T[r.TRTCVideoFillMode.TRTCVideoFillMode_Fit]=Hg.CONTAIN,T)[y]},w.prototype._getTRTCCloudVideoFillMode=function(y){var T;return((T={})[Hg.COVER]=r.TRTCVideoFillMode.TRTCVideoFillMode_Fill,T[Hg.CONTAIN]=r.TRTCVideoFillMode.TRTCVideoFillMode_Fit,T)[y]},w.prototype._getTRTCCloudMirrorType=function(y){return y===!0?r.TRTCVideoMirrorType.TRTCVideoMirrorType_Enable:r.TRTCVideoMirrorType.TRTCVideoMirrorType_Disable},w.prototype._getLocalRenderMirror=function(y){var T;return y===r.TRTCVideoMirrorType.TRTCVideoMirrorType_Auto?!this._getIsMobile()||this._getIsFrontCamera():((T={})[r.TRTCVideoMirrorType.TRTCVideoMirrorType_Enable]=!0,T[r.TRTCVideoMirrorType.TRTCVideoMirrorType_Disable]=!1,T)[y]},w.prototype._getTRTCLocalMirror=function(y,T){var V=this._getLocalRenderMirror(y);return ho(T)?!!V&&"both":V&&T?"both":V&&!T?"view":!V&&T?"publish":!(!V&&!T)&&"view"},w.prototype._getTRTCRemoteMirror=function(y){var T;return((T={})[r.TRTCVideoMirrorType.TRTCVideoMirrorType_Auto]=!1,T[r.TRTCVideoMirrorType.TRTCVideoMirrorType_Enable]=!0,T[r.TRTCVideoMirrorType.TRTCVideoMirrorType_Disable]=!1,T)[y]},w.prototype._getTRTCQosPreference=function(y){var T;return((T={})[r.TRTCVideoQosPreference.TRTCVideoQosPreferenceSmooth]=v.default.TYPE.QOS_PREFERENCE_SMOOTH,T[r.TRTCVideoQosPreference.TRTCVideoQosPreferenceClear]=v.default.TYPE.QOS_PREFERENCE_CLEAR,T)[y]},w.prototype._getTRTCAudioQuality=function(y){var T;return((T={})[r.TRTCAudioQuality.TRTCAudioQualitySpeech]=v.default.TYPE.AUDIO_PROFILE_STANDARD,T[r.TRTCAudioQuality.TRTCAudioQualityDefault]=v.default.TYPE.AUDIO_PROFILE_STANDARD,T[r.TRTCAudioQuality.TRTCAudioQualityMusic]=v.default.TYPE.AUDIO_PROFILE_HIGH_STEREO,T)[y]},w.prototype._getTRTCCloudDeviceType=function(y){return{camera:r.TRTCDeviceType.TRTCDeviceTypeCamera,microphone:r.TRTCDeviceType.TRTCDeviceTypeMic,speaker:r.TRTCDeviceType.TRTCDeviceTypeSpeaker}[y]},w.prototype._getTRTCCloudDeviceState=function(y){return{add:r.TRTCDeviceState.TRTCDeviceStateAdd,remove:r.TRTCDeviceState.TRTCDeviceStateRemove,active:r.TRTCDeviceState.TRTCDeviceStateActive}[y]},w.prototype._getTRTCCloudQuality=function(y){return[r.TRTCQuality.TRTCQuality_Unknown,r.TRTCQuality.TRTCQuality_Excellent,r.TRTCQuality.TRTCQuality_Good,r.TRTCQuality.TRTCQuality_Poor,r.TRTCQuality.TRTCQuality_Bad,r.TRTCQuality.TRTCQuality_Vbad,r.TRTCQuality.TRTCQuality_Down][y]},w.prototype._generateLocalVideoData=function(){var y={view:this._getLocalView(),publish:this._getIsVideoPublish(),option:{profile:this._getVideoProfile(),small:this._getSmallStreamVideoProfile()||!1,mirror:this._getTRTCLocalMirror(this._localRenderParams.mirrorType,this._encoderMirror),fillMode:this._getTRTCFillMode(this._localRenderParams.fillMode)}};return this._cameraVideoTrack?y&&Object.assign(y.option,{videoTrack:this._cameraVideoTrack}):this._getIsMobile()?y&&Object.assign(y.option,{useFrontCamera:this._getIsFrontCamera()}):y&&Object.assign(y.option,{cameraId:this._getCurrentCameraId()}),this._getQosPreference()&&y&&Object.assign(y.option,{qosPreference:this._getQosPreference()}),y},w.prototype._generateLocalTestVideoData=function(){var y={view:this._getLocalTestView(),publish:!1,option:{profile:this._getVideoProfile(),mirror:this._getTRTCLocalMirror(this._localRenderParams.mirrorType,this._encoderMirror),fillMode:this._getTRTCFillMode(this._localRenderParams.fillMode)}};return this._getIsMobile()?y&&Object.assign(y.option,{useFrontCamera:this._getIsFrontCamera()}):y&&Object.assign(y.option,{cameraId:this._getCurrentCameraId()}),y},w.prototype._generateLocalAudioData=function(){var y={publish:this._getIsAudioPublish(),mute:this._getAudioMuteType(),muteKeepVolumeDetection:!0,option:{microphoneId:this._getCurrentMicrophoneId(),profile:this._getAudioProfile(),captureVolume:this._getCaptureVolume()}};return $t(this._echoCancellation)&&(y.option.echoCancellation=this._echoCancellation),$t(this._autoGainControl)&&(y.option.autoGainControl=this._autoGainControl),$t(this._noiseSuppression)&&(y.option.noiseSuppression=this._noiseSuppression),y},w.prototype._generateLocalTestAudioData=function(){return{publish:!1,option:{microphoneId:this._getCurrentMicrophoneId(),profile:this._getAudioProfile()}}},w.prototype._generateRemoteVideoData=function(y,T){return Tr(this._remoteStreamConfig.get("".concat(y,"_").concat(this._getTRTCStreamType(T))))},w.prototype._addTRTCEvents=function(){var y=this;this._trtc.on(v.default.EVENT.ERROR,function(T){T&&y.emit("onError",T.code,T.message)}),this._trtc.on(v.default.EVENT.REMOTE_USER_ENTER,function(T){T?.userId&&y.emit("onRemoteUserEnterRoom",T.userId)}),this._trtc.on(v.default.EVENT.REMOTE_USER_EXIT,function(T){T?.userId&&y.emit("onRemoteUserLeaveRoom",T.userId)}),this._trtc.on(v.default.EVENT.REMOTE_AUDIO_AVAILABLE,function(T){T?.userId&&y.emit("onUserAudioAvailable",T.userId,!0)}),this._trtc.on(v.default.EVENT.REMOTE_AUDIO_UNAVAILABLE,function(T){T?.userId&&y.emit("onUserAudioAvailable",T.userId,!1)}),this._trtc.on(v.default.EVENT.REMOTE_VIDEO_AVAILABLE,function(T){y._emitVideoAvailable(T,!0)}),this._trtc.on(v.default.EVENT.REMOTE_VIDEO_UNAVAILABLE,function(T){y._emitVideoAvailable(T,!1)}),this._trtc.on(v.default.EVENT.AUDIO_VOLUME,function(T){T?.result&&y.emit("onUserVoiceVolume",T?.result,(T?.result||[]).length)}),this._trtc.on(v.default.EVENT.KICKED_OUT,function(T){var V={banned:Vg.banned,room_disband:Vg.roomDisband};jn(V[T.reason])&&y.emit("onExitRoom",V[T.reason])}),this._trtc.on(v.default.EVENT.NETWORK_QUALITY,function(T){var V=T.uplinkNetworkQuality,$=T.downlinkNetworkQuality,CA=new lr("",y._getTRTCCloudQuality(V)),NA=[];y._remoteStatisticsUserIdList.length>0&&(NA=y._remoteStatisticsUserIdList.map(function(KA){return new lr(KA,y._getTRTCCloudQuality($))})),y.emit("onNetworkQuality",CA,NA)}),this._trtc.on(v.default.EVENT.AUTOPLAY_FAILED,function(T){y.emit("onAutoPlayFailed",T)}),this._trtc.on(v.default.EVENT.SEI_MESSAGE,function(T){if(T.data&&typeof T.data=="object"&&T.data instanceof ArrayBuffer){for(var V=new Uint8Array(T.data),$="",CA=0;CA0?E.video.map(function(IA){var BA=new Ji;return BA.width=IA.width,BA.height=IA.height,BA.frameRate=IA.frameRate,BA.videoBitrate=IA.bitrate,BA.audioBitrate=E.audio.bitrate||0,BA.streamType=D[IA.videoType],BA}):[];if(N.length===0&&E.audio.bitrate>0){var O=new Ji;O.audioBitrate=E.audio.bitrate||0,N.push(O)}var Y=[];h.forEach(function(IA){var BA=[],mA=IA.userId,_A=IA.audio.bitrate;if(IA.video&&IA.video.forEach(function(Qe){var Re=new Di;Re.userId=mA,Re.width=Qe.width,Re.height=Qe.height,Re.frameRate=Qe.frameRate,Re.videoBitrate=Qe.bitrate,Re.audioBitrate=_A||0,Re.streamType=D[Qe.videoType],BA.push(Re)}),BA.length===0){var xA=new Di;xA.userId=mA,xA.audioBitrate=_A||0,BA.push(xA)}Y.push.apply(Y,BA)});var j=new ar;j.upLoss=CA,j.downLoss=NA,j.rtt=$,j.sentBytes=KA,j.receivedBytes=C,j.localStatisticsArray=N,j.localStatisticsArraySize=N.length,j.remoteStatisticsArray=Y,j.remoteStatisticsArraySize=Y.length,y.emit("onStatistics",j)}),this._trtc.on(v.default.EVENT.SCREEN_SHARE_STOPPED,function(){y.emit("onScreenCaptureStopped",0),y._clearScreenShareParams(),y._isSharingScreen=!1}),this._trtc.on(v.default.EVENT.PUBLISH_STATE_CHANGED,function(T){var V=T.mediaType;T.state==="started"&&(V==="audio"?y.emit("onSendFirstLocalAudioFrame"):V==="video"?y.emit("onSendFirstLocalVideoFrame",r.TRTCVideoStreamType.TRTCVideoStreamTypeBig):V==="screen"&&y.emit("onSendFirstLocalVideoFrame",r.TRTCVideoStreamType.TRTCVideoStreamTypeSub))}),this._trtc.on(v.default.EVENT.FIRST_VIDEO_FRAME,function(T){var V=T.userId,$=T.streamType,CA=T.width,NA=T.height;y.emit("onFirstVideoFrame",V,$,CA,NA)}),this._trtc.on(v.default.EVENT.AUDIO_PLAY_STATE_CHANGED,function(T){var V=T.userId;T.state==="PLAYING"&&y.emit("onFirstAudioFrame",V)}),this._trtc.on(v.default.EVENT.DEVICE_CHANGED,function(T){var V=T.type,$=T.device,CA=T.action,NA=$.deviceId;if(CA==="active"){switch(V){case"camera":y._currentCameraId=NA,y._currentCamera=$;break;case"microphone":y._currentMicrophoneId=NA,y._currentMicrophone=$;break;case"speaker":y._currentSpeakerId=NA,y._currentSpeaker=$}y.emitOnDeviceChange(NA,y._getTRTCCloudDeviceType(V),y._getTRTCCloudDeviceState(CA))}}),this._trtc.on(v.default.EVENT.CUSTOM_MESSAGE,function(T){T&&y.emit("onRecvCustomCmdMsg",T.userId,T.cmdId,T.seq,T?.data)}),this._trtc.on(v.default.EVENT.CONNECTION_STATE_CHANGED,function(T){y._hasJoinedRoom&&!y._isExitingRoom&&(T.prevState==="CONNECTED"&&T.state==="DISCONNECTED"?y.emit("onConnectionLost"):T.prevState==="DISCONNECTED"&&T.state==="CONNECTING"?y.emit("onTryToReconnect"):T.prevState==="CONNECTING"&&T.state==="CONNECTED"&&y.emit("onConnectionRecovery"))}),this._trtc.on(v.default.EVENT.PICTURE_IN_PICTURE_STATE_CHANGED,function(T){y.emit("onPictureInPictureStateChanged",T)})},w.prototype._removeTRTCEvents=function(){this._trtc.off("*")},w.prototype._emitVideoAvailable=function(y,T){var V=y.userId,$=y.streamType;T?this._remoteStreamMap.set("".concat(V,"_").concat($),!0):this._remoteStreamMap.delete("".concat(V,"_").concat($)),$===v.default.TYPE.STREAM_TYPE_SUB?V&&this.emit("onUserSubStreamAvailable",V,T):V&&this.emit("onUserVideoAvailable",V,T)},w.prototype._setLocalView=function(y){this._localView=y},w.prototype._getLocalView=function(){return this._localView},w.prototype._setIsMobile=function(y){this._isMobile=y},w.prototype._getIsMobile=function(){return this._isMobile},w.prototype._setIsFrontCamera=function(y){this._isFrontCamera=y},w.prototype._getIsFrontCamera=function(){return this._isFrontCamera},w.prototype._getSmallStreamVideoProfile=function(){return this._smallStreamVideoProfile},w.prototype._setSmallStreamVideoProfile=function(y){this._smallStreamVideoProfile=y},w.prototype._setIsVideoPublish=function(y){this._isVideoPublish=y},w.prototype._getIsVideoPublish=function(){return this._isVideoPublish},w.prototype._setVideoProfile=function(y){this._videoProfile=y},w.prototype._getVideoProfile=function(){return this._videoProfile},w.prototype._setQosPreference=function(y){this._qosPreference=y},w.prototype._getQosPreference=function(){return this._qosPreference},w.prototype._setLocalTestView=function(y){this._localTestView=y},w.prototype._getLocalTestView=function(){return this._localTestView},w.prototype._setScreenShareParams=function(y){var T=y.view,V=y.systemAudio,$=y.fillMode,CA=y.profile,NA=y.videoTrack,KA=y.qosPreference;ho(T)||(this._screenShareParams.view=T),ho(V)||(this._screenShareParams.option.systemAudio=V),ho($)||(this._screenShareParams.option.fillMode=$),ho(CA)||(this._screenShareParams.option.profile=CA),ho(NA)||(this._screenShareParams.option.videoTrack=NA),ho(KA)||(this._screenShareParams.option.qosPreference=KA),ho(y.streamType)||(this._screenShareParams.streamType=this._getTRTCStreamType(y.streamType))},w.prototype._clearScreenShareParams=function(){var y,T,V,$,CA;!((y=this._screenShareParams)===null||y===void 0)&&y.view&&delete this._screenShareParams.view,!((V=(T=this._screenShareParams)===null||T===void 0?void 0:T.option)===null||V===void 0)&&V.systemAudio&&delete this._screenShareParams.option.systemAudio,!((CA=($=this._screenShareParams)===null||$===void 0?void 0:$.option)===null||CA===void 0)&&CA.videoTrack&&delete this._screenShareParams.option.videoTrack},w.prototype._getScreenShareParams=function(){return this._screenShareParams},w.prototype._setIsAudioPublish=function(y){this._isAudioPublish=y},w.prototype._getIsAudioPublish=function(){return this._isAudioPublish},w.prototype._setAudioMuteType=function(y){this._audioMuteType=y},w.prototype._getAudioMuteType=function(){return this._audioMuteType},w.prototype._setAudioProfile=function(y){this._audioProfile=y},w.prototype._getAudioProfile=function(){return this._audioProfile},w.prototype._getCaptureVolume=function(){return this._captureVolume},w.prototype._setCaptureVolume=function(y){this._captureVolume=y},w.prototype._setCurrentCameraId=function(y){this._currentCameraId=y},w.prototype._getCurrentCameraId=function(){return this._currentCameraId},w.prototype._setCurrentMicrophoneId=function(y){this._currentMicrophoneId=y},w.prototype._getCurrentMicrophoneId=function(){return this._currentMicrophoneId},w.prototype._setCurrentSpeakerId=function(y){this._currentSpeakerId=y},w.prototype._getCurrentSpeakerId=function(){return this._currentSpeakerId},w.prototype._setRemoteStreamConfig=function(y,T,V){var $=this._remoteStreamConfig.get("".concat(y,"_").concat(this._getTRTCStreamType(T)));$||($={userId:y,streamType:this._getTRTCStreamType(T),option:{mirror:this._getTRTCRemoteMirror(r.TRTCVideoMirrorType.TRTCVideoMirrorType_Disable),fillMode:this._getTRTCFillMode(r.TRTCVideoFillMode.TRTCVideoFillMode_Fit)}});var CA=V.view,NA=V.mirrorType,KA=V.fillMode,C=V.small;ho(CA)||($.view=CA),ho(NA)||($.option.mirror=this._getTRTCRemoteMirror(NA)),ho(KA)||($.option.fillMode=this._getTRTCFillMode(KA)),ho(C)||($.option.small=C),this._remoteStreamConfig.set("".concat(y,"_").concat(this._getTRTCStreamType(T)),$)},w.prototype._inheritPropertiesToSubCloud=function(y){y._frameWorkType=this._frameWorkType,y._component=this._component,y._language=this._language,y._networkProxy=z({},this._networkProxy),y._latencyLevel=this._latencyLevel,y._enableAutoPlayDialog=this._enableAutoPlayDialog},w.prototype._inheritEventsToSubCloud=function(y){var T=this;y._trtc.on(v.default.EVENT.AUTOPLAY_FAILED,function(V){T.emit("onAutoPlayFailed",V)}),y._trtc.on(v.default.EVENT.PICTURE_IN_PICTURE_STATE_CHANGED,function(V){T.emit("onPictureInPictureStateChanged",V)})},w.prototype.handleDeviceChange=function(){return eA(this,void 0,void 0,function(){var y=this;return X(this,function(T){return v.default.getCameraList().then(function(V){return eA(y,void 0,void 0,function(){return X(this,function($){switch($.label){case 0:return this._cameraList.length===V.length?[2]:[4,this.deviceChangeManage(this._cameraList,V,r.TRTCDeviceType.TRTCDeviceTypeCamera)];case 1:return $.sent(),this._cameraList=V,[2]}})})}),v.default.getMicrophoneList().then(function(V){return eA(y,void 0,void 0,function(){return X(this,function($){switch($.label){case 0:return[4,this.deviceChangeManage(this._microphoneList,V,r.TRTCDeviceType.TRTCDeviceTypeMic)];case 1:return $.sent(),this._microphoneList=V,[2]}})})}),v.default.getSpeakerList().then(function(V){return eA(y,void 0,void 0,function(){return X(this,function($){switch($.label){case 0:return[4,this.deviceChangeManage(this._speakerList,V,r.TRTCDeviceType.TRTCDeviceTypeSpeaker)];case 1:return $.sent(),this._speakerList=V,[2]}})})}),[2]})})},w.prototype.isSameDevice=function(y,T){var V=y&&y.deviceId&&y.groupId&&y.label,$=T&&T.deviceId&&T.groupId&&T.label;return!(!V||!$)&&y.deviceId===T.deviceId&&y.groupId===T.groupId&&y.label===T.label},w.prototype.deviceChangeManage=function(y,T,V){return eA(this,void 0,void 0,function(){var $,CA,NA,KA,C;return X(this,function(E){switch(E.label){case 0:return $=void 0,y.length!==T.length&&(CA=(T||[]).map(function(h){return h.deviceId}),NA=new qt,y.length>T.length?(NA=y.filter(function(h){return!CA.includes(h.deviceId)})[0]||{},$=r.TRTCDeviceState.TRTCDeviceStateRemove):(CA=(y||[]).map(function(h){return h.deviceId}),NA=T.filter(function(h){return!CA.includes(h.deviceId)})[0]||{},$=r.TRTCDeviceState.TRTCDeviceStateAdd),KA=NA.deviceId,this.emitOnDeviceChange(KA,V,$)),C=this.getDefaultDeviceInfo(T),V!==r.TRTCDeviceType.TRTCDeviceTypeCamera||$!==r.TRTCDeviceState.TRTCDeviceStateRemove?[3,3]:this.isSameDevice(this._currentCamera,C)?[2]:C.deviceId?[4,this.autoChangeDevice(V,C)]:[3,2];case 1:E.sent(),E.label=2;case 2:E.label=3;case 3:return V!==r.TRTCDeviceType.TRTCDeviceTypeMic?[3,6]:this.isSameDevice(this._currentMicrophone,C)?[2]:C.deviceId?[4,this.autoChangeDevice(V,C)]:[3,5];case 4:E.sent(),E.label=5;case 5:E.label=6;case 6:return V!==r.TRTCDeviceType.TRTCDeviceTypeSpeaker?[3,9]:this.isSameDevice(this._currentSpeaker,C)?[2]:C.deviceId?[4,this.autoChangeDevice(V,C)]:[3,8];case 7:E.sent(),E.label=8;case 8:E.label=9;case 9:return[2]}})})},w.prototype.getDefaultDeviceInfo=function(y){var T=new qt;if(y.length===0)return T;var V=y.filter(function($){return $.deviceId==="default"});return T=V.length>0?V[0]:y[0]},w.prototype.autoChangeDevice=function(y,T){return eA(this,void 0,void 0,function(){var V,$,CA;return X(this,function(NA){switch(NA.label){case 0:return V=T.deviceId,y!==r.TRTCDeviceType.TRTCDeviceTypeCamera?[3,6]:(this._setCurrentCameraId(V),[4,this._updateLocalVideo()]);case 1:NA.sent(),NA.label=2;case 2:return NA.trys.push([2,4,,5]),[4,this._testTrtc.updateLocalVideo({option:{cameraId:V}})];case 3:return NA.sent(),[3,5];case 4:return $=NA.sent(),console.log("testTRTC error",JSON.stringify($)),$.code,v.default.ERROR_CODE.OPERATION_ABORT,[3,5];case 5:this._currentCameraId=V,this._currentCamera=T,this.emitOnDeviceChange(V,y,r.TRTCDeviceState.TRTCDeviceStateActive),NA.label=6;case 6:return y!==r.TRTCDeviceType.TRTCDeviceTypeMic?[3,12]:(this._setCurrentMicrophoneId(V),[4,this._updateLocalAudio()]);case 7:NA.sent(),NA.label=8;case 8:return NA.trys.push([8,10,,11]),[4,this._testTrtc.updateLocalAudio({option:{microphoneId:V}})];case 9:return NA.sent(),[3,11];case 10:return CA=NA.sent(),console.log("testTRTC error",JSON.stringify(CA)),CA.code,v.default.ERROR_CODE.OPERATION_ABORT,[3,11];case 11:this._currentMicrophoneId=V,this._currentMicrophone=T,this.emitOnDeviceChange(V,y,r.TRTCDeviceState.TRTCDeviceStateActive),NA.label=12;case 12:return y!==r.TRTCDeviceType.TRTCDeviceTypeSpeaker?[3,14]:[4,v.default.setCurrentSpeaker(V)];case 13:NA.sent(),this._currentSpeakerId=V,this._currentSpeaker=T,this.emitOnDeviceChange(V,y,r.TRTCDeviceState.TRTCDeviceStateActive),NA.label=14;case 14:return[2]}})})},w.prototype.emitOnDeviceChange=function(y,T,V){this.emit("onDeviceChange",y,T,V)},w.prototype.getMediaMixingManager=function(){return new Hc({logger:this.logger,trtc:this._trtc,trtcCloud:this})},w.prototype.getAITranscriberManager=function(){return new bB({logger:this.logger,trtc:this._trtc})},w.shareInstance=null,w.subCloudMap=new Map,w.enableSEI=!1,w.assetsPath="",sA([(q="exitRoom",function(y,T,V){var $=V.value;return V.value=function(){for(var CA,NA,KA,C,E=[],h=0;hb.length)&&(rA=b.length);for(var gA=0,pA=new Array(rA);gA=0;--Ar){var so=this.tryEntries[Ar],As=so.completion;if(so.tryLoc==="root")return Ti("end");if(so.tryLoc<=this.prev){var ic=vA.call(so,"catchLoc"),_C=vA.call(so,"finallyLoc");if(ic&&_C){if(this.prev=0;--Ti){var Ar=this.tryEntries[Ti];if(Ar.tryLoc<=this.prev&&vA.call(Ar,"finallyLoc")&&this.prev=0;--Qt){var Ti=this.tryEntries[Qt];if(Ti.finallyLoc===Ht)return this.complete(Ti.completion,Ti.afterLoc),bn(Ti),ft}},catch:function(Ht){for(var Qt=this.tryEntries.length-1;Qt>=0;--Qt){var Ti=this.tryEntries[Qt];if(Ti.tryLoc===Ht){var Ar=Ti.completion;if(Ar.type==="throw"){var so=Ar.arg;bn(Ti)}return so}}throw new Error("illegal catch attempt")},delegateYield:function(Ht,Qt,Ti){return this.delegate={iterator:ql(Ht),resultName:Qt,nextLoc:Ti},this.method==="next"&&(this.arg=void 0),ft}},gA}(b.exports);try{regeneratorRuntime=rA}catch{typeof globalThis=="object"?globalThis.regeneratorRuntime=rA:Function("r","regeneratorRuntime = r")(rA)}});var z,sA,eA=function(b){return b&&b.Math==Math&&b},X=eA(typeof globalThis=="object"&&globalThis)||eA(typeof window=="object"&&window)||eA(typeof self=="object"&&self)||eA(typeof U=="object"&&U)||function(){return this}()||Function("return this")(),QA=function(b){try{return!!b()}catch{return!0}},wA=!QA(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!=7}),HA={}.propertyIsEnumerable,VA=Object.getOwnPropertyDescriptor,ue={f:VA&&!HA.call({1:2},1)?function(b){var rA=VA(this,b);return!!rA&&rA.enumerable}:HA},jA=function(b,rA){return{enumerable:!(1&b),configurable:!(2&b),writable:!(4&b),value:rA}},Ve={}.toString,Ze=function(b){return Ve.call(b).slice(8,-1)},Me="".split,qe=QA(function(){return!Object("z").propertyIsEnumerable(0)})?function(b){return Ze(b)=="String"?Me.call(b,""):Object(b)}:Object,Et=function(b){if(b==null)throw TypeError("Can't call method on "+b);return b},Je=function(b){return qe(Et(b))},$e=function(b){return typeof b=="function"},Dt=function(b){return typeof b=="object"?b!==null:$e(b)},Zi=function(b){return $e(b)?b:void 0},bi=function(b,rA){return arguments.length<2?Zi(X[b]):X[b]&&X[b][rA]},qt=bi("navigator","userAgent")||"",ai=X.process,Ki=X.Deno,Ur=ai&&ai.versions||Ki&&Ki.version,Er=Ur&&Ur.v8;Er?sA=(z=Er.split("."))[0]<4?1:z[0]+z[1]:qt&&(!(z=qt.match(/Edge\/(\d+)/))||z[1]>=74)&&(z=qt.match(/Chrome\/(\d+)/))&&(sA=z[1]);var no=sA&&+sA,Kn=!!Object.getOwnPropertySymbols&&!QA(function(){var b=Symbol();return!String(b)||!(Object(b)instanceof Symbol)||!Symbol.sham&&no&&no<41}),Xi=Kn&&!Symbol.sham&&typeof Symbol.iterator=="symbol",yr=Xi?function(b){return typeof b=="symbol"}:function(b){var rA=bi("Symbol");return $e(rA)&&Object(b)instanceof rA},lr=function(b){try{return String(b)}catch{return"Object"}},Ni=function(b){if($e(b))return b;throw TypeError(lr(b)+" is not a function")},wt=function(b,rA){var gA=b[rA];return gA==null?void 0:Ni(gA)},Ji=function(b,rA){try{Object.defineProperty(X,b,{value:rA,configurable:!0,writable:!0})}catch{X[b]=rA}return rA},Di=X["__core-js_shared__"]||Ji("__core-js_shared__",{}),ar=AA(function(b){(b.exports=function(rA,gA){return Di[rA]||(Di[rA]=gA!==void 0?gA:{})})("versions",[]).push({version:"3.18.2",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})}),MA=function(b){return Object(Et(b))},YA={}.hasOwnProperty,pe=Object.hasOwn||function(b,rA){return YA.call(MA(b),rA)},st=0,Te=Math.random(),be=function(b){return"Symbol("+String(b===void 0?"":b)+")_"+(++st+Te).toString(36)},yt=ar("wks"),ht=X.Symbol,ae=Xi?ht:ht&&ht.withoutSetter||be,ye=function(b){return pe(yt,b)&&(Kn||typeof yt[b]=="string")||(Kn&&pe(ht,b)?yt[b]=ht[b]:yt[b]=ae("Symbol."+b)),yt[b]},Xe=ye("toPrimitive"),ot=function(b,rA){if(!Dt(b)||yr(b))return b;var gA,pA=wt(b,Xe);if(pA){if(gA=pA.call(b,rA),!Dt(gA)||yr(gA))return gA;throw TypeError("Can't convert object to primitive value")}return function(vA,Ae){var UA,re;if($e(UA=vA.toString)&&!Dt(re=UA.call(vA))||$e(UA=vA.valueOf)&&!Dt(re=UA.call(vA)))return re;throw TypeError("Can't convert object to primitive value")}(b)},zt=function(b){var rA=ot(b,"string");return yr(rA)?rA:String(rA)},yi=X.document,Hi=Dt(yi)&&Dt(yi.createElement),Ei=function(b){return Hi?yi.createElement(b):{}},ji=!wA&&!QA(function(){return Object.defineProperty(Ei("div"),"a",{get:function(){return 7}}).a!=7}),Xo=Object.getOwnPropertyDescriptor,sr={f:wA?Xo:function(b,rA){if(b=Je(b),rA=zt(rA),ji)try{return Xo(b,rA)}catch{}if(pe(b,rA))return jA(!ue.f.call(b,rA),b[rA])}},Lo=function(b){if(Dt(b))return b;throw TypeError(String(b)+" is not an object")},Nr=Object.defineProperty,Vo={f:wA?Nr:function(b,rA,gA){if(Lo(b),rA=zt(rA),Lo(gA),ji)try{return Nr(b,rA,gA)}catch{}if("get"in gA||"set"in gA)throw TypeError("Accessors not supported");return"value"in gA&&(b[rA]=gA.value),b}},et=wA?function(b,rA,gA){return Vo.f(b,rA,jA(1,gA))}:function(b,rA,gA){return b[rA]=gA,b},Kr=Function.toString;$e(Di.inspectSource)||(Di.inspectSource=function(b){return Kr.call(b)});var Qn,ho,jn,$t=Di.inspectSource,$r=X.WeakMap,On=$e($r)&&/native code/.test($t($r)),An=ar("keys"),Tr=function(b){return An[b]||(An[b]=be(b))},ei={},Es=X.WeakMap;if(On||Di.state){var jr=Di.state||(Di.state=new Es),Gr=jr.get,$o=jr.has,sn=jr.set;Qn=function(b,rA){if($o.call(jr,b))throw new TypeError("Object already initialized");return rA.facade=b,sn.call(jr,b,rA),rA},ho=function(b){return Gr.call(jr,b)||{}},jn=function(b){return $o.call(jr,b)}}else{var dn=Tr("state");ei[dn]=!0,Qn=function(b,rA){if(pe(b,dn))throw new TypeError("Object already initialized");return rA.facade=b,et(b,dn,rA),rA},ho=function(b){return pe(b,dn)?b[dn]:{}},jn=function(b){return pe(b,dn)}}var hn={set:Qn,get:ho,has:jn,enforce:function(b){return jn(b)?ho(b):Qn(b,{})},getterFor:function(b){return function(rA){var gA;if(!Dt(rA)||(gA=ho(rA)).type!==b)throw TypeError("Incompatible receiver, "+b+" required");return gA}}},Gi=Function.prototype,pn=wA&&Object.getOwnPropertyDescriptor,nI=pe(Gi,"name"),gr={PROPER:nI&&function(){}.name==="something",CONFIGURABLE:nI&&(!wA||wA&&pn(Gi,"name").configurable)},gn=AA(function(b){var rA=gr.CONFIGURABLE,gA=hn.get,pA=hn.enforce,vA=String(String).split("String");(b.exports=function(Ae,UA,re,LA){var se,He=!!LA&&!!LA.unsafe,It=!!LA&&!!LA.enumerable,ft=!!LA&&!!LA.noTargetGet,Pe=LA&&LA.name!==void 0?LA.name:UA;$e(re)&&(String(Pe).slice(0,7)==="Symbol("&&(Pe="["+String(Pe).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),(!pe(re,"name")||rA&&re.name!==Pe)&&et(re,"name",Pe),(se=pA(re)).source||(se.source=vA.join(typeof Pe=="string"?Pe:""))),Ae!==X?(He?!ft&&Ae[UA]&&(It=!0):delete Ae[UA],It?Ae[UA]=re:et(Ae,UA,re)):It?Ae[UA]=re:Ji(UA,re)})(Function.prototype,"toString",function(){return $e(this)&&gA(this).source||$t(this)})}),Yo=Math.ceil,Tg=Math.floor,So=function(b){var rA=+b;return rA!=rA||rA===0?0:(rA>0?Tg:Yo)(rA)},ao=Math.max,EE=Math.min,Ta=Math.min,po=function(b){return b>0?Ta(So(b),9007199254740991):0},Ja=function(b){return po(b.length)},Mc=function(b){return function(rA,gA,pA){var vA,Ae=Je(rA),UA=Ja(Ae),re=function(LA,se){var He=So(LA);return He<0?ao(He+se,0):EE(He,se)}(pA,UA);if(b&&gA!=gA){for(;UA>re;)if((vA=Ae[re++])!=vA)return!0}else for(;UA>re;re++)if((b||re in Ae)&&Ae[re]===gA)return b||re||0;return!b&&-1}},Qr={indexOf:Mc(!1)},Fo=Qr.indexOf,$s=function(b,rA){var gA,pA=Je(b),vA=0,Ae=[];for(gA in pA)!pe(ei,gA)&&pe(pA,gA)&&Ae.push(gA);for(;rA.length>vA;)pe(pA,gA=rA[vA++])&&(~Fo(Ae,gA)||Ae.push(gA));return Ae},Ha=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Gs=Ha.concat("length","prototype"),Ga={f:Object.getOwnPropertyNames||function(b){return $s(b,Gs)}},Rr={f:Object.getOwnPropertySymbols},Ia=bi("Reflect","ownKeys")||function(b){var rA=Ga.f(Lo(b)),gA=Rr.f;return gA?rA.concat(gA(b)):rA},fo=function(b,rA){for(var gA=Ia(rA),pA=Vo.f,vA=sr.f,Ae=0;Ae=51||!QA(function(){var rA=[];return(rA.constructor={})[Rt]=function(){return{foo:1}},rA[b](Boolean).foo!==1})},nt=ye("isConcatSpreadable"),ii=no>=51||!QA(function(){var b=[];return b[nt]=!1,b.concat()[0]!==b}),oi=Ye("concat"),Ko=function(b){if(!Dt(b))return!1;var rA=b[nt];return rA!==void 0?!!rA:Ba(b)};Po({target:"Array",proto:!0,forced:!ii||!oi},{concat:function(b){var rA,gA,pA,vA,Ae,UA=MA(this),re=Bt(UA,0),LA=0;for(rA=-1,pA=arguments.length;rA9007199254740991)throw TypeError("Maximum allowed index exceeded");for(gA=0;gA=9007199254740991)throw TypeError("Maximum allowed index exceeded");Mr(re,LA++,Ae)}return re.length=LA,re}});var Kt,ro=Object.keys||function(b){return $s(b,Ha)},ks=wA?Object.defineProperties:function(b,rA){Lo(b);for(var gA,pA=ro(rA),vA=pA.length,Ae=0;vA>Ae;)Vo.f(b,gA=pA[Ae++],rA[gA]);return b},Zr=bi("document","documentElement"),In=Tr("IE_PROTO"),xr=function(){},sI=function(b){return" + + + +
+ + + + diff --git a/app/video_companion/index.html b/app/video_companion/index.html new file mode 100644 index 000000000..4a91af378 --- /dev/null +++ b/app/video_companion/index.html @@ -0,0 +1,15 @@ + + + + + + + 视频面诊 + + +
+ + + + + diff --git a/app/video_companion/package-lock.json b/app/video_companion/package-lock.json new file mode 100644 index 000000000..8858207ac --- /dev/null +++ b/app/video_companion/package-lock.json @@ -0,0 +1,1604 @@ +{ + "name": "doctor-video-companion", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "doctor-video-companion", + "version": "0.1.0", + "dependencies": { + "@trtc/calls-uikit-vue": "4.4.6", + "vue": "3.5.13" + }, + "devDependencies": { + "@vitejs/plugin-vue": "5.2.1", + "typescript": "5.7.3", + "vite": "6.1.1", + "vue-tsc": "2.2.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz", + "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz", + "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz", + "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz", + "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz", + "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz", + "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz", + "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz", + "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz", + "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz", + "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz", + "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz", + "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz", + "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz", + "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz", + "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz", + "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz", + "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz", + "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz", + "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz", + "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz", + "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz", + "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz", + "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz", + "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz", + "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tencentcloud/lite-chat": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/@tencentcloud/lite-chat/-/lite-chat-1.6.18.tgz", + "integrity": "sha512-Gs3Ahns/v/uyWkoqANtTfa9Wl0VwjEA7xiVUcb0Xk67YahjTtHQNkt/nAYbaPKGNWVg36R/huaWi06fijo9lGA==", + "license": "ISC" + }, + "node_modules/@tencentcloud/tui-core-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tencentcloud/tui-core-lite/-/tui-core-lite-1.0.0.tgz", + "integrity": "sha512-+nmOWQ415Kz6aYJDv4EIdnaLk69SPWscZqmIhQp9GhNGFVq4/u+gC/sWvGHEOICJncFjM4dUxBg9EFfzD78rGQ==", + "license": "ISC", + "dependencies": { + "@tencentcloud/lite-chat": "^1.5.0" + } + }, + "node_modules/@trtc/call-engine-lite-js": { + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/@trtc/call-engine-lite-js/-/call-engine-lite-js-3.5.9.tgz", + "integrity": "sha512-fpkiOMQyMA37xFMjcTvTYW0m9qK//ptOY8uOxcAl6cApeebfZNX7Zra60/XxAlIhDH7ZgoFfXcExV6i13twpSg==", + "license": "ISC", + "dependencies": { + "@tencentcloud/lite-chat": "^1.6.3", + "core-js": "^3.8.3", + "eventemitter3": "^4.0.7", + "rtc-detect": "^0.0.5", + "trtc-cloud-js-sdk": "2.10.19", + "tuikit-logger": "latest" + } + }, + "node_modules/@trtc/calls-uikit-vue": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@trtc/calls-uikit-vue/-/calls-uikit-vue-4.4.6.tgz", + "integrity": "sha512-g+j2NuZCKtANqim/wPUnv40x2advVHLa2yevcRj/JGd3Mv0nfDI/lPjbBYb/CUy6BtNGd8O52kRRrE3MYYeeWA==", + "license": "ISC", + "dependencies": { + "@tencentcloud/lite-chat": "^1.6.3", + "@tencentcloud/tui-core-lite": "1.0.0", + "@trtc/call-engine-lite-js": "~3.5.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", + "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.13", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.48", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", + "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.2.tgz", + "integrity": "sha512-QotO41kurE5PLf3vrNgGTk3QswO2PdUFjBwNiOi7zMmGhwb25PSTh9hD1MCgKC06AVv+8sZQvlL3Do4TTVHSiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "~2.4.11", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", + "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", + "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", + "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/runtime-core": "3.5.13", + "@vue/shared": "3.5.13", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", + "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "vue": "3.5.13" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "license": "MIT" + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/core-js": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.50.0.tgz", + "integrity": "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==", + "hasInstallScript": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz", + "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.62.4", + "@rollup/rollup-android-arm64": "4.62.4", + "@rollup/rollup-darwin-arm64": "4.62.4", + "@rollup/rollup-darwin-x64": "4.62.4", + "@rollup/rollup-freebsd-arm64": "4.62.4", + "@rollup/rollup-freebsd-x64": "4.62.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.4", + "@rollup/rollup-linux-arm-musleabihf": "4.62.4", + "@rollup/rollup-linux-arm64-gnu": "4.62.4", + "@rollup/rollup-linux-arm64-musl": "4.62.4", + "@rollup/rollup-linux-loong64-gnu": "4.62.4", + "@rollup/rollup-linux-loong64-musl": "4.62.4", + "@rollup/rollup-linux-ppc64-gnu": "4.62.4", + "@rollup/rollup-linux-ppc64-musl": "4.62.4", + "@rollup/rollup-linux-riscv64-gnu": "4.62.4", + "@rollup/rollup-linux-riscv64-musl": "4.62.4", + "@rollup/rollup-linux-s390x-gnu": "4.62.4", + "@rollup/rollup-linux-x64-gnu": "4.62.4", + "@rollup/rollup-linux-x64-musl": "4.62.4", + "@rollup/rollup-openbsd-x64": "4.62.4", + "@rollup/rollup-openharmony-arm64": "4.62.4", + "@rollup/rollup-win32-arm64-msvc": "4.62.4", + "@rollup/rollup-win32-ia32-msvc": "4.62.4", + "@rollup/rollup-win32-x64-gnu": "4.62.4", + "@rollup/rollup-win32-x64-msvc": "4.62.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/rtc-detect": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/rtc-detect/-/rtc-detect-0.0.5.tgz", + "integrity": "sha512-VANIELbaoIkZRj4gyiCCbTM+/ASy0eNgF35jCs+rrGxzYvD7YIBajEbGGZeh+5ZCNAX8/rT8IVRdpuallf174Q==", + "license": "ISC" + }, + "node_modules/sdp": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/sdp/-/sdp-3.2.2.tgz", + "integrity": "sha512-xZocWwfyp4hkbN4hLWxMjmv2Q8aNa9MhmOZ7L9aCZPT+dZsgRr6wZRrSYE3HTdyk/2pZKPSgqI7ns7Een1xMSA==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trtc-cloud-js-sdk": { + "version": "2.10.19", + "resolved": "https://registry.npmjs.org/trtc-cloud-js-sdk/-/trtc-cloud-js-sdk-2.10.19.tgz", + "integrity": "sha512-TkLx4SbQS9iouwGSPm634dPPDFf3C3nm1okaOzV8bw1tcc6WKz6g2wtTejTHKF+DbWKXSKS78KCuJBC1iTR9iQ==", + "license": "ISC", + "dependencies": { + "trtc-sdk-v5": "5.15.3-beta.12" + } + }, + "node_modules/trtc-sdk-v5": { + "version": "5.15.3-beta.12", + "resolved": "https://registry.npmjs.org/trtc-sdk-v5/-/trtc-sdk-v5-5.15.3-beta.12.tgz", + "integrity": "sha512-CE3mQTj7gB4RIiSGFT5x7GNfT1KP5VVu3C5A8V4Op4nxa4AzCtS4Y6TMuIHH8yGccuzcNLUXYOzov3wxdzvaFw==", + "license": "ISC", + "dependencies": { + "webrtc-adapter": "^8.2.3" + } + }, + "node_modules/tuikit-logger": { + "version": "0.0.4-beta.1", + "resolved": "https://registry.npmjs.org/tuikit-logger/-/tuikit-logger-0.0.4-beta.1.tgz", + "integrity": "sha512-Ky83B1p88xakmfZ2f92cU0YxfolyxnQBv14tQpvnuHcMTnVR2Rjy8tityDGwF+pnxrAhJ7H7OPB/4rFdWVncIw==", + "license": "ISC" + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz", + "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.24.2", + "postcss": "^8.5.2", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", + "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-sfc": "3.5.13", + "@vue/runtime-dom": "3.5.13", + "@vue/server-renderer": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-tsc": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.2.tgz", + "integrity": "sha512-1icPKkxAA5KTAaSwg0wVWdE48EdsH8fgvcbAiqojP4jXKl6LEM3soiW1aG/zrWrFt8Mw1ncG2vG1PvpZpVfehA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "~2.4.11", + "@vue/language-core": "2.2.2" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/webrtc-adapter": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/webrtc-adapter/-/webrtc-adapter-8.2.4.tgz", + "integrity": "sha512-VwtwbYNKnVQW8koB9qb8YcxNwpSVHTvvKEZLzY6uQ3gFrA9E87VPbB5xE+m1AGwUjL1UgN35jRR9hQgteZI5bg==", + "license": "BSD-3-Clause", + "dependencies": { + "sdp": "^3.2.0" + }, + "engines": { + "node": ">=6.0.0", + "npm": ">=3.10.0" + } + } + } +} diff --git a/app/video_companion/package.json b/app/video_companion/package.json new file mode 100644 index 000000000..2e69023fc --- /dev/null +++ b/app/video_companion/package.json @@ -0,0 +1,24 @@ +{ + "name": "doctor-video-companion", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview --port 4173" + }, + "dependencies": { + "@trtc/calls-uikit-vue": "4.4.6", + "vue": "3.5.13" + }, + "devDependencies": { + "@vitejs/plugin-vue": "5.2.1", + "typescript": "5.7.3", + "vite": "6.1.1", + "vue-tsc": "2.2.2" + }, + "engines": { + "node": ">=20.0.0" + } +} diff --git a/app/video_companion/src/App.vue b/app/video_companion/src/App.vue new file mode 100644 index 000000000..cf80f9e8c --- /dev/null +++ b/app/video_companion/src/App.vue @@ -0,0 +1,33 @@ + + + diff --git a/app/video_companion/src/env.d.ts b/app/video_companion/src/env.d.ts new file mode 100644 index 000000000..c2459e248 --- /dev/null +++ b/app/video_companion/src/env.d.ts @@ -0,0 +1,31 @@ +/// + +interface DoctorCallConfig { + SDKAppID?: number | string + sdkAppId?: number | string + userID?: string + userId?: string + userSig: string + targetUserId?: string + patientUserId?: string + diagnosisId: number | string +} + +interface DoctorCallApi { + start(config: DoctorCallConfig): Promise + hangup(): Promise +} + +interface QtVideoBridge { + notify?: (payload: string) => void +} + +interface Window { + doctorCall: DoctorCallApi + qtVideoBridge?: QtVideoBridge + qt?: { webChannelTransport?: unknown } + QWebChannel?: new ( + transport: unknown, + callback: (channel: { objects: { qtVideoBridge?: QtVideoBridge } }) => void, + ) => unknown +} diff --git a/app/video_companion/src/main.ts b/app/video_companion/src/main.ts new file mode 100644 index 000000000..a0cea3842 --- /dev/null +++ b/app/video_companion/src/main.ts @@ -0,0 +1,289 @@ +import { createApp, nextTick, readonly, ref } from 'vue' +import { + NAME, + StoreName, + TUIStore, + TUICallKitAPI, + TUICallType, +} from '@trtc/calls-uikit-vue' + +import App from './App.vue' +import './style.css' + +type CallPhase = 'ready' | 'starting' | 'dialing' | 'connected' | 'ended' | 'error' + +interface NormalizedCallConfig { + SDKAppID: number + userID: string + userSig: string + targetUserId: string + diagnosisId: number | string +} + +interface BridgeMessage { + source: 'doctor-call' + event: 'ready' | 'status' | 'room' | 'hangup' | 'error' + diagnosisId?: number | string + status?: string + roomId?: string + message?: string +} + +const phase = ref('ready') +const statusText = ref('等待桌面端发起视频面诊') +let activeConfig: NormalizedCallConfig | null = null +let endNotified = false +let starting = false +let emittedRoomId = '' + +function initializeQtWebChannel(): void { + const transport = window.qt?.webChannelTransport + const QWebChannel = window.QWebChannel + if (!transport || typeof QWebChannel !== 'function') return + + try { + new QWebChannel(transport, (channel) => { + const bridge = channel.objects.qtVideoBridge + if (bridge) window.qtVideoBridge = bridge + emit({ source: 'doctor-call', event: 'ready' }) + }) + } catch { + console.warn('[doctor-call] Qt WebChannel 初始化失败,将使用 postMessage 通知') + } +} + +function postToHost(message: BridgeMessage): boolean { + let delivered = false + + try { + if (window.parent && window.parent !== window) { + window.parent.postMessage(message, '*') + delivered = true + } + } catch { + // Cross-origin host may reject access; opener remains available as a fallback. + } + + try { + if (window.opener && !window.opener.closed) { + window.opener.postMessage(message, '*') + delivered = true + } + } catch { + // The console fallback below is intentionally non-sensitive. + } + + return delivered +} + +function emit(message: BridgeMessage): void { + const bridge = window.qtVideoBridge + if (bridge && typeof bridge.notify === 'function') { + try { + bridge.notify(JSON.stringify(message)) + return + } catch { + // A detached WebChannel object is equivalent to an unavailable bridge. + } + } + + if (!postToHost(message)) { + console.info('[doctor-call]', message.event, message.status ?? message.message ?? '') + } +} + +function cleanString(value: unknown, field: string): string { + if (typeof value !== 'string' || value.trim() === '') { + throw new Error(`${field} 不能为空`) + } + return value.trim() +} + +function normalizeConfig(config: DoctorCallConfig): NormalizedCallConfig { + if (!config || typeof config !== 'object') throw new Error('通话配置无效') + + const rawSdkAppId = config.SDKAppID ?? config.sdkAppId + const SDKAppID = Number(rawSdkAppId) + if (!Number.isSafeInteger(SDKAppID) || SDKAppID <= 0) { + throw new Error('SDKAppID 必须是正整数') + } + + const diagnosisId = config.diagnosisId + if ( + diagnosisId === undefined + || diagnosisId === null + || (typeof diagnosisId === 'string' && diagnosisId.trim() === '') + ) { + throw new Error('diagnosisId 不能为空') + } + + return { + SDKAppID, + userID: cleanString(config.userID ?? config.userId, 'userID'), + userSig: cleanString(config.userSig, 'userSig'), + targetUserId: cleanString(config.targetUserId ?? config.patientUserId, 'targetUserId'), + diagnosisId: typeof diagnosisId === 'string' ? diagnosisId.trim() : diagnosisId, + } +} + +function safeErrorMessage(error: unknown): string { + let message = error instanceof Error ? error.message : '视频通话发生未知错误' + if (activeConfig?.userSig) message = message.split(activeConfig.userSig).join('[REDACTED]') + return message + .replace(/(user\s*sig\s*[:=]\s*)[^\s,;&]+/gi, '$1[REDACTED]') + .slice(0, 400) +} + +function notifyHangup(status = 'ended'): void { + if (endNotified) return + endNotified = true + phase.value = 'ended' + statusText.value = '视频面诊已结束' + emit({ + source: 'doctor-call', + event: 'hangup', + diagnosisId: activeConfig?.diagnosisId, + status, + }) +} + +function readRoomId(): string { + const raw = TUIStore.getData(StoreName.CALL, NAME.ROOM_ID) + if (raw === undefined || raw === null) return '' + const value = String(raw).trim() + return value && value !== '0' ? value : '' +} + +function emitRoomId(): boolean { + const roomId = readRoomId() + if (!roomId || roomId === emittedRoomId) return Boolean(roomId) + emittedRoomId = roomId + emit({ + source: 'doctor-call', + event: 'room', + diagnosisId: activeConfig?.diagnosisId, + roomId, + }) + return true +} + +async function pollRoomId(): Promise { + for (let attempt = 0; attempt < 40 && activeConfig && !endNotified; attempt += 1) { + if (emitRoomId()) return + await new Promise((resolve) => window.setTimeout(resolve, 50)) + } +} + +function handleStatusChanged(payload: unknown): void { + const value = payload && typeof payload === 'object' + ? (payload as { newStatus?: unknown }).newStatus + : payload + const status = typeof value === 'string' ? value : 'unknown' + + if (status === 'connected' || status.startsWith('calling-')) { + phase.value = 'connected' + statusText.value = '视频面诊进行中' + void pollRoomId() + } else if (status === 'calling' || status.startsWith('dialing')) { + phase.value = 'dialing' + statusText.value = '正在等待患者接听' + } else if (status === 'idle' && activeConfig && !starting) { + notifyHangup(status) + } + + emit({ + source: 'doctor-call', + event: 'status', + diagnosisId: activeConfig?.diagnosisId, + status, + }) +} + +TUICallKitAPI.setCallback({ + statusChanged: handleStatusChanged, + afterCalling: () => notifyHangup('after-calling'), +}) +TUICallKitAPI.enableFloatWindow(false) + +async function start(config: DoctorCallConfig): Promise { + if (starting || (activeConfig && !endNotified)) { + throw new Error('已有视频通话正在进行') + } + + starting = true + endNotified = false + phase.value = 'starting' + statusText.value = '正在初始化安全通话' + + try { + const normalized = normalizeConfig(config) + activeConfig = normalized + emittedRoomId = '' + + await TUICallKitAPI.init({ + SDKAppID: normalized.SDKAppID, + userID: normalized.userID, + userSig: normalized.userSig, + }) + + await nextTick() + phase.value = 'dialing' + statusText.value = '正在呼叫患者' + + await TUICallKitAPI.calls({ + userIDList: [normalized.targetUserId], + type: TUICallType.VIDEO_CALL, + }) + void pollRoomId() + + emit({ + source: 'doctor-call', + event: 'status', + diagnosisId: normalized.diagnosisId, + status: 'dialing', + }) + } catch (error) { + const message = safeErrorMessage(error) + phase.value = 'error' + statusText.value = message + emit({ + source: 'doctor-call', + event: 'error', + diagnosisId: activeConfig?.diagnosisId, + message, + }) + activeConfig = null + endNotified = true + throw new Error(message) + } finally { + starting = false + } +} + +async function hangup(): Promise { + if (!activeConfig || endNotified) return + + try { + await TUICallKitAPI.hangup() + notifyHangup('local-hangup') + } catch (error) { + const message = safeErrorMessage(error) + emit({ + source: 'doctor-call', + event: 'error', + diagnosisId: activeConfig.diagnosisId, + message, + }) + throw new Error(message) + } +} + +window.doctorCall = { start, hangup } +initializeQtWebChannel() + +createApp(App, { + phase: readonly(phase), + statusText: readonly(statusText), +}).mount('#app') + +emit({ source: 'doctor-call', event: 'ready' }) diff --git a/app/video_companion/src/style.css b/app/video_companion/src/style.css new file mode 100644 index 000000000..9b531b5b7 --- /dev/null +++ b/app/video_companion/src/style.css @@ -0,0 +1,127 @@ +:root { + font-family: Inter, "PingFang SC", "Microsoft YaHei", system-ui, sans-serif; + color: #f7f8fa; + background: #0b0f14; + font-synthesis: none; + text-rendering: optimizeLegibility; +} + +* { + box-sizing: border-box; +} + +html, +body, +#app { + width: 100%; + height: 100%; + margin: 0; + overflow: hidden; +} + +button, +input { + font: inherit; +} + +.call-stage { + position: relative; + width: 100%; + height: 100%; + min-height: 420px; + overflow: hidden; + background: + radial-gradient(circle at 50% 35%, rgba(39, 74, 83, 0.22), transparent 38%), + #0b0f14; +} + +.call-kit, +.call-stage :is(.TUICallKit-desktop, .TUICallKit-mobile, #tuicallkit-id) { + width: 100% !important; + height: 100% !important; + max-width: none !important; + max-height: none !important; +} + +.status-card { + position: absolute; + inset: 50% auto auto 50%; + display: grid; + grid-template-columns: 12px minmax(0, 1fr); + gap: 18px; + width: min(520px, calc(100% - 48px)); + padding: 30px 32px; + transform: translate(-50%, -50%); + border: 1px solid rgba(255, 255, 255, 0.09); + border-radius: 20px; + background: rgba(19, 25, 32, 0.9); + box-shadow: 0 24px 70px rgba(0, 0, 0, 0.32); + backdrop-filter: blur(18px); +} + +.eyebrow { + margin: 0 0 12px; + color: #8f9ba8; + font-size: 12px; + font-weight: 700; + letter-spacing: 0.16em; + text-transform: uppercase; +} + +.status-card h1 { + margin: 0; + font-size: clamp(22px, 3.2vw, 34px); + font-weight: 600; + line-height: 1.25; +} + +.status-hint { + margin: 14px 0 0; + color: #9aa5b1; + font-size: 14px; +} + +.status-dot { + width: 10px; + height: 10px; + margin-top: 5px; + border-radius: 50%; + background: #77818c; + box-shadow: 0 0 0 5px rgba(119, 129, 140, 0.12); +} + +.status-dot--starting, +.status-dot--live { + background: #52c99a; + box-shadow: 0 0 0 5px rgba(82, 201, 154, 0.14); +} + +.status-dot--error { + background: #f26d6d; + box-shadow: 0 0 0 5px rgba(242, 109, 109, 0.14); +} + +.live-status { + position: absolute; + z-index: 20; + top: 18px; + left: 50%; + display: flex; + align-items: center; + gap: 10px; + padding: 9px 14px; + transform: translateX(-50%); + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: 999px; + background: rgba(11, 15, 20, 0.76); + color: #e8edf2; + font-size: 13px; + backdrop-filter: blur(14px); +} + +.live-status .status-dot { + width: 7px; + height: 7px; + margin: 0; + box-shadow: none; +} diff --git a/app/video_companion/tsconfig.json b/app/video_companion/tsconfig.json new file mode 100644 index 000000000..74c8d17ff --- /dev/null +++ b/app/video_companion/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2022", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "jsx": "preserve", + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "types": ["vite/client"] + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.vue", "vite.config.ts"] +} diff --git a/app/video_companion/vite.config.ts b/app/video_companion/vite.config.ts new file mode 100644 index 000000000..f2ce64021 --- /dev/null +++ b/app/video_companion/vite.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +export default defineConfig({ + base: './', + plugins: [vue()], + build: { + outDir: 'dist', + emptyOutDir: true, + target: 'chrome100', + }, +}) diff --git a/app/一键打包.command b/app/一键打包.command new file mode 100644 index 000000000..54ad6e72d --- /dev/null +++ b/app/一键打包.command @@ -0,0 +1,5 @@ +#!/bin/bash +set -u +project_root="$(cd "$(dirname "$0")" && pwd -P)" +exec /bin/bash "$project_root/scripts/package_macos.sh" + diff --git a/app/一键打包_医生工作站.bat b/app/一键打包_医生工作站.bat new file mode 100644 index 000000000..bbdc50b3a --- /dev/null +++ b/app/一键打包_医生工作站.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0Build_DoctorWorkstation.bat" %* +exit /b %ERRORLEVEL% diff --git a/app/一键运行.command b/app/一键运行.command new file mode 100644 index 000000000..23d74e421 --- /dev/null +++ b/app/一键运行.command @@ -0,0 +1,5 @@ +#!/bin/bash +set -u +project_root="$(cd "$(dirname "$0")" && pwd -P)" +exec /bin/bash "$project_root/scripts/run_macos.sh" + diff --git a/app/一键运行_医生工作站.bat b/app/一键运行_医生工作站.bat new file mode 100644 index 000000000..8680c050a --- /dev/null +++ b/app/一键运行_医生工作站.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0Run_DoctorWorkstation.bat" %* +exit /b %ERRORLEVEL% diff --git a/server/app/adminapi/logic/doctor/AppointmentLogic.php b/server/app/adminapi/logic/doctor/AppointmentLogic.php index f5702c129..4fc7edadd 100755 --- a/server/app/adminapi/logic/doctor/AppointmentLogic.php +++ b/server/app/adminapi/logic/doctor/AppointmentLogic.php @@ -189,6 +189,7 @@ class AppointmentLogic extends BaseLogic $slots[] = [ 'time' => $time, 'available' => true, + 'has_appointment' => false, 'quota' => 1, 'period' => $roster['period'] ?? 'segment', ]; @@ -224,28 +225,39 @@ class AppointmentLogic extends BaseLogic 'last_3_slots' => array_slice($slots, -3), ]); - // 4. 查询已预约的时间段 - $appointmentTimes = Appointment::where([ + // 4. 查询当天所有挂号记录。 + // available 只由当前有效预约(status=1)决定;has_appointment 保留历史挂号事实, + // 避免预约在完成、过号或取消后被误显示为“空号”。 + $appointmentRows = Appointment::where([ 'doctor_id' => $doctorId, 'appointment_date' => $date, - 'status' => 1 // 只查询有效预约 - ])->column('appointment_time'); + ])->field(['appointment_time', 'status'])->select()->toArray(); - // 将时间格式统一为 HH:MM(去掉秒) - $appointments = array_map(function($time) { - // 如果是 HH:MM:SS 格式,截取前5位 - return substr($time, 0, 5); - }, $appointmentTimes); + $appointmentMap = []; + $activeAppointmentMap = []; + foreach ($appointmentRows as $appointmentRow) { + // 将 HH:MM:SS 统一为 HH:MM + $appointmentTime = substr((string) ($appointmentRow['appointment_time'] ?? ''), 0, 5); + if ($appointmentTime === '') { + continue; + } + $appointmentMap[$appointmentTime] = true; + if ((int) ($appointmentRow['status'] ?? 0) === 1) { + $activeAppointmentMap[$appointmentTime] = true; + } + } - // 4. 标记已占用的时间段 + // 5. 分别标记历史挂号与当前占用状态 foreach ($slots as &$slot) { - if (in_array($slot['time'], $appointments)) { + $slot['has_appointment'] = isset($appointmentMap[$slot['time']]); + if (isset($activeAppointmentMap[$slot['time']])) { $slot['available'] = false; $slot['quota'] = 0; } } + unset($slot); - // 5. 按时间排序 + // 6. 按时间排序 usort($slots, function($a, $b) { return strcmp($a['time'], $b['time']); }); diff --git a/server/app/adminapi/logic/firstvisit/FirstVisitConversionLogic.php b/server/app/adminapi/logic/firstvisit/FirstVisitConversionLogic.php index 6f2a3180e..50dc4e3f7 100644 --- a/server/app/adminapi/logic/firstvisit/FirstVisitConversionLogic.php +++ b/server/app/adminapi/logic/firstvisit/FirstVisitConversionLogic.php @@ -35,7 +35,7 @@ class FirstVisitConversionLogic $selectedAssistantId = max(0, (int) ($params['assistant_id'] ?? 0)); $requestedMediaChannelCode = trim((string)($params['media_channel_code'] ?? '')); $selectedMediaChannel = $requestedMediaChannelCode !== '' - ? MediaChannelService::getChannelByCode($requestedMediaChannelCode) + ? MediaChannelService::getCurrentTagChannelByCode($requestedMediaChannelCode) : null; $selectedMediaChannelCode = $selectedMediaChannel !== null ? $requestedMediaChannelCode : ''; @@ -79,7 +79,9 @@ class FirstVisitConversionLogic 'time_type' => 'custom', 'start_date' => $startDate, 'end_date' => $endDate, - 'include_filters' => 1, + // 一诊筛选项在本层按自身权限和“当前企微标签”口径生成,不再让通用 + // Conversion 额外加载一套包含历史渠道的筛选器。 + 'include_filters' => 0, 'include_members' => 1, 'exclude_cancelled_appointments' => 1, 'order_metric_mode' => 'performance', @@ -98,7 +100,8 @@ class FirstVisitConversionLogic $adminId, $adminInfo, $effectiveAdminIds, - $costAllocationAdminIds + $costAllocationAdminIds, + $selectedMediaChannel ); $rows = is_array($conversion['lists'] ?? null) ? $conversion['lists'] : []; $rowAllowedDeptIds = self::visibleRowDeptIds($effectiveAdminIds); @@ -149,10 +152,6 @@ class FirstVisitConversionLogic $selectedMediaChannelName = $selectedMediaChannelCode !== '' ? (string) ($selectedMediaChannel['channel_name'] ?? $selectedMediaChannelCode) : ''; - $conversionFilters = is_array($conversion['extend']['filters'] ?? null) - ? $conversion['extend']['filters'] - : []; - return [ 'meta' => [ 'time_type' => $timeType, @@ -176,9 +175,7 @@ class FirstVisitConversionLogic 'filters' => [ 'departments' => DeptLogic::getAllDataScoped($adminId, $adminInfo), 'assistants' => self::assistantOptions($baseVisibleAdminIds, $selectedDeptIds, $selectedDeptId), - 'media_channels' => is_array($conversionFilters['media_channels'] ?? null) - ? $conversionFilters['media_channels'] - : [], + 'media_channels' => MediaChannelService::getCurrentTagOptions(), ], 'summary' => $summary, 'rankings' => [ diff --git a/server/app/adminapi/logic/qywx/CustomerLogic.php b/server/app/adminapi/logic/qywx/CustomerLogic.php index 7ccbf3996..1942361be 100755 --- a/server/app/adminapi/logic/qywx/CustomerLogic.php +++ b/server/app/adminapi/logic/qywx/CustomerLogic.php @@ -8,6 +8,7 @@ use app\common\logic\BaseLogic; use app\common\model\auth\Admin; use app\common\model\QywxExternalContact; use app\common\model\QywxSyncSettings; +use app\common\service\qywx\MediaChannelService; use app\common\service\wechat\WechatWorkService; use think\facade\Cache; use think\facade\Db; @@ -306,6 +307,7 @@ class CustomerLogic extends BaseLogic } // 4. 更新同步设置 + MediaChannelService::forgetCurrentTagCatalogCache(); self::updateSyncStatus('success', $syncCount); Log::info('同步完成 - 总数: ' . $syncCount . ', 新增: ' . $newCount . ', 更新: ' . $updateCount); @@ -650,6 +652,7 @@ class CustomerLogic extends BaseLogic $updateCount, $skippedCount ); + MediaChannelService::forgetCurrentTagCatalogCache(); } /** @@ -739,6 +742,7 @@ class CustomerLogic extends BaseLogic Db::name('qywx_external_contact_tag') ->where('external_userid', $externalUserId) ->delete(); + MediaChannelService::forgetCurrentTagCatalogCache(); } /** @@ -796,6 +800,7 @@ class CustomerLogic extends BaseLogic Db::name('qywx_external_contact_tag') ->where('external_userid', $externalUserId) ->delete(); + MediaChannelService::forgetCurrentTagCatalogCache(); return; } @@ -817,6 +822,7 @@ class CustomerLogic extends BaseLogic // 关系表按剩余 kept follow_users 同步(自动清掉离开员工那行 + 保留其他员工的标签) self::syncContactTagsRelation($externalUserId, $kept); + MediaChannelService::forgetCurrentTagCatalogCache(); } private static function upsertOneExternalContactBundle( @@ -1137,24 +1143,11 @@ class CustomerLogic extends BaseLogic */ public static function getTagStats(): array { - // 关系表里 external_userid 可能指向已被软删的客户;这里 INNER JOIN 主表过滤未删除的 - $rows = Db::name('qywx_external_contact_tag') - ->alias('ect') - ->join('qywx_external_contact ec', 'ec.external_userid = ect.external_userid', 'INNER') - ->whereNull('ec.delete_time') - ->field([ - 'ect.tag_id', - 'ect.tag_name', - 'ect.group_name', - 'COUNT(DISTINCT ect.external_userid) AS customer_count', - ]) - ->group('ect.tag_id, ect.tag_name, ect.group_name') - ->order('customer_count', 'desc') - ->select() - ->toArray(); + // 与一诊渠道共用同一份“当前有效标签”投影:一 tag_id 一条最新名称, + // 避免企微标签改名后在筛选器里同时出现新旧快照。 + $rows = MediaChannelService::getCurrentTagCatalog(); $groupMap = []; - $customersUnion = []; foreach ($rows as $r) { $g = (string) ($r['group_name'] ?? ''); if (!isset($groupMap[$g])) { diff --git a/server/app/adminapi/logic/stats/ConversionLogic.php b/server/app/adminapi/logic/stats/ConversionLogic.php index cd06b571a..73c9967d3 100755 --- a/server/app/adminapi/logic/stats/ConversionLogic.php +++ b/server/app/adminapi/logic/stats/ConversionLogic.php @@ -32,6 +32,7 @@ class ConversionLogic * @param array $adminInfo 当前 admin 完整信息(含 root / role_id 数组等) * @param int[]|null $trustedVisibleAdminIdsOverride 仅供服务端内部可信调用覆盖本次可见管理员;不从 HTTP 参数读取 * @param int[]|null $trustedCostAllocationAdminIdsOverride 仅用于成本按加粉占比分摊的分母,不会放大任何业务指标 + * @param array|null $trustedMediaChannelOverride 仅供服务端内部传入已校验渠道,避免再次按全局历史渠道口径解析 * @return array * * 数据权限:通过 DataScopeService::getVisibleAdminIds 拿到当前用户的"可见 admin id 集合"。 @@ -44,7 +45,8 @@ class ConversionLogic int $adminId = 0, ?array $adminInfo = null, ?array $trustedVisibleAdminIdsOverride = null, - ?array $trustedCostAllocationAdminIdsOverride = null + ?array $trustedCostAllocationAdminIdsOverride = null, + ?array $trustedMediaChannelOverride = null ): array { self::$requestRowsCache = []; @@ -56,9 +58,10 @@ class ConversionLogic $usePerformanceOrderMetrics = strtolower(trim((string)($params['order_metric_mode'] ?? ''))) === 'performance'; $dimension = self::normalizeDimension((string)($params['dimension'] ?? 'dept')); $requestedMediaChannelCode = trim((string)($params['media_channel_code'] ?? '')); - $mediaChannel = $requestedMediaChannelCode !== '' - ? MediaChannelService::getChannelByCode($requestedMediaChannelCode) - : null; + $mediaChannel = $trustedMediaChannelOverride; + if ($mediaChannel === null && $requestedMediaChannelCode !== '') { + $mediaChannel = MediaChannelService::getChannelByCode($requestedMediaChannelCode); + } $mediaChannelCode = $mediaChannel !== null ? $requestedMediaChannelCode : ''; $filterEmptyEntities = $mediaChannel !== null; [$startTimestamp, $endTimestamp, $startDate, $endDate] = self::resolveTimeRange($params); diff --git a/server/app/command/QywxBackfillCustomerTags.php b/server/app/command/QywxBackfillCustomerTags.php index cd01d54f7..1dd82c80f 100755 --- a/server/app/command/QywxBackfillCustomerTags.php +++ b/server/app/command/QywxBackfillCustomerTags.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace app\command; use app\adminapi\logic\qywx\CustomerLogic; +use app\common\service\qywx\MediaChannelService; use think\console\Command; use think\console\Input; use think\console\Output; @@ -161,6 +162,7 @@ class QywxBackfillCustomerTags extends Command $output->writeln("空 tags 行数: {$emptyTags} (follow_user 内无任何 tag)"); $output->writeln("关系表同步: {$relationSynced} 行"); $output->writeln("耗时: {$duration}秒"); + MediaChannelService::forgetCurrentTagCatalogCache(); return 0; } @@ -281,6 +283,7 @@ class QywxBackfillCustomerTags extends Command $output->writeln("关系表 INSERT IGNORE: {$tagRowsInserted}(含可能被忽略的重复行)"); $output->writeln("tags JSON 批量 UPDATE: {$jsonUpdated}"); $output->writeln("耗时: {$duration}秒"); + MediaChannelService::forgetCurrentTagCatalogCache(); return 0; } diff --git a/server/app/common/service/qywx/MediaChannelService.php b/server/app/common/service/qywx/MediaChannelService.php index 9e157e906..1fb439096 100755 --- a/server/app/common/service/qywx/MediaChannelService.php +++ b/server/app/common/service/qywx/MediaChannelService.php @@ -6,12 +6,15 @@ namespace app\common\service\qywx; use app\common\model\QywxExternalContact; use app\common\model\QywxMediaChannel; +use think\facade\Cache; use think\facade\Db; use think\db\Query; class MediaChannelService { private const ACTIVE_ROWS_CACHE_TTL_SECONDS = 1.0; + private const CURRENT_TAG_CATALOG_CACHE_KEY = 'qywx:current_tag_catalog:v1'; + private const CURRENT_TAG_CATALOG_CACHE_TTL_SECONDS = 30; private const SCAN_DUPLICATE_UPDATE_FIELDS = [ 'source_group_name', 'last_seen_time', @@ -23,6 +26,16 @@ class MediaChannelService private static float $activeChannelRowsCachedAt = 0.0; + /** @var array|null */ + private static ?array $currentTagCatalogCache = null; + + private static float $currentTagCatalogCachedAt = 0.0; + + /** @var array>|null */ + private static ?array $currentTagChannelRowsCache = null; + + private static float $currentTagChannelRowsCachedAt = 0.0; + /** * 与业绩看板「渠道来源」相同的分组(按 source_group_name),不含客户数统计。 * @@ -86,6 +99,133 @@ class MediaChannelService ], $rows); } + /** + * 企微客户页与一诊渠道共用的当前标签目录。 + * + * 只统计仍关联未删除客户的标签;同一个 tag_id 只保留更新时间最新、 + * 同时间 id 最大的一份名称和分组,避免标签改名后同时展示新旧快照。 + * + * @return array + */ + public static function getCurrentTagCatalog(): array + { + $now = microtime(true); + if (self::$currentTagCatalogCache !== null + && ($now - self::$currentTagCatalogCachedAt) < self::CURRENT_TAG_CATALOG_CACHE_TTL_SECONDS) { + return self::$currentTagCatalogCache; + } + + try { + $cachedCatalog = Cache::get(self::CURRENT_TAG_CATALOG_CACHE_KEY); + } catch (\Throwable) { + // 缓存目录/服务不可用时直接查库,缓存不能阻断业务接口。 + $cachedCatalog = null; + } + if (is_array($cachedCatalog)) { + self::$currentTagCatalogCache = $cachedCatalog; + self::$currentTagCatalogCachedAt = microtime(true); + + return self::$currentTagCatalogCache; + } + + $tagTable = self::tableWithPrefix('qywx_external_contact_tag'); + $contactTable = self::tableWithPrefix('qywx_external_contact'); + $sql = << '' + GROUP BY tagged.tag_id +) current_tag + ON current_tag.tag_id = latest_tag.tag_id + AND current_tag.latest_sort_key = CONCAT( + LPAD(latest_tag.update_time, 10, '0'), + LPAD(latest_tag.id, 10, '0') + ) +ORDER BY current_tag.customer_count DESC, latest_tag.tag_id ASC +SQL; + + self::$currentTagCatalogCache = array_map(static fn (array $row): array => [ + 'tag_id' => trim((string) ($row['tag_id'] ?? '')), + 'tag_name' => trim((string) ($row['tag_name'] ?? '')), + 'group_name' => trim((string) ($row['group_name'] ?? '')), + 'customer_count' => (int) ($row['customer_count'] ?? 0), + ], Db::query($sql)); + self::$currentTagCatalogCachedAt = microtime(true); + try { + Cache::set( + self::CURRENT_TAG_CATALOG_CACHE_KEY, + self::$currentTagCatalogCache, + self::CURRENT_TAG_CATALOG_CACHE_TTL_SECONDS + ); + } catch (\Throwable) { + // 同上:共享缓存仅用于加速,当前请求的内存缓存仍然有效。 + } + + return self::$currentTagCatalogCache; + } + + public static function forgetCurrentTagCatalogCache(): void + { + self::$currentTagCatalogCache = null; + self::$currentTagCatalogCachedAt = 0.0; + self::$currentTagChannelRowsCache = null; + self::$currentTagChannelRowsCachedAt = 0.0; + try { + Cache::delete(self::CURRENT_TAG_CATALOG_CACHE_KEY); + } catch (\Throwable) { + // 缓存不可用不影响标签同步和后续数据库读取。 + } + } + + /** + * 一诊专用渠道选项:严格投影当前企微标签,不混入历史 name-only 渠道。 + * + * @return array + */ + public static function getCurrentTagOptions(): array + { + return array_map(static fn (array $row): array => [ + 'code' => (string) ($row['channel_code'] ?? ''), + 'name' => (string) ($row['channel_name'] ?? ''), + 'tag_id' => (string) ($row['source_tag_id'] ?? ''), + 'group_name' => (string) ($row['source_group_name'] ?? ''), + 'customer_count' => (int) ($row['customer_count'] ?? 0), + ], self::getCurrentTagChannelRows()); + } + + /** + * 一诊专用解析器。当前标签即使在历史渠道注册表中被停用,也仍按企微当前标签生效; + * 全局财务渠道的启停语义继续由 getChannelByCode() 维护。 + * + * @return array|null + */ + public static function getCurrentTagChannelByCode(string $channelCode): ?array + { + $channelCode = trim($channelCode); + if ($channelCode === '') { + return null; + } + + foreach (self::getCurrentTagChannelRows() as $row) { + if ((string) ($row['channel_code'] ?? '') === $channelCode) { + return $row; + } + } + + return null; + } + public static function getDefaultCode(): string { $rows = self::getActiveChannelRows(); @@ -225,8 +365,14 @@ class MediaChannelService $tagId = trim((string) ($channel['source_tag_id'] ?? '')); if ($tagId !== '') { $tagTable = self::tableWithPrefix('qywx_external_contact_tag'); + $contactTable = self::tableWithPrefix('qywx_external_contact'); $query->whereRaw( - "{$field} IN (SELECT channel_tag.external_userid FROM {$tagTable} channel_tag WHERE channel_tag.tag_id = ?)", + "{$field} IN (" + . "SELECT channel_tag.external_userid FROM {$tagTable} channel_tag " + . 'WHERE channel_tag.tag_id = ? ' + . "AND EXISTS (SELECT 1 FROM {$contactTable} active_channel_contact " + . 'WHERE active_channel_contact.external_userid = channel_tag.external_userid ' + . 'AND active_channel_contact.delete_time IS NULL))', [$tagId] ); @@ -321,6 +467,8 @@ class MediaChannelService self::$activeChannelRowsCache = null; self::$activeChannelRowsCachedAt = 0.0; + self::$currentTagChannelRowsCache = null; + self::$currentTagChannelRowsCachedAt = 0.0; return [ 'scanned_contacts' => $scannedContacts, @@ -329,6 +477,105 @@ class MediaChannelService ]; } + /** + * @return array> + */ + private static function getCurrentTagChannelRows(): array + { + $now = microtime(true); + if (self::$currentTagChannelRowsCache !== null + && ($now - self::$currentTagChannelRowsCachedAt) < self::CURRENT_TAG_CATALOG_CACHE_TTL_SECONDS) { + return self::$currentTagChannelRowsCache; + } + + $catalog = self::getCurrentTagCatalog(); + $tagIds = array_values(array_filter(array_map( + static fn (array $tag): string => trim((string) ($tag['tag_id'] ?? '')), + $catalog + ), static fn (string $tagId): bool => $tagId !== '')); + + $configuredRows = []; + if ($tagIds !== []) { + $configuredRows = QywxMediaChannel::whereIn('source_tag_id', $tagIds) + ->field( + 'id, channel_code, channel_name, source_tag_id, source_tag_name, source_group_name, ' + . 'tag_uniq_key, status, last_seen_time, create_time, update_time' + ) + ->order('id asc') + ->select() + ->toArray(); + } + + self::$currentTagChannelRowsCache = self::mergeCurrentTagsWithConfiguredChannels($catalog, $configuredRows); + self::$currentTagChannelRowsCachedAt = microtime(true); + + return self::$currentTagChannelRowsCache; + } + + /** + * 当前企微标签决定展示名称和可见集合;注册表只提供稳定 code 及历史名称兼容。 + * 历史 name-only 行不会进入结果,注册表 status 也不会隐藏仍在使用的企微标签。 + * + * @param array> $catalog + * @param array> $configuredRows + * @return array> + */ + private static function mergeCurrentTagsWithConfiguredChannels(array $catalog, array $configuredRows): array + { + $configuredByTagId = []; + foreach ($configuredRows as $configuredRow) { + $tagId = trim((string) ($configuredRow['source_tag_id'] ?? '')); + if ($tagId !== '' && !isset($configuredByTagId[$tagId])) { + $configuredByTagId[$tagId] = $configuredRow; + } + } + + $rows = []; + foreach ($catalog as $tag) { + $tagId = trim((string) ($tag['tag_id'] ?? $tag['source_tag_id'] ?? '')); + if ($tagId === '') { + continue; + } + + $tagName = trim((string) ($tag['tag_name'] ?? $tag['source_tag_name'] ?? '')); + $groupName = trim((string) ($tag['group_name'] ?? $tag['source_group_name'] ?? '')); + $configured = $configuredByTagId[$tagId] ?? []; + $channelCode = trim((string) ($configured['channel_code'] ?? '')); + if ($channelCode === '') { + $channelCode = self::buildChannelCode($tagId, $tagName); + } + if ($channelCode === '') { + continue; + } + + $row = $configured; + $oldChannelName = trim((string) ($configured['channel_name'] ?? '')); + $oldTagName = trim((string) ($configured['source_tag_name'] ?? '')); + if ($oldChannelName !== '' && $oldChannelName !== $tagName) { + $row['legacy_channel_name'] = $oldChannelName; + } + if ($oldTagName !== '' && $oldTagName !== $tagName) { + $row['legacy_source_tag_name'] = $oldTagName; + } + + $row['id'] = (int) ($configured['id'] ?? 0); + $row['channel_code'] = $channelCode; + $row['channel_name'] = $tagName !== '' ? $tagName : $tagId; + $row['source_tag_id'] = $tagId; + $row['source_tag_name'] = $tagName; + $row['source_group_name'] = $groupName; + $row['tag_uniq_key'] = self::buildTagUniqKey($tagId, $tagName); + $row['status'] = 1; + $row['customer_count'] = (int) ($tag['customer_count'] ?? 0); + $row['last_seen_time'] = (int) ($configured['last_seen_time'] ?? 0); + $row['create_time'] = (int) ($configured['create_time'] ?? 0); + $row['update_time'] = (int) ($configured['update_time'] ?? 0); + $rows[] = $row; + } + + return $rows; + } + /** * Combine the persistent channel registry with the latest tag snapshots in * the normalized relation table. The registry keeps stable channel codes diff --git a/server/sql/1.9.20260810/add_qywx_active_contact_lookup_index.sql b/server/sql/1.9.20260810/add_qywx_active_contact_lookup_index.sql new file mode 100644 index 000000000..722866b11 --- /dev/null +++ b/server/sql/1.9.20260810/add_qywx_active_contact_lookup_index.sql @@ -0,0 +1,19 @@ +-- 当前企微标签目录需要按 external_userid 判断客户是否仍有效。 +-- 覆盖 external_userid + delete_time,避免标签聚合逐条回表读取体积较大的客户 JSON 数据。 +SET @idx_external_delete_exists := ( + SELECT COUNT(*) + FROM information_schema.STATISTICS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'zyt_qywx_external_contact' + AND INDEX_NAME = 'idx_external_delete' +); + +SET @add_idx_external_delete_sql := IF( + @idx_external_delete_exists = 0, + 'ALTER TABLE `zyt_qywx_external_contact` ADD INDEX `idx_external_delete` (`external_userid`, `delete_time`)', + 'SELECT 1' +); + +PREPARE add_idx_external_delete_stmt FROM @add_idx_external_delete_sql; +EXECUTE add_idx_external_delete_stmt; +DEALLOCATE PREPARE add_idx_external_delete_stmt; diff --git a/server/tests/CurrentTagChannelProjectionTest.php b/server/tests/CurrentTagChannelProjectionTest.php new file mode 100644 index 000000000..1e3f16203 --- /dev/null +++ b/server/tests/CurrentTagChannelProjectionTest.php @@ -0,0 +1,166 @@ +setAccessible(true); + +$catalog = [ + ['tag_id' => 'tag-a', 'tag_name' => '最新标签 A', 'group_name' => '当前分组', 'customer_count' => 12], + ['tag_id' => 'tag-disabled', 'tag_name' => '当前仍在用', 'group_name' => '当前分组', 'customer_count' => 8], + ['tag_id' => 'tag-new', 'tag_name' => '新发现标签', 'group_name' => '其它', 'customer_count' => 3], +]; +$configured = [ + [ + 'id' => 1, + 'channel_code' => 'stable-a', + 'channel_name' => '人工渠道名', + 'source_tag_id' => 'tag-a', + 'source_tag_name' => '旧标签 A', + 'source_group_name' => '旧分组', + 'status' => 1, + ], + [ + 'id' => 2, + 'channel_code' => 'stable-disabled', + 'channel_name' => '停用时名称', + 'source_tag_id' => 'tag-disabled', + 'source_tag_name' => '停用时名称', + 'source_group_name' => '旧分组', + 'status' => 0, + ], + [ + 'id' => 3, + 'channel_code' => 'legacy-name-only', + 'channel_name' => '历史个人标签', + 'source_tag_id' => '', + 'source_tag_name' => '历史个人标签', + 'source_group_name' => '历史', + 'status' => 1, + ], +]; + +/** @var array> $rows */ +$rows = $mergeMethod->invoke(null, $catalog, $configured); +if (count($rows) !== count($catalog)) { + throw new RuntimeException('Current-tag projection leaked a historical channel or lost a current tag'); +} + +$byTagId = []; +foreach ($rows as $row) { + $byTagId[(string) ($row['source_tag_id'] ?? '')] = $row; +} + +$renamed = $byTagId['tag-a'] ?? null; +if (!is_array($renamed) + || ($renamed['channel_code'] ?? '') !== 'stable-a' + || ($renamed['channel_name'] ?? '') !== '最新标签 A' + || ($renamed['source_tag_name'] ?? '') !== '最新标签 A' + || ($renamed['source_group_name'] ?? '') !== '当前分组' + || ($renamed['customer_count'] ?? 0) !== 12 + || ($renamed['legacy_channel_name'] ?? '') !== '人工渠道名' + || ($renamed['legacy_source_tag_name'] ?? '') !== '旧标签 A') { + throw new RuntimeException('Current tag metadata did not override historical display metadata safely'); +} + +$disabled = $byTagId['tag-disabled'] ?? null; +if (!is_array($disabled) + || ($disabled['channel_code'] ?? '') !== 'stable-disabled' + || ($disabled['channel_name'] ?? '') !== '当前仍在用' + || ($disabled['status'] ?? 0) !== 1) { + throw new RuntimeException('A current WeCom tag was hidden by historical registry status'); +} + +$newTag = $byTagId['tag-new'] ?? null; +if (!is_array($newTag) + || ($newTag['channel_code'] ?? '') !== 'tag_tag-new' + || ($newTag['channel_name'] ?? '') !== '新发现标签') { + throw new RuntimeException('A current unregistered tag did not receive its deterministic channel code'); +} + +if (isset($byTagId['']) || in_array('legacy-name-only', array_column($rows, 'channel_code'), true)) { + throw new RuntimeException('Historical name-only channels must not appear in the current-tag projection'); +} + +if (in_array('--integration', $argv, true)) { + $app = new think\App(); + $app->initialize(); + + $startedAt = microtime(true); + $currentCatalog = MediaChannelService::getCurrentTagCatalog(); + $catalogElapsedMs = round((microtime(true) - $startedAt) * 1000, 1); + $optionsStartedAt = microtime(true); + $currentOptions = MediaChannelService::getCurrentTagOptions(); + $optionsElapsedMs = round((microtime(true) - $optionsStartedAt) * 1000, 1); + $statsStartedAt = microtime(true); + $tagStats = CustomerLogic::getTagStats(); + $statsElapsedMs = round((microtime(true) - $statsStartedAt) * 1000, 1); + $elapsedMs = round((microtime(true) - $startedAt) * 1000, 1); + + $catalogById = []; + foreach ($currentCatalog as $tag) { + $catalogById[(string) ($tag['tag_id'] ?? '')] = $tag; + } + $statsById = []; + foreach ($tagStats['groups'] ?? [] as $group) { + foreach ($group['tags'] ?? [] as $tag) { + $statsById[(string) ($tag['tag_id'] ?? '')] = [ + 'tag_name' => (string) ($tag['tag_name'] ?? ''), + 'group_name' => (string) ($group['group_name'] ?? ''), + 'customer_count' => (int) ($tag['customer_count'] ?? 0), + ]; + } + } + + if (count($catalogById) !== count($currentCatalog) + || count($currentOptions) !== count($currentCatalog) + || count($statsById) !== count($currentCatalog)) { + throw new RuntimeException('Current catalog, qywx tag stats, and first-visit options are not one-to-one'); + } + + foreach ($currentOptions as $option) { + $tagId = (string) ($option['tag_id'] ?? ''); + $catalogTag = $catalogById[$tagId] ?? null; + if (!is_array($catalogTag) + || ($option['name'] ?? '') !== ($catalogTag['tag_name'] ?? '') + || ($option['group_name'] ?? '') !== ($catalogTag['group_name'] ?? '') + || ($option['customer_count'] ?? 0) !== ($catalogTag['customer_count'] ?? 0) + || MediaChannelService::getCurrentTagChannelByCode((string) ($option['code'] ?? '')) === null) { + throw new RuntimeException("First-visit option {$tagId} differs from the current qywx tag catalog"); + } + } + + foreach ($catalogById as $tagId => $catalogTag) { + $statsTag = $statsById[$tagId] ?? null; + if (!is_array($statsTag) + || $statsTag['tag_name'] !== (string) ($catalogTag['tag_name'] ?? '') + || $statsTag['group_name'] !== (string) ($catalogTag['group_name'] ?? '') + || $statsTag['customer_count'] !== (int) ($catalogTag['customer_count'] ?? 0)) { + throw new RuntimeException("Qywx tag stats {$tagId} differs from the shared current catalog"); + } + } + + echo json_encode([ + 'current_tag_count' => count($currentCatalog), + 'first_visit_option_count' => count($currentOptions), + 'qywx_tag_count' => count($statsById), + 'matching_4' => array_values(array_map( + static fn (array $option): string => (string) ($option['name'] ?? ''), + array_filter( + $currentOptions, + static fn (array $option): bool => mb_strpos((string) ($option['name'] ?? ''), '4') !== false + ) + )), + 'catalog_ms' => $catalogElapsedMs, + 'options_ms' => $optionsElapsedMs, + 'qywx_stats_ms' => $statsElapsedMs, + 'elapsed_ms' => $elapsedMs, + ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), "\n"; +} + +echo "CURRENT_TAG_CHANNEL_PROJECTION_OK\n";

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 literal 0 HcmV?d00001 diff --git a/app/artifacts/ui_acceptance/10_login_server_settings_1280x800.png b/app/artifacts/ui_acceptance/10_login_server_settings_1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..034eef586dc218beda9828910d143bd001b03604 GIT binary patch literal 83205 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�#y(NQiTQ6i! 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%0Dq$TH!lF!747qP^S#@D(a;RQ5AgNj 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 TbF%JfeDbO{f+cK+GG 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 + + + + com.apple.security.device.camera + + com.apple.security.device.audio-input + + com.apple.security.device.microphone + + com.apple.security.network.client + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.disable-library-validation + + + diff --git a/app/packaging/windows/start_release.bat b/app/packaging/windows/start_release.bat new file mode 100644 index 000000000..61e9e8ad7 --- /dev/null +++ b/app/packaging/windows/start_release.bat @@ -0,0 +1,19 @@ +@echo off +setlocal EnableExtensions DisableDelayedExpansion +set "APPLICATION=%~dp0DoctorWorkstation\DoctorWorkstation.exe" + +if not exist "%APPLICATION%" ( + echo DoctorWorkstation.exe was not found. + echo Please keep this launcher beside the DoctorWorkstation folder. + pause + exit /b 1 +) + +start "" "%APPLICATION%" +if errorlevel 1 ( + echo DoctorWorkstation failed to start. + pause + exit /b 1 +) + +exit /b 0 diff --git a/app/packaging/windows/version_info.txt b/app/packaging/windows/version_info.txt new file mode 100644 index 000000000..dd3c7d942 --- /dev/null +++ b/app/packaging/windows/version_info.txt @@ -0,0 +1,31 @@ +# UTF-8 +# Example PyInstaller version resource. Update all four version tuples together. +VSVersionInfo( + ffi=FixedFileInfo( + filevers=(0, 1, 0, 0), + prodvers=(0, 1, 0, 0), + mask=0x3f, + flags=0x0, + OS=0x40004, + fileType=0x1, + subtype=0x0, + date=(0, 0) + ), + kids=[ + StringFileInfo([ + StringTable( + '080404B0', + [ + StringStruct('CompanyName', 'ZYT'), + StringStruct('FileDescription', '医生工作台'), + StringStruct('FileVersion', '0.1.0.0'), + StringStruct('InternalName', 'DoctorWorkstation'), + StringStruct('OriginalFilename', 'DoctorWorkstation.exe'), + StringStruct('ProductName', '医生工作台'), + StringStruct('ProductVersion', '0.1.0.0') + ] + ) + ]), + VarFileInfo([VarStruct('Translation', [2052, 1200])]) + ] +) diff --git a/app/pyproject.toml b/app/pyproject.toml new file mode 100644 index 000000000..554381363 --- /dev/null +++ b/app/pyproject.toml @@ -0,0 +1,49 @@ +[build-system] +requires = ["hatchling>=1.25"] +build-backend = "hatchling.build" + +[project] +name = "zhenyang-doctor-workstation" +version = "0.1.0" +description = "Cross-platform doctor consultation workstation for Windows and macOS" +readme = "README.md" +requires-python = ">=3.11" +license = { text = "Proprietary" } +authors = [{ name = "Zhenyangtang" }] +dependencies = [ + "httpx>=0.27.2,<1", + "keyring>=25.5,<26", + "platformdirs>=4.3,<5", + "PySide6>=6.8.2,<7", + "python-dotenv>=1.0.1,<2", +] + +[project.optional-dependencies] +dev = [ + "pytest>=8.3,<9", + "pytest-cov>=6,<7", + "ruff>=0.9,<1", +] +build = [ + "pyinstaller>=6.11,<7", +] + +[project.scripts] +doctor-workstation = "doctor_workstation.app:main" + +[tool.hatch.build.targets.wheel] +packages = ["src/doctor_workstation"] + +[tool.pytest.ini_options] +addopts = "-q" +pythonpath = ["src"] +testpaths = ["tests"] + +[tool.ruff] +line-length = 100 +target-version = "py311" + +[tool.ruff.lint] +select = ["E", "F", "I", "UP", "B", "SIM"] +ignore = ["E501"] + diff --git a/app/research/admin_audit.md b/app/research/admin_audit.md new file mode 100644 index 000000000..4bbef5a9b --- /dev/null +++ b/app/research/admin_audit.md @@ -0,0 +1,820 @@ +# admin 医生端源码审计 + +审计日期:2026-08-10 +参考项目:D:\web\zyt\admin +审计方式:只读检查 Vue/TypeScript 源码、API 封装、路由守卫、Pinia store、业务组件和权限判断;未修改 admin 项目,也未把 README 当作结论来源。 + +## 1. 结论摘要 + +1. admin 是 Vue 3 + TypeScript + Vite + Element Plus + Pinia 项目。医生端并不是一套独立的静态路由:除登录、H5 诊单和只读诊单外,页面路径、标题、组件和菜单权限都由登录后 GET /adminapi/auth.admin/mySelf 返回的 menu 动态注入。 +2. 医生相关页面的全局状态很少。Pinia 只持有认证用户、权限、动态菜单、全局站点配置、布局与多标签;接诊台、处方、患者、问诊列表的查询条件和业务状态均保留在各页面的 ref/reactive 中,分页统一使用 usePaging。 +3. “患者列表”有两个不同实现: + - 医生/一诊工作台的“我的患者”:src/views/first_visit/my_patients/index.vue,带患者、订单、面诊进度三个工作区,服务端按当前角色和部门数据范围收窄。 + - 平台注册用户列表:src/views/consumer/lists/index.vue,仅展示头像、昵称、账号、手机号、渠道和注册时间,不是医生业务患者工作台。 +4. “问诊列表”也有两个相关实现: + - 挂号/问诊执行列表:src/views/tcm/appointment/list.vue,默认“今天 + 待接诊”,支持通话、视频二维码、完成、开方、取消。 + - 诊单/患者业务列表:src/views/tcm/diagnosis/index.vue,围绕诊单、挂号、确认、开方、医助指派、二维码和视频旁观。 + 最终菜单叫什么、URL 是什么取决于后端 menu 配置,不应仅根据文件名硬编码。 +5. 实际视频问诊主链是 src/components/chat-dialog/index.vue:腾讯云 Chat UIKit 单聊 + TUICallKit 音视频;通话前后还串联后端通话记录、TRTC 房间绑定、云端混流录制、可选浏览器本地录制、截屏写医生备注。src/components/video-call/index.vue 是另一套旧/独立实现,目前源码中没有被任何页面引用。 +6. 处方领域要区分三类对象: + - 处方库模板:tcm.prescriptionLibrary,供医生复用药材组合。 + - 已开处方:tcm.prescription,处方笺、患者、医师签名、主辅方、审核与作废。 + - 处方业务订单:tcm.prescriptionOrder,收货、费用、双审、支付单、药房和物流履约;它不是支付单 zyt_order。 + +## 2. 关键源码与路由 + +### 2.1 页面定位 + +| 业务 | 关键源文件(绝对路径) | 路由结论 | +|---|---|---| +| 登录 | D:\web\zyt\admin\src\views\account\login.vue | 静态精确路由 /login | +| 接诊台 | D:\web\zyt\admin\src\views\patient\reception\index.vue | 动态菜单组件键应指向 patient/reception/index;实际 URL 取 menu[].paths | +| 我的处方库 | D:\web\zyt\admin\src\views\consumer\prescription\list.vue | 动态菜单组件键应指向 consumer/prescription/list;实际 URL 取 menu[].paths | +| 药品库(不是处方库) | D:\web\zyt\admin\src\views\doctor\medicine.vue | 动态菜单组件键应指向 doctor/medicine | +| 已开处方/处方管理 | D:\web\zyt\admin\src\views\consumer\prescription\index.vue | 动态菜单组件键应指向 consumer/prescription/index | +| 处方业务订单 | D:\web\zyt\admin\src\views\consumer\prescription\order_list.vue | 动态菜单组件键应指向 consumer/prescription/order_list | +| 我的患者 | D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue | 动态菜单组件键应指向 first_visit/my_patients/index | +| 平台用户列表 | D:\web\zyt\admin\src\views\consumer\lists\index.vue | 动态菜单组件键应指向 consumer/lists/index | +| 问诊/挂号列表 | D:\web\zyt\admin\src\views\tcm\appointment\list.vue | 动态菜单组件键应指向 tcm/appointment/list | +| 诊单列表 | D:\web\zyt\admin\src\views\tcm\diagnosis\index.vue | 动态菜单组件键应指向 tcm/diagnosis/index;另有静态 H5 路由 /tcm/diagnosis/h5 | +| 诊单编辑/只读抽屉 | D:\web\zyt\admin\src\views\tcm\diagnosis\edit.vue | 被多个页面异步复用,不一定是独立菜单 | +| 患者只读详情 | D:\web\zyt\admin\src\views\tcm\diagnosis\readonly.vue | 静态精确路由 /tcm/diagnosis-readonly?id=诊单ID | +| 预约视频问诊 | D:\web\zyt\admin\src\views\tcm\diagnosis\appointment.vue | 抽屉组件,由诊单列表/我的患者调用 | +| 诊间开方 | D:\web\zyt\admin\src\components\tcm-prescription\index.vue | 复用组件,由问诊列表和诊单编辑调用 | +| 聊天与视频问诊 | D:\web\zyt\admin\src\components\chat-dialog\index.vue | 浮动组件,由接诊台及问诊列表调用 | +| 医助视频旁观 | D:\web\zyt\admin\src\views\tcm\diagnosis\components\AssistantWatchCallDialog.vue | 诊单列表内异步组件 | + +### 2.2 动态路由机制 + +关键文件: + +- D:\web\zyt\admin\src\router\routes.ts +- D:\web\zyt\admin\src\router\index.ts +- D:\web\zyt\admin\src\permission.ts +- D:\web\zyt\admin\src\stores\modules\user.ts + +流程: + +1. 常量路由只注册 /login、/403、/change-password、/bind-work-wechat、/user/setting、/doctor/progress、/tcm/diagnosis/h5 和 /tcm/diagnosis-readonly 等少数页面。 +2. 登录成功后 GET /auth.admin/mySelf。 +3. user store 保存 data.user、data.permissions,并把 data.menu 交给 filterAsyncRoutes。 +4. 每个后端菜单项使用以下字段转为 Vue Router: + - paths:路由路径; + - component:src/views 下的组件键; + - name:菜单标题; + - perms:写入 route.meta.perms; + - is_show:控制 meta.hidden; + - is_cache:控制 keepAlive; + - params:默认 query; + - selected:activeMenu; + - type:目录或菜单。 +5. permission.ts 把转换后的路由动态挂到根布局;第一个可见菜单成为 / 的重定向目标。 + +因此,本仓库源码能确定组件和静态路由,但不能单独确定接诊台、处方库、已开处方、我的患者、问诊列表的生产 URL 与菜单标题。要得到精确值,必须取得当前环境 /auth.admin/mySelf 的 menu 响应或检查服务端菜单表。 + +## 3. 登录、认证、权限和状态管理 + +### 3.1 登录链路 + +关键文件: + +- D:\web\zyt\admin\src\views\account\login.vue +- D:\web\zyt\admin\src\api\user.ts +- D:\web\zyt\admin\src\stores\modules\user.ts +- D:\web\zyt\admin\src\utils\request\index.ts +- D:\web\zyt\admin\src\utils\auth.ts + +账号密码: + +- POST /login/account +- 请求:account、password、terminal=1。 +- 响应被页面使用的字段:token、is_paw、need_bind_work_wechat。 +- token 写入本地缓存键 token,后续请求通过请求拦截器放到 HTTP 头 token。 +- “记住账号”只缓存 account,不缓存密码,缓存键为 account。 + +企业微信: + +- GET /login/workWechatConfig,使用 enabled、corp_id、agent_id。 +- 企业微信内置浏览器走 OAuth,scope=snsapi_privateinfo、state=admin_login。 +- 普通浏览器动态加载 https://wwcdn.weixin.qq.com/node/wework/wwopen/js/wwLogin-1.2.7.js 显示扫码登录。 +- 回调 code 通过 POST /login/workWechatLogin,参数 code、terminal=1。 +- 另有 POST /auth.admin/bindWorkWechat、POST /auth.admin/unbindWorkWechat。 + +守卫: + +- is_paw=0 强制跳转 /change-password,并通过 POST /login/changeFirstPassword 修改。 +- need_bind_work_wechat=true 强制进入 /bind-work-wechat。 +- 没有 token 的非白名单路由跳 /login?redirect=原地址。 +- /auth.admin/mySelf 没有任何有效菜单时清认证并跳 /403。 +- 响应码约定:1 成功、0 失败、-1 登录失效、10 需要绑定企微、2 打开新页面、-2 未安装。 + +### 3.2 Pinia 与页面状态 + +| Store/Hook | 文件 | 职责 | +|---|---|---| +| user | D:\web\zyt\admin\src\stores\modules\user.ts | token、userInfo、routes、perms、isPaw;登录、退出、企微登录、加载个人信息 | +| app | D:\web\zyt\admin\src\stores\modules\app.ts | 网站配置、OSS 图片地址、移动端/侧栏状态、视图刷新 | +| tabs | D:\web\zyt\admin\src\stores\modules\multipleTabs.ts | 多标签与 keep-alive 缓存 | +| setting | D:\web\zyt\admin\src\stores\modules\setting.ts | 本地布局、主题配置 | +| usePaging | D:\web\zyt\admin\src\hooks\usePaging.ts | 页码、page_size、loading、count、lists、extend;支持 silent 静默刷新 | + +列表接口统一期待服务端 data 为: + +- lists:当前页数组; +- count:总数; +- extend:额外统计、日期、权限范围等扩展数据。 + +页面内筛选和弹窗状态不进入 Pinia。这一约定适合桌面端复用:认证/权限做全局 store,业务工作台保持页面级 store 或 view-model。 + +### 3.3 权限判断语义 + +关键文件: + +- D:\web\zyt\admin\src\install\directives\perms.ts +- D:\web\zyt\admin\src\utils\perm.ts + +需要特别注意两套语义不同: + +- v-perms 数组是“任一权限命中即可显示”(OR)。 +- hasPermission 数组是“数组内每个权限都必须存在”(AND)。 +- permissions 含星号时视为全部权限。 + +多数业务调用只传单个权限,因此差异暂时不明显;复用时不要把多权限数组在两处互换。 + +## 4. 业务页面审计 + +### 4.1 接诊台 + +源码: + +- D:\web\zyt\admin\src\views\patient\reception\index.vue +- D:\web\zyt\admin\src\api\patient.ts +- D:\web\zyt\admin\src\views\tcm\diagnosis\components\PatientInfoCard.vue +- D:\web\zyt\admin\src\views\tcm\diagnosis\components\PatientCaseCard.vue +- D:\web\zyt\admin\src\views\tcm\diagnosis\components\DailyMatrix.vue +- D:\web\zyt\admin\src\views\patient\reception\components\NoteTimeline.vue + +页面行为: + +- 默认显示当天 status=1 待接诊;可切到 status=4 已过号。 +- 搜索字段 patient_name;分页 page_no/page_size,固定每页 15。 +- 每 5 秒静默刷新队列和已选患者详情;页面隐藏时暂停,恢复可见后立即刷新。 +- 队列使用无限滚动,并按 id 去重。 +- 队列行主要字段:id、patient_id、patient_name、patient_phone、diagnosis_id、doctor_id/name、assistant_id/name、appointment_date/time、gender、age、status/status_desc、has_prescription、remark。 +- 详情结构按源码使用为: + - appointment:挂号; + - diagnosis:诊单/病例; + - doctor_notes:医生备注、舌苔和报告。 +- 日常记录不依赖 reception 响应完整下发,而由 DailyMatrix 继续按 diagnosis_id 调 trackingWindow/trackingNotes。 + +操作: + +- 通知医助:POST /doctor.appointment/notifyAssistant,参数 id=挂号ID。 +- 发起通话:先 POST /tcm.diagnosis/getCallSignature,参数 patient_id、diagnosis_id,再打开 ChatDialog。 +- 备注:POST /doctor.appointment/addDoctorNote,参数 diagnosis_id、content,可追加 tongue_images、report_files。 +- 编辑病历:复用 tcm/diagnosis/edit.vue。 +- 完成接诊:POST /doctor.appointment/complete,参数 id=挂号ID;页面允许 status=1 或 4。 + +权限: + +- doctor.appointment/addDoctorNote +- tcm.diagnosis/edit +- doctor.appointment/complete + +源码中的“通知医助”和“发起通话”按钮没有 v-perms;只能依赖页面菜单权限和后端接口鉴权,桌面端若拆成独立入口应补显式能力判断。 + +### 4.2 我的处方库 + +源码: + +- D:\web\zyt\admin\src\views\consumer\prescription\list.vue +- D:\web\zyt\admin\src\api\tcm.ts +- D:\web\zyt\admin\src\components\medicine-name-select\index.vue + +模型与筛选: + +- 查询:prescription_name、formula_type(主方/辅方)、is_public(0 仅自己、1 所有人)。 +- 列表:id、prescription_name、formula_type、herbs、is_public、disable_edit、creator_id/name、create_time。 +- herbs 项:medicine_id(可选)、name、dosage。 +- 编辑:id、prescription_name、formula_type、herbs、is_public、disable_edit。 +- disable_edit=1 表示导入模板后锁定整张处方的药材,不可增删改,只能再次导入覆盖。 + +接口: + +- GET /tcm.prescriptionLibrary/lists +- POST /tcm.prescriptionLibrary/add +- POST /tcm.prescriptionLibrary/edit +- POST /tcm.prescriptionLibrary/delete,参数 id +- GET /tcm.prescriptionLibrary/detail,参数 id(API 已封装,但当前列表弹窗直接使用行数据) + +权限: + +- wcf.prescription/add +- wcf.prescription/read +- wcf.prescription/edit +- wcf.prescription/delete + +所有权: + +- 普通用户只可编辑/删除 creator_id 等于当前 userInfo.id 的模板。 +- root=1 或 role_ids 包含 0、3 可管理全部模板。 +- 诊间/已开处方导入模板时会额外传 prescribing_creator_id,通常取处方 creator_id,新增时取当前登录用户 id。 + +### 4.3 药品库(容易和处方库混淆) + +源码:D:\web\zyt\admin\src\views\doctor\medicine.vue + +接口: + +- GET /doctor.medicine/lists +- POST /doctor.medicine/add +- POST /doctor.medicine/edit +- POST /doctor.medicine/delete +- GET /doctor.medicine/detail + +模型: + +- id、name、supplier、unit、settlement_price、retail_price、stock、image、status、remark。 +- 图片上传直接 POST 到 VITE_APP_BASE_URL + /api/upload/image,并携带 token 头。 + +当前页面的增删改按钮没有 v-perms。它是药材主数据管理,不应直接当作“我的处方库”复刻。 + +### 4.4 已开处方/处方管理 + +源码: + +- D:\web\zyt\admin\src\views\consumer\prescription\index.vue +- D:\web\zyt\admin\src\components\tcm-prescription\index.vue +- D:\web\zyt\admin\src\api\tcm.ts + +列表筛选: + +- sn:处方编号模糊查; +- patient_name; +- creator_ids:开方医师多选; +- audit_filter:all、pending、passed、not_passed、rejected; +- source_filter:all、manual、system; +- start_time、end_time(按创建时间)。 + +列表核心字段: + +- id、sn、prescription_type; +- is_system_auto:0 手工、1 空白处方/系统代开; +- patient_name、gender、age、phone; +- audit_status、audit_remark、business_prescription_audit_rejected、business_prescription_audit_remark; +- void_status、void_by_name、void_time; +- doctor_name、creator_id、assistant_name、prescription_date、create_time; +- has_prescription_order。 + +处方编辑/详情模型: + +- 关联:id、diagnosis_id、creator_id。 +- 患者:patient_name、gender、age、visit_no、prescription_date。 +- 诊断:tongue、tongue_image、pulse、pulse_condition、clinical_diagnosis。 +- 药材:herbs,每项 medicine_id、name、dosage、formula_type(主方/辅方)、locked。 +- 剂型/用法:prescription_type、dosage_amount、dosage_unit、dosage_bag_count、need_decoction、bags_per_dose、dose_count、dose_unit、usage_days、times_per_day、usage_instruction、usage_time、usage_way、dietary_taboo、usage_notes。 +- 辅方用法 aux_usage:dosage_amount、dosage_bag_count、need_decoction、bags_per_dose、times_per_day、usage_days、prescription_name(部分页面保留模板名)。 +- 医师:doctor_name、doctor_signature(PNG data URL,保存前必填)。 +- 可见性/审核:is_shared、visible_role_ids、audit_status、audit_time、audit_by_name、audit_remark。 + +状态规则: + +- audit_status:0 待审核、1 已通过、2 已驳回。 +- 驳回处方会同时作废。 +- “已通过且未作废”的有效处方不能普通编辑/删除。 +- 新增时前端强制 audit_status=0;编辑保存后提示重新进入待审核。 +- 诊间开方组件会保存 case_record 病历快照,并在已有 appointment_id 处方时直接进入只读查看。 +- 已存在业务订单时,诊间组件禁止作废处方。 + +主要接口: + +- GET /tcm.prescription/lists +- GET /tcm.prescription/detail,参数 id +- POST /tcm.prescription/add +- POST /tcm.prescription/edit +- POST /tcm.prescription/delete,参数 id +- POST /tcm.prescription/patchPatient,参数 id、patient_name、phone、gender +- POST /tcm.prescription/audit,参数 id、action=approve|reject、remark +- POST /tcm.prescription/void,参数 id +- GET /tcm.prescription/listByDiagnosis,参数 diagnosis_id +- GET /tcm.prescription/getByAppointment,参数 appointment_id + +权限: + +- cf.prescription/add、read、edit、audit、del +- tcm.prescription/patchPatient +- tcm.prescriptionLibrary/lists +- tcm.prescriptionOrder/create、lists、setShipMode +- finance.account_log/lists +- tcm.prescriptionOrder/editRemarkExtra + +角色补充:消费者处方页将 root 或 role_ids 0、3 视为可审核角色;仍应以后端和 cf.prescription/audit 为最终判定。 + +### 4.5 处方业务订单 + +源码: + +- D:\web\zyt\admin\src\views\consumer\prescription\order_list.vue +- D:\web\zyt\admin\src\views\consumer\prescription\components\PrescriptionOrderDetailDrawer.vue +- D:\web\zyt\admin\src\views\consumer\prescription\components\prescription-order-utils.ts + +此页面是已开处方的相邻履约域。核心字段: + +- id、order_no、prescription_id、diagnosis_id; +- recipient_name、recipient_phone、region、shipping_address; +- fee_type、amount、internal_cost; +- prescription_audit_status、payment_slip_audit_status; +- fulfillment_status; +- linked_pay_order_count、linked_pay_order_id、linked_pay_paid_total; +- medication_days、service_channel、service_package; +- express_company、tracking_number、ship_mode; +- doctor_name、creator_id/name、assistant_id; +- remark_extra、remark_assistant; +- 药房提交号和状态。 + +审核状态统一为 0 待审核、1 已通过、2 已驳回。履约状态: + +- 1 待双审通过 +- 2 待发货 +- 3 已完成 +- 4 已取消 +- 5 已发货 +- 6 已签收 +- 7 进行中 +- 8 暂不制药 +- 9 拒收 +- 10 退款 +- 11 保留药方 +- 12 制药缓发 + +核心接口: + +- GET /tcm.prescriptionOrder/lists、detail、paidPayOrders、logs、logisticsTrace、export +- POST /tcm.prescriptionOrder/create、edit、withdraw、ddcode +- POST /tcm.prescriptionOrder/auditPrescription、auditPayment、revokeRxAudit、revokePayAudit +- POST /tcm.prescriptionOrder/ship、complete、refund、requestCompletion +- POST /tcm.prescriptionOrder/addPayOrder、linkPayOrder +- POST /tcm.prescriptionOrder/patchPrescriptionPatient、patchPrescriptionUsage、updateAmount +- POST /tcm.prescriptionOrder/setShipMode、uploadToPharmacy +- POST /tcm.prescriptionOrder/submitGancaoRecipel、previewGancaoRecipel、confirmGancaoSubmission +- POST /tcm.prescriptionOrder/batchAssignAssistant、addLog + +主要权限: + +- tcm.prescriptionOrder/detail、edit、export、ddcode、ship、addPayOrder、complete、refund、withdraw +- tcm.prescriptionOrder/auditPrescription、auditPayment +- tcm.prescriptionOrder/setShipMode、uploadToPharmacy、editRemarkExtra +- finance.account_log/lists、prescription.order/finance + +前端还存在角色级显示规则: + +- role 2:医助; +- role 6:下单角色; +- role 3、8:下单筛选豁免; +- role 0、3、6:财务字段; +- role 0、3:可绕过双审后的创建人编辑锁、可批量改派; +- 业务订单处方审核角色在共享工具中为 0、3、6。 + +这些数字与服务端配置耦合,不宜在新客户端再次散落硬编码。 + +### 4.6 我的患者 + +首选医生端实现: + +- D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue +- D:\web\zyt\admin\src\api\first_visit.ts + +页面结构: + +- “患者列表”“订单管理”“面诊进度”三个工作区。 +- 筛选 keyword、status_filter、start_date、end_date。 +- status_filter:unbooked 未预约、pending_interview 待面诊、completed 已完成、missed 已过号。 +- 日期快捷:今天、明天、后天、近 7 天、近 30 天、自定义。 +- extend.summary 返回 today/tomorrow/day_after 计数。 +- extend.dates 返回对应日期。 +- extend.scope.label 直接展示后端判定的数据范围。 + +列表使用字段: + +- diagnosis_id 或 id、source_patient_id; +- patient_name、gender_desc、age、phone_masked、has_id_card; +- assistant_id/name; +- appointment_id、appointment_doctor_id/name、appointment_status、appointment_status_text、appointment_time_text; +- revisit_count、confirmed、confirmation_text、diagnosis_date_text。 + +操作与接口: + +- GET /firstvisit.myPatient/lists +- GET /firstvisit.myPatient/assistants +- POST /firstvisit.myPatient/assign:id、assistant_id、is_inherit=0|1 +- POST /firstvisit.myPatient/fillIdCard:id、id_card +- POST /firstvisit.myPatient/createAppointment:预约完整参数 +- POST /firstvisit.myPatient/cancelAppointment:id=挂号ID +- 订单工作区另使用 /firstvisit.myPatient/orders、orderDetail、orderEdit 及双审/发货/退款等受限代理接口。 +- 面诊进度使用 GET /firstvisit.myPatient/progress。 + +权限: + +- tcm.diagnosis/edit +- tcm.diagnosis/readonlyDetail +- tcm.diagnosis/guahao +- tcm.diagnosis/assign + +服务端按当前角色与部门范围裁剪数据;前端不自行拼接 doctor_id 或 department_id 来模拟数据权限。 + +平台用户列表 D:\web\zyt\admin\src\views\consumer\lists\index.vue 使用 GET /user.user/lists,字段是 avatar、nickname、account、mobile、channel、create_time,只适合账号管理,不适合医生患者列表。 + +### 4.7 问诊/挂号列表 + +源码: + +- D:\web\zyt\admin\src\views\tcm\appointment\list.vue +- D:\web\zyt\admin\src\api\doctor.ts + +默认条件: + +- status=1 待接诊; +- start_date=end_date=今天; +- date_preset=today; +- 20 秒静默轮询; +- include_status_counts=1 时从 extend.status_count 一次返回各状态角标。 + +状态: + +- 1 待接诊/已预约 +- 2 已取消 +- 3 已完成 +- 4 已过号 + +筛选: + +- patient_name、doctor_name; +- status; +- start_date、end_date、date_preset; +- diagnosis_confirmed; +- assistant_dept_id(选父部门含子级)。 + +行字段: + +- id、patient_id、diagnosis_id; +- patient_name、patient_phone、gender、age、height、weight; +- doctor_id/name、assistant_name; +- appointment_date、appointment_time、period; +- diagnosis_confirmed; +- has_prescription、prescription_is_system_auto、prescription_audit_status、prescription_void_status; +- status/status_desc、remark。 + +操作: + +- 编辑患者:复用诊单编辑抽屉。 +- 视频二维码:生成小程序码。 +- 通话:获取签名并打开 ChatDialog。 +- 完成:POST /doctor.appointment/complete,可同时 POST addDoctorNote。 +- 开方/查看:复用 TcmPrescription;有效已审核处方显示“查看”。 +- 取消:POST /doctor.appointment/cancel。 + +权限: + +- tcm.diagnosis/edit +- tcm.diagnosis/videoQr +- doctor.appointment/prescription +- doctor.appointment/complete +- tcm.diagnosis/kaifang +- doctor.appointment/cancel +- doctor.appointment/addDoctorNote(完成时备注能力) + +角色判断:role_id 为 1 医生、2 医助;两者之外才显示医生姓名筛选。此处同时兼容 role_id 单值或数组,但其他页面多使用 role_ids,说明 user 模型尚未完全统一。 + +### 4.8 诊单列表 + +源码: + +- D:\web\zyt\admin\src\views\tcm\diagnosis\index.vue +- D:\web\zyt\admin\src\views\tcm\diagnosis\edit.vue +- D:\web\zyt\admin\src\views\tcm\diagnosis\readonly.vue + +列表筛选字段: + +- keyword、diagnosis_type、syndrome_type、assistant_id; +- diagnosis_confirmed、appointment_date、has_appointment; +- latest_appointment_start_date/end_date/channel_source; +- latest_assign_start_date/end_date; +- pending_booking、completed_appointment、pending_assign; +- pending_assign_order_month、pending_assign_keyword; +- sort_unserved_days。 + +列表使用字段: + +- id、patient_name、gender_desc、age; +- assistant_id/assistant、assign_read_at; +- appointments 或聚合的 appointment_doctor_name、appointment_time_text、appointment_status; +- has_appointment、diagnosis_confirmed; +- has_prescription、followup_time_text、followup_doctor_name、followup_rx_voided; +- unserved_days、last_blood_record_at; +- video_call_hint。 + +video_call_hint: + +- state:none、pending_room、live 等; +- label; +- start_time、end_time。 + +操作权限: + +- tcm.diagnosis/add、edit、delete、readonlyDetail +- tcm.diagnosis/assign +- tcm.diagnosis/kaifang +- tcm.diagnosis/guahao、guahaoLogList +- tcm.diagnosis/videoQr +- tcm.diagnosis/order +- tcm.diagnosis/watchCall + +诊单编辑模型的核心字段: + +- 标识:id、patient_id。 +- 患者:patient_name、id_card、phone、gender、age、marital_status、height、weight、region。 +- 诊断:diagnosis_date、diagnosis_type、syndrome_type、diabetes_type、diabetes_discovery_year、local_hospital_diagnosis、local_hospital_name。 +- 指标:systolic_pressure、diastolic_pressure、fasting_blood_sugar。 +- 现病史多选:appetite、water_intake、diet_condition、weight_change、body_feeling、sleep_condition、eye_condition、head_feeling、sweat_condition、skin_condition、urine_condition、stool_condition、kidney_condition、fatty_liver_degree。 +- 既往史:past_history、trauma_history、surgery_history、allergy_history、family_history、pregnancy_history。 +- 医疗内容:symptoms、tongue_coating、pulse、treatment_principle、prescription、doctor_advice、remark、current_medications。 +- 归属与来源:assistant_id、status、create_source、show_card、external_userid。 + +详情响应还使用 patient_basic_locked、can_edit_patient_basic、latest_prescription_order。手机号/身份证是否显示明文由 tcm.diagnosis/phonePlain 控制;已有身份证通常只有明文权限才能修改。 + +诊单详情 Tab 权限: + +- tcm.diagnosis/chufang:处方 +- tcm.diagnosis/patientOrders:业务订单 +- tcm.diagnosis/huifang:视频回放 +- tcm.diagnosis/chat:聊天记录 +- tcm.diagnosis/assign 或 detail:指派记录 +- doctor.appointment/lists:挂号记录 +- tcm.diagnosis/dailyRecord:日常记录 + +## 5. 视频问诊完整链路 + +### 5.1 预约 + +源码:D:\web\zyt\admin\src\views\tcm\diagnosis\appointment.vue + +目前预约类型只有 video。请求字段: + +- patient_id +- doctor_id +- appointment_date +- period=all +- appointment_time +- appointment_type=video +- remark +- channel_source +- channel_source_detail + +普通入口 POST /doctor.appointment/create;“我的患者”入口 POST /firstvisit.myPatient/createAppointment。可用时段来自 GET /doctor.appointment/availableSlots,字段 doctor_id、appointment_date、period=all,响应使用 slots[].time、slots[].available。页面还读取医生排班并限制不能重复预约当天 status=1/4 的号。 + +### 5.2 医生发起通话 + +生产主组件:D:\web\zyt\admin\src\components\chat-dialog\index.vue + +1. 页面调用 open({ patientId, patientName, diagnosisId })。 +2. POST /tcm.diagnosis/getCallSignature,请求 patient_id、diagnosis_id。 +3. 响应实际使用: + - sdkAppId + - userId(医生 IM/TRTC user ID) + - userSig + - patientUserId,缺省回退 patient_加患者ID + - assistant_id(群视频邀请) + - isLochostVod(是否启用浏览器本地录制) +4. Chat UIKit 登录并创建与 patientUserId 的 C2C 会话。 +5. TUICallKitServer.init 初始化通话能力;只有成功后才显示 AudioCallPicker、VideoCallPicker 和群视频按钮。 +6. beforeCalling 时 POST /tcm.diagnosis/startCall: + - diagnosis_id + - patient_id + - call_type=2(视频) +7. 呼叫状态进入 calling/connected 后从 TUIStore 或 TUICallEngine 捕获 roomID/strRoomID,再 POST /tcm.diagnosis/bindCallRoom: + - diagnosis_id + - room_id(字符串) +8. bindCallRoom 的响应可带 cloud_recording.started、task_id、message;源码注释说明后端在这里触发腾讯云 CreateCloudRecording,混流模式由后端负责。 +9. 接通后,若 isLochostVod=true,前端从 TUICallKit 视频元素启动 MediaRecorder/Canvas 本地录制。 +10. 通话结束、挂断、IM 自定义挂断消息或用户关闭窗口时先 POST /tcm.diagnosis/endCall,再完成本地视频上传并 POST attachLocalCallRecording。 + +群视频调用 TUICallKitServer.calls,userIDList=[patientUserId, assistant_id],type=VIDEO_CALL。 + +### 5.3 截屏、录制与回放 + +关键文件: + +- D:\web\zyt\admin\src\utils\call-local-recorder.ts +- D:\web\zyt\admin\src\utils\call-video-screenshot.ts +- D:\web\zyt\admin\src\views\tcm\diagnosis\components\CallRecordPanel.vue +- D:\web\zyt\admin\src\views\tcm\diagnosis\components\RecordingPlaybackBlock.vue + +视频浮窗“截屏”会: + +1. 抓取当前 video frame; +2. 上传图片; +3. POST /doctor.appointment/addDoctorNote,把路径追加到 tongue_images。 + +通话记录字段: + +- id、call_type(1 语音、其他视为视频) +- room_id +- status:1 进行中、2 已结束、3 未接听、4 已取消 +- recording_status_text +- recording_urls_list +- start_time_text、end_time_text、duration_text + +接口: + +- GET /tcm.diagnosis/getCallRecords,diagnosis_id +- POST /tcm.diagnosis/attachLocalCallRecording,diagnosis_id、file_url、可选 call_record_id +- POST /tcm.diagnosis/createManualCallRecord,diagnosis_id +- POST /tcm.diagnosis/startCloudRecording,diagnosis_id(API 有封装,主组件当前通过 bindCallRoom 的后端联动启动) + +### 5.4 医助旁观 + +入口在诊单列表。只有同时满足: + +- 当前 userInfo.id 等于该诊单 assistant_id; +- 拥有 tcm.diagnosis/watchCall; +- video_call_hint.state=live; + +才可真正进入。 + +GET /tcm.diagnosis/watchCall,参数 diagnosis_id,响应使用: + +- sdkAppId +- userId +- userSig +- roomId 或 strRoomId +- patientName + +旁观组件直接使用 trtc-sdk-v5 进入房间,只调用 startRemoteVideo,不开启本地摄像头或麦克风。pending_room 时显示入口提示但点击会阻止进入,等待房间号同步。 + +### 5.5 视频二维码 + +页面通过 POST /tcm.diagnosis/generateMiniProgramQrcode 生成 qrcode_url,常用字段: + +- diagnosis_id +- patient_id +- doctor_id(部分入口) +- share_user_id +- mini_program_path=pages/login/login(问诊列表入口) + +调用前先 GET 小程序配置并校验 app_id。 + +## 6. API 总表 + +所有 URL 会被请求层加上 baseUrl 和 adminapi 前缀;下表写的是 API 封装中的业务路径。 + +### 6.1 认证 + +| 方法 | 路径 | 关键请求/响应 | +|---|---|---| +| POST | /login/account | account、password、terminal;返回 token、is_paw、need_bind_work_wechat | +| POST | /login/workWechatLogin | code、terminal;返回同登录结果 | +| GET | /login/workWechatConfig | enabled、corp_id、agent_id | +| GET | /auth.admin/mySelf | 返回 user、permissions、menu | +| POST | /login/logout | 退出 | +| POST | /login/changeFirstPassword | password、password_confirm | +| POST | /auth.admin/bindWorkWechat | code | + +### 6.2 挂号与接诊 + +| 方法 | 路径 | 关键字段 | +|---|---|---| +| GET | /doctor.appointment/lists | status、start_date、end_date、patient_name、doctor_name、diagnosis_confirmed、assistant_dept_id、page_no、page_size | +| GET | /doctor.appointment/reception | id=挂号ID;返回 appointment、diagnosis、doctor_notes | +| GET | /doctor.appointment/detail | id | +| GET | /doctor.appointment/availableSlots | doctor_id、appointment_date、period | +| POST | /doctor.appointment/create | patient_id、doctor_id、appointment_date/time、appointment_type、渠道等 | +| POST | /doctor.appointment/cancel | id | +| POST | /doctor.appointment/complete | id | +| POST | /doctor.appointment/notifyAssistant | id | +| POST | /doctor.appointment/addDoctorNote | diagnosis_id、content、tongue_images、report_files | +| GET | /doctor.appointment/doctorNotes | diagnosis_id | +| POST | /doctor.appointment/deleteDoctorNoteImage | note_id、image_type、image_path | + +### 6.3 诊单 + +| 方法 | 路径 | 关键字段 | +|---|---|---| +| GET | /tcm.diagnosis/lists | 诊单列表全部筛选 + page_no/page_size;返回 lists/count/extend | +| GET | /tcm.diagnosis/detail | id | +| GET | /tcm.diagnosis/readonlyDetail | id;返回 appointment、diagnosis、unserved_days、last_blood_record_at、doctor_notes | +| POST | /tcm.diagnosis/add | 完整诊单模型 | +| POST | /tcm.diagnosis/edit | 完整诊单模型 | +| POST | /tcm.diagnosis/delete | id | +| POST | /tcm.diagnosis/assign | id、assistant_id、可选 is_inherit;批量场景由前端逐条调用 | +| GET | /tcm.diagnosis/getAssistants | 医助选项 | +| GET | /tcm.diagnosis/getDoctors | 医生选项 | +| POST | /tcm.diagnosis/checkPhone | phone 及排除 id | +| POST | /tcm.diagnosis/checkIdCard | id_card 及排除 id | +| POST | /tcm.diagnosis/fillIdCard | id、id_card | +| GET | /tcm.diagnosis/trackingWindow | id、start_date、end_date | +| GET | /tcm.diagnosis/trackingNotes | diagnosis_id | +| POST | /tcm.diagnosis/addTrackingNote | diagnosis_id、tracking_content | + +### 6.4 处方与业务订单 + +处方、处方库、业务订单接口已在 4.2、4.4、4.5 分节完整列出。实现时必须保留三个资源命名空间,不要把 prescription、prescriptionLibrary、prescriptionOrder 合并成一个“处方”接口。 + +### 6.5 视频 + +| 方法 | 路径 | 关键字段 | +|---|---|---| +| POST | /tcm.diagnosis/getCallSignature | patient_id、diagnosis_id;返回 sdkAppId、userId、userSig、patientUserId、assistant_id、isLochostVod | +| POST | /tcm.diagnosis/startCall | diagnosis_id、patient_id、call_type | +| POST | /tcm.diagnosis/bindCallRoom | diagnosis_id、room_id | +| POST | /tcm.diagnosis/startCloudRecording | diagnosis_id | +| POST | /tcm.diagnosis/endCall | diagnosis_id | +| GET | /tcm.diagnosis/getCallRecords | diagnosis_id | +| POST | /tcm.diagnosis/attachLocalCallRecording | diagnosis_id、file_url、可选 call_record_id | +| POST | /tcm.diagnosis/createManualCallRecord | diagnosis_id | +| GET | /tcm.diagnosis/watchCall | diagnosis_id | +| POST | /tcm.diagnosis/generateMiniProgramQrcode | diagnosis_id、patient_id、doctor_id、share_user_id 等 | + +## 7. 可复用约定 + +1. 请求协议 + - baseURL 来自 VITE_APP_BASE_URL,统一 URL 前缀 adminapi。 + - token 放在名为 token 的请求头,不是 Bearer Authorization。 + - POST 默认把 params 转为 body;GET 使用 params。 + - 标准成功响应是 code=1,业务数据自动解包为 data。 + - GET 网络失败默认最多重试 2 次,POST 不自动重试。 + +2. 列表协议 + - 请求 page_no、page_size。 + - 响应 lists、count、extend。 + - 定时刷新使用 getLists({ silent: true }),避免表格白屏闪烁。 + +3. 标识约定 + - diagnosis_id 是诊单主键。 + - appointment.id 是挂号主键。 + - prescription.id 是处方主键。 + - prescriptionOrder.id 是处方业务订单主键。 + - patientUserId 是腾讯云 IM/TRTC 用户名,通常 patient_加患者标识。 + +4. 隐私 + - 默认手机号 3-4-4 脱敏,身份证保留前 6 后 4。 + - tcm.diagnosis/phonePlain 控制诊单编辑中的明文能力。 + - 数据范围由后端按角色、部门、归属医助裁剪,前端只做 UI 能力门控。 + +5. 复用组件 + - 患者摘要/病例:PatientInfoCard、PatientCaseCard。 + - 日常记录:DailyMatrix。 + - 医生备注:NoteTimeline。 + - 诊单编辑和只读:tcm/diagnosis/edit.vue 的 open、openViewOnly。 + - 处方开立/查看:TcmPrescription 的 open、openById。 + - 视频通讯:ChatDialog 的 open。 + - 业务订单详情:PrescriptionOrderDetailDrawer。 + +6. 状态文本 + - 不建议在新客户端重复定义状态映射。优先抽取 D:\web\zyt\admin\src\views\consumer\prescription\components\prescription-order-utils.ts 中的审核、履约、支付、供货和物流格式化逻辑为共享领域模块。 + +## 8. 未知点、歧义与风险 + +1. 动态菜单缺口:admin 前端仓库没有生产环境 /auth.admin/mySelf 的 menu 数据,因此接诊台、处方库、患者、问诊列表的精确 URL、菜单标题和页面级 route.meta.perms 仍未知。 +2. API 类型不足:tcm.ts、doctor.ts 多数参数和返回值是 any;本文列出的响应字段来自实际页面读取,不等于完整服务端 schema。后续实现应抓取真实响应或检查服务端 DTO。 +3. patient_id 语义有重载: + - 挂号行中 patient_id 常被当作诊单/患者标识; + - 我的患者 openAppointment 又把 diagnosis_id 或 id 同时写进 id 和 patient_id; + - ChatDialog 则把它转换为 patient_前缀的腾讯云用户。 + 新客户端必须先确认数据库实体关系,不能只按字段名推断。 +4. 接诊台发起通话使用 diagnosis_id || row.id;row.id 本身是挂号 ID。若后端要求真正诊单 ID,这个回退可能只在特定历史数据下成立。 +5. 视频二维码参数疑点:tcm/appointment/list.vue 的一个入口把 diagnosis_id 赋为 row.doctor_id,而其他入口使用真正诊单 ID;这很可能是历史兼容或缺陷,应向后端核实后再复用。 +6. 权限命名不统一: + - 处方库用 wcf.prescription/*; + - 已开处方用 cf.prescription/*; + - 新增能力又混用 tcm.prescription/* 与 tcm.prescriptionOrder/*。 + 不能按字符串前缀自动推导资源。 +7. 角色配置存在差异: + - 消费者处方审核页面写死 0、3; + - 业务订单共享工具写死 0、3、6; + - 多处注释都声称与服务端配置一致。 + 最终角色应由服务端下发 capability,避免继续硬编码。 +8. 权限 UI 不是安全边界:部分接诊、药品和通话按钮没有 v-perms;所有写接口必须继续依赖服务端鉴权。 +9. 双 SDK 并存: + - 实际 ChatDialog 使用 @tencentcloud/call-uikit-vue; + - 未引用的 video-call/index.vue 使用 @trtc/calls-uikit-vue; + - 医助旁观直接使用 trtc-sdk-v5。 + 新项目应明确只保留一套主叫/被叫 UI SDK,并将纯 TRTC 旁观作为独立只拉流能力。 +10. src/components/video-call/index.vue 当前没有被任何 Vue/TS 源码引用,不应误认为生产主链。 +11. PatientCaseCard 的 caseTypeLabel 无论 consultation_type 都返回“复诊”,属于明显展示逻辑疑点。 +12. 录制启动/停止部分依赖 TUICallKit 内部 store、引擎属性和方法包装,升级腾讯云 SDK 时风险较高,必须用真实双端通话、拒接、对端挂断、网络中断和房间号延迟场景回归。 +13. 处方业务订单大量前端角色规则与 server/config/project.php 注释耦合;当前审计范围只有 admin 前端,无法验证服务端配置是否已同步。 + +## 9. 面向新医生端的建议映射 + +若新项目要复刻医生工作流,建议按领域而不是按现有目录命名: + +- /login:复用认证协议和企业微信登录。 +- /reception:复用接诊台队列、详情、5 秒静默刷新与 ChatDialog。 +- /prescription-library:复用 prescriptionLibrary 模板及所有权规则。 +- /prescriptions:复用 tcm.prescription 列表、审核、作废、打印/下载。 +- /patients:优先复用 firstvisit.myPatient,而不是 user.user/lists。 +- /consultations:复用 doctor.appointment/lists 的今天待接诊视图。 +- /diagnoses:复用 tcm.diagnosis/lists 的完整诊单工作台。 +- /video-consultation:主叫链路复用 ChatDialog/TUICallKit;医助旁观保持独立 TRTC 只拉流组件。 + +这些建议 URL 是新端的信息架构建议,不是对 admin 当前动态 URL 的断言。 diff --git a/app/research/desktop_architecture.md b/app/research/desktop_architecture.md new file mode 100644 index 000000000..a54d0a7cb --- /dev/null +++ b/app/research/desktop_architecture.md @@ -0,0 +1,461 @@ +# 医生桌面端工程架构与打包方案(Windows / macOS) + +> 结论先行:采用 **Python 3.12 + PySide6 Qt Widgets** 构建原生业务界面,以分层的 `httpx` API client 连接现有后端;会话、权限、离线队列和本地安全存储统一放在 core 层。视频不是整套应用的实现基础,而是独立的可选集成:只有当现有腾讯 TRTC Web 方案无法由原生 SDK 替代时,才在受限的 `QWebEngineView` 中承载单一视频页面。发布使用 **PyInstaller onedir**,Windows 与 macOS 必须在各自原生 CI runner 上分别构建、签名和验收,不能交叉编译。 + +## 1. 已知上下文、边界与待确认项 + +本结论只对 `admin/package.json` 和环境配置做了最小只读核对,没有审计管理端实现。 + +- 管理端以 `VITE_APP_BASE_URL` 注入后端根地址;示例文件故意留空,开发示例注释仅以 `http://127.0.0.1:8080` 举例。现有环境文件还出现了 `https://css.zhenyangtang.com.cn/`、`https://admin.zhenyangtang.com.cn/` 和 60 秒请求超时,但这些地址可能是网关或前端站点,**不能据此认定为稳定的桌面 API 地址**。 +- 管理端依赖包含 Axios、腾讯 TRTC/Call/Chat UI、`hls.js` 和 COS JS SDK。可以据此判断视频、聊天、流媒体和对象存储是潜在集成面,但不能推断接口路径、认证协议、权限码或 RTC 凭证格式。 +- 桌面端不得读取或复用 Vite 环境变量,不得硬编码管理端 URL,也不得在客户端持有 COS Secret、TRTC SecretKey 或任何服务端签名密钥。 + +编码前必须由后端确认以下契约,并固化为 OpenAPI 或最小接口文档: + +1. API 的正式 base URL、版本前缀、响应 envelope、错误码、分页和时间格式。 +2. 登录协议(账号密码、短信、SSO/OIDC 或 Cookie)、access/refresh 生命周期、登出和吊销语义。 +3. `/me` 等当前用户接口返回的医生身份、机构/租户、角色与细粒度权限码。 +4. 预约、患者、病历、处方等写操作的幂等键、乐观锁版本号及审计要求。 +5. 聊天的拉取/推送协议、断线续传游标;COS 上传应由后端提供短期预签名 URL 或临时凭证。 +6. TRTC 房间、`userSig` 等凭证必须由后端短时签发;确认现有 Web 页面能否作为受支持的嵌入入口。 +7. 桌面端的 CORS、代理、私有 CA、设备绑定、强制升级和最低版本策略。 + +在这些问题确认前可以完成壳层、接口抽象和模拟服务器,但不应猜测生产 endpoint。 + +## 2. 目标平台与技术选择 + +### 2.1 建议支持矩阵 + +| 项目 | 首发建议 | 说明 | +| --- | --- | --- | +| Python | CPython 3.12,固定 patch 版本 | 生命周期长,第三方包成熟;每个平台使用相同 minor | +| Windows | Windows 10 22H2 / Windows 11,x86-64 | ARM64 可作为后续独立制品,不与 x64 混装 | +| macOS | macOS 13+,先 arm64,再按客户量增加 x86-64 | 当前 PySide6 wheel 的最低系统版本必须在锁版本时再次核对 | +| UI | PySide6 Qt Widgets | 医疗表单、表格、快捷键、打印和可访问性更稳定 | +| 视频 | 可选 PySide6 Addons / QtWebEngineWidgets | 只隔离承载视频页,不用 WebEngine 包住整个应用 | +| 打包 | PyInstaller onedir | 对 QtWebEngine helper、资源、签名和启动性能最稳妥 | + +macOS 推荐分别产出 `arm64` 与 `x86_64` 制品。`universal2` 只有在 Python、PySide6 和所有二进制依赖均提供 universal2 slice,且真实验证签名/视频后再启用;两个单架构制品更易排障且体积更小。 + +### 2.2 依赖分档 + +建立一份代码、两种构建 profile: + +- `core`:`PySide6-Essentials`、`httpx`、`pydantic`、`pydantic-settings`、`platformdirs`、`keyring`、`cryptography`。包含 QtCore/Gui/Widgets/Network/Sql/Svg/PrintSupport,不包含 WebEngine。 +- `video`:在 core 上增加与 Essentials **完全相同版本**的 `PySide6-Addons`,从而获得 QtWebEngineWidgets、WebChannel、Multimedia 等模块。 +- 开发/测试:`pytest`、`pytest-qt`、`respx`、`coverage`、`ruff`、`mypy`、`pip-audit`。 +- 构建:锁定 `PyInstaller` 及其 hooks 版本。以 2026-08-10 可验证组合为基线,可先验证 Python 3.12 + PySide6 Essentials/Addons 6.11.1 + PyInstaller 6.21.0;只有在两端打包 smoke test 通过后才更新锁。 + +不要同时安装 PyQt、PySide2 或系统级 PySide6;必须从干净虚拟环境构建。使用平台专属、带 hash 的锁文件(例如 `requirements-win-x64.lock`、`requirements-macos-arm64.lock`),而不是在发布任务中直接安装“最新版”。 + +如果所有医生都需要视频,可只发布 `video` 制品;仍保留 profile 边界,以便定位 WebEngine 问题。若视频是少数场景,可以发布 core 制品并在系统浏览器打开受支持的视频页,避免让每个安装包承担 Chromium 的体积和攻击面。 + +## 3. 分层架构 + +依赖方向固定为:`ui -> application -> domain`,`infrastructure` 在 composition root 中实现 domain/application 定义的 port。View 不允许直接调用 `httpx`、SQLite 或 keyring。 + +```text +app/ +├─ pyproject.toml # 项目元数据、依赖分组、工具配置 +├─ requirements/ # 各 OS/架构的发布锁及 hash +├─ src/ +│ └─ zyt_doctor/ +│ ├─ __main__.py # 极薄入口,只调用 bootstrap.main() +│ ├─ bootstrap.py # QApplication、配置、DI、异常钩子、主窗口 +│ ├─ build_info.py # 版本、commit、channel;构建时生成 +│ ├─ config/ +│ │ ├─ models.py # 强类型配置及校验 +│ │ └─ loader.py # defaults -> 受管配置 -> 开发环境变量 +│ ├─ domain/ +│ │ ├─ identity.py # Principal、Tenant、Permission +│ │ ├─ errors.py # 与 UI/HTTP 无关的错误类型 +│ │ └─ ports.py # Repository、Clock、SecretStore 等协议 +│ ├─ application/ +│ │ ├─ commands.py # 写用例、幂等键和确认规则 +│ │ ├─ queries.py # 读用例和缓存策略 +│ │ └─ result.py # Result / Page / OperationState +│ ├─ core/ +│ │ ├─ api/ +│ │ │ ├─ client.py # httpx client、header、超时、重试 +│ │ │ ├─ auth.py # token/cookie adapter 与 refresh single-flight +│ │ │ ├─ errors.py # HTTP/业务错误归一化 +│ │ │ ├─ models.py # 公共 DTO +│ │ │ └─ generated/ # 若有 OpenAPI,生成代码仅放此处 +│ │ ├─ session/ +│ │ │ ├─ manager.py # 会话状态机、锁屏、租户切换、登出清理 +│ │ │ └─ permissions.py # 权限快照与 guard +│ │ ├─ storage/ +│ │ │ ├─ database.py # SQLite、migration、单写线程 +│ │ │ ├─ secure_store.py # Windows Credential Manager / macOS Keychain +│ │ │ └─ cache.py # 加密缓存、TTL、容量控制 +│ │ ├─ offline/ +│ │ │ ├─ connectivity.py # 网络状态提示,不作为唯一真相 +│ │ │ ├─ outbox.py # 离线写队列状态机 +│ │ │ └─ sync.py # 重放、冲突和人工处理 +│ │ ├─ jobs.py # QThreadPool 任务、取消、signal 适配 +│ │ ├─ events.py # 进程内 typed event bus +│ │ ├─ logging.py # 脱敏日志和诊断包 +│ │ └─ paths.py # QStandardPaths/platformdirs;绝不写 bundle +│ ├─ modules/ +│ │ ├─ auth/ +│ │ ├─ dashboard/ +│ │ ├─ patients/ +│ │ ├─ appointments/ +│ │ ├─ consultations/ +│ │ ├─ medical_records/ +│ │ ├─ prescriptions/ +│ │ ├─ chat/ +│ │ ├─ followups/ +│ │ └─ settings/ +│ │ # 每个模块内含 domain.py、service.py、viewmodel.py、views.py、permissions.py +│ ├─ integrations/ +│ │ ├─ realtime/ # WebSocket/轮询 adapter,不侵入模块 +│ │ ├─ object_storage/ # 仅消费后端预签名 URL/临时凭证 +│ │ └─ video/ +│ │ ├─ port.py # join/leave/mute 等抽象 +│ │ ├─ external_browser.py +│ │ └─ webengine.py # 唯一允许 import QtWebEngine 的文件 +│ ├─ ui/ +│ │ ├─ shell/ # 导航、标题栏、全局离线/会话提示 +│ │ ├─ widgets/ # Loading、Empty、Error、PermissionDenied +│ │ ├─ dialogs/ +│ │ └─ theme/ +│ └─ resources/ # qrc、图标、字体许可、翻译、默认配置 +├─ tests/ +│ ├─ unit/ +│ ├─ contract/ +│ ├─ integration/ +│ ├─ ui/ +│ ├─ packaging/ +│ └─ fixtures/ # 全部为合成数据,禁止生产病患数据 +├─ packaging/ +│ ├─ windows/doctor-core.spec +│ ├─ windows/doctor-video.spec +│ ├─ macos/doctor-core.spec +│ ├─ macos/doctor-video.spec +│ ├─ macos/entitlements.plist +│ └─ hooks/ +├─ scripts/ # build、self-check、sign、notarize +└─ docs/ # API 映射、权限矩阵、发布 runbook +``` + +每个业务模块只公开一个 facade 和路由描述,例如 `ModuleDescriptor(id, title, permissions, view_factory)`。主壳根据权限注册菜单,模块内再对按钮和 command 做 guard;这样既不会形成一个巨型主窗口,也不会把权限判断散落在控件代码中。 + +## 4. API client、并发和会话 + +### 4.1 API client + +建议使用一个长生命周期 `httpx.Client`,由 composition root 创建并注入 service。所有同步请求放入 `QThreadPool/QRunnable`,结果通过 Qt signal 回到主线程;严禁 UI 线程阻塞网络。窗口关闭或查询条件变化时取消尚未开始的任务,并忽略带旧 generation id 的晚到响应。 + +Client 的固定行为: + +- production base URL 只允许 HTTPS;HTTP 仅在 debug profile 且 host 为 localhost 时允许。 +- production 允许的 API、视频和上传 host 必须来自签名/受管配置或内置 allowlist,避免篡改本地配置后窃取 token。 +- 超时拆分为 connect/read/write/pool,不只设一个总数。可从 connect 10 秒、read 60 秒起步,上传/导出另设长超时。 +- 每次请求加入 `Authorization`(若契约采用 bearer)、`X-Request-ID`、客户端版本、平台、时区和租户信息;不得写入日志的 header 列表默认包含 Authorization、Cookie 和所有临时凭证。 +- GET/HEAD 和带服务端认可幂等键的写操作,才可对连接错误、超时、429、502、503、504 做指数退避 + jitter;遵守 `Retry-After`。验证错误、普通 4xx 和未知写请求不自动重试。 +- 所有关键 mutation 生成并持久化 `Idempotency-Key`,直到收到确定结果;请求超时后的状态为“结果未知”,先按键查询/重放,不能直接再创建一条。 +- 业务错误映射为稳定类型:`ValidationError`、`Unauthenticated`、`Forbidden`、`Conflict`、`RateLimited`、`Maintenance`、`TransportError`、`UnknownServerError`。UI 不解析后端文案。 +- 支持 ETag/版本字段做乐观锁。收到 409/412 时进入冲突页,展示服务器版本与本地草稿,不做静默覆盖。 +- 下载/上传流式处理并限制文件大小、MIME 和保存目录。COS 只使用后端签发的预签名 URL或短期临时凭证,绝不打包永久密钥。 + +若后端有 OpenAPI,生成的 models/client 放入 `core/api/generated`,外面再包一层业务 adapter;模块不得直接依赖生成器的数据结构。若无 OpenAPI,先写小而明确的 typed endpoint,不做一个接受任意 path/dict 的“万能客户端”。 + +实时聊天使用独立 adapter:WebSocket 可运行在一个后台 asyncio loop/thread 中,通过 signal 投递事件;实现心跳、指数重连、服务器 sequence/cursor 补拉、重复消息去重和应用休眠恢复。首版若后端没有可靠续传契约,应采用短轮询而不是假装 WebSocket 永不丢消息。 + +### 4.2 Session 状态机 + +`SessionManager` 是唯一会话真相,显式状态为: + +```text +SIGNED_OUT -> AUTHENTICATING -> AUTHENTICATED +AUTHENTICATED -> REFRESHING -> AUTHENTICATED +AUTHENTICATED/REFRESHING -> LOCKED | EXPIRED | SIGNED_OUT +``` + +- access token 只保存在内存;需要“保持登录”时,refresh token 或可续期凭证保存在 OS keychain,不能放在 QSettings、SQLite 明文或日志。 +- `keyring` 启动时必须检查实际 backend。没有 Windows Credential Manager/macOS Keychain 等安全 backend 时禁用持久登录,而不是退化到明文文件。 +- 多请求同时遇到 401 时只能有一个 refresh 在飞行,其他请求等待同一个 future;refresh 失败统一切到 `EXPIRED`,避免 401 风暴。 +- 登出、切换医生或切换租户时:取消网络任务、停止实时连接、退出视频、清内存 token、清空 WebEngine profile、关闭并按用户/租户清理本地缓存密钥。 +- 支持工作站空闲自动锁定。解锁方式由后端安全策略决定;锁定界面不得继续显示患者姓名、通知正文或缩略图。 +- 用 `QLocalServer/QLocalSocket` 实现单实例,第二次启动只唤醒现有窗口,避免同一用户同时运行两个 outbox。 + +### 4.3 权限模型 + +权限码由后端返回并作为服务端授权的镜像,例如 `patient.read`、`record.write`、`prescription.sign`;具体字符串必须以真实契约为准。 + +客户端执行三层防误操作: + +1. 路由层:无模块权限时不注册菜单/路由。 +2. ViewModel/command 层:按钮显示与执行前都检查 `PermissionGuard.require(...)`。 +3. API 层:403 统一转为 `Forbidden`,刷新权限快照并提示“权限已变更”。 + +这些仅改善体验,真正的 RBAC/ABAC、租户隔离和审计必须由后端再次校验。不能因为客户端隐藏了按钮就省略服务端授权。对开方、签名、删除等高风险操作增加 step-up authentication 或明确二次确认,并把 request id/idempotency key 传给服务端审计。 + +## 5. 本地数据、离线与错误态 + +### 5.1 数据目录与加密 + +使用 `QStandardPaths` 或 `platformdirs` 获取每用户目录:Windows 通常位于 `%LOCALAPPDATA%`,macOS 位于 `~/Library/Application Support`。安装目录和 `.app` bundle 始终只读;业务代码不要访问 `sys._MEIPASS`,资源通过 `importlib.resources`/Qt resource system 读取。 + +SQLite 使用 WAL、schema migration 和单写入 worker(或每线程独立 connection),不在线程间共享 `sqlite3.Connection`。默认只缓存必要元数据;如果确需缓存患者/病历或离线草稿: + +- 使用 `cryptography` 的 AES-GCM 做版本化记录加密,随机 nonce,密钥由 OS keychain 保存;AAD 包含 tenant/user/table/record id,防止记录调包。 +- outbox、cache 和密钥按机构 + 用户分区;退出账号做 crypto-erasure(删除密钥)并清理索引。SSD 上不能承诺可靠覆盖删除,因此不能用“反复覆盖文件”作为安全保证。 +- 设置缓存 TTL、容量上限和最少字段;搜索索引不放诊断正文等敏感内容。 +- QSettings 只保存主题、窗口大小等无敏感偏好。 +- 日志不记录患者姓名、手机号、证件号、病历正文、处方内容、token、Cookie 或 URL query;提供用户确认后的脱敏诊断包。 + +### 5.2 离线策略 + +不要只依赖系统“在线/离线”事件;真正状态以最近请求结果和轻量 health check 综合判定。主壳常驻显示 `在线 / 网络不稳定 / 离线 / 服务维护`,且标明数据最后更新时间。 + +写操作按风险分类: + +| 类别 | 离线行为 | 恢复后 | +| --- | --- | --- | +| 只读列表/详情 | 展示有时间戳的加密缓存,明显标记“可能已过期” | 后台重新验证并原子替换 | +| 普通草稿、低风险备注 | 可进入 outbox,保存幂等键、base version 和依赖 | 自动重放;冲突转人工处理 | +| 病历最终提交、开方/签方、医嘱、删除等高风险操作 | 只允许保存为本地草稿,禁止假显示“已提交” | 恢复网络后重新拉取服务端版本,由医生确认再提交 | +| 视频/实时聊天 | 显示不可用或重连,不能伪造发送成功 | 按 cursor 补拉并去重 | + +Outbox 状态至少包含 `QUEUED -> SENDING -> SUCCEEDED`,以及 `NEEDS_ATTENTION`、`DEAD_LETTER`。保存 payload schema version、创建人/租户、幂等键、重试次数、next attempt、最后错误和服务端 base version。只自动重放白名单 action;切换用户时绝不重放前一用户队列。 + +### 5.3 统一错误体验 + +所有页面复用下列状态组件,而不是把异常 traceback 或后端原文弹给用户: + +- 首次加载 skeleton;刷新时保留旧数据并显示非阻塞进度。 +- 真空数据(业务上没有记录)与加载失败严格区分。 +- 离线且有缓存、离线且无缓存、权限不足、登录过期、字段校验、版本冲突、维护中、未知错误各有独立文案和可行动按钮。 +- 未知错误显示 request id、发生时间、“重试/复制诊断编号”,详细堆栈只进入脱敏日志。 +- 全局未捕获异常写入 rotating log 并打开安全错误页;不要自动上传包含医疗数据的 crash dump。 + +## 6. 视频与 QtWebEngine 的可执行边界 + +### 6.1 首选集成顺序 + +1. 先确认腾讯或现有供应商是否提供受支持的 Windows/macOS 原生桌面 SDK 以及 Python 可调用层。如果维护成本可接受,原生 adapter 最可控。 +2. 若现有成熟能力是 TRTC Web 页面,后端提供一个专用、窄功能、HTTPS 的 `/desktop-call` 类入口(实际路径待定),由 `QWebEngineView` 嵌入。 +3. 若 SDK/UA/DRM/屏幕共享在 Qt Chromium 中不受支持,可靠回退是系统默认浏览器,不通过修改 UA 或关闭浏览器安全策略强行兼容。 + +不要把整套 admin 嵌入桌面壳。JS SDK 的版本和构建产物留在专用 Web 页面侧,Python 只持有 `VideoPort(join, leave, mute, device_changed)` 抽象,这样管理端升级 TRTC SDK 不要求桌面二进制同步发版。 + +### 6.2 安全桥接 + +- 桌面从后端申请一次性、短有效期的 call ticket;Web 页面再用 ticket 换房间凭证。禁止把 access token、`userSig` 长期放在 URL、日志或 localStorage。 +- 使用专用 `QWebEngineProfile`。优先 off-the-record;若必须持久化设备选择,也只能保存无认证数据。通话结束时清 Cookie、HTTP cache、permissions 和页面内容。 +- 导航只允许精确的 HTTPS origin/path allowlist;拦截新窗口、任意下载、`file://`、未知 scheme、跨域跳转和证书错误。证书错误 fail closed。 +- 相机/麦克风权限只对当前 allowlisted 通话 origin、活跃通话和明确用户操作放行,结束即撤销。屏幕共享另做显式确认。 +- 若使用 Qt WebChannel,bridge 只暴露少量 typed method/signal,不暴露文件系统、shell、通用 HTTP client、token getter 或任意 Python 调用。每次调用再次校验当前 page origin 和 session/call id。 +- release 不启用 remote debugging,不设置 `QTWEBENGINE_DISABLE_SANDBOX=1`,不使用 `--no-sandbox`。应用也不以管理员/root 身份运行。 + +### 6.3 兼容性与体积现实 + +`PySide6` 顶层 wheel 会同时拉入 Essentials 和 Addons;core profile 应直接依赖 `PySide6-Essentials`。WebEngine 位于 Addons,wheel 和最终制品都会显著增大,不能把它当成“小插件”。最终体积以两端产物为准,不承诺一个固定数字。 + +QtWebEngine 使用多进程 Chromium,发布物必须保留: + +- `QtWebEngineProcess` helper; +- QtWebEngineCore/Widgets 库与所需平台插件; +- `qtwebengine_resources*.pak`、`icudtl.dat`、V8 snapshot; +- `qtwebengine_locales`(至少完整验证 `zh-CN`、`en-US` 后才可裁剪); +- macOS framework/helper 的 bundle 结构和 entitlements。 + +H.264/AAC/MP3 等专有 codec 是否可用取决于 QtWebEngine 构建与许可,不能因为 `hls.js` 存在就假设一定能播放。首发验收必须覆盖真实 TRTC/WebRTC、摄像头、麦克风、扬声器切换、屏幕共享(若需求存在)、HLS/录播格式和弱网;若要自行构建启用 proprietary codecs,先完成专利/分发许可评审。 + +## 7. PyInstaller 构建与发布 + +### 7.1 为什么固定 onedir + +虽然 PyInstaller 支持 onefile,但本项目默认 `onedir`: + +- onefile 每次启动需解压大体积 Chromium,冷启动慢,易触发杀软且临时目录空间不可控; +- WebEngine 是多进程,helper、framework、资源和 macOS 签名/沙箱都依赖正确目录结构; +- onedir 更容易做增量诊断、签名验证和 installer 管理。 + +用户最终仍拿到一个 `.exe` 安装程序或 `.dmg/.pkg`,无需手动管理 onedir 目录。 + +### 7.2 spec 设计原则 + +维护四个薄 spec,公共配置放 `packaging/common.py`。入口始终为 `src/zyt_doctor/__main__.py`,`pathex=["src"]`;只收集应用 resources 和必要 metadata。WebEngine profile 因 `integrations/video/webengine.py` 中有显式 import,触发 PyInstaller 官方 PySide6 hook;如通过 feature registry 动态加载,再显式加入这些 hidden imports: + +```python +VIDEO_HIDDEN_IMPORTS = [ + "zyt_doctor.integrations.video.webengine", + "PySide6.QtWebEngineCore", + "PySide6.QtWebEngineWidgets", + "PySide6.QtWebChannel", +] + +# core spec 中排除,且 core 构建环境根本不安装 Addons +CORE_EXCLUDES = [ + "PySide6.QtWebEngineCore", + "PySide6.QtWebEngineWidgets", + "PySide6.QtWebEngineQuick", +] +``` + +不要手工把整个 `site-packages/PySide6` 复制进 datas,也不要用 `collect_all("PySide6")`;这会拉入无关 Qt 模块并可能破坏 hook 期望的目录。优先依赖当前锁定 PyInstaller 的 Qt hooks,仅对 self-check 证实遗漏的自有动态模块写自定义 hook。 + +macOS `BUNDLE` 至少设置稳定的 bundle id、版本、图标,并在 `Info.plist` 中写清: + +```python +info_plist = { + "CFBundleIdentifier": "com.zhenyangtang.doctor", + "NSCameraUsageDescription": "用于医生视频问诊", + "NSMicrophoneUsageDescription": "用于医生视频问诊", + "NSHighResolutionCapable": True, +} +``` + +仅当有实际功能时再加入其他 TCC 权限说明。不得加入放宽 ATS 的全局例外。Windows spec 使用有版本信息的 manifest、`.ico` 和 GUI subsystem,同时保留内部异常日志;开发 smoke build 可临时打开 console。 + +### 7.3 构建命令骨架 + +Windows x64 runner: + +```powershell +py -3.12 -m venv .venv-build +.venv-build\Scripts\python -m pip install --require-hashes -r requirements\video-win-x64.lock +.venv-build\Scripts\python -m PyInstaller --noconfirm --clean packaging\windows\doctor-video.spec +dist\DoctorDesktop\DoctorDesktop.exe --self-check +``` + +macOS arm64 runner: + +```bash +python3.12 -m venv .venv-build +.venv-build/bin/python -m pip install --require-hashes -r requirements/video-macos-arm64.lock +.venv-build/bin/python -m PyInstaller --noconfirm --clean packaging/macos/doctor-video.spec +dist/DoctorDesktop.app/Contents/MacOS/DoctorDesktop --self-check +``` + +PyInstaller 不能从 Windows 生成 macOS `.app`,反之亦然。每次构建从干净环境执行 `--clean`,记录 Python/PySide6/PyInstaller/OS SDK 版本、锁文件 hash、git commit 和产物 SHA-256,保证可追溯。 + +### 7.4 WebEngine 自检 + +应用提供 `--self-check`,不访问患者数据,检查: + +- build info、只读 resources、可写 data/log/cache 路径; +- keyring backend 是否安全、SQLite migration 是否可运行; +- TLS CA、production 配置和 host allowlist; +- video profile 中通过 `QLibraryInfo` 定位 helper/resources/locales,禁止依赖写死的 `_internal` 路径; +- release 环境没有 `QTWEBENGINE_DISABLE_SANDBOX`/`--no-sandbox`; +- GUI smoke 模式实际创建 `QWebEngineView`,加载本地无网络测试页,然后退出;真实视频另由端到端测试覆盖。 + +任何 helper、`.pak`、ICU、snapshot、platform plugin 或 locale 缺失都应让发布流水线失败,不在运行时静默降级。 + +### 7.5 Windows 发布 + +1. 使用固定、受控的 Windows x64 runner 构建;不要在装有多套 Qt/Anaconda 的个人机上发正式包。 +2. QtWebEngine 运行依赖合适的 MSVC runtime。由安装器包含/检查 Microsoft Visual C++ Redistributable(Qt 官方要求的版本下限需按锁定 Qt 再核对),并在干净 VM 验证。 +3. 用组织的 Authenticode 证书和 RFC 3161 时间戳签名主程序及最终 MSI/EXE 安装器;验证 `signtool verify /pa /all`。 +4. 安装到 Program Files,用户数据仍进 LocalAppData;普通用户可运行/升级。可用 WiX Toolset/MSIX 或 Inno Setup,选择后固定 UpgradeCode/AppUserModelID 和回滚策略。 +5. 在 Windows 10/11 干净 VM 上验证安装、升级、卸载后保留/清除用户数据的明确策略、SmartScreen、企业代理、中文路径和非管理员账户。 + +### 7.6 macOS 发布 + +1. 在目标架构的 macOS runner 构建。PyInstaller 修改 Mach-O 后必须重新签名;使用 Developer ID Application 身份,不用 ad-hoc 签名发布。 +2. QtWebEngine helper 是嵌套 app/process。必须保留 framework bundle 结构,并确认 helper 使用 Qt 自带的 `QtWebEngineProcess.entitlements` 所需权限签名;主 app 使用项目的 camera/microphone 权限说明和最小 entitlements。签名顺序由内向外,避免用 `codesign --deep` 掩盖错误。 +3. 执行 `codesign --verify --deep --strict --verbose=2 DoctorDesktop.app` 和 `spctl --assess --type execute`;随后用 `xcrun notarytool submit ... --wait` 公证,staple ticket,再在离线干净 Mac 验证 Gatekeeper。 +4. 用 DMG/PKG 或能保留 symlink 的方式分发。PyInstaller 6+ 的 POSIX bundle 广泛使用 symlink,普通 zip 若不保留 symlink 可能膨胀或破坏运行。 +5. 在 Intel(若支持)与 Apple Silicon 真机上分别验证 keychain 升级连续性、摄像头/麦克风 TCC、休眠唤醒、Retina、多显示器和 WebEngine helper 签名。 + +### 7.7 常见打包坑清单 + +- **Qt binding 混装**:同环境存在 PyQt/PySide2 或系统 Qt,hook 收到冲突库。解决:干净 venv、只安装一种 binding、锁版本。 +- **误用 onefile**:启动慢、helper/沙箱/签名问题更难复现。解决:正式版固定 onedir。 +- **动态 import 未分析**:业务模块或 WebEngine 在 registry 中字符串加载。解决:显式 import 或最小 hiddenimports,并用 frozen smoke test 覆盖。 +- **资源路径错误**:开发机相对路径可用,安装后 CWD 变化。解决:`importlib.resources`/qrc;用户数据用 QStandardPaths。 +- **过度裁剪 Qt**:删除 `.pak`、ICU、snapshot、locale、platform plugin 后只在某些机器崩。解决:先保留 hook 输出,按真实清单与测试有证据地裁剪。 +- **macOS 签名次序/entitlements 错**:QtWebEngineProcess 启动即退出或 TCC 不弹窗。解决:嵌套 helper 真机测试、由内到外签、notarize/staple。 +- **归档破坏 symlink**:`.app` 体积暴涨或 framework 无法加载。解决:DMG/ditto 或明确保留 symlink 的归档工具。 +- **GPU/远程桌面差异**:WebEngine 黑屏。不要默认全局 `--disable-gpu`;收集诊断后提供经验证的软件渲染或外部浏览器 fallback。 +- **codec 误判**:开发机能播 H.264,发布 wheel 不能播。解决:把真实媒体矩阵列入 artifact 验收和许可评审。 +- **杀软与信誉**:大量 DLL/helper 或未签名 nightly 被拦截。解决:正式证书、时间戳、稳定 installer identity、干净 VM/主流安全软件测试。 +- **升级破坏 keychain/数据**:bundle id、签名 identity 或 schema 不稳定。解决:这些值从首版固定,migration 支持备份与回滚。 + +## 8. 安全与隐私基线 + +- TLS 校验永远开启。企业私有 CA 应通过受管安装进入系统 trust store;不得用 `verify=False`。如需兼容企业代理,可用 `truststore` 接入 OS 证书库并做专项测试。 +- 本地配置不能提供任意 production host 重定向;敏感 token 永远不进入 URL query、clipboard、日志、analytics 或 crash report。 +- HTML 病历优先用受限 `QTextBrowser`/原生富文本展示并在服务端净化;不要因为“要展示 HTML”就引入 WebEngine。任何外链由用户确认后交给系统浏览器。 +- 限制剪贴板和通知中的患者信息;自动锁定后遮蔽窗口内容。截图阻止在跨平台上不可靠,不能作为合规控制。 +- 所有高风险业务写操作由服务端保留不可抵赖审计;客户端日志只记录事件名、耗时、状态、request id 和脱敏技术上下文。 +- 发布前完成依赖 SBOM、许可证清单和漏洞扫描。PySide6 采用 LGPLv3/GPLv3 或商业许可,QtWebEngine/Chromium/codec 还包含额外 notices;由法务确认采用的 Qt 许可与分发义务,安装包附第三方 notices。 +- 自动升级若后续实现,更新 manifest 必须签名,制品必须校验 SHA-256 与平台签名,并支持回滚;首版宁可用已签名安装器提示升级,也不要执行未签名下载内容。 + +## 9. 测试与发布门槛 + +### 9.1 自动化测试分层 + +- **unit**:权限 guard、会话状态机、单飞 refresh、重试白名单、错误映射、缓存 TTL、加解密、outbox 状态和冲突决策。用 fake clock/random/secret store,保证确定性。 +- **API contract**:以 OpenAPI schema 或后端 mock 验证字段、错误码、分页、时间和幂等语义;`respx` 模拟超时、断流、401 并发、429/Retry-After、5xx 和结果未知。 +- **integration**:临时 SQLite + fake keyring + staging API,覆盖 migration、损坏缓存、磁盘满、退出清理、租户切换和代理/私有 CA。 +- **UI**:`pytest-qt` 验证路由权限、loading/empty/error/offline、键盘导航、取消和 late response;不要用脆弱的像素级截图替代行为断言。 +- **frozen artifact**:Windows/macOS 各自安装后运行 `--self-check`,启动主窗口、登录 mock/staging、访问资源、写用户目录、升级 migration、卸载。 +- **视频真机**:摄像头/麦克风授权与拒绝、无设备、设备热插拔、回声设备、弱网/断网重连、休眠唤醒、屏幕共享、录播 codec、结束后权限与 Cookie 清理。 + +重点故障用例包括:十个请求同时 401、提交后响应丢失、服务器版本冲突、系统时钟偏差、刷新时退出、缓存被截断、keychain 被锁、两实例竞争、磁盘只读、API 维护、WebEngine helper 被杀、证书过期。测试数据必须是合成数据。 + +### 9.2 CI 矩阵与质量门槛 + +PR 阶段可并行运行 Windows x64 和 macOS arm64 的 lint/type/unit/UI headless 测试。release tag 阶段在原生 runner 生成制品并执行: + +1. `ruff`、`mypy`、unit/contract/integration 测试全绿,覆盖率阈值重点约束 core 状态机而非 UI 行数。 +2. 依赖 lock、SBOM、license、`pip-audit` 无未批准的高危项。 +3. 两端 frozen self-check 与安装/升级 smoke 通过。 +4. 签名、公证、hash、版本资源和 update channel 验证通过。 +5. video profile 在目标硬件的人工/自动验收清单签字;core profile 证明不会意外收集 QtWebEngine。 +6. staging 完成登录、权限变更、患者查询、一个低风险写操作、一个高风险确认、登出清理和离线恢复闭环。 + +## 10. 实施顺序与验收里程碑 + +### M0:契约和风险封板(约 3–5 天) + +- 获取 OpenAPI/认证/权限/RTC/对象存储契约;形成 endpoint 与权限矩阵。 +- 在 Windows/macOS 原型中用 QtWebEngine 打开专用测试页,验证 TRTC/WebRTC、设备权限和目标 codec。 +- 决定首发是 core、video 还是“core + 外部浏览器”。 + +**退出条件**:API base 和 auth 不再是假设;视频路线有真实 PoC,而非只证明网页能打开。 + +### M1:可发布骨架 + +- 完成 bootstrap、配置校验、日志/路径、API client、SessionManager、PermissionGuard、shell 和统一状态组件。 +- mock server 下完成登录、`/me`、权限菜单、401 single-flight refresh、登出清理。 +- 两端 onedir unsigned nightly 可安装并通过 self-check。 + +### M2:业务纵切 + +- 先选一个完整纵切(例如预约 -> 患者概要 -> 诊间记录草稿),按 module 结构贯穿 UI、service、API、权限和测试。 +- 再并行扩展患者、病历、处方、随访、聊天;高风险操作必须有后端幂等/审计。 + +### M3:离线与视频 + +- 实现加密 cache/outbox、冲突页、断网/恢复和数据清理。 +- video adapter、受限 profile、一次性 ticket、权限撤销和外部浏览器 fallback 完成。 + +### M4:生产发布 + +- 锁依赖和 runner image,完成 Windows Authenticode、macOS Developer ID/notarization、SBOM/许可证。 +- 干净 VM/真机、企业代理、非管理员、升级/回滚、视频设备矩阵全部通过。 + +## 11. 最终架构决策摘要 + +1. 业务 UI 用原生 Qt Widgets;QtWebEngine 是隔离的视频实现细节,不是应用架构。 +2. 后端契约、服务端授权和服务端审计是权威;桌面端只做强类型 adapter、体验 guard 和安全状态管理。 +3. access token 仅在内存,长期凭证进 OS keychain;敏感离线数据加密且按用户/租户隔离。 +4. 高风险医疗写操作离线时只能保存草稿,恢复后由医生确认;普通 outbox 依赖幂等键和乐观锁。 +5. 发布固定 PyInstaller onedir、平台原生构建、签名和 artifact 级测试;不交叉编译,不依赖开发机“能跑”。 +6. production URL、SDK secret、对象存储密钥和 RTC 签名密钥都不能硬编码进客户端。 + +## 参考资料 + +- [Qt for Python package details](https://doc.qt.io/qtforpython-6.10/package_details.html):Essentials/Addons 拆分和 wheel 内容。 +- [Qt for Python 与 PyInstaller](https://doc.qt.io/qtforpython-6.10/deployment/deployment-pyinstaller.html):官方 PyInstaller 基础部署说明。 +- [Qt WebEngine 部署](https://doc.qt.io/qt-6/qtwebengine-deploying.html):helper、resources、locales、macOS entitlements 等必需项。 +- [Qt WebEngine features](https://doc.qt.io/qt-6/qtwebengine-features.html):WebRTC/媒体能力及专有 codec 许可提醒。 +- [PyInstaller macOS multi-arch 与签名](https://pyinstaller.org/en/stable/feature-notes.html):架构 slice 和 codesign 行为。 +- [PyInstaller symlink/common pitfalls](https://pyinstaller.org/en/stable/common-issues-and-pitfalls.html):PyInstaller 6+ POSIX bundle 的 symlink 分发要求。 + diff --git a/app/research/final_parity_audit.md b/app/research/final_parity_audit.md new file mode 100644 index 000000000..e84f989c4 --- /dev/null +++ b/app/research/final_parity_audit.md @@ -0,0 +1,320 @@ +# 医生工作站最终 parity 审计 + +审计日期:2026-08-10 +审计方式:只读源码复核 + 纯本地测试;未修改业务源码。 +结论基准:`D:\web\zyt\admin\src\views` 的实际实现优先于既有 `research/parity_*.md`。 + +## 1. 结论 + +当前医生桌面整体判定为 **PARTIAL**,不建议在修复 P0 前作为后台同型版本发布。 + +- **P0:3 项** + 1. 接诊附件没有上传步骤,本机绝对路径被作为附件 URL 发给服务端。 + 2. 问诊开方在当前 appointment 无处方或查询失败时按 diagnosis 回退,可显示、编辑或作废另一挂号的处方。 + 3. “我的患者”预约把 `source_patient_id` 优先写入 `patient_id`,而管理端该端点明确要求诊单 ID,可能预约到错误上下文或被后端拒绝。 +- **Repository 方法存在性:EXACT**。当前五页及相关对话框实际调用的 canonical 方法均同时存在于 Protocol、Remote、Demo,未发现不存在或拼错的方法名;兼容别名均能解析到有效方法。 +- **动态菜单:EXACT(限定五个受支持页面)**。非 Demo 会话使用服务端菜单,遵守显示、禁用、排序、路由及 canonical permission;未把未实现的后台运营页面伪装成本地入口。 +- **医生活跃视频 eligibility:EXACT;权限语义:PARTIAL**。状态与三个业务 ID 已对齐,但问诊页错误复用了小程序二维码权限 `tcm.diagnosis/videoQr`。 +- 既有三份 parity 文档明显早于本轮实现,不能直接当作当前验收结果;本报告已重新逐项分类。 + +本次执行: + +```text +.venv\Scripts\python.exe -m pytest +110 passed in 1.33s +``` + +全绿不能覆盖本报告的 P0:`D:\web\zyt\app\tests\test_reception_parity_ui.py:263-306` 当前把本地绝对路径进入备注 payload 当成正确行为;`D:\web\zyt\app\tests\test_consultations_parity_ui.py:241-264` 当前把 appointment miss 后回退 diagnosis 旧处方当成正确行为。这两组测试需要随 P0 修复反向改写。 + +## 2. 范围与判定规则 + +审计范围: + +- Python 五页: + - `D:\web\zyt\app\src\doctor_workstation\ui\pages\reception.py` + - `D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py` + - `D:\web\zyt\app\src\doctor_workstation\ui\pages\consultations.py` + - `D:\web\zyt\app\src\doctor_workstation\ui\pages\prescription_library.py` + - `D:\web\zyt\app\src\doctor_workstation\ui\pages\prescriptions.py` +- 与五页直接相连的 `ui/dialogs/diagnosis.py`、`ui/dialogs/prescription.py`、`ui/widgets.py`、`ui/shell.py`、`core/models.py`、`services/*`。 +- 管理端唯一事实基准:`D:\web\zyt\admin\src\views`,必要时追到其直接使用的 `src/components` 与 `src/api`。 + +明确排除:企业微信后台运营、转化/统计后台、医助专属旁观、小程序二维码本身、其他角色专属批量运营能力。医助旁观因此判为 **N/A / intentionally excluded**,不计 MISSING。 + +判定含义: + +- **EXACT**:端点、DTO、可见字段/筛选/动作、权限及状态门槛在医生桌面范围内等价。 +- **PARTIAL**:主链存在,但字段、上下文、权限、状态门槛、分页或异步一致性不完整。 +- **MISSING**:管理端医生主链存在,而 Python 没有可用实现。 + +## 3. 页面与横切能力总表 + +| 范围 | 判定 | 已对齐 | 主要偏差 | +|---|---|---|---| +| 接诊台 | **PARTIAL** | 今日范围;等待/过号状态 1/4;详情、通知医助、备注读取/删除、完成接诊;直呼 ID | 附件真实上传 **MISSING/P0**;固定只取前 50 条;附件无预览/打开 | +| 我的患者 | **PARTIAL** | 患者/订单/面诊进度三工作区;订单筛选、summary/scope、字段、状态动作矩阵与 canonical permissions | 预约上下文 **P0**;预约表单、诊单详情、上下文订单不完整;写操作竞态 | +| 我的问诊 | **PARTIAL** | 列表、详情/编辑/删除端点;字典/医助;开方/作废入口;视频状态与 ID | appointment 处方回退 **P0**;诊单编辑只覆盖小字段子集;部分医生行操作/筛选缺失;视频权限码错误 | +| 我的处方库 | 功能 **EXACT** / 运行时 **PARTIAL** | 筛选、15 条分页、字段、查看/新增/编辑/删除、远程药材、校验、owner/root/role 行条件;`disable_edit` 语义正确 | 通用权限 helper 接受非 canonical 别名;worker 读 Qt 控件;加载中 refresh 被丢弃 | +| 已开处方 | **PARTIAL** | 完整筛选与主要字段;详情、CRUD、患者修正、审核、作废、订单创建/查看、A4 打印、PDF;状态动作矩阵 | 诊单详情授权边界;建单支付单竞态;诊单上下文订单与部分业务字段;重复药材校验 | +| Repository Protocol/Remote/Demo 方法 | **EXACT** | 五页实际 canonical 调用全部存在且签名兼容 | 上传素材方法 **MISSING**;Demo 问诊筛选语义不完整 | +| 动态菜单 | **EXACT** | 使用服务端 menu;显示/禁用/排序/路由/权限;只注册受支持页面 | 无发布阻断偏差 | +| 视频端点与 eligibility | **PARTIAL** | ticket/start/bind/end 方法存在;问诊 `has_appointment && status==1`;接诊今日状态域;ID 分离 | 原生直呼错误复用 `videoQr` 权限;服务端仍须最终复核当前状态/归属 | + +## 4. P0 发布阻断 + +### P0-1 接诊附件不是上传,而是泄漏并保存本机路径 — MISSING + +管理端合同是严格的两阶段流程: + +1. `POST /upload/image` 或 `POST /upload/file`,multipart 字段为 `file`、`cid=0`,返回服务器 `uri/url`:`D:\web\zyt\admin\src\api\file.ts:7-33`。 +2. 素材选择器只把上传成功的服务器地址交给业务组件:`D:\web\zyt\admin\src\components\material\picker.vue:260-283`。 +3. 再调用 `POST /doctor.appointment/addDoctorNote`,payload 为 `{diagnosis_id, content?, tongue_images?: string[], report_files?: string[]}`:`D:\web\zyt\admin\src\views\patient\reception\components\NoteTimeline.vue:195-227`。 + +Python 只是用文件选择器保存 `Path(raw_path)`,界面虽写“待上传”,但没有任何上传请求:`D:\web\zyt\app\src\doctor_workstation\ui\pages\reception.py:1291-1346`。保存时本机路径被原样放进 `tongue_images/report_files`:`D:\web\zyt\app\src\doctor_workstation\ui\pages\reception.py:1358-1393`;Remote repository 直接 JSON 透传:`D:\web\zyt\app\src\doctor_workstation\services\repository.py:709-730`。`ApiClient` 只有 JSON 请求并固定 `Content-Type: application/json`,没有 multipart:`D:\web\zyt\app\src\doctor_workstation\services\api_client.py:108-180,211-220`。 + +影响:服务端会收到 `C:\Users\...\report.pdf` 一类不可共享路径,其他终端无法访问,同时泄漏本机目录。已有 notes 读取与删除端点正确,但不能补救创建时的坏数据:`D:\web\zyt\app\src\doctor_workstation\services\repository.py:732-759`。 + +可执行修复: + +1. 在 `ApiClient` 增加独立 multipart 方法,不沿用 JSON `Content-Type`,由 httpx 生成 boundary。 +2. 在 repository 增加 `upload_material(path, material_type, cid=0)`;图片走 `/upload/image`,报告走 `/upload/file`。 +3. 所有素材上传成功后才调用 `addDoctorNote`;最终 DTO 必须拒绝盘符路径、UNC、`file://`。 +4. 部分失败不提交本地路径,逐文件提示;必要时清理已上传但未关联素材。 +5. 将 `D:\web\zyt\app\tests\test_reception_parity_ui.py:263-306` 改成 multipart + 最终 JSON 双阶段测试,并断言最终 JSON 只含服务器地址。 + +### P0-2 当前 appointment 处方 miss/异常后回退 diagnosis 旧处方 — PARTIAL + +管理端从问诊行传 `diagnosis_id=row.id`、`appointment_id=row.appointment_id`:`D:\web\zyt\admin\src\views\tcm\diagnosis\index.vue:1685-1694`。处方组件只以 `GET /tcm.prescription/getByAppointment {appointment_id}` 判断当前挂号是否已有处方;空结果进入当前挂号的新建流程,再用 `GET /tcm.diagnosis/detail {id}` 生成病历快照:`D:\web\zyt\admin\src\components\tcm-prescription\index.vue:1829-1907`。保存明确发送 `diagnosis_id`、`appointment_id`、`case_record`:`D:\web\zyt\admin\src\components\tcm-prescription\index.vue:2219-2268`。 + +Python 已有正确的两个 repository 端点:`D:\web\zyt\app\src\doctor_workstation\services\repository.py:994-1016`。但当前 appointment 查询为空,甚至 401/403/网络异常时,都会继续按 diagnosis 查询并选择“最新一张”:`D:\web\zyt\app\src\doctor_workstation\ui\pages\consultations.py:1179-1216`。选中的 fallback 随后可被展示或作废:`D:\web\zyt\app\src\doctor_workstation\ui\pages\consultations.py:1250-1283,1350-1383`。Demo 的 `get_prescription_by_appointment` 也仅按 diagnosis 返回首张,忽略 appointment:`D:\web\zyt\app\src\doctor_workstation\services\mock_repository.py:752-760`。 + +同时,新建只从列表行拼少量患者字段:`D:\web\zyt\app\src\doctor_workstation\ui\pages\consultations.py:1300-1347`;编辑器 payload 没有完整 round-trip `appointment_id/case_record`:`D:\web\zyt\app\src\doctor_workstation\ui\dialogs\prescription.py:1304-1370`;模型也没有正式保留这两个字段:`D:\web\zyt\app\src\doctor_workstation\core\models.py:580-646,728-771`。 + +影响:同一 diagnosis 的 appointment A 有处方、B 无处方时,B 可误看、误编辑或误作废 A;网络/权限错误也被错误解释为“允许回退”。 + +可执行修复: + +1. `appointment_id > 0` 时只允许 `getByAppointment` 决定当前处方;空结果新建 B,异常 fail-closed 并提示,绝不按 diagnosis 自动回退。 +2. diagnosis 级历史只能做独立只读历史列表,不能成为查看/编辑/作废目标选择器。 +3. 新建前调用 `get_diagnosis_detail`,把不可变 `case_record` 与 `diagnosis_id + appointment_id` 一起提交。 +4. 给 `Prescription` 增加并完整序列化 `appointment_id`、`case_record`;Demo 按 appointment 精确匹配。 +5. 反向改写 `D:\web\zyt\app\tests\test_consultations_parity_ui.py:241-264`:A 有处方、B 无处方时 B 必须新建 B;查询异常不得回退或作废 A。 + +### P0-3 “我的患者”预约使用了错误的 `patient_id` 语义 — PARTIAL + +管理端在打开预约框时刻意把 `patient_id` 覆盖成 `diagnosis_id || id`:`D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:513-518`。预约组件把该值设为 `patientInfo.id`:`D:\web\zyt\admin\src\views\tcm\diagnosis\appointment.vue:392-402`,并提交到 `POST /firstvisit.myPatient/createAppointment`:`D:\web\zyt\admin\src\views\tcm\diagnosis\appointment.vue:701-719`。 + +Python payload 虽计算了 `diagnosis_id`,却让 `patient_id` 优先取 `source_patient_id`:`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:266-279`。Remote 不作转换,直接把整个 body 发给同一端点:`D:\web\zyt\app\src\doctor_workstation\services\repository.py:1318-1325`。管理端仅在视频 ticket 中使用 `source_patient_id`,同时保留 diagnosis ID,证明两者不是同一语义:`D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:642-661`。 + +影响:只要列表同时返回 `diagnosis_id` 与 `source_patient_id`,Python 就与实际端点 DTO 不同,可能绑定错误患者上下文或被后端拒绝。 + +可执行修复: + +1. `firstvisit.myPatient/createAppointment` 的 `patient_id` 固定使用当前 `diagnosis_id`,不要用 `source_patient_id`。 +2. repository 为该端点定义显式 DTO,避免“完整字典透传”隐藏字段语义错误。 +3. 增加 `diagnosis_id != source_patient_id` 的合同测试,断言 body 的 `patient_id == diagnosis_id`。 +4. 视频 ticket 继续使用独立的真实 patient ID,不把本修复扩散到视频 DTO。 + +## 5. P1 高优先级缺口 + +### P1-1 诊单详情/编辑只是字段子集,且未落实隐私权限 — PARTIAL + +管理端根据 `tcm.diagnosis/phonePlain` 决定明文手机号,并在无权时先对手机号、身份证脱敏:`D:\web\zyt\admin\src\views\tcm\diagnosis\edit.vue:822-856,1263-1274`。Python `DiagnosisDialog` 构造函数不接 permissions:`D:\web\zyt\app\src\doctor_workstation\ui\dialogs\diagnosis.py:53-65`,直接渲染电话等字段:`D:\web\zyt\app\src\doctor_workstation\ui\dialogs\diagnosis.py:317-352`。编辑仅有 9 个文本字段:`D:\web\zyt\app\src\doctor_workstation\ui\dialogs\diagnosis.py:150-174`,保存也只回传这组子集:`D:\web\zyt\app\src\doctor_workstation\ui\dialogs\diagnosis.py:446-464`。 + +修复:把 permission set 传入对话框;明文手机严格要求 `tcm.diagnosis/phonePlain`;身份证同样 fail-closed;按管理端 DTO 补齐患者基本信息、生命体征、病史/四诊/诊断字段及电话/身份证唯一性检查;对后端声明不可编辑的基础字段锁定。 + +### P1-2 患者预约表单缺排班、号源和关键 DTO 字段 — PARTIAL + +管理端加载医生列表、未来 7 天排班、可用时间段,并检查当天重复预约:`D:\web\zyt\admin\src\views\tcm\diagnosis\appointment.vue:423-447,495-625`;提交要求 `appointment_type`、`channel_source`、`channel_source_detail`:`D:\web\zyt\admin\src\views\tcm\diagnosis\appointment.vue:683-719`。Python 只提供自由输入医生 ID、任意日期/时间/period/remark,payload 缺上述字段:`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:220-279`。 + +修复:用后端医生/排班/可用时间段数据驱动选择器;限制日期和可预约 slot;增加 appointment type、channel source/detail;提交前与服务端均做重复预约校验。与 P0-3 一起建立 exact DTO 测试。 + +### P1-3 诊单上下文订单缺失,支付/退款字段缩水 — PARTIAL + +管理端诊单只读页按 `tcm.diagnosis/patientOrders` 显示订单,并请求 `GET /tcm.prescriptionOrder/lists {context_diagnosis_id, patient_id, scene:'diagnosis_edit'}`:`D:\web\zyt\admin\src\views\tcm\diagnosis\readonly.vue:74-88`、`D:\web\zyt\admin\src\views\tcm\diagnosis\components\PatientOrderList.vue:118-179`。Python `DiagnosisDialog` 只有病历、备注、挂号、指派四个 tab:`D:\web\zyt\app\src\doctor_workstation\ui\dialogs\diagnosis.py:53-99,381-386`,虽然 repository 已有订单列表端点:`D:\web\zyt\app\src\doctor_workstation\services\repository.py:1018-1029`。 + +此外,Python 补支付单把 `pay_remark`、`completion_request=0`、`pay_create_type=fubei` 写死:`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:2048-2076`,而管理端由用户明确选择:`D:\web\zyt\admin\src\views\first_visit\my_patients\components\OrderActionHost.vue:573-587`。Python 强制填写退款金额:`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:2108-2131`;管理端允许省略:`D:\web\zyt\admin\src\views\first_visit\my_patients\components\OrderActionHost.vue:610-621`。 + +修复:给 `DiagnosisDialog` 传 permissions,按 canonical `tcm.diagnosis/patientOrders` 增加只读订单 tab并使用 exact context DTO;补支付单暴露三项业务字段;退款增加“不指定金额”。 + +### P1-4 处方建单可在门槛未加载时提交,并可混入旧诊单支付单 — PARTIAL + +Python 把 `deposit_min_amount` 初始化为 0,创建按钮立即可用:`D:\web\zyt\app\src\doctor_workstation\ui\dialogs\prescription.py:1793-1827`。`paidPayOrders` 只在初始化时异步加载,没有 generation/diagnosis ID 回验:`D:\web\zyt\app\src\doctor_workstation\ui\dialogs\prescription.py:1928-1979`;diagnosis ID 又可编辑。最终 payload 可把新 diagnosis ID 与旧 `pay_order_ids/deposit_min_amount` 组合:`D:\web\zyt\app\src\doctor_workstation\ui\dialogs\prescription.py:1989-2054`。管理端在诊单变化时清空并重载支付单:`D:\web\zyt\admin\src\views\consumer\prescription\index.vue:2307-2409`。 + +修复:来自处方的 diagnosis ID 设为只读,或用 `/tcm.diagnosis/searchPatient` 受控选择器;变化时立即清空支付单并禁提交;捕获 `(generation, diagnosis_id)`,仅应用同上下文响应;加载成功后才启用保存;服务端再校验处方、diagnosis、每个支付单的归属和定金门槛。 + +### P1-5 患者页写操作 latest-wins 会吞掉已执行 mutation 的回调 — PARTIAL + +`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:1696-1728` 为所有写操作共用 `_action_generation`,但未串行化或禁用其他动作。动作 B 启动后,动作 A 即使已在服务端成功或失败,其回调也会被丢弃,可能不刷新、不提示,界面与服务端不一致。 + +修复:按 operation/entity 维护 pending token,或串行化并禁用动作;任何成功 mutation 都必须触发最终一致性 refresh;generation 只能决定消息落点,不能取消写后 reconcile。补“两个不同订单动作乱序完成”的测试。 + +### P1-6 QRunnable 工作线程读取 Qt 控件 — PARTIAL + +`run_async` 的函数实际在工作线程执行:`D:\web\zyt\app\src\doctor_workstation\ui\widgets.py:257-319`。以下 worker lambda 仍调用 `.text()`、`.currentData()` 或 QWidget 属性: + +- 接诊状态:`D:\web\zyt\app\src\doctor_workstation\ui\pages\reception.py:502-525` +- 患者列表:`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:825-845` +- 患者订单:`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:1114-1129` +- 处方库:`D:\web\zyt\app\src\doctor_workstation\ui\pages\prescription_library.py:220-238` +- 模板导入:`D:\web\zyt\app\src\doctor_workstation\ui\dialogs\prescription.py:736-755` + +修复:所有控件值在 GUI 线程先快照成不可变 query/page DTO,worker 只执行 `repository.method(**query)`。这样既满足 Qt 线程约束,也保证 generation 对应的条件不会在执行中变化。 + +### P1-7 通用 permission helper 会把非 canonical 点号别名当成授权 — PARTIAL + +canonical 权限常量采用 slash 形式,例如 `wcf.prescription/add` 与 `cf.prescription/edit` 对应代码定义:`D:\web\zyt\app\src\doctor_workstation\services\repository.py:33-52`。但通用 `has_permission` 会生成 slash/dot 互换别名:`D:\web\zyt\app\src\doctor_workstation\ui\widgets.py:135-180`,因此仅持有 `cf.prescription.edit` 也可能通过 `cf.prescription/edit` 门槛。处方库和已开处方使用了该 helper:`D:\web\zyt\app\src\doctor_workstation\ui\pages\prescription_library.py:101-161`、`D:\web\zyt\app\src\doctor_workstation\ui\pages\prescriptions.py:282-391,809-815`。shell、患者、问诊已采用 exact/wildcard 语义:`D:\web\zyt\app\src\doctor_workstation\ui\shell.py:109-142`、`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:110-143`。 + +修复:全项目统一 exact + `*`/`prefix/*` helper;删除点/斜杠互换;增加“只有 alias grant 时按钮必须隐藏且 handler 必须拒绝”的测试。服务端权限仍是最终防线。 + +### P1-8 原生医生直呼错误复用小程序二维码权限 — PARTIAL + +医生直呼状态已经与管理端一致:管理端仅在 `has_appointment && appointment_status===1` 时启用:`D:\web\zyt\admin\src\views\tcm\diagnosis\index.vue:1778-1780`;Python 同样分离并复核 appointment/patient/diagnosis ID:`D:\web\zyt\app\src\doctor_workstation\ui\pages\consultations.py:142-183,1094-1122,1413-1427`。接诊台的今日状态 1/4 和 ID 也正确:`D:\web\zyt\app\src\doctor_workstation\ui\pages\reception.py:1542-1564`、`D:\web\zyt\app\src\doctor_workstation\services\repository.py:640-692`。 + +偏差是问诊原生直呼受 `tcm.diagnosis/videoQr` 控制:`D:\web\zyt\app\src\doctor_workstation\ui\pages\consultations.py:625-630,1413-1415`;管理端该权限只保护“小程序视频二维码”:`D:\web\zyt\admin\src\views\tcm\diagnosis\index.vue:390-391`。这还造成接诊台和问诊页对同一原生直呼的授权不一致。 + +修复:与后端确认独立原生直呼 permission(例如 `tcm.diagnosis/startCall`)并让两入口统一;若没有独立 grant,则不复用 `videoQr`,由 call endpoint 的后端授权兜底。ticket/start/bind/end 的服务端必须再次验证 appointment 当前状态及 diagnosis/patient 归属。医助 `watchCall` 继续排除。 + +### P1-9 接诊队列固定前 50 条,无继续加载 — PARTIAL + +管理端每页 15 条并持续加载,同时维护其他队列计数:`D:\web\zyt\admin\src\views\patient\reception\index.vue:213,296-379`。Python 每次只请求 `page_no=1,page_size=50`:`D:\web\zyt\app\src\doctor_workstation\ui\pages\reception.py:502-525`,没有分页或 infinite scroll。忙时第 51 位及以后患者不可达。 + +修复:按管理端实现 `page_no/page_size=15` 累加加载,并以 total 判定是否继续;切 tab/搜索重置页码和 items;用 generation + pending refresh 保证旧页不污染新筛选。 + +### P1-10 已开处方可打开诊单详情,但没有诊单权限门槛 — PARTIAL + +处方页无条件给详情对话框启用诊单入口:`D:\web\zyt\app\src\doctor_workstation\ui\pages\prescriptions.py:633-664`,处方详情对话框据此显示按钮:`D:\web\zyt\app\src\doctor_workstation\ui\dialogs\prescription.py:1641-1669`。这条数据入口未检查 `tcm.diagnosis/readonlyDetail` 或产品定义的等价授权。 + +修复:显式传入 permission set;按钮可见与 handler 双重校验 canonical 诊单只读权限;无权限时不发 `get_diagnosis_detail`。补只有 `cf.prescription/read` 而无诊单权限的拒绝测试。 + +## 6. Endpoint、DTO 与动作复核 + +| 业务 | 管理端/服务端合同 | Python | 判定 | +|---|---|---|---| +| 接诊队列 | `GET doctor.appointment/lists`;`status,start_date,end_date,page_no,page_size,patient_name` | `D:\web\zyt\app\src\doctor_workstation\services\repository.py:640-692`;今日和 1/4 强约束 | DTO **EXACT**;分页 **PARTIAL** | +| 接诊详情/完成 | `detail`、`doctorNotify`、`completeAppointment` | `D:\web\zyt\app\src\doctor_workstation\services\repository.py:694-765` | **EXACT** | +| 医生备注 | `doctorNotes/addDoctorNote/deleteDoctorNoteImage`;素材 URL 先上传 | 读/增/删端点存在,但缺 `/upload/image|file` | **MISSING/P0** | +| 我的患者列表 | `GET firstvisit.myPatient/lists`,keyword/status/date/page | `D:\web\zyt\app\src\doctor_workstation\services\repository.py:1088-1102` | **EXACT** | +| 患者订单/进度 | `orders`、`faceToFaceProgress` + scope/summary | `D:\web\zyt\app\src\doctor_workstation\services\repository.py:1104-1128` | **EXACT** | +| 患者订单动作 | detail/edit、两类审核/撤销、支付、物流、完成、退款、撤回、上传药房 | `D:\web\zyt\app\src\doctor_workstation\services\repository.py:1130-1287`;状态矩阵 `D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:1211-1289` | 主链 **EXACT**;支付/退款表单 **PARTIAL** | +| 患者预约 | `POST firstvisit.myPatient/createAppointment`;`patient_id` 实为当前 diagnosis ID,另含医生/日期/时间/type/channel | Remote `D:\web\zyt\app\src\doctor_workstation\services\repository.py:1318-1325` 透传缩水且错误 DTO | **PARTIAL/P0** | +| 问诊列表/诊单 CRUD | `tcm.diagnosis/lists|detail|add|edit|delete` | `D:\web\zyt\app\src\doctor_workstation\services\repository.py:1339-1418` | endpoint **EXACT**;UI 字段 **PARTIAL** | +| appointment 处方上下文 | `getByAppointment`;空则当前 appointment 新建;保存 diagnosis/appointment/case_record | 端点存在,但错误 diagnosis fallback | **PARTIAL/P0** | +| 处方库 | `tcm.prescriptionLibrary/lists|detail|add|edit|delete`;`doctor.medicine/lists` | `D:\web\zyt\app\src\doctor_workstation\services\repository.py:766-864` | **EXACT** | +| 已开处方 | `tcm.prescription/lists|detail|add|edit|delete|patchPatient|audit|void` | `D:\web\zyt\app\src\doctor_workstation\services\repository.py:866-1016` | endpoint/状态动作 **EXACT**;上下文/权限 **PARTIAL** | +| 处方订单 | lists/detail/create/paidPayOrders | `D:\web\zyt\app\src\doctor_workstation\services\repository.py:1018-1080` | endpoint **EXACT**;建单异步 **PARTIAL** | +| 视频 | `getCallSignature/startCall/bindCallRoom/endCall`,IDs 分离 | `D:\web\zyt\app\src\doctor_workstation\services\repository.py:1575-1615` | endpoint/eligibility **EXACT**;permission **PARTIAL** | + +## 7. 筛选、字段、分页和行状态门槛 + +### 7.1 接诊台 + +- **EXACT**:今日 `start_date=end_date`、等待/过号状态 1/4、姓名筛选、选中患者详情与完成前重取详情。Python:`D:\web\zyt\app\src\doctor_workstation\ui\pages\reception.py:488-558,591-750,1474-1529`。 +- **PARTIAL**:页面固定前 50 条;备注附件只能显示名称/删除,无管理端的图片预览/报告打开。Python:`D:\web\zyt\app\src\doctor_workstation\ui\pages\reception.py:1091-1142`;管理端:`D:\web\zyt\admin\src\views\patient\reception\components\NoteTimeline.vue:52-101`。 + +### 7.2 我的患者 + +- **EXACT**:患者列表 filters、page size 15、summary/scope;订单 keyword、处方审核、支付审核、履约状态、日期与分页;订单列和 action matrix。Python:`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:547-688,825-874,913-1289,1292-1595`。管理端动作基准:`D:\web\zyt\admin\src\views\first_visit\my_patients\components\order-actions.ts:32-124`。 +- **PARTIAL**:预约和诊单详情/编辑字段;诊单上下文订单;支付/退款输入;写操作回调竞态。 + +### 7.3 我的问诊 + +- **EXACT**:核心列表/详情 CRUD endpoints、canonical `tcm.diagnosis/add|edit|delete|readonlyDetail|kaifang`、视频 eligibility 与 ID。 +- **PARTIAL**:Python filters/columns 位于 `D:\web\zyt\app\src\doctor_workstation\ui\pages\consultations.py:649-660,875-904`;管理端基准在 `D:\web\zyt\admin\src\views\tcm\diagnosis\index.vue:191-341,775-798,878-887`。Python 发出管理端不存在的 `consultation_type`,缺 doctor-relevant 的未接诊天数排序;预约、补身份证等管理端行入口没有在本页呈现。指派/医助专属动作不因本页缺失计发布阻断,因为它们不是医生桌面主链或已在患者页提供。 +- **P0**:处方上下文不得按 diagnosis 自动选最近处方。 + +### 7.4 我的处方库 + +- **EXACT**:处方名/剂型/公开范围筛选、15 条分页、处方名/剂型/功效/归属/创建人/时间字段、只读/新增/编辑/删除、远程药材选择、剂量校验、owner/root/role(0/3) 行条件。Python:`D:\web\zyt\app\src\doctor_workstation\ui\pages\prescription_library.py:106-193,267-376`;管理端:`D:\web\zyt\admin\src\views\consumer\prescription\list.vue:1-111,260-301,333-390`。 +- **EXACT**:`disable_edit` 是导入后药材行的保存锁,不是“处方库模板禁止编辑”的行权限。Python:`D:\web\zyt\app\src\doctor_workstation\ui\dialogs\prescription.py:554-585`。 +- **PARTIAL**:canonical permission alias 与异步控件读取。 + +### 7.5 已开处方 + +- **EXACT**:SN、患者、审核状态、来源、日期、医生筛选;15 条分页;详情、CRUD、患者修正、审核通过/驳回备注、作废、订单创建/列表、A4 打印、PDF。Python:`D:\web\zyt\app\src\doctor_workstation\ui\pages\prescriptions.py:297-847`、`D:\web\zyt\app\src\doctor_workstation\ui\dialogs\prescription.py:955-1715`。 +- **EXACT**:编辑/删除/审核/患者修正/建单的行状态门槛与管理端 action matrix 等价。Python:`D:\web\zyt\app\src\doctor_workstation\ui\pages\prescriptions.py:569-577,799-841`;管理端:`D:\web\zyt\admin\src\views\consumer\prescription\index.vue:214-263,3154-3157`。 +- **PARTIAL**:编辑器没有管理端保存前的重复药材名拒绝。Python校验:`D:\web\zyt\app\src\doctor_workstation\ui\dialogs\prescription.py:1397-1417`;管理端:`D:\web\zyt\admin\src\components\tcm-prescription\index.vue:2228-2231`。处方建单及诊单详情权限另见 P1。 + +## 8. Repository 调用存在性审计 + +结论:**EXACT;没有发现 UI 调用不存在/错误命名的 canonical repository 方法。** + +- 接诊别名最终映射到 `list_appointments/get_reception`;notes、tracking、complete 均存在。 +- 患者列表、订单、进度、详情、所有订单动作、预约/取消、指派/身份证均在 Protocol/Remote/Demo 存在。 +- 问诊列表、字典、医助、诊单 CRUD、appointment/diagnosis 处方查询、开方/作废均存在。 +- 处方库 CRUD、药材检索均存在。 +- 已开处方 CRUD、患者修正、审核、作废、诊单详情、订单 CRUD/paid orders 均存在。 + +定义集中于 `D:\web\zyt\app\src\doctor_workstation\services\repository.py:56-425`,Remote 实现在 `D:\web\zyt\app\src\doctor_workstation\services\repository.py:640-1615`,Demo 实现在 `D:\web\zyt\app\src\doctor_workstation\services\mock_repository.py:97-1515`。`D:\web\zyt\app\src\doctor_workstation\services\demo_repository.py:1-5` 只是重导出 Demo 类。 + +兼容调用器 `D:\web\zyt\app\src\doctor_workstation\ui\widgets.py:183-248` 会静默删除未知 kwargs。当前没有因此丢掉必需字段,但这会掩盖未来拼写错误,判 **P2**:把允许删除的冗余键改为显式 adapter/allowlist,测试环境对其他未知键报错。 + +## 9. 动态菜单与 canonical permissions + +### 动态菜单 — EXACT + +- 支持页面注册表:`D:\web\zyt\app\src\doctor_workstation\ui\shell.py:41-106`。 +- 服务端节点 flatten、显示/禁用、排序:`D:\web\zyt\app\src\doctor_workstation\ui\shell.py:145-197`。 +- component/path 匹配和受支持页面解析:`D:\web\zyt\app\src\doctor_workstation\ui\shell.py:200-249`。 +- 非 Demo 会话取 menu 并解析:`D:\web\zyt\app\src\doctor_workstation\app.py:413-443`、`D:\web\zyt\app\src\doctor_workstation\ui\shell.py:264-301,436-460`。 + +仅渲染本地已经实现的五个页面是本轮明确范围,不把其余 admin 路由判 MISSING。不存在“拿静态菜单覆盖后端菜单”的旧问题。 + +### Permissions — PARTIAL + +患者、问诊、shell 使用 exact/wildcard;处方库和已开处方仍经通用 alias helper。所有按钮可见性还必须在 action handler 再检查同一 canonical 权限,不能只靠隐藏按钮。优先修复 P1-7 与 P1-10。 + +## 10. 异步与竞态审计 + +已正确做 generation/目标校验的主链包括:接诊队列与详情、患者列表/助手/订单详情、问诊列表/计数/字典选项/处方上下文、诊单对话框加载保存、药材搜索、模板列表、订单列表。 + +仍需处理: + +| 优先级 | 问题 | 证据 | 修复 | +|---|---|---|---| +| P1 | 患者 mutations 共用 latest-wins generation | `D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:1696-1728` | 串行化或 per-operation token;所有成功写入都 reconcile | +| P1 | 处方建单支付单/定金无上下文 generation | `D:\web\zyt\app\src\doctor_workstation\ui\dialogs\prescription.py:1928-2054` | `(generation,diagnosis_id)` 回验;加载期间禁提交 | +| P1 | worker 直接读 QWidget | `D:\web\zyt\app\src\doctor_workstation\ui\widgets.py:257-319` 及 P1-6 列表 | GUI 线程快照不可变 query | +| P1 | 切换问诊行会 invalidate generation 但可能保留 busy | `D:\web\zyt\app\src\doctor_workstation\ui\pages\consultations.py:1094-1105,1234-1292` | invalidation 同时结束旧 busy,或 active token/cancel;确保新行按钮可恢复 | +| P2 | 处方库/处方列表 loading 时直接丢 refresh | `D:\web\zyt\app\src\doctor_workstation\ui\pages\prescription_library.py:220-238`;`D:\web\zyt\app\src\doctor_workstation\ui\pages\prescriptions.py:499-529` | pending refresh 或并发请求 + generation;快照 filters | +| P2 | 处方诊单详情、订单详情缺目标 ID generation | `D:\web\zyt\app\src\doctor_workstation\ui\pages\prescriptions.py:653-664`;`D:\web\zyt\app\src\doctor_workstation\ui\dialogs\prescription.py:2178-2196` | `_detail_generation` + target ID;加载期间禁重复点击 | + +## 11. 低优先级与 Demo 差异 + +- **P2 / Demo filters**:UI 发 `diagnosis_confirmed` 等筛选:`D:\web\zyt\app\src\doctor_workstation\ui\pages\consultations.py:875-904`;Demo 只处理少数键且读成 `confirmed`:`D:\web\zyt\app\src\doctor_workstation\services\mock_repository.py:1243-1268`。Demo 字典除 `server_order` 外也为空:`D:\web\zyt\app\src\doctor_workstation\services\mock_repository.py:851-860`。补齐 UI 暴露的筛选和四组演示字典。 +- **P2 / raw detail**:已开处方的订单列表详情是通用字段展示,管理端跳向完整订单路由。若桌面产品要求在本应用闭环,需实现 typed detail;否则应明确“只读摘要”范围。 +- **P2 / refresh**:处方库与已开处方在请求过程中改筛选/翻页可能显示旧条件结果,见异步表。 + +## 12. 既有 parity 文档复核 + +### `parity_reception_consultations.md` + +`D:\web\zyt\app\research\parity_reception_consultations.md:14-16,81,148-154` 中“未限定今日/队列详情竞态/视频状态错误/无附件 UI/无开方”等描述大多已经关闭。当前真实结论是:今日和状态 **EXACT**、详情竞态主要链路 **EXACT**、视频 eligibility **EXACT**、开方入口已存在;附件 UI 已存在但上传协议 **MISSING/P0**。 + +### `parity_patients_permissions.md` + +`D:\web\zyt\app\research\parity_patients_permissions.md:13-14,124-127,200-216` 中“订单工作区和动态菜单完全缺失”已关闭。当前三工作区、订单状态矩阵、summary/scope 和动态菜单均存在;仍开放的是预约 DTO/P0、诊单详情隐私、诊单上下文订单和写操作竞态。 + +### `parity_prescriptions.md` + +`D:\web\zyt\app\research\parity_prescriptions.md:255-285,337-343` 把已开处方描述成只读,已过期。当前 `D:\web\zyt\app\src\doctor_workstation\ui\pages\prescriptions.py:253-393,588-847` 已有 CRUD、审核、患者修正、订单、打印/PDF。处方库旧文档的所有权 fail-open 也已修成缺 ID 默认拒绝:`D:\web\zyt\app\src\doctor_workstation\ui\pages\prescription_library.py:267-279`。仍开放的是 P0 处方上下文、P1 order async/权限/重复药材等。 + +## 13. 建议修复顺序与验收门槛 + +1. **先修 P0-1 附件上传**:没有 multipart 和服务器 URL 的实现不得开放附件提交。 +2. **再修 P0-2 处方上下文**:appointment authoritative、异常 fail-closed、完整 `case_record`;删除 diagnosis 自动 fallback。 +3. **修 P0-3 患者预约 ID**:exact DTO + diagnosis/source patient 分离测试。 +4. **随后修权限和订单上下文**:P1-1、P1-3、P1-4、P1-7、P1-8、P1-10。 +5. **最后收口异步/分页**:per-operation mutation、Qt query snapshot、接诊分页、pending refresh。 + +发布验收至少应新增以下反例: + +- 本机盘符/UNC/`file://` 永远不能进入 `addDoctorNote` JSON。 +- 同 diagnosis 两个 appointments 时,B 的 miss/异常永远不能展示或作废 A 的处方。 +- `diagnosis_id != source_patient_id` 时,预约 body 的 `patient_id` 必须等于 diagnosis ID;视频 body 保持真实 patient ID。 +- 只有点号 alias permission 时,slash canonical action 必须拒绝。 +- 两个患者订单 mutation 乱序完成后,UI 必须最终与服务端一致。 +- 诊单切换前返回的 paid-order 响应不能进入新诊单 payload,门槛未加载时不能提交。 +- 超过 50 位的今日接诊队列仍可继续加载。 + +完成以上 P0 并替换两条错误预期测试后,才可把整体结论从 **PARTIAL** 提升到可发布候选。 diff --git a/app/research/integration_review.md b/app/research/integration_review.md new file mode 100644 index 000000000..9a3370a40 --- /dev/null +++ b/app/research/integration_review.md @@ -0,0 +1,101 @@ +# 医生工作站集成审查 + +审查时间:2026-08-10。范围为当前工作区中的组合根、登录到主壳链路、Remote/Demo repository、权限门控、退出/视频生命周期及 PyInstaller 入口。审查只读进行;除本报告外未修改项目文件,也未发送网络请求。 + +## 结论 + +入口链 `packaging/doctor_workstation.spec -> doctor_workstation/__main__.py -> app.main()` 和 `build_repository(..., verify=...)` 的构造签名已经对齐,Remote/Demo 的主要 CRUD 与通话方法也具有兼容签名。当前仍有 4 个高严重度和 6 个中严重度集成问题;其中浏览器视频模式目前不能真正发起通话,退出时也存在通话窗口失管和 GUI 阻塞风险。 + +## P1(高) + +### 1. 浏览器视频模式没有把一次性通话上下文交给伴随页 + +- `src/doctor_workstation/video/window.py:312-326` 在服务端 `start_call` 后仅执行 `webbrowser.open(location.url)`;`VideoCallRequest` 中的 diagnosis、目标用户和 UserSig 均未交给浏览器。 +- `video_companion/src/main.ts:208-236` 只有显式调用 `window.doctorCall.start(config)` 才会初始化 SDK 并呼叫患者,页面自身不获取票据;`video_companion/src/main.ts:281-289` 只是暴露 API 和发送 ready。 +- `README.md:70-77` 又把 browser 声明为正式降级路径,并要求用一次性业务票据传递上下文,和当前实现不一致。 + +系统浏览器不存在 Qt WebChannel,且静态 URL 连 diagnosis_id 都没有,因此页面会一直停在“等待桌面端发起”,而后端通话记录已经开始。浏览器标签关闭也无法回告 Python,`end_call` 只能等显式退出应用。应使用后端签发、单次消费且短有效期的浏览器 handoff ticket(URL 中不能放 UserSig),或受认证的本机 IPC;伴随页确认接收后再调用 `start_call`,并建立可观测的结束回调。 + +### 2. 通话 start/bind/end 的同步 HTTP 被直接放在 Qt GUI 线程执行 + +- `src/doctor_workstation/video/window.py:206-290` 直接调用 repository 的 `start_call`、`bind_call_room`、`end_call`。 +- browser 在 `src/doctor_workstation/video/window.py:312-320` 同步 start;embedded 在 loadFinished 回调 `src/doctor_workstation/video/window.py:437-456` 同步 start,在 bridge/close 回调 `src/doctor_workstation/video/window.py:485-522` 同步 bind/end。 +- Remote 实现最终执行同步 `httpx` POST(`src/doctor_workstation/services/repository.py:377-402`),而配置超时可达 120 秒。 +- 登出和进程退出又在主线程逐个 `call.close()`(`src/doctor_workstation/app.py:298-315`、`src/doctor_workstation/app.py:409-415`)。 + +弱网时打开、挂断、退出都会冻结整个界面;`end_call` 抛错时 embedded 的 `closeEvent` 甚至到不了 `event.accept()`。应把生命周期写操作放入受控 worker,并使用状态机保证单次执行;退出阶段设置短上限、记录未完成结束动作,同时先关闭媒体/UI,不能让网络请求阻塞 Qt 关闭事件。 + +### 3. 同一 diagnosis 的重复发起会覆盖通话句柄,导致退出后仍可能保留旧视频窗口 + +- `src/doctor_workstation/app.py:343-356` 没有 pending/active 去重,用户可在票据请求完成前重复发起。 +- `src/doctor_workstation/app.py:390-396` 以 diagnosis_id 为唯一 key 直接覆盖旧句柄;旧窗口的 destroyed 回调还会无条件 `pop` 同一个 key,可能把较新的句柄移除。 +- 登出/退出只关闭字典当前仍持有的值(`src/doctor_workstation/app.py:298-305`、`src/doctor_workstation/app.py:409-412`)。 + +结果是第一个窗口可能在切回登录页后继续持有摄像头/麦克风;反向关闭旧窗口也会让新窗口失去托管。应对 diagnosis 建立 pending/active 单飞,拒绝或先可靠关闭旧通话;销毁回调必须做对象身份判断后再移除。 + +### 4. WebEngine 对任意来源自动授予音视频权限,且登出没有隔离/清理 profile + +- `src/doctor_workstation/video/window.py:381-390` 使用 `QWebEngineView` 的共享默认 profile,没有为单次通话建立隔离 profile。 +- `src/doctor_workstation/video/window.py:405-435` 在授权回调中不校验请求 origin、当前页面 URL 或通话状态,只要 feature 名含 audio/video 就 grant。 +- 没有自定义 `acceptNavigationRequest`/origin allowlist;关闭时 `src/doctor_workstation/video/window.py:519-522` 仅挂断,不撤销权限或清理 Cookie、cache、local storage。 + +初始 URL 虽经过 HTTPS 校验,但页面后续导航不受限制;同一进程内切换账号时 WebEngine 状态也可能复用。应使用每通话或每会话的 off-the-record profile、精确 origin/path allowlist,只在活跃通话且当前主文档来源匹配时授权,并在挂断/登出时撤销权限和清理页面/profile。 + +## P2(中) + +### 5. API code=-1 没有接入应用级会话失效处理 + +- `src/doctor_workstation/services/api_client.py:277-278` 会抛出 `AuthenticationExpiredError`。 +- worker 只把异常交给页面自己的通用 on_error(`src/doctor_workstation/ui/widgets.py:262-293`);组合根只有用户主动点击时才执行 `_logout`(`src/doctor_workstation/app.py:298-315`)。 +- 项目中除异常定义/抛出外没有消费 `AuthenticationExpiredError` 的代码。 + +token 过期后主壳仍展示已加载的患者数据和旧权限快照,各页面只显示错误,用户必须手动退出。应在统一 API/worker 边界发出 session-expired 事件,由 Controller 原子地停止轮询和视频、清 token、销毁 ShellWindow 并回到 LoginWindow。 + +### 6. 页面和动作权限使用过宽的 OR 兜底,并忽略后端 menu + +- `src/doctor_workstation/services/repository.py:111-127` 已解析 `Session.menu`,但 `src/doctor_workstation/ui/shell.py:248-260` 只按硬编码 `NAVIGATION.permissions` 注册页面,menu 从未参与判断;这与管理端“无有效 menu 即 403”的已确认行为(`research/admin_audit.md:103-109`)不一致。 +- 接诊页可仅凭 `doctor.appointment/reception` 显示,但页面首先请求 `doctor.appointment/lists`(`src/doctor_workstation/ui/shell.py:40-47`、`src/doctor_workstation/ui/pages/reception.py:347-364`)。患者页可仅凭 readonlyDetail 显示,却始终请求 firstvisit lists;问诊页可仅凭 appointment lists 显示,却始终请求 diagnosis lists(`src/doctor_workstation/ui/shell.py:62-75`)。 +- 通知医助和视频按钮又把基础 lists 当动作权限兜底(`src/doctor_workstation/ui/pages/reception.py:321-332`、`src/doctor_workstation/ui/pages/consultations.py:88-96`),所以缺少 videoQr/notifyAssistant 的账号仍看到按钮。 + +服务端仍是最终边界,但当前 UI 会显示必然 403 的页面/动作,也可能绕过管理员对 desktop 页面入口的隐藏意图。页面应同时受后端 menu/capability 和实际列表接口权限约束;动作只接受对应动作码或经过确认的同义码,不能用 lists 兜底。 + +### 7. 已开处方审核状态筛选在 UI 适配层被改成 Remote 不识别的字段 + +- UI 传入 status,`src/doctor_workstation/ui/widgets.py:205-208` 将其改写为 `audit_status`。 +- Remote 只在收到 `status` 时转换成后端需要的 `audit_filter=pending|passed|rejected`(`src/doctor_workstation/services/repository.py:284-303`),因此实际请求会原样携带数值 `audit_status`。 +- Demo 特意兼容了 `audit_status`(`src/doctor_workstation/services/mock_repository.py:374-399`),所以演示验收不会暴露生产差异。 + +结果是生产环境的“待审核/已通过/已驳回”筛选可能无效或被后端拒绝。应只在 repository 内做一次 UI 值到 API DTO 的映射,并给 Remote 增加 request-parameter 合同测试。 + +### 8. 登录 token 在 Session 校验成功前落盘,失败路径不回滚 + +- `src/doctor_workstation/services/repository.py:82-90` 在调用 `auth.admin/mySelf` 前就设置并持久化 token。 +- mySelf 网络失败、协议错误或 code=10 时 LoginWindow 只显示错误(`src/doctor_workstation/ui/login.py:385-390`),不会调用 repository.logout。 + +这会在用户从未进入有效 Session 的情况下留下内存和 keyring/JSON token,后续登录还会带着该 token 请求 login/account。应先把 token 暂存在内存,完整构建并校验 Session 后再持久化;任何异常都清理 client/token store。 + +### 9. “记住账号”未控制 TokenStore 中的账号落盘,且持久 token 没有启动恢复闭环 + +- `src/doctor_workstation/services/repository.py:87-88` 每次成功账号密码登录都把 account 传给 TokenStore,与复选框无关。 +- TokenStore 会把 account 写入 JSON 元数据(`src/doctor_workstation/services/token_store.py:83-108`),而 LoginWindow 的复选框只增删 QSettings(`src/doctor_workstation/ui/login.py:374-379`)。 +- `ApplicationController.start()` 始终显示登录页(`src/doctor_workstation/app.py:172-176`),未调用已实现的 `restore_session`;普通关闭只 close client,不清 token(`src/doctor_workstation/app.py:409-415`)。 + +因此取消“记住账号”仍会在磁盘留下账号;成功 token 则持续保存但下次启动完全不使用。应让 remember-account 明确控制所有账号元数据,并二选一:启动时安全验证/恢复 token,或不持久化并在关闭时清除。 + +### 10. 当前冻结产物落后于最新 companion,构建脚本也没有执行入口 smoke test + +- 最新 `video_companion/dist/index.html:8` 引用 `index-le5ZH3pL.js`(包含 roomId/bindCallRoom 桥接),现有 `dist/DoctorWorkstation/_internal/video_companion_dist/index.html:8` 仍引用旧的 `index-BrQGJzsD.js`。 +- 应用已经提供 `--smoke-test`(`src/doctor_workstation/app.py:436-451`),但 Windows 构建只检查 helper/pak/index 文件存在(`scripts/build_windows.ps1:30-43`),macOS 同样只做静态文件和 codesign 检查(`scripts/build_macos.sh:22-37`),都不启动冻结入口。 + +所以当前 `dist/DoctorWorkstation` 不包含刚合并的 room binding;未来即使入口 import/bootstrap 失败,构建也可能仍打印成功。交付前应重新执行 PyInstaller,并在隔离用户目录、无真实网络的环境下运行冻结程序 `--smoke-test`,同时校验退出码和日志中无未捕获异常。 + +## 已核对且未发现签名断点 + +- `ApiClient(base_url, ..., verify=...)`、`build_repository(..., verify=...)` 与 `app.py` 调用一致。 +- Remote/Demo 的 login 均返回 `Session`;列表、接诊、处方库 CRUD、患者/问诊列表及 `get_call_ticket/start_call/bind_call_room/end_call` 的 UI 所需参数基本对齐。 +- PyInstaller spec 的入口、`src` pathex、resources 和 `video_companion_dist` 目标路径与 `resources.py` 的 `_MEIPASS` 查找规则一致。 +- 最新 source companion 已产生 roomId 并调用 `bind_call_room`;本报告未把此前已修复的“问诊页交换 appointment/diagnosis ID”或“未绑定 room”列为当前问题。 + +## 验证限制 + +本轮没有重新执行 Python 测试:工作区 `.venv/Scripts/python.exe` 指向当前机器上不存在的 uv Python 基础解释器;为保持只读审查,没有重建虚拟环境。现有 `research/ui_acceptance.md` 记录的最近一次完整测试为 46 passed,但上述多项是未被现有单元测试覆盖的跨层行为。 diff --git a/app/research/parity_patients_permissions.md b/app/research/parity_patients_permissions.md new file mode 100644 index 000000000..76c1a8465 --- /dev/null +++ b/app/research/parity_patients_permissions.md @@ -0,0 +1,229 @@ +# 患者列表、动态菜单与权限一致性审计 + +审计日期:2026-08-10 +管理端唯一事实来源:`D:\web\zyt\admin\src\views\**` +Python 对照范围:`D:\web\zyt\app\src\doctor_workstation\**` + +## 1. 结论摘要 + +| 审计项 | 结论 | 摘要 | +|---|---|---| +| “患者列表”真实业务页面识别 | **EXACT** | 医生工作站语义下的真实页面是 `first_visit/my_patients/index.vue`,不是同样含“患者列表”字样的 `doctor/progress.vue`。 | +| Python 患者列表基础查询 | **PARTIAL** | 使用同一“我的患者”业务语义、相同五种状态和服务端数据范围,但只实现了主列表的子集。 | +| 患者详情与历史关联 | **MISSING** | Python 没有进入诊单编辑/只读详情链,也没有详情请求;右侧内容直接取列表行及其 `raw`。 | +| 患者订单管理、面诊进度 | **MISSING** | 管理端同一路由内的两个完整工作区在 Python 中均不存在。 | +| 五模块主导航 | **PARTIAL** | Python 解析并保存 `mySelf.menu`,登录时只判断菜单非空;Shell 随后忽略菜单树,使用固定五项加扁平权限码。 | +| 按钮权限 | **PARTIAL** | 多数已有写操作有权限门禁,但存在 canonical 权限码偏差、额外别名放行、患者动作大量缺失;处方库所有者判断存在 fail-open。 | +| 医生角色/部门数据范围 | **PARTIAL** | 患者主列表的请求未注入任意医生 ID,保持服务端权威范围;但 Python 丢弃 `extend.scope`、汇总和 ownership 模式,且缺少订单/进度工作区。 | + +判定口径: + +- **EXACT**:当前证据范围内,业务入口、条件、权限或数据语义一致。 +- **PARTIAL**:主链存在,但字段、筛选、动作、菜单约束或范围提示不完整/不一致。 +- **MISSING**:管理端已存在的业务能力,在 Python 中未找到入口或调用链。 + +## 2. 证据边界 + +1. 本报告没有读取 `D:\web\zyt\admin\src\views` 之外的管理端文件。因此可以确认 Vue 页面实际引用的 API **函数名、参数和交互**,但不能读取 `@/api/**` 的实现来反推真实 HTTP URL。 +2. `views/**` 内没有 `auth.admin/mySelf` 调用或该接口返回的真实菜单 JSON。五个主页面的 `paths/component/perms/sort/is_show/is_disable` 精确菜单记录无法从本次允许范围内恢复。 +3. 管理端的菜单管理页证明动态菜单记录至少分别保存“路由路径”“组件路径”“权限字符”“是否显示”“菜单状态”:`D:\web\zyt\admin\src\views\permission\menu\edit.vue:41-94,125-150`;其中隐藏菜单仍可访问的语义写在 `D:\web\zyt\admin\src\views\permission\menu\edit.vue:135-137`。因此,不能把单一扁平权限码等同于完整路由记录。 +4. 对服务端是否再次执行权限/所有权校验不作推断;本报告的 P0 是**客户端授权门禁一致性**问题。 + +## 3. “患者列表”真实页面识别 + +### 3.1 主页面:`first_visit/my_patients/index.vue` + +确认依据: + +- 页面直接声明“一诊 / 我的患者”,并说明“患者、挂号与诊单信息按当前角色和部门数据范围展示”:`D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:5-10`。 +- 同一路由内明确包含“患者列表 / 订单管理 / 面诊进度”三个工作区:`D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:15-20`。 +- 主表由 `myPatientLists` 驱动,并异步装载诊单编辑、预约、订单和进度组件:`D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:330-344,404-409`。 + +结论:Python `PatientsPage` 应对标这一页面及其子工作区,而不应只对标某张通用患者/挂号表。 + +### 3.2 排除项:`doctor/progress.vue` + +该文件虽在表头使用“患者列表”,但它是医生面诊进度看板: + +- 页面要求先选择医生,再展示该医生挂号:`D:\web\zyt\admin\src\views\doctor\progress.vue:57-88`。 +- 组件名为 `doctorProgress`,API 为 `doctorLists` 与 `appointmentLists`:`D:\web\zyt\admin\src\views\doctor\progress.vue:176-182`。 +- 它显式传 `role_id: 1` 拉医生,并用 `doctor_id + progress_board=1` 拉挂号;注释说明不按医生/医助角色收窄:`D:\web\zyt\admin\src\views\doctor\progress.vue:408-448,460`。 + +因此该页面是跨医生进度看板,不是“我的患者”主数据页。把它的数据范围套到患者模块会错误扩大语义范围。 + +## 4. 管理端患者模块真实合同 + +### 4.1 主列表、筛选和服务端范围 + +| 能力 | 管理端证据 | +|---|---| +| 关键词 | 患者姓名、手机号、助理、医生:`D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:23-43` | +| 状态 | 未预约、待面诊、已完成、已过号:`D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:346-393` | +| 挂号日期 | 今日、明日、后天、近 7 天、近 30 天、自定义区间:`D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:46-69,395-401` | +| 汇总 | 今日/明日/后天预约人数来自 `pager.extend.summary/dates`:`D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:72-88,411-416` | +| 范围提示 | 顶部和表格显示 `pager.extend.scope.label`:`D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:90-96,417` | +| 列表字段 | 患者性别年龄/脱敏手机、归属助理、预约医生及状态、预约时间、复诊次数、确认信息、诊单日期:`D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:105-148` | + +主列表 API 符号为 `myPatientLists`,调用参数为 `keyword/status_filter/start_date/end_date/page`:`D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:330-336,380-408`。 + +### 4.2 行级动作与权限码 + +| 动作 | 管理端权限/条件 | 证据 | +|---|---|---| +| 编辑诊单 | `tcm.diagnosis/edit` | `D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:152,418,492-498` | +| 只读查看 | `tcm.diagnosis/readonlyDetail` | `D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:153,419,500-510` | +| 预约/取消挂号 | `tcm.diagnosis/guahao`;取消仅状态 1/4 | `D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:154,179-186,420,681-696` | +| 指派/重新指派医助 | `tcm.diagnosis/assign` | `D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:155-162,421,527-575` | +| 补全身份证 | 复用 `tcm.diagnosis/edit` | `D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:163-170,422,578-628` | +| 诊单二维码 | 复用挂号权限,且要求有效挂号、状态 1、医生 ID | `D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:171-178,630-673` | + +只读诊单不是列表内的摘要面板。页面先从动态路由中查找 `meta.perms === 'tcm.diagnosis/readonlyDetail'`,再携带诊单 ID 跳转:`D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:500-510`。 + +### 4.3 订单管理子工作区 + +- 数据口径明确为“当前患者范围内”的处方业务订单,且“订单创建人不参与数据归属判断”:`D:\web\zyt\admin\src\views\first_visit\my_patients\components\OrderPanel.vue:3-10`。 +- 支持处方审核、支付单审核、履约状态、关键词与日期筛选:`D:\web\zyt\admin\src\views\first_visit\my_patients\components\OrderPanel.vue:14-79`。 +- 汇总包含订单数、有效金额、待审核、完成/签收、拒收数和拒收率:`D:\web\zyt\admin\src\views\first_visit\my_patients\components\OrderPanel.vue:82-123,289-297`。 +- 列表显示订单/患者/处方与诊单/金额/双审/履约/支付单/助理/医生/创建人:`D:\web\zyt\admin\src\views\first_visit\my_patients\components\OrderPanel.vue:125-188`。 +- 数据由 `myPatientOrderLists` 分页加载:`D:\web\zyt\admin\src\views\first_visit\my_patients\components\OrderPanel.vue:234-244,282-286`。 +- 订单按钮以 canonical `tcm.prescriptionOrder/*` 权限和业务状态共同判定;完整矩阵在 `D:\web\zyt\admin\src\views\first_visit\my_patients\components\order-actions.ts:32-124`,包括详情、编辑、双审及撤回、快递、补支付、完成、退款、撤回、上传药房。 + +### 4.4 面诊进度子工作区 + +- 服务端通过 `extend.schedule_mode` 决定“按本人归属”或“与排班合并”,而不是客户端按角色 ID 猜测:`D:\web\zyt\admin\src\views\first_visit\my_patients\components\ProgressPanel.vue:7-26,206-214`。 +- “本人患者”语义、近七日安排、医生聚合、候诊队列均在同一工作区:`D:\web\zyt\admin\src\views\first_visit\my_patients\components\ProgressPanel.vue:31-117,120-178`。 +- API 符号为 `myPatientProgressLists`,数据范围标签来自 `extend.scope.label`,本人患者由 `row.is_self_patient` 标识:`D:\web\zyt\admin\src\views\first_visit\my_patients\components\ProgressPanel.vue:185-203,263,308-309`。 +- 每 15 秒自动刷新:`D:\web\zyt\admin\src\views\first_visit\my_patients\components\ProgressPanel.vue:318-325`。 + +### 4.5 详情与历史关联链 + +管理端患者行会进入诊单编辑或只读详情,而后继续关联: + +- 只读页真实标题为“患者信息详情”,无权限/不存在时明确空态:`D:\web\zyt\admin\src\views\tcm\diagnosis\readonly.vue:4-36`。 +- 基本信息、完整病历、日常记录、医生备注/舌苔/报告:`D:\web\zyt\admin\src\views\tcm\diagnosis\readonly.vue:38-72`。 +- 业务订单、视频回放、聊天、医助指派历史、挂号历史分别按权限展示:`D:\web\zyt\admin\src\views\tcm\diagnosis\readonly.vue:74-146`。 +- 详情由 `diagnosisReadonlyDetail({id})` 拉取,备注另用 `getDoctorNotes({diagnosis_id})` 补齐:`D:\web\zyt\admin\src\views\tcm\diagnosis\readonly.vue:151-188,209-234`。 +- 编辑页还提供处方病历、订单、视频、聊天、指派与挂号记录分页签:`D:\web\zyt\admin\src\views\tcm\diagnosis\edit.vue:655-759`。 +- 挂号历史不是列表行快照,而是按诊单 ID 单独调用 `appointmentLists`,携带 `diag_scope_relax: 1`、最多 500 条:`D:\web\zyt\admin\src\views\tcm\diagnosis\components\AppointmentRecordPanel.vue:79-89,139-152`。 +- 指派历史同样按诊单 ID 调用 `tcmDiagnosisAssignLogList`:`D:\web\zyt\admin\src\views\tcm\diagnosis\components\AssignLogPanel.vue:47-57,102-125`。 +- 业务订单按 `context_diagnosis_id + patient_id + scene=diagnosis_edit` 独立分页:`D:\web\zyt\admin\src\views\tcm\diagnosis\components\PatientOrderList.vue:118-148,170-179`。 + +## 5. Python 患者模块逐项对照 + +| 项目 | Python 当前实现 | 判定 | 说明 | +|---|---|---|---| +| 页面身份 | 标题“我的患者”,描述服务端授权范围:`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:84-92` | **EXACT** | 对标对象正确。 | +| 状态筛选 | 五种状态一致:`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:94-119` | **EXACT** | 状态值与管理端一致。 | +| 关键词 | Python 提示“姓名、手机号或诊单号”:`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:99-103` | **PARTIAL** | 管理端还明确支持助理/医生。 | +| 日期与汇总 | 无日期快捷项、区间和三日汇总 | **MISSING** | 管理端证据见 4.1。 | +| 表格 | 患者、性别年龄、电话、进度、医助、最近预约、复诊:`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:132-196` | **PARTIAL** | 缺预约医生独立列、确认信息、诊单日期和全部操作。 | +| 列表请求 | `patients(keyword,status,page,page_size)`:`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:307-326` | **PARTIAL** | 无 `start_date/end_date`;服务层正确映射 `status -> status_filter`。 | +| 服务端范围 | `list_patients` 使用 `firstvisit.myPatient/lists`,不注入医生 ID:`D:\web\zyt\app\src\doctor_workstation\services\repository.py:398-412` | **EXACT** | 保持服务端权威数据范围,没有客户端越权扩大证据。 | +| `extend` | `PageResult` 完整保留 `extend`:`D:\web\zyt\app\src\doctor_workstation\core\models.py:590-598,618-672`;页面只读 items/total:`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:328-335` | **PARTIAL** | scope、summary、dates 已被解析却未消费。 | +| 患者模型 | 覆盖主列表核心字段并保留 `raw`:`D:\web\zyt\app\src\doctor_workstation\core\models.py:241-318` | **EXACT** | 解析层可承载主表数据。 | +| 详情 | 选择行后直接 `_render_detail(patient)`:`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:349-415` | **MISSING** | 没有诊单详情请求,不能等价于管理端只读/编辑页。 | +| 历史预约 | 从列表行 `appointments` 取最多 6 条:`D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:417-446` | **MISSING** | 管理端按诊单单独请求最多 500 条并显示更完整字段。 | +| 患者行动作 | 无编辑/只读/预约/指派/补身份证/二维码/取消挂号按钮 | **MISSING** | `D:\web\zyt\app\src\doctor_workstation\ui\pages\patients.py:1-454` 没有动作链。 | +| 订单/进度工作区 | 无 | **MISSING** | Python 只有列表与右侧摘要。 | + +补充:`get_value` 会在 dataclass 属性缺失时回退到 `.raw`:`D:\web\zyt\app\src\doctor_workstation\ui\widgets.py:48-66`。因此右侧摘要“可能”显示列表响应附带的额外字段,但它仍是列表快照,不是独立详情/历史合同。 + +## 6. 五模块动态路由、API 与按钮权限复核 + +### 6.1 主路由组件与 Python 导航 + +| 模块 | 管理端实际组件(views 证据) | Python 固定导航权限 | 判定 | +|---|---|---|---| +| 接诊台 | `D:\web\zyt\admin\src\views\patient\reception\index.vue:1-18` | `doctor.appointment/lists`:`D:\web\zyt\app\src\doctor_workstation\ui\shell.py:40-47` | **PARTIAL** | +| 处方库 | `D:\web\zyt\admin\src\views\consumer\prescription\list.vue:1-4,234-245` | `tcm.prescriptionLibrary/lists`:`D:\web\zyt\app\src\doctor_workstation\ui\shell.py:48-54` | **PARTIAL** | +| 已开处方 | `D:\web\zyt\admin\src\views\consumer\prescription\index.vue:1-4,1697-1711` | `tcm.prescription/lists`:`D:\web\zyt\app\src\doctor_workstation\ui\shell.py:55-61` | **PARTIAL** | +| 患者 | `D:\web\zyt\admin\src\views\first_visit\my_patients\index.vue:5-20` | `firstvisit.myPatient/lists`:`D:\web\zyt\app\src\doctor_workstation\ui\shell.py:62-68` | **PARTIAL** | +| 问诊/诊单 | `D:\web\zyt\admin\src\views\tcm\diagnosis\index.vue:726-738` | `tcm.diagnosis/lists`:`D:\web\zyt\app\src\doctor_workstation\ui\shell.py:69-75` | **PARTIAL** | + +这里的 **PARTIAL** 不是说固定权限码必然错误,而是:在 `views/**` 证据范围内无法恢复五条真实 `mySelf.menu` 记录,Python 又没有使用已经解析到的菜单树来做组件/顺序/显示/停用约束。 + +### 6.2 `mySelf` 菜单链 + +1. Python 正确请求 `auth.admin/mySelf`,解析用户、权限与 menu:`D:\web\zyt\app\src\doctor_workstation\services\repository.py:164-195` —— **EXACT**。 +2. `Session` 正确保留 `menu`:`D:\web\zyt\app\src\doctor_workstation\core\session.py:12-22` —— **EXACT**。 +3. 正式登录只检查 `session.menu` 非空,然后把权限交给 Shell:`D:\web\zyt\app\src\doctor_workstation\app.py:413-443` —— **PARTIAL**。 +4. Shell 注册页面时遍历固定 `NAVIGATION`,只调用扁平 `has_permission`,没有读取 `session.menu`:`D:\web\zyt\app\src\doctor_workstation\ui\shell.py:248-280` —— **MISSING(菜单绑定)**。 + +实际影响:菜单中任意一项存在即可通过登录守卫;随后五模块的显示、顺序、名称及停用状态均由本地固定表决定。动态路由中的隐藏/停用/组件路径/排序语义没有落地。 + +### 6.3 按钮权限与功能矩阵 + +#### 接诊台 — **PARTIAL** + +- 管理端备注、编辑病历、完成接诊分别使用 `doctor.appointment/addDoctorNote`、`tcm.diagnosis/edit`、`doctor.appointment/complete`:`D:\web\zyt\admin\src\views\patient\reception\index.vue:144-171`。 +- 管理端队列内“通知医助/发起通话”按钮本身没有 `v-perms`:`D:\web\zyt\admin\src\views\patient\reception\index.vue:75-90`。 +- Python 备注与完成权限一致,但通知增加了 `doctor.appointment/notifyAssistant`,视频增加了 `tcm.diagnosis/videoQr`;缺“编辑病历”:`D:\web\zyt\app\src\doctor_workstation\ui\pages\reception.py:322-331`。 +- Python 的通知、备注、完成调用链存在:`D:\web\zyt\app\src\doctor_workstation\ui\pages\reception.py:558-641`;管理端对应 API 调用见 `D:\web\zyt\admin\src\views\patient\reception\index.vue:460-527`。 + +#### 处方库 — **PARTIAL,含 P0 权限门禁问题** + +- 管理端 canonical 按钮码是 `wcf.prescription/add|read|edit|delete`:`D:\web\zyt\admin\src\views\consumer\prescription\list.vue:35-41,83-105`。 +- 管理端编辑/删除还要求创建人本人,或 root/角色 0、3:`D:\web\zyt\admin\src\views\consumer\prescription\list.vue:278-301`。 +- Python 新增/编辑/删除同时接受 canonical `wcf.*` 和额外 `tcm.prescriptionLibrary/*`:`D:\web\zyt\app\src\doctor_workstation\ui\pages\prescription_library.py:271-279,330-348`。 +- Python root/角色 0、3 的例外与管理端一致,但当 `user_id` 或 `creator_id` 缺失时直接返回可管理:`D:\web\zyt\app\src\doctor_workstation\ui\pages\prescription_library.py:460-472`。管理端的 `Number(row.creator_id) === Number(user.id)` 不会对缺失创建人默认放行。 + +#### 已开处方 — **PARTIAL/MISSING actions** + +- 管理端支持业务订单跳转、新增、查看、修正患者、创建订单、编辑、审核、删除,对应权限码见 `D:\web\zyt\admin\src\views\consumer\prescription\index.vue:102-117,214-265`。 +- 业务订单导航依赖动态路由中的 `meta.perms === 'tcm.prescriptionOrder/lists'`,菜单不存在会拒绝跳转并提示:`D:\web\zyt\admin\src\views\consumer\prescription\index.vue:1862-1871`。 +- Python 只实现关键词/审核状态的列表和详情请求:`D:\web\zyt\app\src\doctor_workstation\ui\pages\prescriptions.py:91-188,284-340`;上述写操作与订单导航均不存在。 + +#### 患者 — **MISSING actions** + +完整动作矩阵见第 4.2 节;Python 患者页没有对应按钮或权限检查。 + +#### 问诊/诊单 — **PARTIAL/MISSING actions** + +- 管理端新增、批量指派、查看、诊单、开方、预约、补身份证、指派/取消指派、视频二维码、确认二维码/取消挂号、挂号日志、订单、删除的权限矩阵见 `D:\web\zyt\admin\src\views\tcm\diagnosis\index.vue:154-175,342-405`。 +- Python 仅保留列表筛选与 `tcm.diagnosis/videoQr` 视频入口:`D:\web\zyt\app\src\doctor_workstation\ui\pages\consultations.py:101-107,110-236,264-323`。 + +### 6.4 权限匹配语义 + +- `PermissionSet` 支持精确码、全局 `*` 和 `prefix/*`:`D:\web\zyt\app\src\doctor_workstation\core\permissions.py:24-84`,OR 语义见 `D:\web\zyt\app\src\doctor_workstation\core\permissions.py:96-104`。 +- UI `has_permission` 额外把 `/` 与 `.` 互换后尝试匹配:`D:\web\zyt\app\src\doctor_workstation\ui\widgets.py:135-180`。 +- 管理端视图只声明 canonical 形态,例如 `tcm.diagnosis/edit`、`wcf.prescription/edit`。由于本次不能读取管理端权限工具实现,不能证明管理端也接受点/斜杠变体;Python 的变体放行应判为 **PARTIAL**,不应当作已证明的兼容要求。 + +## 7. 医生角色与数据范围 + +### 7.1 已证明一致的部分 + +- 患者列表:管理端要求按当前角色/部门展示并把最终范围作为 `extend.scope.label` 返回;Python 调用相同业务域列表,不传任意 `doctor_id`,所以没有客户端扩大数据集的证据。判定 **EXACT(请求边界)**。 +- 处方库:普通医生只能管理自己创建的模板,root/角色 0、3 才可管理全部。Python 的正常 ID 分支与此一致。判定 **EXACT(正常分支)**。 + +### 7.2 部分或缺失 + +- Python 不显示 `extend.scope.label`,用户无法验证当前是本人、部门还是其他服务端范围:**PARTIAL**。 +- Python 缺失患者订单工作区,因而没有落实“当前患者范围内、订单创建人不参与归属”的口径:**MISSING**。 +- Python 缺失面诊进度工作区,因而没有落实服务端 `schedule_mode=ownership`、`is_self_patient` 和近七日聚合:**MISSING**。 +- 除患者模块视图明确写出的范围文字外,接诊、处方、诊单视图没有在允许证据范围内定义服务端角色/部门过滤算法。Python 使用同域列表接口且未见额外越权 `doctor_id` 注入,但无法仅凭 views 宣称五模块的后端数据范围 **EXACT**;应保留 **PARTIAL / 服务端待证**。 + +## 8. P0 / P1 缺口 + +### P0 + +1. **处方库所有权校验 fail-open。** + Python 在当前用户 ID 或模板 `creator_id` 任一缺失时允许编辑/删除:`D:\web\zyt\app\src\doctor_workstation\ui\pages\prescription_library.py:460-466`;管理端仅允许严格所有者匹配或 root/角色 0、3:`D:\web\zyt\admin\src\views\consumer\prescription\list.vue:286-301`。应改成缺失即拒绝,并只在明确 root/角色例外时放行。若服务端另有强制校验,实际数据写入风险会降低,但客户端授权偏差仍已成立。 + +### P1 + +1. **患者模块只有主表子集。** 缺日期筛选、三日汇总、范围标签、确认/诊单日期列和全部行级动作。 +2. **患者详情不是管理端真实详情。** Python 不请求诊单只读/编辑详情,病历摘要与最多 6 条历史预约依赖列表行快照,可能为空或陈旧。 +3. **患者订单管理与面诊进度两个工作区完全缺失。** 同时丢失订单数据范围、订单操作权限矩阵、ownership 模式和 15 秒候诊刷新。 +4. **Shell 忽略 `mySelf.menu`。** 已解析的动态菜单只用于“非空”登录守卫;五模块由固定表和扁平权限决定,未落实组件路径、显示/停用、排序和真实菜单成员关系。 +5. **处方库权限码存在额外别名放行。** Python 接受 `tcm.prescriptionLibrary/add|edit|delete`,而视图仅证明 canonical `wcf.prescription/*`;应在拿到真实 `mySelf.permissions/menu` 样本后收敛。 +6. **通用权限帮助器接受 `/`/`.` 互换。** 该兼容未被 views-only 证据证明,可能让非 canonical grant 意外点亮按钮。 +7. **接诊台按钮矩阵不一致。** Python 比管理端额外门禁通知/视频,同时缺少 `tcm.diagnosis/edit` 的编辑病历动作。 +8. **已开处方和问诊页均被压缩为只读子集。** 管理端已有的新增/编辑/审核/删除/订单/预约/指派等受权操作未落地。 + +## 9. 建议的验收优先级 + +1. 先修复处方库所有权 fail-open,并用“缺 `creator_id`、缺当前用户 ID、本人、他人、root、角色 0/3”六组合同测试覆盖。 +2. 让 Shell 以 `Session.menu` 为主约束,再叠加权限码;不要仅以硬编码五项替代动态菜单。 +3. 将患者页拆成与管理端一致的三个工作区,优先补真实只读详情/历史请求和主表行级动作。 +4. 消费 `PageResult.extend.scope/summary/dates/schedule_mode`,把服务端权威范围直接呈现给医生。 +5. 获取一份真实医生角色 `mySelf` 响应样本后,补做菜单 `paths/component/perms/is_show/is_disable/sort` 的精确合同测试;这一步无法由 `views/**` 单独完成。 diff --git a/app/research/parity_prescriptions.md b/app/research/parity_prescriptions.md new file mode 100644 index 000000000..5a76ba78c --- /dev/null +++ b/app/research/parity_prescriptions.md @@ -0,0 +1,357 @@ +# “我的处方库 / 已开处方”桌面端对齐审计 + +审计日期:2026-08-10 + +## 1. 范围、基准与结论口径 + +本审计只读检查以下两套实现,没有修改业务源码: + +- 管理端唯一功能基准:D:/web/zyt/admin/src/views +- Python 桌面端:D:/web/zyt/app/src/doctor_workstation + +管理端 API 包装文件、通用组件和分页 hook 仅用于解析“页面已经发起的调用”的 URL、参数与直接子组件行为,不把相邻页面或未被页面调用的 API 当成处方页功能。 + +结论标签: + +- EXACT:用户可见行为、状态语义和请求合同均与基准一致;不要求布局像素一致。 +- PARTIAL:仅覆盖基准的子集,或字段/状态/校验语义有差异。 +- MISSING:基准存在,而 Python 没有入口或没有可达实现。 +- EXACT(负向):基准明确没有该能力,Python 也没有;不能把它列为待补功能。 + +## 2. 真实页面定位 + +| 业务名 | 管理端真实 view 组件 | Python 页面 | 结论 | +|---|---|---|---| +| 我的处方库 | D:/web/zyt/admin/src/views/consumer/prescription/list.vue:1-414;script name 为 prescriptionLibrary(234) | D:/web/zyt/app/src/doctor_workstation/ui/pages/prescription_library.py:251-545;固定导航见 D:/web/zyt/app/src/doctor_workstation/ui/shell.py:48-54 | EXACT(组件映射) | +| 已开处方 / 处方管理 | D:/web/zyt/admin/src/views/consumer/prescription/index.vue:1-4892;script name 为 prescriptionList(1697) | D:/web/zyt/app/src/doctor_workstation/ui/pages/prescriptions.py:72-436;固定导航见 D:/web/zyt/app/src/doctor_workstation/ui/shell.py:55-61 | EXACT(组件映射),功能不是 EXACT | + +管理端采用动态菜单,单凭 src/views 只能确定组件键应分别落到 consumer/prescription/list 与 consumer/prescription/index,不能确定生产环境最终 URL、菜单标题或 route.meta.perms。Python 则固定注册为 prescription_library / prescriptions。审计不伪造管理端生产 URL。 + +## 3. 直接子组件与边界 + +### 3.1 MedicineNameSelect + +处方库在 D:/web/zyt/admin/src/views/consumer/prescription/list.vue:158-165 使用;已开处方的主方、辅方行分别在 D:/web/zyt/admin/src/views/consumer/prescription/index.vue:695-726、736-767 使用。 + +真实合同: + +- 远程、可过滤选择器,提示支持药材名或拼音首字母:D:/web/zyt/admin/src/components/medicine-name-select/index.vue:3-24。 +- 展开或搜索时 GET /doctor.medicine/lists,参数 name、page_no=1、page_size=100、status=1:同文件 69-92;URL 包装见 D:/web/zyt/admin/src/api/medicine.ts:6-8。 +- 选择后同时回写 name 和 medicine_id;不能把任意自由文本当成一次有效选择:组件 95-110。 + +Python 处方库的 HerbRow 是两个自由文本 QLineEdit,medicine_id 只会保留已有行上的值,新增行没有药材主数据选择:D:/web/zyt/app/src/doctor_workstation/ui/pages/prescription_library.py:76-110。结论:PARTIAL。 + +### 3.2 DaterangePicker + +已开处方在 D:/web/zyt/admin/src/views/consumer/prescription/index.vue:19-23 使用。直接子组件默认 datetimerange,值格式 YYYY-MM-DD HH:mm:ss,并分别回写 start_time/end_time:D:/web/zyt/admin/src/components/daterange-picker/index.vue:1-48。 + +Python 没有日期范围控件:MISSING。 + +### 3.3 TcmDiagnosisEditView + +已开处方异步加载 D:/web/zyt/admin/src/views/tcm/diagnosis/edit.vue,并在 diagnosis_id>0 时提供“查看患者诊单详情”:D:/web/zyt/admin/src/views/consumer/prescription/index.vue:566-574、1692-1693、1728、2910-2921。 + +直接调用 openViewOnly(id);子页面以同一套界面只读打开、加载 GET /tcm.diagnosis/detail {id},默认病历 tab:D:/web/zyt/admin/src/views/tcm/diagnosis/edit.vue:1263-1264、1310-1322;URL 见 D:/web/zyt/admin/src/api/tcm.ts:59-62。 + +该只读子页仍保留全套 tab 边界: + +- 病历字段整体 disabled:diagnosis/edit.vue:55-67。 +- 医生备注 readonly、日常记录 read-only:633-670。 +- 处方 tab 受 tcm.diagnosis/chufang 控制且 read-only:673-686。 +- 业务订单受 tcm.diagnosis/patientOrders 控制:688-702。 +- 视频回放、聊天、指派、挂号分别受 tcm.diagnosis/huifang、tcm.diagnosis/chat、tcm.diagnosis/assign 或 detail、doctor.appointment/lists 控制:704-758。 + +Python 已开处方没有 diagnosis_id 跳转或只读诊单子页:MISSING。 + +### 3.4 分页 + +两个管理端页面均通过 usePaging 自动发送 page_no/page_size,默认 page=1、size=15,并消费 count/lists/extend:D:/web/zyt/admin/src/hooks/usePaging.ts:13-49。Python 两页均默认 page_size=20,使用 PageResult/Pager: + +- 处方库:D:/web/zyt/app/src/doctor_workstation/ui/pages/prescription_library.py:263-266、413-442。 +- 已开处方:D:/web/zyt/app/src/doctor_workstation/ui/pages/prescriptions.py:84-89、284-316。 + +参数和总数分页机制 EXACT,默认每页条数 PARTIAL(15 vs 20)。 + +## 4. 我的处方库:管理端真实合同 + +### 4.1 筛选、字段与状态 + +- 筛选:prescription_name、formula_type=主方|辅方、is_public=0|1,查询回第一页,重置为初始值:D:/web/zyt/admin/src/views/consumer/prescription/list.vue:5-31、247-252、281-284。 +- 列表字段:id、prescription_name、formula_type、herbs.length、全部 herbs 的 name/dosage(g)、is_public、disable_edit、creator_name、create_time:list.vue:44-107。 +- 公开范围:0=仅自己可见,1=所有人可见:list.vue:21-26、67-72、195-205。 +- disable_edit:0=可修改,1=已禁用;真实语义是“导入到已开处方后锁定整张处方药材”,不是“禁止维护这条模板自身”:list.vue:74-79、208-220。 +- 普通用户只管理本人 creator_id;root=1 或 role_ids 含 0、3 可管理任意模板:list.vue:276-301。 + +### 4.2 查看、创建、编辑、删除、复制 + +- 新增:独立按钮,表单字段为 prescription_name(maxlength=100)、formula_type、herbs、is_public、disable_edit:list.vue:35-41、116-230、259-267。 +- 查看:有单独 read 权限按钮,复用列表行数据打开完全禁用的表单;不调用 detail:list.vue:83-87、123-129、333-343。 +- 编辑:仅 owner 或管理角色可见;仍可修改 disable_edit=1 模板本身的药材:list.vue:88-106、345-355。 +- 删除:确认后 POST {id}:list.vue:403-409。 +- 复制:页面没有复制/克隆按钮、函数或端点。导入模板属于“已开处方”的复用流程,不是复制模板 CRUD。 +- 导出/打印:本页面没有。 + +### 4.3 药材行和校验 + +- 药材 DTO:{medicine_id?: number, name: string, dosage: number}:list.vue:259-266。 +- name 必须由 MedicineNameSelect 选取并同步 ID;dosage 是 min=0、precision=1、step=0.5 的数字控件:list.vue:156-190。 +- 提交要求:名称必填、至少一味药、每行 name 非空、dosage>0:list.vue:269-274、357-379。 + +### 4.4 API DTO + +页面调用来源见 list.vue:234-245;URL 包装见 D:/web/zyt/admin/src/api/tcm.ts:591-615。 + +| 方法与端点 | 页面请求参数 / body | 页面使用情况 | +|---|---|---| +| GET /tcm.prescriptionLibrary/lists | page_no、page_size、prescription_name、formula_type、is_public | 列表与分页 | +| POST /tcm.prescriptionLibrary/add | prescription_name、formula_type、herbs、is_public、disable_edit;页面对象还带重置后的 id=0 | 新增 | +| POST /tcm.prescriptionLibrary/edit | id、prescription_name、formula_type、herbs、is_public、disable_edit | 编辑 | +| POST /tcm.prescriptionLibrary/delete | {id} | 删除 | +| GET /tcm.prescriptionLibrary/detail | {id} | API 已封装,但该 view 没有调用 | + +权限码为 wcf.prescription/add、read、edit、delete:list.vue:36、85、93、102。 + +## 5. 我的处方库:Python 逐项对比 + +| 项目 | Python 证据 | 结论 | +|---|---|---| +| 页面入口 | shell.py:48-54 以 tcm.prescriptionLibrary/lists 注册;页面标题见 prescription_library.py:251-282 | EXACT | +| 筛选 | Python 有关键词、主/辅方、公开范围;repository 把 keyword 改成 prescription_name,把 main/aux 改为主方/辅方:prescription_library.py:284-315、413-429;repository.py:279-298、586-588 | PARTIAL:请求合同基本一致,但“名称或药材”的占位文案(291)是假的,实际只查 prescription_name | +| 分页 | page/page_size 经 invoke 转 page_no/page_size;Pager 消费总数:prescription_library.py:409-442,widgets.py:221-223 | PARTIAL:默认 20,基准 15 | +| 列表字段 | Python 只显示名称、类型、最多 4 味摘要、公开范围、创建人、时间:prescription_library.py:357-384 | PARTIAL:缺 id、药材数量、完整药材、disable_edit;把 create_time 列标题写成“更新时间” | +| 单独查看 | 没有 read 按钮;双击只会走 _edit_selected,且需 edit 按钮可见及 owner/管理员:prescription_library.py:330-350、385-386、479-485 | MISSING | +| 新增 | _new_template -> save -> repository add:prescription_library.py:474-501;repository.py:309-323 | PARTIAL:端点可用,但药材和 disable_edit 语义不完整 | +| 编辑 | 使用列表行直接打开,与基准一样不请求 detail;保存到 edit:prescription_library.py:479-501;repository.py:325-347 | PARTIAL | +| 删除 | owner/管理员检查、确认、POST {id}:prescription_library.py:454-472、507-537;repository.py:349-352 | EXACT | +| 公开范围 | 复选框产生 bool,repository 规范为 0/1:prescription_library.py:157-159、218-228;repository.py:572-575 | EXACT | +| disable_edit | Python 把它解释成“当前模板药材不可编辑”,隐藏增删并禁用输入;而管理端只在导入已开处方后锁药材。Python 也没有切换开关,只能原样回传:prescription_library.py:117-140、167-170、218-224 | PARTIAL(语义错误) | +| 药材选择 | 自由文本 name/dosage;新行无 medicine_id,已有行才保留:prescription_library.py:76-110 | PARTIAL | +| 药材校验 | 只检查至少一行、有名称时 dosage 非空:prescription_library.py:230-248 | PARTIAL:不校验数字和 >0,且允许“10g”字符串,与基准 number DTO 不同 | +| 所有权 | user id 相同、root、role 0/3:prescription_library.py:460-472 | EXACT | +| API CRUD | list/detail/add/edit/delete 均存在且 URL、id 合同正确:repository.py:279-352 | EXACT(仓储层) | +| 模型 | PrescriptionTemplate 保留 id/name/formula/herbs/public/disable/creator/time/raw,to_api_dict 正规化中文方型和 0/1:core/models.py:426-477 | EXACT(字段合同) | +| 权限 | add/edit/delete 接受基准 wcf.*,同时接受 tcm.prescriptionLibrary/* 别名:prescription_library.py:274-279、332-347 | PARTIAL:动作基本受控,但缺 wcf.prescription/read 的可达只读查看;额外别名不是 view 基准 | +| 复制 | 两边都没有 | EXACT(负向) | +| 导出/打印 | 两边都没有 | EXACT(负向) | + +## 6. 已开处方:管理端真实合同 + +### 6.1 筛选与分页 DTO + +页面筛选控件见 D:/web/zyt/admin/src/views/consumer/prescription/index.vue:4-99;状态对象见 1874-1887: + +- sn:处方编号模糊查询。 +- patient_name。 +- creator_ids:医生 ID 多选;有值才发数组。 +- audit_filter:all、pending、passed、not_passed、rejected;all 被正规化为空字符串。 +- source_filter:all、manual、system;all 被正规化为空字符串。 +- start_time/end_time:创建时间,格式 YYYY-MM-DD HH:mm:ss。 +- 快捷日期:全部、今日、昨日、前天,切换后立即回第一页查询:index.vue:3013-3048。 + +最终 GET /tcm.prescription/lists 参数是 page_no、page_size 与上述字段;creator_ids 空数组会被省略:index.vue:2990-3007。默认 page_size=15。 + +### 6.2 列表字段、状态与可达动作 + +列表与按钮位于 index.vue:102-270: + +- 列:sn、id、订单一致性警告、prescription_type、is_system_auto(1=空白处方,其他=手工)、patient_name/gender/age、综合审核状态和驳回意见、void_status、doctor_name/prescription_date、assistant_name、create_time。 +- audit_status:0 待审核、1 已通过、2 已驳回:index.vue:3113-3123。 +- business_prescription_audit_rejected=1 时,列表主状态覆盖为“已驳回”,并分别展示业务订单与消费者处方的驳回意见:index.vue:3125-3151。 +- void_status=1 单独显示“作废”。 +- 已有关联业务订单时,药材为空或重名会在编号下给出警告:index.vue:3192-3216。 + +动作门槛: + +- 查看:cf.prescription/read。 +- 修正姓名/性别/手机:未作废且 tcm.prescription/patchPatient。 +- 创建订单:has_prescription_order=0、未作废且 tcm.prescriptionOrder/create。 +- 编辑、删除:只有“非 audit_status=1 且未作废”才出现,分别需 cf.prescription/edit、cf.prescription/del。 +- 审核:audit_status=0、未作废且 cf.prescription/audit。 +- 业务订单列表:tcm.prescriptionOrder/lists。 + +精确条件和权限见 index.vue:214-264;“已通过且未作废”判定见 3154-3157。 + +### 6.3 查看详情、打印与 PDF + +查看先用列表行渲染,再 GET /tcm.prescription/detail {id} 覆盖:index.vue:3796-3817。 + +A4 处方笺显示: + +- 来源、作废、消费者审核、业务订单审核及意见:index.vue:284-343。 +- 日期/编号;患者姓名、性别、年龄、电话、收件信息、临床诊断:345-390。 +- 主方/辅方药材,单剂 dosage 与 dose_count 计算后的总量:392-433。 +- 主辅方用法、医嘱、忌口、备注、药房备注、出丸:435-448。 +- 医师手写签名、医生、类型、天数/剂数、单剂量:450-481。 +- 审核人、审核时间、审核意见:484-496。 + +打印调用 window.print:index.vue:2741-2751。PDF 用 html2canvas(scale=2) 渲染 A4,再由 jsPDF 分页并下载:index.vue:2753-2813。页面没有“列表导出 Excel”;tcm.ts:384-387 的业务订单导出 API 没有被此 view 导入或调用。 + +### 6.4 新增/编辑字段与药材规则 + +表单位于 index.vue:499-1153,reactive DTO 在 2815-2862: + +- 关联/系统:id、diagnosis_id、creator_id、is_system_auto。 +- 患者:patient_name、gender、age、visit_no、prescription_date。 +- 四诊/诊断:tongue、tongue_image、pulse、pulse_condition、clinical_diagnosis。 +- 药材:herbs[{medicine_id?, name, dosage, formula_type=主方|辅方, locked?}]。 +- 剂型:prescription_type(浓缩水丸、饮片、颗粒、丸剂、散剂、膏方、汤剂)、dosage_amount、dosage_unit、dosage_bag_count、need_decoction、bags_per_dose、dose_count、dose_unit。 +- 主方用法:usage_days、times_per_day、usage_instruction、usage_time、usage_way、dietary_taboo[]、usage_notes。 +- 辅方用法 aux_usage:dosage_amount、dosage_bag_count、need_decoction、bags_per_dose、times_per_day、usage_days、prescription_name。 +- 医师:doctor_name、doctor_signature(手写 canvas 生成 PNG data URL,必填)。 +- 隐藏状态:is_shared、visible_role_ids、audit_status/time/by/remark、业务订单审核字段。 + +主辅方各自使用 MedicineNameSelect 和数字 dosage;导入 disable_edit=1 模板时给行加 locked 并锁定整张处方药材:index.vue:667-813、3489-3515、3712-3732。 + +新增/编辑校验: + +- patient_name、gender、prescription_date、clinical_diagnosis、dose_count、doctor_name、doctor_signature 必填:index.vue:2955-2988。 +- 至少一味药,每行 name 非空、dosage>0:3920-3947。 +- 新增提交前强制 audit_status=0;add/edit 都把完整 editForm 展开为 body:3951-3961。 +- 编辑提示保存后重新进入待审核;已作废/已驳回可经编辑恢复,业务订单侧审核会重置:index.vue:514-565。 + +公开/共享范围的特殊事实:is_shared、visible_role_ids 虽存在于 editForm、详情回填和展开 payload(2846-2847、3889-3890、3952),但模板区没有任何 v-model 控件;formatVisibleRoleNames 也未被模板调用(3348-3364)。因此该真实 view 不允许用户设置共享范围。桌面端不应凭字段存在擅自新增 UI。 + +### 6.5 处方库导入、粘贴导入与“复制” + +- 从处方库导入对话框支持处方名称、主/辅方筛选、replace/append、10/15/20/50 分页,展示公开范围和创建人:index.vue:1539-1633。 +- 请求 GET /tcm.prescriptionLibrary/lists,参数 page_no、page_size、prescription_name、formula_type、prescribing_creator_id:index.vue:3444-3468。 +- prescribing_creator_id 取当前开方医生;语义是“该医生自己的模板 + 公共模板”。 +- 粘贴导入解析 name/dosage,只接受 GET /doctor.medicine/lists 中 name 完全相同且唯一的药材;请求 name、page_no=1、page_size=200、status=1:index.vue:3538-3709。 +- replace 只替换同方型药材,append 追加;重复名仅警告。 + +该页面没有“复制某张已开处方”动作或端点。处方库导入与文本导入是新增/编辑中的填充方式,不等于复制已开处方。Python 也没有复制:EXACT(负向)。 + +### 6.6 审核联动 + +- POST /tcm.prescription/audit body={id, action:'approve'|'reject', remark}:D:/web/zyt/admin/src/api/tcm.ts:365-372;调用见 index.vue:3367-3395。 +- reject 必填 remark,成功语义为“驳回并作废处方”:index.vue:1669-1689、3373-3385。 +- 返回 wecom_notify_ok=false 且有 wecom_notify_hint 时额外警告:3384-3388。 +- 页面定义 root/role_ids 0、3 的审核角色辅助函数,但该函数没有被模板使用;真实按钮门槛仍是 v-perms cf.prescription/audit 加行状态:index.vue:1854-1855、247-253、3104-3110。 + +### 6.7 患者修正与订单联动 + +患者修正: + +- 对话框只改 patient_name、gender、phone,明确不改审核状态,并记录到业务订单日志:index.vue:1155-1195。 +- POST /tcm.prescription/patchPatient body={id,patient_name,phone,gender}:index.vue:1948-1973;API 类型见 tcm.ts:330-338。 + +订单读取与一致性: + +- 编辑处方时 GET /tcm.prescriptionOrder/lists,参数 page_no=1、page_size=5、prescription_id,显示最近订单的 order_no、medication_days、remark_assistant:index.vue:769-811、2879-2907。 +- 业务订单审核驳回可以覆盖处方列表状态和处方笺状态,但保留消费者处方本身的 audit_status:index.vue:165-190、295-343、3125-3151。 + +从处方创建业务订单: + +- 三步表单:诊单患者与收件信息;服务/发货/支付单;费用与备注:index.vue:1197-1537。 +- 诊单患者远程搜索意图为 GET /tcm.diagnosis/searchPatient,参数 keyword、page_no=1、page_size=10:index.vue:2384-2401;API 定义在 D:/web/zyt/admin/src/api/order.ts:88-91。 +- GET /tcm.prescriptionOrder/paidPayOrders {diagnosis_id} 返回可关联支付单和 deposit_min_amount:index.vue:2307-2329;API 见 tcm.ts:389-398。 +- POST /tcm.prescriptionOrder/create 的 body: + prescription_id、diagnosis_id、recipient_name、recipient_phone、shipping_address、is_follow_up、prev_staff、service_channel、service_package(逗号拼接)、express_company、tracking_number、ship_mode、fee_type、amount、remark_extra、remark_assistant;可选 shipping_province/city/district、medication_days、internal_cost、pay_order_ids。证据:index.vue:2435-2485;URL 见 tcm.ts:374-382。 +- ship_mode 选择需 tcm.prescriptionOrder/setShipMode;internal_cost 需 finance.account_log/lists;remark_extra 需 tcm.prescriptionOrder/editRemarkExtra:index.vue:1307-1314、1466-1488、2041-2043。 +- 服务套餐来自 GET /config/dict {type:'server_order'}:index.vue:2180-2187;URL 见 D:/web/zyt/admin/src/api/app.ts:13-16。 + +## 7. 已开处方:Python 逐项对比 + +D:/web/zyt/app/src/doctor_workstation/ui/pages/prescriptions.py:1 已明确把本页定义为 “Read-only list and detail view for issued prescriptions”。这不是完整管理端主链。 + +| 项目 | Python 证据 | 结论 | +|---|---|---| +| 页面入口 | shell.py:55-61,以 tcm.prescription/lists 控制 | EXACT | +| 筛选 | 只有一个“编号/患者”关键词和 audit 0/1/2:prescriptions.py:101-125、284-303 | PARTIAL | +| 请求映射 | repository 根据 RX/CF/纯数字猜 sn,否则 patient_name;status 转 pending/passed/rejected:repository.py:354-387 | PARTIAL:已有控件映射正确;缺 creator_ids、日期、source、not_passed;同一关键词不能同时查编号与患者 | +| 分页 | PageResult/Pager 完整 | PARTIAL:默认 20,基准 15 | +| 列表字段 | sn、patient、audit、source、doctor、prescription_date:prescriptions.py:139-180 | PARTIAL:缺 id、prescription_type、gender/age、业务/消费者驳回意见、void 独立列、assistant、create_time、订单警告 | +| 来源 | is_system_auto -> “系统代开/医生开具”:prescriptions.py:67-70 | PARTIAL:基准语义/文案是“空白处方/手工” | +| 状态 | 先作废,再业务订单驳回/消费者驳回,再通过/待审;raw fallback 可读模型未声明字段:prescriptions.py:46-60,widgets.py:48-66 | PARTIAL:主标签逻辑接近,但不能分别显示两类驳回意见、审核人/时间和独立作废信息 | +| 详情请求 | 选中后 GET /tcm.prescription/detail {id}:prescriptions.py:326-357;repository.py:389-396 | EXACT(端点) | +| 详情字段 | 患者/性别/年龄、医生、日期、类型、剂数、药材/剂量/方型、频次/天数/方式/时间/忌口/说明和一条审核备注:prescriptions.py:360-420 | PARTIAL | +| A4 处方笺 | 无 A4 版式;缺电话/收件、临床诊断、签名、单味总量、药房备注/出丸、审核轨迹等 | MISSING | +| 新增 | 页面无按钮、无表单;RemoteRepository 无 prescription add 方法 | MISSING | +| 编辑 | 页面无按钮、无表单;缺主/辅方药材、剂型用法、签名、重新待审完整流程 | MISSING | +| 删除 | 无按钮;RemoteRepository 无 delete | MISSING | +| 患者修正 | 无 patchPatient UI/仓储方法 | MISSING | +| 审核 | 无 approve/reject UI/仓储方法;无驳回必填、作废联动、企微提示 | MISSING | +| 订单联动 | 无订单列表入口、创建订单、支付单关联、处方一致性警告、最近订单提示 | MISSING | +| 处方库导入 | 无新增/编辑,自然也没有 replace/append、锁药材、prescribing_creator_id | MISSING | +| 文本导入 | 无解析及药材完全同名验证 | MISSING | +| 药材编辑行 | 详情表只读;无 medicine_id 选择与 dosage 校验 | MISSING | +| 打印 | 无 window/Qt 打印等价能力 | MISSING | +| PDF | 无处方笺 PDF 导出 | MISSING | +| 列表 Excel | 基准页也没有 | EXACT(负向) | +| 复制已开处方 | 基准页也没有 | EXACT(负向) | +| 共享范围 UI | Python 不展示 is_shared/visible_role_ids;基准 view 也没有可见控件 | EXACT(只读 UI 的负向行为) | +| 共享字段模型 | Prescription 存 is_shared、visible_role_ids,但没有 mutation:core/models.py:519-521、574-576 | PARTIAL(数据保留) | +| 诊单详情联动 | 没有 diagnosis_id “查看诊单详情”和全 tab 只读子页 | MISSING | +| 动作权限 | 构造器保存 permissions 但页面没有任何 has_permission 动作判断:prescriptions.py:72-99 | MISSING(动作本身也缺) | + +### 7.1 Python Prescription DTO 覆盖度 + +Prescription 模型保留绝大多数列表/详情核心字段:id、diagnosis、sn、患者、四诊、药材、剂型/主方用法、aux_usage、签名、creator/assistant、source/share/audit/void/order/create_time,并保留 raw:D:/web/zyt/app/src/doctor_workstation/core/models.py:480-587。 + +结论:PARTIAL。 + +原因: + +- 模型层比 UI 完整,但 UI 只消费很小子集。 +- business_prescription_audit_rejected、business_prescription_audit_remark、收件/药房/出丸等不设显式 dataclass 字段,只能从 raw 兜底;get_value 确实支持 raw fallback:widgets.py:48-66。 +- RemoteRepository 只实现 GET lists/detail:repository.py:354-396;没有 add/edit/delete/patch/audit/order 的请求合同。 + +## 8. 权限码总表 + +### 8.1 我的处方库 + +| 能力 | 管理端真实码 | Python | +|---|---|---| +| 页面/列表 | 动态菜单实际值不能由 view 单独确定;接口是 tcm.prescriptionLibrary/lists | shell 固定 tcm.prescriptionLibrary/lists | +| 新增 | wcf.prescription/add | 接受 wcf.prescription/add 或 tcm.prescriptionLibrary/add | +| 查看 | wcf.prescription/read | MISSING | +| 编辑 | wcf.prescription/edit + owner/root/role 0,3 | 同时接受 wcf 或 tcm 别名 + 同一所有权规则 | +| 删除 | wcf.prescription/delete + owner/root/role 0,3 | 同时接受 wcf 或 tcm 别名 + 同一所有权规则 | + +### 8.2 已开处方 + +管理端真实页面使用: + +- cf.prescription/add、read、edit、audit、del。 +- tcm.prescription/patchPatient。 +- tcm.prescriptionLibrary/lists。 +- tcm.prescriptionOrder/create、lists、setShipMode、editRemarkExtra。 +- finance.account_log/lists。 +- 诊单子页另用 tcm.diagnosis/chufang、patientOrders、huifang、chat、assign/detail 和 doctor.appointment/lists。 + +证据集中在 index.vue:102-117、214-264、667-680、1307-1314、1466-1488、1692-1728。 + +Python 只有页面入口 tcm.prescription/lists(shell.py:55-61);PrescriptionsPage 没有上述动作,也没有动作权限判断。结论:MISSING。 + +## 9. 基准 view 自身的边界/风险(不计作 Python 差异) + +1. 订单患者搜索在 index.vue:2391 调用 searchPatientsAPI,但 index.vue:1698-1714 的显式 import 没有该符号;真正 export 位于 api/order.ts:88-91。若工程没有为这个本地 API 符号做自动导入,远程患者搜索会失败。仅以 views 不能证明是否存在额外自动导入,故结论是“高风险未确认”,不是把不存在的合同补到 Python。 +2. is_shared、visible_role_ids、roleAll、formatVisibleRoleNames 存在,但没有表单绑定;不要把死状态误判成可见“公开范围”功能。 +3. userCanAudit() 定义了 root/role 0,3,但没有被模板调用;真实前端门槛是 cf.prescription/audit 和行状态,后端仍是最终边界。 +4. prescriptionVoid API 虽在 tcm.ts:360-363 存在,但此 route 没有导入/直接调用;该页的可达作废路径是 audit reject 的服务端联动。 +5. prescriptionOrderExport API 存在,但“已开处方” route 不调用;不能据此声称本页有 Excel 导出。 +6. 两个基准页面均无“复制”能力。 + +## 10. P0 / P1 缺口 + +### P0 + +1. 已开处方主链整体缺失:新增、编辑、删除及其 RemoteRepository POST 合同均不存在。当前 Python 实现是明确的只读页,无法替代管理端真实路由。 +2. 医疗安全关键编辑合同缺失:药材必须来自 MedicineNameSelect、主辅方和 locked 模板规则、dosage>0、剂型/用法、临床诊断、手写医生签名、编辑后重入待审,Python 全部不可达。 +3. 审核/作废闭环缺失:approve/reject、驳回意见必填、reject 同时作废、两类审核意见、企微通知提示均不存在。 +4. 订单联动缺失:患者修正、订单创建、支付单关联/定金门槛、发货模式权限、订单审核驳回覆盖状态、处方/订单药材一致性提示全部不存在。 +5. 权限闭环缺失:已开处方除了列表入口没有任何 cf.prescription/*、patchPatient、prescriptionOrder/* 动作校验;在补动作前必须按基准精确落码,不能以 lists 权限兜底。 + +### P1 + +1. 已开处方列表筛选不完整:缺医生多选、创建时间/快捷日期、来源、not_passed;关键词还通过内容猜测 sn 或 patient_name。 +2. 已开处方列表/详情展示不完整:缺业务订单警告、两类驳回意见、独立作废/审核轨迹、收件/电话、临床诊断、医生签名、药房备注/出丸及 A4 处方笺。 +3. 已开处方缺打印和 A4 PDF 下载。 +4. 已开处方缺 diagnosis_id 只读诊单子页及其权限化 tabs。 +5. 处方库缺真正的 wcf.prescription/read 查看路径;只有有编辑权且可管理该行的用户能通过编辑对话框看完整内容。 +6. 处方库药材行应改为药材远程选择与数字 dosage;当前自由文本允许合同无效值。 +7. 处方库 disable_edit 语义错误且无切换开关:它应控制“导入后的已开处方药材锁定”,不应锁死模板自身编辑。 +8. 处方库表格缺 id、药材数、完整明细、disable_edit,且时间列标题与数据不一致。 +9. 两页默认 page_size 与基准不同(20 vs 15);属于低风险但可见的分页差异。 + +“复制”不是缺口:两个管理端基准页面均没有复制动作,Python 也没有。 diff --git a/app/research/parity_reception_consultations.md b/app/research/parity_reception_consultations.md new file mode 100644 index 000000000..85e382e44 --- /dev/null +++ b/app/research/parity_reception_consultations.md @@ -0,0 +1,267 @@ +# 接诊台 / 问诊列表:管理后台到医生桌面的逐项一致性审计 + +审计日期:2026-08-10 +基准:`D:\web\zyt\admin\src\views` 中从现行路由可达的 Vue/TS 实现 +对比对象:`D:\web\zyt\app\src\doctor_workstation` 当前 Python 实现 +约束:本次只读审计;未修改 `src/`,未发网络请求。 + +## 1. 结论摘要 + +当前 Python 不是管理后台两个页面的等价移植,而是“接诊队列 + 简化问诊表 + 原生直呼视频”的医生端子集。端点骨架中,挂号列表、接诊聚合详情、通知、添加文字备注、完成接诊、诊单列表以及 `getCallSignature/startCall/bindCallRoom/endCall` 已接通;但今日队列边界、异步选人一致性、挂号状态判定、病例详情/编辑、开方、日常记录、备注媒体、复杂筛选和操作权限仍有显著差异。 + +发布阻断级结论: + +1. **P0 — 接诊台快速切换患者会出现旧患者详情挂在新患者选择下。** 管理后台每次选人递增请求序号并同时校验序号和 `selectedId`(`D:\web\zyt\admin\src\views\patient\reception\index.vue:398-418`);Python 在任一详情请求进行中时直接拒绝下一次加载(`D:\web\zyt\app\src\doctor_workstation\ui\pages\reception.py:406-418`),旧响应只按旧 generation 接受(同文件 `:437-447`)。这会把显示、备注目标和当前队列行拆成两个患者上下文。 +2. **P0 — Python 接诊队列没有“今天”条件。** 基准固定发送 `start_date=end_date=today`(`patient/reception/index.vue:296-305`);Python 只发送 `status/keyword/page/page_size`(`reception.py:344-361`)。因此历史或未来的状态 1/4 记录可能进入“今日接诊台”,并可触发通知、备注、视频和完成。 +3. **P0 — 问诊列表的视频门槛读取了错误的状态域。** 基准以 `has_appointment && appointment_status===1` 为唯一可视频条件(`tcm/diagnosis/index.vue:1778-1780`;H5 同口径 `index_h5.vue:949-950`)。Python 读取诊单模型的 `status`,并允许 1 或 4(`consultations.py:310-317`);模型又优先取根 `status`,而不是根 `appointment_status`(`core/models.py:362-366,406-414`)。结果是已完成/过号记录可能仍可直呼,合法已预约记录也可能被误禁用。 + +其余 P1 缺口集中在:完整病例核对与只读详情、诊单编辑、从诊单开方、接诊详情字段/日常记录/备注附件、手机号脱敏、动作权限契约,以及问诊列表的筛选/状态/多挂号语义。详见第 8 节。 + +## 2. 判定口径与路由范围 + +状态含义: + +- **exact**:端点、关键参数、状态门槛和结果语义均一致;不要求 Qt 与 Web 视觉相同。 +- **partial**:已有对应能力,但参数、字段、权限、状态或边界行为不完整。 +- **missing**:基准可达的医生核心能力在 Python 中没有入口或 repository 合同。 +- **intentionally unsupported**:明确属于 H5 布局、小程序二维码或医助/后台运营角色,当前原生医生桌面选择了不同交互或没有承载;这是审计分类,不代表产品已正式批准删除。 + +路由证据: + +- 管理后台主菜单是服务端动态路由:Vite 收集所有 `views/**/*.vue`,菜单组件名交给 `loadRouteView` 匹配(`D:\web\zyt\admin\src\router\index.ts:9-15,28-69`)。因此接诊台主文件是 `views/patient/reception/index.vue`,问诊列表 PC 主文件是 `views/tcm/diagnosis/index.vue`。 +- `/tcm/diagnosis/h5` 静态指向 `index_h5.vue`(`D:\web\zyt\admin\src\router\routes.ts:82-85`)。 +- PC 问诊列表的“查看”与双击跳转隐藏路由 `/tcm/diagnosis-readonly?id=...`(`tcm/diagnosis/index.vue:2165-2172`),静态路由指向 `readonly.vue`(`router/routes.ts:87-102`)。 +- `index.vue.bak` 的后缀不是 `.vue`,不会进入 `import.meta.glob('/src/views/**/*.vue')`;`add.vue` 没有被现行两个入口导入;两者均未作为基准。PC 虽挂载 `detail.vue`,却没有存活的 `handleDetail` 调用;该弹窗仅由 H5 卡片点击实际触发(`index_h5.vue:121,144,264-268,1013-1015`)。 + +Python 页面级门控与主入口一致:接诊台使用 `doctor.appointment/lists`,问诊列表使用 `tcm.diagnosis/lists`(`D:\web\zyt\app\src\doctor_workstation\ui\shell.py:40-47,69-75,248-264`),判定为 **exact**。 + +## 3. 实际可达文件与依赖图 + +以下只列业务 Vue/TS 和决定行为的共享文件,不展开 Element Plus、基础 popup/upload 等纯框架组件。 + +### 3.1 接诊台 + +- `views/patient/reception/index.vue`:队列、轮询、详情、通知、完成、快捷文字备注、通话入口(导入证据 `:191-210`)。 +- `views/patient/reception/components/NoteTimeline.vue`:备注文本、舌苔图片、检查报告、单附件删除(`:1-121,125-132`)。 +- `views/tcm/diagnosis/components/PatientInfoCard.vue`:脱敏手机号、预约与人员摘要(`:1-41`)。 +- `views/tcm/diagnosis/components/PatientCaseCard.vue`:病例全字段和生命体征阈值(`:1-124,128-153`)。 +- `views/tcm/diagnosis/components/DailyMatrix.vue` → `DiagnosisTodoList.vue`:7/30/自定义日期窗、血糖血压/饮食/运动/跟踪备注/待办(`DailyMatrix.vue:317-332,342-470`)。 +- `components/chat-dialog/index.vue` → `ChatMessageItem.vue` 及本地录制/截图/IM 工具:实时聊天与通话、通话落库、房间绑定、结束、可选本地录制;API 导入见 `chat-dialog/index.vue:129-175`。 +- `views/tcm/diagnosis/edit.vue` 及其下述诊单详情依赖:`DailyMatrix.vue`、`CaseRecordList.vue`、`CallRecordPanel.vue` → `RecordingPlaybackBlock.vue` → `RecordingVideoPlayer.vue`、`ImChatRecordPanel.vue`、`AssignLogPanel.vue`、`AppointmentRecordPanel.vue`、`NoteTimeline.vue`、`TrackingNoteTimeline.vue`、`PatientOrderList.vue` → `PrescriptionOrderDetailDrawer.vue`、`components/tcm-prescription/index.vue`(导入证据 `edit.vue:788-806`)。 + +### 3.2 问诊列表 + +- `views/tcm/diagnosis/index.vue`:PC 列表、全部筛选/角标、行操作、20 秒静默轮询(导入及异步组件 `:727-746`)。 +- `views/tcm/diagnosis/index_h5.vue`:静态 H5 路由;复用同一 edit/detail/prescription/appointment/watch-call 组件(`:588-630`)。原生 Python 不需要复刻 H5 布局,标为 **intentionally unsupported**;但它证明的业务状态和动作边界仍计入对比。 +- `views/tcm/diagnosis/readonly.vue`:PC 隐藏详情路由;复用 PatientInfo/Case、DailyMatrix、备注、通话回放、IM、指派、挂号、业务订单组件(`:151-167`)。 +- `views/tcm/diagnosis/detail.vue`:H5 卡片的简版诊单详情(`:1-165`)。 +- `views/tcm/diagnosis/edit.vue`:新增/编辑/只读抽屉及所有扩展 Tab。 +- `components/tcm-prescription/index.vue`:按诊单开方、查已有处方、作废、处方库导入和 PDF。 +- `views/tcm/diagnosis/appointment.vue`:预约、排班、号源、渠道和今日重复挂号边界。 +- `views/tcm/diagnosis/components/AssistantWatchCallDialog.vue`:医助 TRTC 只拉流旁观(`:23-26,120-219`)。 +- 决定字段与边界的 TS:`hooks/usePaging.ts`(`:13-58`)、`utils/perm.ts`(`:3-17`)、`install/directives/perms.ts`(`:13-32`)、`utils/diag-display.ts`、`utils/blood-thresholds.ts`、`utils/diabetes-discovery-display.ts`。 + +## 4. 接诊台逐项差异 + +| 项目 | 基准证据 | Python 证据 | 判定 | 差异/影响 | +|---|---|---|---|---| +| 页面权限 | 动态菜单页面权限为 `doctor.appointment/lists` | `shell.py:40-47,248-264` | exact | 页面级一致。 | +| 状态队列 | 仅 status 1“待接诊”和 4“已过号”(`index.vue:33-45,235`) | 两个 QTab 映射 1/4(`reception.py:152-156,334-336`) | exact | 状态集合一致。 | +| 今日范围 | 每次请求带当天 `start_date/end_date`(`index.vue:296-305`) | 未发送日期(`reception.py:344-361`) | missing / P0 | 非今日记录污染工作台并暴露写动作。 | +| 搜索 | `patient_name`,清空也自动搜索(`index.vue:20-32,296-305,431-436`) | UI 只在回车/搜索按钮触发;repository 将 `keyword` 改为 `patient_name`(`reception.py:159-168,352-360`; `repository.py:231-236`) | partial | 请求字段一致;清空不自动刷新。 | +| 分页与数量 | page size 15、另一状态独立 count、无限滚动、去重合并(`index.vue:212-213,296-318,359-379,606-620`) | 固定第一页 50 条,仅显示已加载条数(`reception.py:344-386`) | partial | 50 条以上不可见;没有 waiting/passed 总数或加载更多。 | +| 轮询 | 5 秒链式轮询、倒计时、队列/详情/双 count、防重入、页面隐藏暂停/恢复立即刷新(`index.vue:254-259,539-592`) | 8 秒 QTimer,只刷新当前队列;页面 QWidget 隐藏时停(`reception.py:138-140,663-672`) | partial | 无倒计时/另一状态 count;应用最小化不等价于 `document.hidden`;周期不同。 | +| 异步选人 | 每次选人递增 seq、清空详情、结果校验 seq + selected id(`index.vue:398-418`) | 请求进行中拒绝新选人;旧结果仍应用(`reception.py:406-418,437-447`) | missing / P0 | 可显示旧患者详情并对新选择行执行其他动作。 | +| 队列行字段 | id、patient/diagnosis/doctor/assistant、日期时间、性别年龄、status、处方、remark(`index.vue:215-233`);实际显示姓名、性别年龄、过号、时间、医助(`:57-90`) | 显示同一核心子集(`reception.py:50-95`) | exact | 行上显示字段基本一致。 | +| 聚合详情端点 | GET `/doctor.appointment/reception?id`(`api/patient.ts:9-12`) | `get_reception()` 同端点/参数(`repository.py:242-250`) | exact | 传输合同一致。 | +| 患者/病例字段 | PatientInfo 显示脱敏电话、性别年龄、身高体重地区、预约、医生/客服、状态/开方、remark(`PatientInfoCard.vue:3-25`);PatientCase 显示基本信息、生命体征、糖尿病史、现病史、既往/其他病史、处方意见(`PatientCaseCard.vue:8-124`) | 仅预约时间/电话/医生/医助,加主诉、临床诊断、舌脉、治则摘要和开方提示(`reception.py:241-285,471-516`) | partial / P1 | 大量临床字段缺失;无法达到基准的接诊前核对深度。 | +| 手机脱敏 | 两张卡都调用 `maskPhone`(`PatientInfoCard.vue:8`; `PatientCaseCard.vue:15`) | 直接显示 `patient_phone/phone/phone_masked` 中第一个非空值(`reception.py:478-480`) | missing / P1 | API 若下发明文即展示;未受 `tcm.diagnosis/phonePlain` 控制。 | +| 医生备注读取 | 聚合详情 `doctor_notes`,编辑/只读还会 GET `/doctor.appointment/doctorNotes` 并保留详情兜底(`readonly.vue:177-217`; `api/patient.ts:29-32`) | 仅消费聚合详情中的 `doctor_notes/notes`(`reception.py:518-548`);Remote 无 `doctorNotes` 方法 | partial | 无独立补拉;备注元数据只显示 creator/time,忽略 `note_date` 语义。 | +| 文字备注写入 | `diagnosis_id + trimmed content`,最多 500 字,空值/无诊单拒绝(`index.vue:175-181,514-536`) | 同端点和空值/诊单检查(`reception.py:575-601`; `repository.py:257-272`),但 QTextEdit 无 500 字限制 | partial | 端点 exact;客户端长度边界缺失。 | +| 舌苔/报告 | NoteTimeline 支持最多 99 个图片/文件、新增后刷新、单附件确认删除(`NoteTimeline.vue:3-40,52-101,195-227,260-268`; `api/patient.ts:19-40`) | repository 可发送 `tongue_images/report_files`,但 UI 不展示附件、无上传/预览/删除入口(`repository.py:257-272`; `reception.py:524-548`) | missing / P1 | 核心检查资料不可见、不可维护。 | +| 日常记录 | 只读 DailyMatrix,按诊单/患者加载(`index.vue:129-139`);7/30/自定义窗、trackingWindow/trackingNotes(`DailyMatrix.vue:410-458,550-564,838-875`) | 无 UI、模型和 repository 合同 | missing / P1 | 接诊时看不到血糖血压、饮食、运动、跟踪备注及阈值。 | +| 编辑病历 | `tcm.diagnosis/edit` 权限后打开 `edit.vue`(`index.vue:155-161,474-480`) | 无按钮、无 `tcm.diagnosis/detail/edit` repository 方法 | missing / P1 | 接诊工作台不能维护病历。 | +| 通知医助 | POST `/doctor.appointment/notifyAssistant {id}`,防重入、成功后刷新队列与详情(`index.vue:460-471`; `api/patient.ts:14-17`) | 端点/防按钮重入一致,但只 toast、不刷新(`reception.py:558-573`; `repository.py:252-255`) | partial | 后端动作 exact;页面不会立即反映服务端副作用。 | +| 完成接诊 | 仅 apt.status 1/4,权限 `doctor.appointment/complete`,不可逆确认,POST `{id: apt.id}` 后清选中并重载(`index.vue:162-171,492-511`; `api/doctor.ts:84-87`) | 同权限、确认和端点(`reception.py:326-328,610-641`; `repository.py:274-277`) | partial | 正常队列内近似 exact;受“非今日队列”和错患者详情竞态放大风险,UI 本身未再校验状态。 | +| 通话标识 | 缺 patient_id 拒绝;`diagnosis_id = row.diagnosis_id || row.id`(`index.vue:438-453`) | app 同时要求 patient/diagnosis id;payload 优先真实 diagnosis_id(`reception.py:643-661`; `app.py:496-537`) | exact | ID 未互换。 | +| 通话生命周期 | ChatDialog 调 get signature、start、bind、end(`chat-dialog/index.vue:641-695,996-1032,1089-1096`) | Remote 同四端点(`repository.py:443-483`),FIFO 生命周期按 start→bind→end(`video/lifecycle.py:184-209,211-263,265-292`) | exact(核心) | Python 的核心通话落库顺序一致。 | +| 通话扩展 | ChatDialog 还有 IM、截图写备注、云/本地录像上传(`chat-dialog/index.vue:129-175,241-265,1276-1301`) | 原生 companion 未提供这些管理后台附属入口 | partial | 核心视频可用;聊天、截图备注和本地录像回填不等价。 | + +### 接诊台权限差异 + +- 基准悬浮备注/编辑/完成分别使用 `doctor.appointment/addDoctorNote`、`tcm.diagnosis/edit`、`doctor.appointment/complete`(`patient/reception/index.vue:146-171`)。Python 已实现备注与完成门控,但编辑缺失(`reception.py:322-331`)。 +- 基准队列行“通知医助”和“发起通话”没有 `v-perms`(`index.vue:75-90`)。Python 额外要求 `doctor.appointment/notifyAssistant` 与 `tcm.diagnosis/videoQr`(`reception.py:322-325`)。后者在基准中是“小程序视频二维码”权限,不是直呼权限;这可能把拥有接诊页但没有二维码权限的医生挡在视频之外,判为 **partial / P1**。 +- NoteTimeline 的“添加文字备注”检查 addDoctorNote 权限,但两个媒体 picker 和删除图标只受 readonly 控制(`NoteTimeline.vue:3-40,64-99,150-151`)。这是基准自身的权限不对称,不能据此推导 Python 应无条件开放媒体写入。 + +## 5. 问诊列表逐项差异 + +### 5.1 列表、筛选与分页 + +| 项目 | 基准 | Python | 判定 | +|---|---|---|---| +| 列表端点 | GET `/tcm.diagnosis/lists`(`api/tcm.ts:3-6`) | 同端点(`repository.py:414-440`) | exact | +| 分页 | `usePaging` 默认 page size 15,发送 `page_no/page_size`(`usePaging.ts:13-21,25-48`) | page size 20、PageResult 容错(`consultations.py:93-95,264-300`) | partial | +| 默认范围 | PC/H5 均默认 `appointment_date=today`(`index.vue:2174-2182`; `index_h5.vue:1427-1437`) | 默认日期同为今天;Remote 在起止相等时转换为 `appointment_date`(`consultations.py:129-141,248-251,264-282`; `repository.py:420-424`) | exact(日期) | +| 默认状态 | 基准默认今天的所有挂号语义,不额外传 appointment status | Python status 下拉默认 1,并转成 `appointment_status=1`(`consultations.py:121-128,276-279`; `repository.py:429-434`) | partial / P1 | +| 关键词 | `keyword`,提示姓名/手机号(`index.vue:72-75,773-775`) | 同字段(`consultations.py:116-120,276`) | exact | +| 日期快捷项 | 前天、昨天、今天、明天、后天、全部;另有待预约、已完成、待分配及 9 路角标(`index.vue:963-1085`) | 单个起止日期控件和“今天”;无角标 | partial | +| 挂号/确认 | `has_appointment` 0/1;`diagnosis_confirmed` 0/1(`index.vue:78-97,804-833`) | 无这两个筛选 | missing | +| 诊断/证型/医助 | 字典筛选(`index.vue:104-113,1158-1188`) | 无 | missing | +| 最近挂号 | 起止日期 + 渠道,且与 appointment_date/未挂号互斥(`index.vue:114-149,1197-1228`) | 多日 start/end 被隐式映射为 latest appointment 起止,但无渠道、无互斥提示(`repository.py:420-428`) | partial | +| 最近指派 | 起止日期(`index.vue:124-133,1203-1216,1230-1232`) | 无 | missing | +| 未服务排序 | `sort_unserved_days=asc/desc`(`index.vue:297-304,1234-1248`) | 无 | missing | +| 待分配宽搜 | 有关键词时只保留 page、pending_assign 和 pending_assign_keyword,主动清空其他筛选(`index.vue:836-861,923-954`) | 无 | intentionally unsupported(医助分配) | +| 定时刷新 | PC 20 秒且 document.hidden 时跳过(`index.vue:1098-1105`);H5 15 秒(`index_h5.vue:1418-1437`) | 20 秒,页面 QWidget 隐藏时停(`consultations.py:238-240,325-334`) | exact(PC 周期)/ partial(可见性语义) | +| 路由 query id | `?id=` 会在异步 edit ref 就绪后打开编辑(`index.vue:1343-1357,2184-2188`) | 无 deep-link | missing | + +Python 的“状态下拉”不是基准筛选:它提供待接诊/取消/完成/过号(`consultations.py:121-127`),Remote 再把 3 映射为 `completed_appointment=1`,其他值映射成 `appointment_status`(`repository.py:429-434`)。基准 PC 没有该下拉;“已完成”定义为至少有一条 appointment.status=3(`index.vue:1007-1020`),取消状态也不在展示映射中。因此这里只能判 **partial**,不能视为同一合同。 + +### 5.2 行字段与状态映射 + +基准 PC 行字段: + +- 诊单 ID/NEW、患者姓名、性别年龄(`index.vue:191-218`)。 +- `appointments[]` 多挂号;回退到 appointment_id/status/doctor/time 主字段;最近渠道(`:219-261,1747-1757`)。 +- 确认状态来自 `DiagnosisViewRecord.some(is_confirmed == 1)`(`:262-267,1313-1317`)。 +- 复诊时间/医生/处方已作废、助理、是否开方(`:268-296`)。 +- `unserved_days` 与 last blood tooltip,阈值 null 灰、>=7 红、3-6 橙、<=2 绿(`:297-317,1319-1329`)。 +- `video_call_hint.state` 映射 none/live/pending_room/label(`:318-341,1373-1427`)。 + +Python 只显示预约时间、患者、状态、联系方式、医助、确认、处方、remark(`consultations.py:183-225`),判 **partial / P1**。具体错误为: + +1. `Consultation` 模型没有正式字段 `has_appointment`、`appointment_status`、`appointments`、followup、unserved、last blood、video hint;虽保留 raw,但 UI 不读取这些字段(`core/models.py:322-350`)。 +2. 模型从根 `status` 优先取值,只有根 status 缺失才使用首个 nested appointment.status(`:362-366,406-414`)。基准明确把 appointment status 放在 `appointment_status`/`appointments[].status`,并将诊单本身的 status 用作启用状态。这是 P0 视频门槛错误的根因。 +3. Python `diagnosis_confirmed` 属性只来自根 `confirmed/diagnosis_confirmed`(`:413-423`),不计算 `DiagnosisViewRecord`;存在把已确认显示成待确认的风险。 +4. Python 联系方式列直接显示 `patient_phone/phone/phone_masked`(`consultations.py:195-201`),而基准 PC/H5 列表不展示手机号明文;编辑页仅 `tcm.diagnosis/phonePlain` 可保持明文(`edit.vue:822-856,1263-1277`)。判 **missing / P1(隐私)**。 + +挂号状态基准只有:1=已预约、3=已完成、4=已过号(`index.vue:1732-1745`);取消仅允许 status 1/4,status 3 明确拒绝,且多挂号必须按具体 appointment id 操作(`:1782-1857`)。Python 把 2 显示为“已取消”,并把 4 也设为可直呼(`consultations.py:53-58,310-317`),不符合基准。 + +### 5.3 详情、编辑与操作 + +| 能力 | 基准行为与证据 | Python | 判定 | +|---|---|---|---| +| 只读病例详情 | PC 查看/双击需 `tcm.diagnosis/readonlyDetail`,路由 query id;加载 `/tcm.diagnosis/readonlyDetail` + doctorNotes(`index.vue:345-354,2165-2172`; `readonly.vue:172-240`; `api/tcm.ts:8-11`) | 表格双击直接发起视频;无详情页/端点(`consultations.py:227-228,319-323`) | missing / P1 | +| H5 简版详情 | 卡片头/体打开 `detail.vue`;GET `/tcm.diagnosis/detail`,显示基础、病史、舌苔/报告、症状舌脉治则处方医嘱状态(`index_h5.vue:121,144`; `detail.vue:10-122,157-165`) | 无 | missing | +| 完整诊单编辑 | `tcm.diagnosis/edit`;GET detail 后 POST edit;新增用 add;手机号/身份证唯一性检查(`edit.vue:1263-1375`; `api/tcm.ts:44-61,77-90`) | 无 repository 方法或 UI | missing / P1 | +| 编辑字段 | patient/id card/phone/gender/age/marital/height/weight/region/BP/glucose/type/status/source/card/current medicine/local diagnosis、全部现病史/既往史/其他史/symptoms/remark(`edit.vue:86-624,916-970`) | Consultation 只存列表摘要(`core/models.py:322-350`) | missing / P1 | +| 编辑验证 | 姓名、手机、性别、年龄、空腹血糖、诊断类型、当地医院必填;手机号正则;身份证 18 位正则;病史发现最多 50(`edit.vue:1026-1175`) | 无 | missing | +| 开方/查看 | `tcm.diagnosis/kaifang`;审核通过且未作废显示“查看”,否则“开方”;传 diagnosis id + appointment id(`index.vue:354-363,1671-1694`) | 无问诊行开方入口;只有独立已开处方列表/详情 | missing / P1 | +| 处方边界 | 先按 appointment 查已有;临床诊断、至少一味药、药名/正剂量、无重复、手写签名必填;可作废但有业务订单时禁止(`tcm-prescription/index.vue:1829-1922,2219-2328`) | Remote 仅 list/detail issued prescription(`repository.py:354-397`),无 add/getByAppointment/void | missing / P1 | +| 预约 | `tcm.diagnosis/guahao`;医生排班/未来 7 天/可用时段;今天过去时段禁用;渠道必填;指定自媒体渠道补充必填;今天已有 status1/4 禁止重复约今天(`appointment.vue:239-420,423-448,535-619,669-724`) | 无 | intentionally unsupported(后台/医助调度) | +| 取消挂号 | status1/4 可取消,3 拒绝,多 appointment 精确到子记录(`index.vue:1782-1857`; `api/doctor.ts:59-67`) | 无 | intentionally unsupported(后台/医助调度) | +| 指派/取消指派 | `tcm.diagnosis/assign`;单条/批量、继承标志、取消传 assistant_id=0(`index.vue:1532-1661`) | 无 | intentionally unsupported(医助管理) | +| 视频二维码/确认二维码 | 仅 `has_appointment && appointment_status=1`;需 weapp config;权限 `videoQr`/`guahao`(`index.vue:390-391,1778-1780,1964-2055`) | 用同一 `videoQr` 权限启动原生直呼(`consultations.py:102-106`) | intentionally unsupported(二维码)+ partial(权限/状态复用错误) | +| 医助旁观 | 仅当前被指派医助 + `tcm.diagnosis/watchCall`;pending_room 显示但不能进,live 才进;TRTC 只拉流(`index.vue:1380-1413`; `AssistantWatchCallDialog.vue:120-219`) | 无旁观角色/入口 | intentionally unsupported(医助角色) | +| 挂号日志 | `tcm.diagnosis/guahaoLogList`,空数组容错,显示 action/operator/summary/time(`index.vue:1859-1897`) | 无 | intentionally unsupported | +| 补身份证 | 15/18 位前端校验,POST fillIdCard 后自动年龄(`index.vue:1918-1961`) | 无 | intentionally unsupported(后台资料维护) | +| 企微记录 | records/contact 并行、20 条分页、文字 note 新增/删除(`index.vue:2066-2160`) | 无 | intentionally unsupported(后台企微归档) | +| 创建订单 | order_type、amount、remark 后生成订单二维码(`index.vue:1430-1515`) | 无 | intentionally unsupported(后台运营) | + +### 5.4 只读详情的权限化子区块 + +基准 `/tcm/diagnosis-readonly` 不是一个简单摘要,它按权限加载: + +- `tcm.diagnosis/dailyRecord`:DailyMatrix(`readonly.vue:42-54,183`)。 +- `doctor.appointment/addDoctorNote`:NoteTimeline 的可写版本在 edit;readonly route 固定只读(`readonly.vue:56-70`)。 +- `tcm.diagnosis/patientOrders`:业务订单(`:74-88`)。 +- `tcm.diagnosis/huifang`:通话录制回放(`:90-101`)。 +- `tcm.diagnosis/chat`:IM 记录(`:103-113`)。 +- `tcm.diagnosis/assign` 或 `tcm.diagnosis/detail`:指派日志(`:115-131`)。 +- `doctor.appointment/lists`:挂号记录(`:133-146`)。 + +Python 问诊列表没有选中详情容器,因此上述全部为 **missing**;其中病例、日常记录、备注、挂号记录属于医生核对链路,列 P1;订单、指派和后台 IM 可按角色继续列 intentionally unsupported。 + +## 6. API 覆盖矩阵 + +此表只包含从上述可达 view/component 实际导入的业务 API;端点定义证据集中在 `D:\web\zyt\admin\src\api\patient.ts:3-40`、`api\doctor.ts:49-87`、`api\tcm.ts:3-109,202-310,313-372,591-648`。 + +| API 组 | 管理后台可达用途 | Python 状态 | +|---|---|---| +| `doctor.appointment/lists` | 接诊队列、预约/挂号记录、最近就诊/今日重复检查 | **exact 端点 / partial 参数**;接诊台漏 today | +| `doctor.appointment/reception` | 接诊聚合详情 | **exact** | +| `notifyAssistant` | 通知医助 | **exact 端点 / partial 刷新与权限** | +| `addDoctorNote` | 文字、舌苔、报告、通话截图 | **partial**;Remote 参数齐,UI 只有文字 | +| `doctorNotes`, `deleteDoctorNoteImage` | 备注补拉、附件删除 | **missing** | +| `doctor.appointment/complete` | 完成接诊 | **exact 端点 / partial 上下文边界** | +| `tcm.diagnosis/lists` | 问诊列表、全部角标 | **exact 端点 / partial filters/model** | +| `readonlyDetail`, `detail`, `add`, `edit`, `delete`, `checkPhone`, `checkIdCard`, `fillIdCard` | 详情与资料维护 | **missing** | +| `assign`, `assignLogList`, `getAssistants`, `watchCall` | 医助分配与旁观 | **intentionally unsupported** | +| `trackingWindow`, `trackingNotes`, `addTrackingNote` | 日常记录/备注窗 | **missing** | +| blood/diet/exercise add/edit | 编辑页日常记录 | **missing** | +| diagnosisTodo lists/add/cancel | 日常记录待办 | **missing** | +| `getCallSignature`, `startCall`, `bindCallRoom`, `endCall` | 原生实时视频核心 | **exact** | +| `getCallRecords`, `attachLocalCallRecording`, `createManualCallRecord` | 回放与人工补传 | **missing**(可选扩展) | +| `getImChatMessages`, `triggerImChatSync` | IM 归档 | **missing** | +| `prescription/listByDiagnosis`, `getByAppointment`, `add`, `void` | 病例处方与开方 | **missing / P1** | +| `prescription/detail`, `prescription/lists` | 查看已开处方 | **exact**,但只在独立页面 | +| `prescriptionLibrary/lists` | 开方时导入本人模板 | **exact endpoint**,但问诊开方 UI 缺失 | +| availableSlots/create/roster/lists | 预约 | **intentionally unsupported** | +| generateMiniProgramQrcode/generateOrderQrcode + weapp config | 二维码 | **intentionally unsupported**,由原生直呼替代 | +| WeChat records/contact/add/delete | 企微归档 | **intentionally unsupported** | +| prescriptionOrder lists/detail/logs | 只读业务订单 | **intentionally unsupported** | + +Remote 的相关实现块只覆盖 appointment/reception/actions(`D:\web\zyt\app\src\doctor_workstation\services\repository.py:226-277`)、diagnosis list 与四个 call endpoint(`:414-483`);因此上述“missing”不是 UI 隐藏但 repository 已具备,而是端到端合同确实不存在。 + +## 7. 权限码对照 + +### 基准中实际出现 + +- 页面/读取:`doctor.appointment/lists`、`tcm.diagnosis/lists`、`tcm.diagnosis/readonlyDetail`、`tcm.diagnosis/detail`、`tcm.diagnosis/dailyRecord`、`tcm.diagnosis/patientOrders`、`tcm.diagnosis/huifang`、`tcm.diagnosis/chat`。 +- 接诊写动作:`doctor.appointment/addDoctorNote`、`doctor.appointment/complete`、`tcm.diagnosis/edit`。 +- 问诊列表动作:`tcm.diagnosis/add`、`edit`、`delete`、`assign`、`kaifang`、`guahao`、`videoQr`、`watchCall`、`guahaoLogList`、`order`。 +- 编辑扩展:`tcm.diagnosis/phonePlain`、`tcm.diagnosis/chufang`、`tcm.diagnosis/setRevisitSlotStartOffset`、`tcm.prescriptionOrder/detail`。 + +证据:接诊 `patient/reception/index.vue:146-171`;问诊 PC `tcm/diagnosis/index.vue:318-400`;readonly `readonly.vue:42-146`;edit `edit.vue:674-748,822-856`;PatientOrderList `components/PatientOrderList.vue:20-33,99-114`。 + +### Python 实际门控 + +- 页面:两个页面码 **exact**(`shell.py:40-75`)。 +- 接诊:`notifyAssistant`、`videoQr`、`complete`、`addDoctorNote`(`reception.py:322-331`);缺 edit。 +- 问诊:只有 `videoQr`(`consultations.py:102-106`);其余动作根本没有 UI。 +- Python PermissionSet 本身支持 `*`、all/any(`core/permissions.py:60-104`),问题在页面选择了哪些码,而不是权限容器能力。 + +特别注意:Web 的 `v-perms` 是数组 OR(`install/directives/perms.ts:13-32`),`hasPermission()` 工具是数组 AND(`utils/perm.ts:3-17`);当前页面绝大多数调用只有一个码,唯一显式 OR 的 assign/detail 是两个独立调用(`readonly.vue:117-120`),所以本次差异不受二者实现差别影响。 + +## 8. P0 / P1 缺口清单(按严重度排序) + +### P0 + +1. **RACE-RECEPTION-01:快速切换患者导致详情与选择错配。** 修复验收应覆盖 A 请求未返回时选 B,A/B 任意顺序返回后 UI、备注 diagnosis_id、通知/完成 appointment_id 和视频 payload 必须全部指向 B;详见第 1、4 节证据。 +2. **SCOPE-RECEPTION-02:接诊列表漏 `start_date=end_date=today`。** 必须在 UI 或 repository 的专用 reception query 中固定今日,不能让通用 appointment list 隐式决定。 +3. **STATE-CALL-03:问诊视频使用 `status` 而非 `has_appointment + appointment_status`,且错误允许 4。** 模型和 UI 都需改;只修 UI 的字段名仍会被当前 dataclass 的根 status 优先级遮蔽。 + +### P1 + +1. **DETAIL-04:问诊列表没有 `readonlyDetail`/详情入口,双击反而直呼。** 医生无法先核对完整病例、日常记录、备注和挂号历史。 +2. **EDIT-05:接诊台和问诊列表均无诊单详情/edit 合同。** 基准接诊台明确提供“编辑病历”。 +3. **RX-06:没有从诊单开方/查看/作废的工作流。** 独立“已开处方”页面不能替代 `diagnosis_id + appointment_id` 上下文开方。 +4. **RECEPTION-DETAIL-07:接诊详情只显示摘要,缺完整 PatientCase、日常记录、备注附件和附件删除。** +5. **PRIVACY-08:接诊和问诊列表可能直接显示明文手机号,未遵守基准的 mask/phonePlain 边界。** +6. **PERM-09:用 `tcm.diagnosis/videoQr` 保护原生直呼、用未在基准按钮上出现的 `doctor.appointment/notifyAssistant` 保护通知,可能让合法接诊医生缺动作;同时缺 `tcm.diagnosis/edit` 入口。** 需要后端权限清单确认专用 call permission,而不是继续借用二维码码。 +7. **MODEL-10:Consultation 未正式解析 appointment_status、has_appointment、多挂号、DiagnosisViewRecord、unserved/video hint 等;当前确认和状态显示不可靠。** +8. **FILTER-11:问诊筛选缺 has_appointment、confirmed、诊断类型、证型、医助、最新挂号渠道、最新指派、未服务排序及顶部 count;Python 自创 status 下拉又改变默认结果集。** +9. **BOUNDARY-12:文字备注没有 500 字客户端限制;通知成功不刷新;完成动作未在 handler 中二次验证 1/4。** + +不列 P0/P1 的 intentionally unsupported 项:H5 响应式布局、小程序/订单二维码、批量指派、医助旁观、企微后台归档、后台订单创建和排班预约。若产品决定医生桌面也承担医助/运营职责,应把这些重新分类为 missing 并另立需求。 + +## 9. 基准自身的可疑点(不可静默照搬) + +以下均是当前 `admin/src/views` 的真实行为,本报告仅记录,不用其他资料修正它: + +1. 接诊台“编辑病历”把 `diag.patient_id` 传给 `edit.open('edit', id)`(`patient/reception/index.vue:474-476`),而 edit 将该 id 直接传给 `/tcm.diagnosis/detail`(`tcm/diagnosis/edit.vue:1263-1265,1288-1302`);问诊列表传的则是 `row.id`(`index.vue:1667-1669`)。这是明显 ID 口径冲突。 +2. PC/H5 的“视频二维码”请求把 `diagnosis_id` 赋成 `row.appointment_doctor_id`(`index.vue:1987-1993`; `index_h5.vue:1262-1268`),而“诊单二维码”正确使用 `row.id`(`index.vue:2037-2042`)。Python 原生直呼当前没有复制此错误。 +3. `PatientCaseCard` 的 consultation_type 三元两边都返回“复诊”(`PatientCaseCard.vue:148-151`)。 +4. 接诊行通知/通话无权限指令、NoteTimeline 媒体写入未复用 addDoctorNote 门控,见第 4 节;应先确认服务端授权模型,再决定桌面行为。 + +## 10. 建议的最小合同测试 + +后续实现至少应加入不发网络的合同测试: + +1. Reception request 必含 status、today start/end、patient_name、page_no/page_size。 +2. A/B 详情乱序返回不会产生跨患者详情或写动作目标。 +3. Consultation row 的 `status=1, appointment_status=3` 不可视频;`status=1, has_appointment=1, appointment_status=1` 可视频;status 4 一律不可从问诊列表直呼。 +4. `DiagnosisViewRecord=[{is_confirmed:1}]` 显示已确认;多 appointments 保留并正确挑选 active appointment。 +5. 无 phonePlain 权限时列表和详情只出现掩码。 +6. readonlyDetail、edit 和 prescription 动作分别由准确权限码控制;缺码时不创建可调用控件。 +7. 备注 501 字在客户端拒绝;媒体 note payload 保留 tongue/report 数组;删除附件的三字段合同固定。 + diff --git a/app/research/tencent_rtc.md b/app/research/tencent_rtc.md new file mode 100644 index 000000000..37625b07c --- /dev/null +++ b/app/research/tencent_rtc.md @@ -0,0 +1,275 @@ +# 腾讯云 TRTC 接入 Python / PySide6 跨平台桌面视频面诊研究 + +> 调研日期:2026-08-10 +> 范围:Windows / macOS 桌面端;Python / PySide6 业务程序;1 对 1 视频面诊,可扩展屏幕共享。 +> 来源原则:仅使用腾讯云、Tencent RTC 官方文档与官方 SDK API 文档。文中标为“工程判断/建议”的内容是根据官方能力边界作出的架构推断,并非腾讯云对 Python 或 PySide6 的兼容性承诺。 + +## 结论摘要 + +1. **腾讯云没有官方 Python 或 PySide6 TRTC 客户端 SDK。** 用户指定的[产品概述(文档 16788)](https://cloud.tencent.com/document/product/647/16788)列出了 Windows、macOS、Web、Electron 等平台,没有 Python/PySide6。官方还提供了 Windows/macOS 的 **C++ Qt** 集成示例,但它不是 Python 绑定,也没有证明 PySide6 / Qt 6 ABI 兼容。 +2. **推荐生产架构:PySide6 保留为业务主程序,音视频做成独立 Electron RTC companion(伴随进程/独立面诊窗口),由后端签发进房票据,PySide6 与 companion 通过本机受认证 IPC 交互。** 1 对 1 场景优先使用底层 `trtc-electron-sdk`;若要快速获得完整会议 UI、成员管理和会控,可选官方 TUIRoomKit Electron。官方明确将 TUIRoomKit Electron 用于“医疗问诊”等场景。 +3. **最快的业务 MVP 是从 PySide6 打开系统浏览器中的 HTTPS Web SDK 面诊页。** 这是官方浏览器支持路径。把 Web SDK 嵌入 `QWebEngineView` 技术上有机会可行,但 QtWebEngine 不在腾讯的具名支持矩阵中;官方只说理论上支持 Chromium 56+,并要求对 WebView 等未列环境运行能力检测。因此,`QWebEngineView` 只能作为验证分支,不能在未完成双平台全量实测前作为生产承诺。 +4. **若“必须在同一 PySide6 窗口内原生渲染”是硬要求,才选择 Native C++ 桥接。** 需要自行为 Windows/macOS 编译 C ABI/CPython 扩展,处理原生渲染句柄、回调线程、Qt 5/Qt 6 兼容、签名与打包;这是可落地但成本和维护风险最高的方案。 +5. **生产环境的 SDKSecretKey 只能放在服务端。** 客户端仅获得短期 `UserSig`;需要面诊房间级与媒体权限控制时,开启 Advanced Permission Control 并由服务端签发 `PrivateMapKey`。房间 ID 不能视作访问控制。 + +## 方案对比 + +| 方案 | 官方支持边界 | 与 Python/PySide6 的关系 | 摄像头/麦克风/屏幕分享 | 主要风险 | 判断 | +|---|---|---|---|---|---| +| Web SDK + 系统浏览器 | 官方支持 Windows/macOS 主流浏览器;生产要求 HTTPS | PySide6 打开带一次性业务会话的 HTTPS 页面;无 Python SDK 绑定 | 官方均支持;屏幕分享受浏览器/OS 授权和用户选择器约束 | 独立浏览器窗口、业务 UI 一体化较弱 | **最快、风险低的 MVP/兜底** | +| Web SDK + `QWebEngineView` | 官方称理论支持 Chromium 56+,未列环境(含 WebView)需 `TRTC.isSupported()`/能力检测;未明确认证 QtWebEngine | JS 运行在嵌入页,通过 WebChannel/IPC 与 Python 通信(工程自建) | 需验证嵌入引擎的媒体权限、设备切换、屏幕选择与 macOS Screen Recording | 腾讯支持边界、QtWebEngine 版本与权限行为不确定 | **仅作 POC;通过准入测试后才可采用** | +| Electron SDK / TUIRoomKit Electron | 官方支持 Windows/macOS;SDK 是 Node 原生模块;官方提供设备权限、打包、屏幕分享和医疗问诊组件指引 | Python 不能直接 `import`;作为独立伴随进程最清晰 | 完整支持,DOM 承载本地/远端画面;可用辅路同时保留摄像头与屏幕 | 包体较大、需维护本机 IPC、两平台分别构建签名 | **推荐生产方案** | +| Native C++ SDK + 自研桥 | 官方全平台 C++ API、Windows/macOS SDK、C++ Qt 示例 | 自行写 C ABI/pybind11/CPython 桥;腾讯不提供 Python/PySide6 绑定 | 能力最完整,包含设备管理、测试、屏幕源枚举、原生渲染与私有加密 API | C++ ABI、Qt 版本、线程、崩溃隔离、双平台构建维护 | **单窗口原生体验的二期方案** | + +## 各方案适配判断 + +### 1. Web SDK + +官方事实: + +- TRTC Web SDK 是 JavaScript SDK,视频渲染目标是 HTML 元素;通过 `TRTC.create()`、`enterRoom()`、`startLocalAudio()`、`startLocalVideo()`、`startRemoteVideo()`、`exitRoom()` 和 `destroy()` 完成生命周期,见[Web & H5 快速接入](https://cloud.tencent.com/document/product/647/116544)。 +- 官方平台页称理论上支持所有 Chromium 56+ 浏览器;对支持表之外的环境,建议用 `TRTC.isSupported()` 或[能力检测页](https://web.sdk.qcloud.com/trtc/webrtc/demo/detect/index.html)检测。快速 Demo 文档还特别提到 WebView 等环境应先检测,见[Web Demo 准备工作](https://cloud.tencent.com/document/product/647/32398)和[Web API 概览/平台要求](https://intl.cloud.tencent.com/zh/document/product/647/41664)。 +- 生产环境推流和屏幕分享要求 HTTPS;HTTP 生产页只能播放,不能上麦/屏幕分享。本地 `localhost` 可用于开发。 +- 设备名称和 `deviceId` 在获得摄像头/麦克风授权前可能为空;应先完成授权再展示设备详情。 +- 桌面 Web 支持 `startScreenShare()`;用户可能从浏览器系统 UI 停止分享,业务必须监听分享停止事件并恢复 UI 状态,见[Web 屏幕分享](https://intl.cloud.tencent.com/zh/document/product/647/35163)。 + +对 PySide6 的工程判断: + +- 系统 Chrome/Edge/Safari 是具名支持路径,最适合快速验证服务端、UserSig、房间和媒体链路。 +- `QWebEngineView` 虽基于 Chromium,但不是腾讯文档具名认证平台。只有在目标 PySide6 随附的 QtWebEngine 上同时通过能力检测和真实设备测试,才能认为本项目可用。 +- 若验证嵌入方案,应把下列项目设为硬门槛:摄像头/麦克风首次授权及拒绝后恢复、设备插拔和切换、远端音频自动播放、窗口/整屏分享、从系统分享条停止、macOS Screen Recording 权限、窗口最小化/休眠恢复、打包后仍可用。 +- `file://` 虽在官方表中可用,但生产仍建议加载受控 HTTPS 页面,以便版本发布、CSP、证书与安全响应集中管理。 + +### 2. Electron SDK / TUIRoomKit Electron + +官方事实: + +- 当前[Electron 快速接入](https://cloud.tencent.com/document/product/647/116549)要求 Electron 工程安装 `trtc-electron-sdk`,实际加载 `trtc_electron_sdk.node` 原生模块;支持 Windows 和 macOS,并给出了两平台不同的原生模块资源路径、摄像头/麦克风/屏幕权限检查及打包配置。 +- `startLocalPreview()` 的渲染目标是 `HTMLElement`,不是 PySide `QWidget`;`startLocalAudio()` 可选 Speech 模式,官方说明其噪声抑制和弱网抗性更强,适合面诊语音。 +- 1 对 1 视频面诊应使用 `TRTCAppSceneVideoCall`,而不是直播场景。官方将 VideoCall 定位为 1 对 1 或 300 人以内实时通话。 +- [TUIRoomKit Electron 接入](https://cloud.tencent.com/document/product/647/129879)明确列出“医疗问诊”场景,并内置房间管理、音视频控制、屏幕共享、成员管理和布局。 +- Electron 屏幕分享支持主路和辅路。辅路可在摄像头继续上行的同时分享屏幕;一个 TRTC 房间目前只能有一路屏幕分享,见[Electron 屏幕分享](https://intl.cloud.tencent.com/zh/document/product/647/47619)。 +- 官方 Electron API 还提供设备列表、设备切换、摄像头/麦克风/扬声器测试和网络测速;网络测速应在进房前进行,见[Electron SDK API](https://web.sdk.qcloud.com/trtc/electron/doc/en-us/trtc_electron_sdk/TRTCCloud.html)。 + +对 PySide6 的工程判断: + +- Node 原生模块不能当作 Python 模块直接加载。把它塞进 PySide6 进程会引入 Node/Electron 运行时、DOM 渲染和 ABI 问题,不值得。 +- 独立 RTC companion 可将故障、升级和媒体权限与 Python 主进程隔离;PySide6 只负责预约、病历、支付等业务 UI,Electron 只持有当次短期票据并负责通话。 +- Windows 与 macOS 应各自在目标系统构建、签名并验证产物;不要把包含 `.node`/`.dll`/framework 的包当作纯 JS 跨平台包。 +- IPC 采用本机命名管道/Unix domain socket 或 loopback WebSocket,并以每次启动随机 nonce 双向认证;不要把 `UserSig` 放在命令行参数、URL 查询串或长期日志中。此为工程安全建议,不是腾讯 SDK 的内置保证。 + +### 3. Native C++ SDK 与 Qt 桥接 + +官方事实: + +- [全平台 C++ API 概览](https://cloud.tencent.com/document/product/647/32268)包含实例/回调、进退房、摄像头和远端渲染、音频、设备管理、屏幕分享、网络质量、连接恢复及私有加密等完整能力。 +- 腾讯提供[Qt Windows/macOS 集成文档](https://intl.cloud.tencent.com/zh/document/product/647/39665):Windows 使用 C++ SDK 的 `liteav.lib`/DLL;macOS 引用 `TXLiteAVSDK_TRTC_Mac.framework` 的 C++ 接口。示例是 Qt Widgets/C++,macOS 文档写的是 Qt 5.10+。 +- macOS 需要在 `Info.plist` 声明摄像头和麦克风权限;官方 Electron 指引另外检查 `screen` 权限。 +- C++ API 可枚举/切换设备并运行摄像头、麦克风和扬声器测试;屏幕分享可枚举窗口/屏幕、选择目标、设置辅路参数及包含/排除窗口。 + +对 PySide6 的工程判断: + +- PySide6 使用 Qt 6,而官方 Qt 示例仍以 Qt 5 为基线,不能把“支持 C++ Qt”直接等同于“支持 PySide6”。 +- 若采用,推荐制作**很薄的 C ABI 桥**,不要让 Python 直接调用 C++ ABI:桥内持有 `ITRTCCloud`、回调对象和 SDK 生命周期,只向 Python 暴露稳定的 opaque handle、进退房、设备、屏幕分享和事件队列。 +- 视频尽量由 SDK 绑定原生子窗口/视图句柄渲染;不要默认把每帧 YUV 回调到 Python,这会显著增加跨语言复制、GIL 和掉帧风险。 +- SDK 回调可能不在 Qt UI 线程,桥层必须投递到 PySide6 主线程;退出时顺序应固定为停止屏幕分享/本地采集/远端渲染、`exitRoom`、等待退房回调、移除回调、销毁实例。 +- 该路线必须先验证 Qt 版本和原生窗口句柄,且建议在正式承诺前向腾讯云提交工单确认目标 SDK 版本的 Qt 6/PySide 嵌入边界。 + +## 推荐生产架构 + +```text +┌──────────────────────┐ HTTPS ┌────────────────────────┐ +│ PySide6 业务主程序 │ ───────────────────▶ │ 业务后端 / RTC Ticket │ +│ 预约、病历、面诊入口 │ │ 鉴权、预约授权、UserSig │ +└──────────┬───────────┘ │ PrivateMapKey、结束房间 │ + │ 本机受认证 IPC └────────────┬───────────┘ + ▼ │ TRTC REST / callback +┌──────────────────────┐ ┌─────────────▼──────────┐ +│ Electron RTC companion│ ◀──── RTC 媒体 ────▶ │ 腾讯云 TRTC │ +│ 设备、视频、屏幕分享 │ └────────────────────────┘ +└──────────────────────┘ +``` + +### 组件职责 + +**PySide6 主程序** + +- 只传预约 ID/面诊动作,不生成或持久化 SDKSecretKey。 +- 调用业务后端获取本次短期进房票据,启动/聚焦 RTC companion。 +- 展示 companion 回传的 `preflight / joining / connected / reconnecting / ended / error` 状态。 +- 业务“面诊已结束”不能只依赖窗口关闭事件,应由客户端结果、TRTC 服务端回调和后端结束动作共同收敛。 + +**业务后端 / RTC Ticket 服务** + +- 验证当前登录用户确实是该预约的医生或患者,并验证允许进房的时间窗和预约状态。 +- 服务端派生 `userId`、`roomId`,生成 `UserSig`;启用高级权限控制时同时生成 `PrivateMapKey`。 +- 返回最小票据:`sdkAppId`、`userId`、一种且仅一种 room ID、`userSig`、`expiresAt`、可选 `privateMapKey`、业务角色与 UI 权限。SDKSecretKey 永不返回。 +- 提供“结束面诊”接口;需要强制结束时调用官方 `DismissRoom`/`DismissRoomByStrRoomId`,见[解散房间 API](https://cloud.tencent.com/document/api/647/50089)。 +- 接收房间/媒体回调,校验签名并幂等处理。 + +**Electron RTC companion** + +- 使用底层 `trtc-electron-sdk` 完成 1 对 1 VideoCall;若需求接近完整会议产品,则用 TUIRoomKit Electron。 +- 不保存长期登录态或云密钥;窗口关闭、崩溃和正常退房均向 PySide6/后端报告。 +- 所有摄像头、麦克风和屏幕分享都由用户明确操作开启,并在界面持续显示状态。 + +## UserSig 与房间权限 + +### UserSig + +- [官方用户鉴权文档](https://cloud.tencent.com/document/product/647/17275)明确指出:客户端计算 UserSig 只适合 Demo。客户端代码,尤其 Web,容易被反编译;泄露 SDKSecretKey 会导致腾讯云资源被盗用。 +- 正式环境流程必须是:客户端先向业务服务器请求;服务器按 `SDKAppID + UserID` 生成 UserSig;客户端仅把结果交给 SDK。官方提供 Python HMAC-SHA256 服务端示例,因此 Python 后端生成完全可行。 +- 建议把 UserSig 有效期控制为“预约可加入窗口 + 最大面诊时长 + 合理重连缓冲”,并在每次重新进入房间前重新授权。腾讯官方云助手的[Web 进房说明](https://cloud.tencent.com/document/product/1715/104507)指出原始 TRTC 的 UserSig 在进房时校验、进房后到期不影响当前通话;若采用包含 IM 登录的 TUIRoomKit,还要监听 `onUserSigExpired` 并从后端续签。 +- SecretKey 放在服务端密钥管理系统/受限环境变量中;禁止进入桌面包、前端 JS、崩溃转储、遥测和调试日志。 + +### PrivateMapKey(高级权限控制) + +- UserSig 证明某 UserID 有权使用该 SDKAppID,**不等于有权进入某个面诊房间**。对视频面诊,建议评估开启[高级权限控制](https://intl.cloud.tencent.com/zh/document/product/647/35157)。 +- `PrivateMapKey` 绑定 room ID 与权限位,可分别控制创建房间、进房、收发音频、收发主路视频、收发辅路(屏幕分享)。必须由服务端计算。 +- 示例权限策略: + - 医生:创建/进入、收发音频、收发视频、发送/接收辅路。 + - 患者:进入、收发音频、收发视频、接收辅路;若不允许患者分享,则不授予“发送辅路”。 + - 若不能保证医生先进入,需要给患者也授予创建房间,或由业务规则强制医生先创建。 +- 启用高级权限控制后,同一 SDKAppID 下所有用户都必须携带 PrivateMapKey;已有线上应用不能直接无迁移开启。建议新建独立 SDKAppID 做灰度验证。 + +## 房间与用户生命周期 + +官方[基本概念](https://cloud.tencent.com/document/product/647/46351)给出的关键规则: + +- 不存在的房间在首个用户进入时自动创建。 +- 通话模式下,所有用户主动退房后房间立即解散;所有人异常掉线时,服务端约 90 秒后清理并解散。异常等待时间仍计入用量。 +- 数字 `roomId` 与字符串 `strRoomId` 是两套不同房间,不能混用;全端和服务端必须统一一种类型。 +- 同一 UserID 同时进入同一房间会互踢/干扰。UserID 应由后端稳定映射;若允许同一账号多设备同时加入,应给每个设备/会话分配唯一 UserID。 +- 原始 TRTC 的远端用户进出回调用于维护成员列表,不代表对方已有视频;显示远端画面必须监听 `onUserVideoAvailable`,屏幕分享监听 `onUserSubStreamAvailable`。 + +建议客户端状态机: + +```text +idle + → device-preflight + → ticket-issued + → joining + → joined(media-off) + → media-on / screen-sharing + → exiting + → idle + +joined ↔ reconnecting +joining/connected → kicked | room-dismissed | fatal-error → cleanup → idle +``` + +实施要点: + +- 创建实例后先注册所有错误、进退房、远端媒体、设备变化和连接状态回调,再调用 `enterRoom`。 +- 以 `onEnterRoom(result > 0)` 作为真正进房成功,不以 `enterRoom()` 函数返回或窗口已打开代替。 +- 网络断开时 SDK 会自动重连;监听 `onConnectionLost`、`onTryToReconnect`、`onConnectionRecovery`。官方说明远端通常约 90 秒后才收到异常用户离开,因此业务后端不能把短时断网立即当成面诊结束,见[断线重连说明](https://intl.cloud.tencent.com/document/product/647/36057)。 +- 正常结束必须成对调用 `exitRoom`;退出后停止本地媒体、停止远端渲染、移除监听并销毁实例。Web 端明确要求 `exitRoom()` 后不再使用时调用 `destroy()`。 +- 服务端[房间与媒体回调](https://intl.cloud.tencent.com/zh/document/product/647/39558)可能重试,且特殊网络/重进场景可能产生重复事件;回调处理必须幂等,不能只用“最后一条回调”做财务/医疗业务结论。 + +## 摄像头、麦克风与屏幕分享 + +### 通话前检查 + +- 列出并选择摄像头、麦克风和扬声器;运行摄像头预览、麦克风电平和扬声器测试。 +- 网络测速只在进房前运行,避免影响通话质量。 +- 默认音频质量使用 Speech/语音模式;先以 640×360 的保守视频档位验证弱网和 CPU,再按质量监控数据决定是否提高到 720p。 +- 对权限拒绝、设备被占用、设备拔出、默认设备变化给出可恢复 UI,不应直接结束预约。 + +### 屏幕分享 + +- 默认采用**辅路**,让医生摄像头与屏幕并存;远端根据辅路可用事件订阅。 +- 一个房间只允许一路屏幕分享,第二人发起前应在业务 UI 层仲裁。 +- 分享前必须让用户确认目标窗口/屏幕;分享中持续显示醒目标志;无论从应用按钮还是浏览器/系统指示条停止,都要收到事件并清理本地状态。 +- 医疗场景应默认不共享整个桌面,优先窗口分享。Native SDK 可用窗口排除/包含 API,避免将病历主窗口、通知或其他患者信息意外共享。 +- macOS 打包必须验证 Camera、Microphone 和 Screen Recording 权限的首次授权、拒绝、系统设置中撤销及升级安装后的行为。 + +## 生产安全与合规边界 + +1. **应用隔离**:开发、测试、生产使用不同 SDKAppID;正式环境不要复用 Demo 密钥或固定房间号。 +2. **最小化标识**:`roomId`/`userId` 使用无语义内部 ID,不包含姓名、手机号、身份证号、诊断或预约描述;映射只保存在业务后端。 +3. **后端授权**:每次签票都校验预约参与者、角色、状态和时间窗;不能只靠“知道 roomId”。高安全场景使用 PrivateMapKey。 +4. **回调真实性**:生产回调使用 HTTPS;按官方算法对原始请求体做 HMAC-SHA256 校验,并校验 SDKAppID;存储事件 ID/组合键以幂等处理重试。 +5. **传输与额外加密**:腾讯[信息安全说明](https://cloud.tencent.com/document/product/647/86362)说明其默认传输有私有传输协议/TLS/WSS 保护。若组织政策要求额外媒体私有加密,Native C++ API 提供 `enablePayloadPrivateEncryption`,见[媒体流私有加密](https://cloud.tencent.com/document/product/647/106173);该能力需要相应套餐,并与云端录制、旁路转推等能力存在冲突,应在架构阶段选定。Electron 官方另有 C++ 动态库形式的[自定义媒体加解密插件](https://web.sdk.qcloud.com/trtc/electron/doc/zh-cn/trtc_electron_sdk/tutorial-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E9%9F%B3%E8%A7%86%E9%A2%91%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89%E5%8A%A0%E8%A7%A3%E5%AF%86.html),实施成本应单独评估。 +6. **录制默认关闭**:只有在业务、告知同意、保存期限、访问控制和删除策略均明确后才启用。官方说明云录制文件存入客户指定的云存储;开启私有加密会限制云录制等服务。 +7. **日志最小化**:不记录 UserSig、PrivateMapKey、完整 IPC 消息、病历内容或屏幕标题;支持包上传前先脱敏。SDK 日志目录应受操作系统用户权限保护并配置留存期。 +8. **程序供应链**:Windows 代码签名;macOS Developer ID、Hardened Runtime/必要 entitlement、Notarization;固定已验证 SDK 版本,升级先做双平台回归。 +9. **网络准入**:医院/机构网络可能限制 UDP。上线前按[防火墙白名单](https://intl.cloud.tencent.com/zh/document/product/647/35164)在真实网络验证 Native/Electron 或 WebRTC 所需端口与动态域名,不要只在家庭网络测试。 +10. **合规不是 SDK 自动获得**:腾讯的信息安全说明明确不是国家/行业标准承诺,强制要求建议通过书面 SLA 确认。医疗隐私、录制同意、数据驻留和留存仍需项目方做法务/安全评审。 + +## 最小可验证集成(推荐:Electron companion) + +### 验证目标 + +先在一个 Windows 10/11 x64 和一个受支持 macOS 真机上实现 doctor ↔ patient 互通;进入预生产前再增加同平台终端,覆盖 Windows ↔ Windows、macOS ↔ macOS。最终证明安全签票、跨平台进房、音视频、设备权限、屏幕辅路、重连、正常退房和打包后运行都成立。 + +### 实施顺序 + +1. **TRTC 开发应用** + - 新建独立开发 SDKAppID。 + - 先关闭自动录制/旁路转推;高级权限控制在基础链路跑通后于同一开发应用或新应用验证。 +2. **Python/任意现有后端的 ticket endpoint** + - `POST /api/appointments/{id}/rtc-ticket`。 + - 从登录态和预约记录派生 `userId`/room ID;使用腾讯官方 Python HMAC-SHA256 示例在服务端生成 UserSig。 + - 响应中不包含 SecretKey;票据只允许用于该预约与短时间窗。 +3. **最小 Electron companion** + - 安装官方 SDK,创建 `TRTCCloud` 单例并先注册回调。 + - 请求相机/麦克风权限,提供摄像头、麦克风、扬声器测试。 + - 使用 `TRTCAppSceneVideoCall` 进房;等待 `onEnterRoom > 0`。 + - 用户点击后调用 `startLocalPreview()` 和 `startLocalAudio(TRTCAudioQualitySpeech)`。 + - 监听远端主路/辅路可用事件并渲染;实现窗口/整屏辅路分享和停止。 + - 退出时完整清理并调用 `destroyTRTCShareInstance()`。 +4. **PySide6 最小联动** + - “开始面诊”请求 ticket,创建带随机 IPC nonce 的 companion;ticket 通过受认证 IPC 发送,不放命令行。 + - companion 将状态和最终错误码回传;PySide6 只展示状态并提供结束入口。 +5. **后端回调** + - 配置 HTTPS 房间/媒体回调,启用自定义 callback key。 + - 对原始 body 验签并幂等落库;把客户端与回调状态关联到 appointment/session ID。 +6. **高级权限控制验证** + - 服务端生成 PrivateMapKey;验证错误房间、过期/错误票据、患者无屏幕上行权限均被服务端拒绝。 + +### 最小验收清单 + +- [ ] Windows ↔ Windows、macOS ↔ macOS、Windows ↔ macOS 三组均能进房。 +- [ ] SDKSecretKey 不存在于 Python 包、Electron 包、JS source map、命令行和日志。 +- [ ] 正确票据进房成功;错误 UserSig、错误 PrivateMapKey、非预约参与者进房失败。 +- [ ] 摄像头、麦克风、扬声器可检测/切换;拒绝授权后 UI 可恢复;设备拔插不崩溃。 +- [ ] 医生与患者可看到/听到对方;以首帧和首个音频回调确认,不只凭 UI 按钮状态。 +- [ ] 辅路屏幕分享与摄像头并存;系统 UI 停止分享后双方状态同步;第二路分享被正确阻止。 +- [ ] 网络断开时进入 reconnecting,恢复后继续通话;应用强杀后服务端约 90 秒收敛,客户端有经过验证的重新取票/进房路径。 +- [ ] 重复 UserID 的互踢行为有明确提示;正常退出释放摄像头/麦克风并销毁实例。 +- [ ] 回调验签失败被拒绝;腾讯回调重试不会重复结算或重复关闭预约。 +- [ ] Windows 签名安装包和 macOS 签名/公证包在干净机器可运行并能申请权限。 +- [ ] 医院/目标机构网络按官方白名单完成真实音视频与屏幕分享测试。 + +### 决策门槛 + +- 若 Electron companion 的包体/双窗口体验可以接受,按该架构进入生产化。 +- 若产品坚持单窗口,可并行做 2 个受限 POC: + 1. `QWebEngineView`:仅在上述 WebView 准入测试全部通过后采用;失败即回退 Electron。 + 2. Native C++ bridge:先只实现 SDK version、实例、回调、一个本地/远端原生渲染视图和完整销毁;确认 Qt 6/PySide6 稳定后再扩展设备与屏幕分享。 +- 若组织要求媒体私有加密且同时要求云端录制,必须先解决官方能力冲突,不能在开发末期再补。 + +## 官方资料索引 + +- [TRTC 产品概述与平台支持(用户指定文档 16788)](https://cloud.tencent.com/document/product/647/16788) +- [TRTC 基本概念:UserID、房间与生命周期](https://cloud.tencent.com/document/product/647/46351) +- [Web & H5 快速接入](https://cloud.tencent.com/document/product/647/116544) +- [Web Demo:WebView 检测、HTTPS 与防火墙要求](https://cloud.tencent.com/document/product/647/32398) +- [Web API 概览与平台支持矩阵](https://intl.cloud.tencent.com/zh/document/product/647/41664) +- [Web 屏幕分享](https://intl.cloud.tencent.com/zh/document/product/647/35163) +- [Electron 快速接入、设备权限与打包](https://cloud.tencent.com/document/product/647/116549) +- [TUIRoomKit Electron:医疗问诊等场景](https://cloud.tencent.com/document/product/647/129879) +- [Electron 屏幕分享](https://intl.cloud.tencent.com/zh/document/product/647/47619) +- [Electron SDK API](https://web.sdk.qcloud.com/trtc/electron/doc/en-us/trtc_electron_sdk/TRTCCloud.html) +- [C++ 全平台 API 概览](https://cloud.tencent.com/document/product/647/32268) +- [C++ Qt Windows/macOS 集成](https://intl.cloud.tencent.com/zh/document/product/647/39665) +- [UserSig 用户鉴权与官方 Python 服务端示例入口](https://cloud.tencent.com/document/product/647/17275) +- [原始 TRTC Web 进房时的 UserSig 校验说明](https://cloud.tencent.com/document/product/1715/104507) +- [PrivateMapKey 高级权限控制](https://intl.cloud.tencent.com/zh/document/product/647/35157) +- [房间与媒体服务端回调、签名和重试](https://intl.cloud.tencent.com/zh/document/product/647/39558) +- [房间解散 REST API](https://cloud.tencent.com/document/api/647/50089) +- [断线与自动重连行为](https://intl.cloud.tencent.com/document/product/647/36057) +- [屏幕分享(macOS/Native)](https://cloud.tencent.com/document/product/647/32249) +- [TRTC 信息安全说明](https://cloud.tencent.com/document/product/647/86362) +- [媒体流私有加密](https://cloud.tencent.com/document/product/647/106173) +- [Native/WebRTC 防火墙白名单](https://intl.cloud.tencent.com/zh/document/product/647/35164) diff --git a/app/research/ui_acceptance.md b/app/research/ui_acceptance.md new file mode 100644 index 000000000..503bec047 --- /dev/null +++ b/app/research/ui_acceptance.md @@ -0,0 +1,95 @@ +# 医生工作站 UI 最终离屏回归 + +- 验收日期:2026-08-10 +- 环境:Windows 11、Python 3.12.12、PySide6 6.11.1 +- 目标尺寸:1280 × 800 +- 最小 Shell 尺寸:1024 × 640 +- 最终结论:**PASS** + +## 1. 结论摘要 + +最新原始源码已通过完整离屏回归。验收在全新 Python 进程中执行,没有加载任何方法别名、monkey patch 或兼容垫片,并明确断言 `BusyOverlay` 不存在临时 `set_text` 属性。 + +`LoginWindow.submit()` 使用空账号和密码触发 Demo 默认凭据,真实执行 `DemoDoctorRepository.login()` 与 `get_current_user()`,随后由 `ApplicationController` 创建 `ShellWindow`。登录成功后 loading 正常释放、密码被清空,五个授权页面均能异步加载。 + +问诊列表到 Controller 再到 `DemoVideoDialog` 的信号链路、性别文本、服务器设置和 1024 × 640 最小 Shell 均通过。上一轮发现的四个问题现已全部关闭。 + +## 2. 验收方法 + +1. 使用 `QT_QPA_PLATFORM=offscreen` 创建真实 `QApplication`。 +2. 创建原始 `LoginWindow`,保持 Demo 模式并将账号密码留空,调用真实 `submit()`。 +3. 等待 `login_succeeded` 和 Controller 创建 Shell,核对认证 Session、用户、repository、loading 与密码清理状态。 +4. 依次进入接诊台、我的处方库、已开处方、我的患者、问诊列表,等待后台 Worker 返回数据和详情。 +5. 在问诊列表点击“发起视频问诊”,验证 `ConsultationsPage → ShellWindow.video_requested → ApplicationController._request_video → DemoVideoDialog` 完整链路。 +6. 将 Shell 精确调整为 1024 × 640,检查接诊主要按钮的窗口坐标和 splitter 两侧可用宽度。 +7. 关闭 Demo 后展开服务器设置,保存 HTTPS 地址与 45 秒超时,验证设置存储和两个配置变更信号。 +8. 使用 `QWidget.grab()` 覆盖必要截图并逐张目检。 + +Qt `offscreen` 平台在本机不提供系统字体列表,因此验收进程临时用 `QFontDatabase.addApplicationFont()` 加载 `C:\Windows\Fonts\msyh.ttc`,使截图反映真实中文排版;未修改产品源码或打包配置。 + +## 3. 回归结果 + +| 范围 | 结果 | 验收证据 | +| --- | --- | --- | +| 真实 Demo 登录 | 通过 | 空账号密码成功使用 Demo 默认凭据;发出 `login_succeeded`;Session 已认证;用户为“陈医生(演示)”;loading 释放且密码清空 | +| 服务器设置按钮 | 通过 | Demo 模式下禁用;关闭 Demo 后可展开、保存、收起;地址规范化为 `https://api.example.com/adminapi`,超时为 45 秒 | +| Shell / 权限导航 | 通过 | Controller 创建接诊台、我的处方库、已开处方、我的患者、问诊列表共 5 页 | +| 接诊台 | 通过 | 待接诊 2 条,详情异步加载;性别显示“女”;1280 × 800 与 1024 × 640 均稳定 | +| 我的处方库 | 通过 | Demo 模板 2 条 | +| 已开处方 | 通过 | Demo 处方 2 条;详情显示“赵明远 · 男 · 53岁” | +| 我的患者 | 通过 | Demo 患者 3 条,首条详情正常加载 | +| 问诊列表 | 通过 | 今日待接诊 1 条,视频按钮可用 | +| 问诊 → Controller → DemoVideoDialog | 通过 | payload 为 `appointment_id=101`、`diagnosis_id=501`、`patient_id=301`;Controller 以 key `501` 创建并回收窗口 | +| Demo 视频窗口 | 通过 | 980 × 660 正常渲染;计时到 `00:01`;麦克风与摄像头均可切换为关闭 | +| 1024 × 640 最小 Shell | 通过 | “完成接诊”边界为 `(883, 243, 84, 38)`,右边界 967、下边界 281,完整位于窗口内;splitter 宽度为 `[322, 430]` | +| 1280 × 800 视觉 | 通过 | 五页、登录页、服务器设置和视频窗无重叠或横向裁切 | + +离屏断言摘要: + +```text +runtime_adapter = false +login = authenticated / 陈医生(演示) / loading released / password cleared +server_url = https://api.example.com/adminapi +server_timeout = 45 +page_rows = reception 2 / library 2 / prescriptions 2 / patients 3 / consultations 1 +reception_gender = 女 · 46岁 · 患者编号 301 +prescription_gender = 赵明远 · 男 · 53岁 +video_ids = appointment 101 / diagnosis 501 / patient 301 +video_dialog = key 501 / duration 00:01 / mic off / camera off +compact_shell = 1024 × 640 / complete_button right 967 bottom 281 +pytest = 69 passed +``` + +## 4. 问题关闭情况 + +| 问题 | 状态 | 本轮证据 | +| --- | --- | --- | +| F-01 问诊列表视频 ID 错置 | 已关闭 | 实际点击后得到 101 / 501 / 301,并由 Controller 创建 `DemoVideoDialog` | +| F-02 紧凑尺寸接诊详情横向裁切 | 已关闭 | Shell 最小尺寸为 1024 × 640;该尺寸下两侧 splitter 有效,“完成接诊”完整可见 | +| F-03 性别显示内部数值 | 已关闭 | 接诊显示“女”,处方详情显示“男” | +| F-04 Demo 登录 loading 调用不存在的方法 | 已关闭 | `LoginWindow` 使用 `BusyOverlay.set_message()`;无垫片真实登录成功进入 Shell | + +## 5. 截图索引 + +1. [登录页 1280 × 800](../artifacts/ui_acceptance/01_login_1280x800.png) +2. [接诊台 1280 × 800](../artifacts/ui_acceptance/02_reception_1280x800.png) +3. [我的处方库 1280 × 800](../artifacts/ui_acceptance/03_prescription_library_1280x800.png) +4. [已开处方 1280 × 800](../artifacts/ui_acceptance/04_prescriptions_1280x800.png) +5. [我的患者 1280 × 800](../artifacts/ui_acceptance/05_patients_1280x800.png) +6. [问诊列表 1280 × 800](../artifacts/ui_acceptance/06_consultations_1280x800.png) +7. [Demo 视频窗口 980 × 660](../artifacts/ui_acceptance/07_demo_video_980x660.png) +8. [最小 Shell 1024 × 640](../artifacts/ui_acceptance/08_shell_compact_1024x640.png) +9. [问诊视频链路成功页 1280 × 800](../artifacts/ui_acceptance/09_consultations_video_success_1280x800.png) +10. [服务器设置 1280 × 800](../artifacts/ui_acceptance/10_login_server_settings_1280x800.png) + +旧的 `08_shell_compact_900x600.png` 与 `09_consultations_video_error_1280x800.png` 是历史问题证据,不属于本轮最终截图索引。 + +## 6. 自动化测试记录 + +```text +uv run --offline pytest +..................................................................... [100%] +69 passed in 0.65s +``` + +本轮验收没有修改 `src/` 下任何源文件;仅覆盖本报告和 `artifacts/ui_acceptance/` 下的 PNG 截图。 diff --git a/app/resources/icon.svg b/app/resources/icon.svg new file mode 100644 index 000000000..b5b78948c --- /dev/null +++ b/app/resources/icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/run_macos.command b/app/run_macos.command new file mode 100644 index 000000000..23d74e421 --- /dev/null +++ b/app/run_macos.command @@ -0,0 +1,5 @@ +#!/bin/bash +set -u +project_root="$(cd "$(dirname "$0")" && pwd -P)" +exec /bin/bash "$project_root/scripts/run_macos.sh" + diff --git a/app/scripts/build_macos.sh b/app/scripts/build_macos.sh new file mode 100644 index 000000000..617fa4816 --- /dev/null +++ b/app/scripts/build_macos.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash +set -euo pipefail + +project_root="$(cd "$(dirname "$0")/.." && pwd)" +python_bin="${PYINSTALLER_PYTHON:-$project_root/.venv-build/bin/python}" +companion_root="$project_root/video_companion" + +if [[ "$(uname -s)" != "Darwin" ]]; then + echo "The macOS bundle must be built on macOS." >&2 + exit 2 +fi +if [[ ! -x "$python_bin" ]]; then + echo "Build Python was not found: $python_bin" >&2 + exit 2 +fi + +if [[ "${SKIP_FRONTEND_INSTALL:-0}" != "1" ]]; then + npm ci --prefix "$companion_root" --no-audit --no-fund +fi +npm run build --prefix "$companion_root" + +"$python_bin" -m PyInstaller \ + --noconfirm \ + --clean \ + "$project_root/packaging/doctor_workstation.spec" + +artifact="$project_root/dist/DoctorWorkstation.app" +helper="$(find "$artifact" -type f -name 'QtWebEngineProcess' -print -quit)" +resources="$(find "$artifact" -type f -name 'qtwebengine_resources*.pak' -print -quit)" +companion="$(find "$artifact" -type f -path '*video_companion_dist/index.html' -print -quit)" +executable="$artifact/Contents/MacOS/DoctorWorkstation" + +[[ -n "$helper" ]] || { echo "QtWebEngineProcess is missing from the app." >&2; exit 1; } +[[ -n "$resources" ]] || { echo "QtWebEngine resources are missing from the app." >&2; exit 1; } +[[ -n "$companion" ]] || { echo "video_companion_dist is missing from the app." >&2; exit 1; } +[[ -x "$executable" ]] || { echo "Frozen application entry point is missing." >&2; exit 1; } + +codesign --verify --deep --strict --verbose=2 "$artifact" + +temp_root="${TMPDIR:-/tmp}" +temp_root="${temp_root%/}" +smoke_root="$(mktemp -d "$temp_root/doctor-workstation-smoke.XXXXXX")" +cleanup_smoke() { + case "$smoke_root" in + "$temp_root"/doctor-workstation-smoke.*) rm -rf -- "$smoke_root" ;; + *) echo "Refusing to remove unsafe smoke-test directory: $smoke_root" >&2 ;; + esac +} +trap cleanup_smoke EXIT +mkdir -p \ + "$smoke_root/Library/Application Support" \ + "$smoke_root/Library/Caches" \ + "$smoke_root/xdg/config" \ + "$smoke_root/xdg/state" \ + "$smoke_root/xdg/cache" \ + "$smoke_root/tmp" + +set +e +env \ + TMPDIR="$smoke_root/tmp" \ + XDG_CONFIG_HOME="$smoke_root/xdg/config" \ + XDG_STATE_HOME="$smoke_root/xdg/state" \ + XDG_CACHE_HOME="$smoke_root/xdg/cache" \ + DOCTOR_CONFIG_DIR="$smoke_root/doctor/config" \ + DOCTOR_LOG_DIR="$smoke_root/doctor/logs" \ + DOCTOR_API_BASE_URL="https://127.0.0.1:9" \ + DOCTOR_DEMO_MODE="true" \ + DOCTOR_VIDEO_MODE="embedded" \ + DOCTOR_VIDEO_WEB_URL="" \ + DOCTOR_VERIFY_SSL="true" \ + DOCTOR_LOG_LEVEL="INFO" \ + DOCTOR_SMOKE_TEST="1" \ + HTTP_PROXY="http://127.0.0.1:9" \ + HTTPS_PROXY="http://127.0.0.1:9" \ + ALL_PROXY="http://127.0.0.1:9" \ + NO_PROXY="" \ + QT_QPA_PLATFORM="offscreen" \ + "$executable" --smoke-test >"$smoke_root/stdout.txt" 2>"$smoke_root/stderr.txt" & +smoke_pid=$! +smoke_running=1 +for _ in {1..300}; do + if ! kill -0 "$smoke_pid" 2>/dev/null; then + smoke_running=0 + break + fi + sleep 0.1 +done +if [[ "$smoke_running" == "1" ]]; then + kill "$smoke_pid" 2>/dev/null + wait "$smoke_pid" 2>/dev/null + smoke_status=124 +else + wait "$smoke_pid" + smoke_status=$? +fi +set -e + +if [[ "$smoke_status" -ne 0 ]]; then + cat "$smoke_root/stderr.txt" >&2 + echo "Frozen application smoke test failed with exit code $smoke_status." >&2 + exit 1 +fi +diagnostics="$smoke_root/diagnostics.txt" +cat "$smoke_root/stdout.txt" "$smoke_root/stderr.txt" >"$diagnostics" +find "$smoke_root" -type f -name '*.log' -exec cat {} + >>"$diagnostics" +if grep -Eiq 'traceback \(most recent call last\)|unhandled exception|uncaught exception|fatal python error' "$diagnostics"; then + cat "$diagnostics" >&2 + echo "Frozen application smoke-test logs contain an unhandled exception." >&2 + exit 1 +fi +echo "Frozen entry smoke test passed (--smoke-test, isolated demo mode)." +echo "Build complete: $artifact" diff --git a/app/scripts/build_windows.ps1 b/app/scripts/build_windows.ps1 new file mode 100644 index 000000000..32622e5ea --- /dev/null +++ b/app/scripts/build_windows.ps1 @@ -0,0 +1,171 @@ +[CmdletBinding()] +param( + [string]$Python = ".venv-build\Scripts\python.exe", + [switch]$SkipFrontendInstall +) + +$ErrorActionPreference = "Stop" +$ProjectRoot = (Resolve-Path (Join-Path $PSScriptRoot "..")).Path +$CompanionRoot = Join-Path $ProjectRoot "video_companion" +$Spec = Join-Path $ProjectRoot "packaging\doctor_workstation.spec" + +function Invoke-FrozenSmokeTest { + param([Parameter(Mandatory = $true)][string]$Executable) + + $TempRoot = [System.IO.Path]::GetFullPath([System.IO.Path]::GetTempPath()) + $SmokeRoot = Join-Path $TempRoot ("doctor-workstation-smoke-" + [guid]::NewGuid().ToString("N")) + $SmokeRoot = [System.IO.Path]::GetFullPath($SmokeRoot) + if (-not ($SmokeRoot.StartsWith($TempRoot, [System.StringComparison]::OrdinalIgnoreCase)) -or + -not ([System.IO.Path]::GetFileName($SmokeRoot)).StartsWith("doctor-workstation-smoke-")) { + throw "Refusing to use an unsafe smoke-test directory: $SmokeRoot" + } + + $Environment = @{ + "APPDATA" = (Join-Path $SmokeRoot "AppData\Roaming") + "LOCALAPPDATA" = (Join-Path $SmokeRoot "AppData\Local") + "XDG_CONFIG_HOME" = (Join-Path $SmokeRoot "xdg\config") + "XDG_STATE_HOME" = (Join-Path $SmokeRoot "xdg\state") + "XDG_CACHE_HOME" = (Join-Path $SmokeRoot "xdg\cache") + "DOCTOR_CONFIG_DIR" = (Join-Path $SmokeRoot "doctor\config") + "DOCTOR_LOG_DIR" = (Join-Path $SmokeRoot "doctor\logs") + "DOCTOR_API_BASE_URL" = "https://127.0.0.1:9" + "DOCTOR_DEMO_MODE" = "true" + "DOCTOR_VIDEO_MODE" = "embedded" + "DOCTOR_VIDEO_WEB_URL" = "" + "DOCTOR_VERIFY_SSL" = "true" + "DOCTOR_LOG_LEVEL" = "INFO" + "DOCTOR_SMOKE_TEST" = "1" + "HTTP_PROXY" = "http://127.0.0.1:9" + "HTTPS_PROXY" = "http://127.0.0.1:9" + "ALL_PROXY" = "http://127.0.0.1:9" + "NO_PROXY" = "" + "QT_QPA_PLATFORM" = "offscreen" + } + $PreviousEnvironment = @{} + $StandardOutput = Join-Path $SmokeRoot "stdout.txt" + $StandardError = Join-Path $SmokeRoot "stderr.txt" + + New-Item -ItemType Directory -Path $SmokeRoot -Force | Out-Null + New-Item -ItemType Directory -Path $Environment["APPDATA"] -Force | Out-Null + New-Item -ItemType Directory -Path $Environment["LOCALAPPDATA"] -Force | Out-Null + try { + foreach ($Name in $Environment.Keys) { + $PreviousEnvironment[$Name] = [Environment]::GetEnvironmentVariable($Name, "Process") + [Environment]::SetEnvironmentVariable($Name, $Environment[$Name], "Process") + } + + # Windows PowerShell 5 can leave ExitCode unset on the object returned + # by Start-Process. System.Diagnostics.Process retains the real code + # and lets us drain redirected streams without risking a pipe deadlock. + $ProcessInfo = New-Object System.Diagnostics.ProcessStartInfo + $ProcessInfo.FileName = $Executable + $ProcessInfo.Arguments = "--smoke-test" + $ProcessInfo.UseShellExecute = $false + $ProcessInfo.CreateNoWindow = $true + $ProcessInfo.RedirectStandardOutput = $true + $ProcessInfo.RedirectStandardError = $true + $Process = New-Object System.Diagnostics.Process + $Process.StartInfo = $ProcessInfo + if (-not $Process.Start()) { + throw "Unable to start the frozen application smoke test" + } + $OutputTask = $Process.StandardOutput.ReadToEndAsync() + $ErrorTask = $Process.StandardError.ReadToEndAsync() + $TimedOut = -not $Process.WaitForExit(30000) + if ($TimedOut -and -not $Process.HasExited) { + $Process.Kill() + } + $Process.WaitForExit() + $OutputTask.Wait() + $ErrorTask.Wait() + Set-Content -LiteralPath $StandardOutput -Value $OutputTask.Result -Encoding UTF8 + Set-Content -LiteralPath $StandardError -Value $ErrorTask.Result -Encoding UTF8 + + $DiagnosticFiles = @($StandardOutput, $StandardError) + $DiagnosticFiles += Get-ChildItem -LiteralPath $SmokeRoot -Recurse -Filter "*.log" -File | + Select-Object -ExpandProperty FullName + $Diagnostics = ($DiagnosticFiles | Where-Object { Test-Path -LiteralPath $_ } | + ForEach-Object { Get-Content -LiteralPath $_ -Raw -ErrorAction SilentlyContinue }) -join "`n" + if ($TimedOut) { + throw "Frozen application smoke test timed out after 30 seconds`n$Diagnostics" + } + if ($Process.ExitCode -ne 0) { + throw "Frozen application smoke test failed with exit code $($Process.ExitCode)`n$Diagnostics" + } + if ($Diagnostics -match "(?im)traceback \(most recent call last\)|unhandled exception|uncaught exception|fatal python error") { + throw "Frozen application smoke-test logs contain an unhandled exception" + } + Write-Host "Frozen entry smoke test passed (--smoke-test, isolated demo mode)." + } + finally { + foreach ($Name in $Environment.Keys) { + [Environment]::SetEnvironmentVariable($Name, $PreviousEnvironment[$Name], "Process") + } + if (Test-Path -LiteralPath $SmokeRoot) { + Remove-Item -LiteralPath $SmokeRoot -Recurse -Force + } + } +} + +if (-not [System.IO.Path]::IsPathRooted($Python)) { + $Python = Join-Path $ProjectRoot $Python +} +if (-not (Test-Path -LiteralPath $Python -PathType Leaf)) { + throw "Build Python was not found: $Python" +} + +$Npm = (Get-Command npm.cmd -ErrorAction Stop).Source +Push-Location $ProjectRoot +try { + if (-not $SkipFrontendInstall) { + & $Npm ci --prefix $CompanionRoot --no-audit --no-fund + if ($LASTEXITCODE -ne 0) { throw "npm ci failed" } + } + + & $Npm run build --prefix $CompanionRoot + if ($LASTEXITCODE -ne 0) { throw "video companion build failed" } + + & $Python -m PyInstaller --noconfirm --clean $Spec + if ($LASTEXITCODE -ne 0) { throw "PyInstaller build failed" } + + $Artifact = Join-Path $ProjectRoot "dist\DoctorWorkstation" + $Helper = Get-ChildItem -LiteralPath $Artifact -Recurse -Filter "QtWebEngineProcess.exe" -File | Select-Object -First 1 + $Resources = Get-ChildItem -LiteralPath $Artifact -Recurse -Filter "qtwebengine_resources*.pak" -File | Select-Object -First 1 + $Companion = Get-ChildItem -LiteralPath $Artifact -Recurse -Filter "index.html" -File | + Where-Object { $_.FullName -like "*video_companion_dist*" } | + Select-Object -First 1 + if (-not $Helper) { throw "QtWebEngineProcess.exe is missing from the artifact" } + if (-not $Resources) { throw "QtWebEngine Chromium resources are missing from the artifact" } + if (-not $Companion) { throw "video_companion_dist is missing from the artifact" } + + $PythonBase = (& $Python -c "import sys; print(sys.base_prefix)").Trim() + if ($LASTEXITCODE -ne 0 -or -not $PythonBase) { + throw "Unable to resolve the build Python runtime directory" + } + foreach ($RuntimeDllName in @("libssl-3-x64.dll", "libcrypto-3-x64.dll")) { + $SourceRuntimeDll = Join-Path $PythonBase "DLLs\$RuntimeDllName" + $FrozenRuntimeDll = Join-Path $Artifact "_internal\$RuntimeDllName" + if (-not (Test-Path -LiteralPath $SourceRuntimeDll -PathType Leaf)) { + throw "Build Python runtime dependency is missing: $SourceRuntimeDll" + } + if (-not (Test-Path -LiteralPath $FrozenRuntimeDll -PathType Leaf)) { + throw "Frozen Python runtime dependency is missing: $FrozenRuntimeDll" + } + $SourceHash = (Get-FileHash -LiteralPath $SourceRuntimeDll -Algorithm SHA256).Hash + $FrozenHash = (Get-FileHash -LiteralPath $FrozenRuntimeDll -Algorithm SHA256).Hash + if ($SourceHash -ne $FrozenHash) { + throw "Frozen $RuntimeDllName does not match the build Python runtime" + } + } + + $Executable = Join-Path $Artifact "DoctorWorkstation.exe" + if (-not (Test-Path -LiteralPath $Executable -PathType Leaf)) { + throw "Frozen application entry point is missing: $Executable" + } + Invoke-FrozenSmokeTest -Executable $Executable + + Write-Host "Build complete: $Artifact" +} +finally { + Pop-Location +} diff --git a/app/scripts/check_macos_entrypoints.sh b/app/scripts/check_macos_entrypoints.sh new file mode 100644 index 000000000..5fa17673a --- /dev/null +++ b/app/scripts/check_macos_entrypoints.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash +set -euo pipefail + +script_dir="$(cd "$(dirname "$0")" && pwd -P)" +project_root="$(cd "$script_dir/.." && pwd -P)" + +operational_files=( + "$script_dir/macos_helpers.sh" + "$script_dir/run_macos.sh" + "$script_dir/package_macos.sh" + "$script_dir/build_macos.sh" + "$project_root/一键运行.command" + "$project_root/一键打包.command" + "$project_root/run_macos.command" + "$project_root/package_macos.command" +) + +for file in "${operational_files[@]}"; do + [[ -f "$file" ]] || { printf 'Missing macOS entry file: %s\n' "$file" >&2; exit 1; } + /bin/bash -n "$file" +done +for file in \ + "$project_root/一键运行.command" \ + "$project_root/一键打包.command" \ + "$project_root/run_macos.command" \ + "$project_root/package_macos.command"; do + [[ -x "$file" ]] || { printf 'Finder entry is not executable: %s\n' "$file" >&2; exit 1; } +done + +open_line="$(grep -nF '/usr/bin/open "$artifact"' "$script_dir/run_macos.sh" | head -n 1 | cut -d: -f1)" +source_line="$(grep -nF 'macos_ensure_uv' "$script_dir/run_macos.sh" | head -n 1 | cut -d: -f1)" +[[ -n "$open_line" && -n "$source_line" && "$open_line" -lt "$source_line" ]] || { + echo 'Built .app must be opened before source-environment preparation.' >&2 + exit 1 +} + +grep -Fq 'sync --locked' "$script_dir/run_macos.sh" +grep -Fq 'sync --locked --extra build' "$script_dir/package_macos.sh" +grep -Fq 'ci --prefix "$project_root/video_companion"' "$script_dir/package_macos.sh" +grep -Fq '/bin/bash "$script_dir/build_macos.sh"' "$script_dir/package_macos.sh" +grep -Fq 'SHASUMS256.txt' "$script_dir/package_macos.sh" +grep -Fq '/usr/bin/ditto -c -k --sequesterRsrc --keepParent' "$script_dir/package_macos.sh" +grep -Fq '/usr/bin/shasum -a 256' "$script_dir/package_macos.sh" +grep -Fq 'scripts/run_macos.sh' "$project_root/一键运行.command" +grep -Fq 'scripts/run_macos.sh' "$project_root/run_macos.command" +grep -Fq 'scripts/package_macos.sh' "$project_root/一键打包.command" +grep -Fq 'scripts/package_macos.sh' "$project_root/package_macos.command" + +if grep -En '(^|[[:space:]])(export[[:space:]]+)?HOME=' "${operational_files[@]}"; then + echo 'macOS entry scripts must not repurpose HOME.' >&2 + exit 1 +fi +if grep -Ein 'SDKSecret(Key)?|UserSig|userSig' "${operational_files[@]}"; then + echo 'macOS entry scripts must not contain RTC secrets or credentials.' >&2 + exit 1 +fi + +set +e +trap_output="$( + CI=1 DOCTOR_NONINTERACTIVE=1 /bin/bash -c ' + source "$1" + macos_install_exit_trap 1 + exit 7 + ' macos-contract "$script_dir/macos_helpers.sh" 2>&1 +)" +trap_status=$? +set -e +[[ "$trap_status" -eq 7 ]] || { + printf 'Non-interactive failure trap changed exit status to %s.\n' "$trap_status" >&2 + exit 1 +} +grep -Fq '操作失败' <<<"$trap_output" + +echo 'macOS entrypoint contracts passed.' diff --git a/app/scripts/macos_helpers.sh b/app/scripts/macos_helpers.sh new file mode 100644 index 000000000..e0b95afe2 --- /dev/null +++ b/app/scripts/macos_helpers.sh @@ -0,0 +1,110 @@ +#!/usr/bin/env bash + +# Shared helpers for Finder-launched macOS entry points. This file is sourced. + +MACOS_PAUSE_ON_SUCCESS=0 +MACOS_UV_BIN="" +MACOS_TEMP_DIRS=() + +macos_register_temp_dir() { + MACOS_TEMP_DIRS[${#MACOS_TEMP_DIRS[@]}]="$1" +} + +macos_cleanup_temp_dirs() { + local directory + for directory in "${MACOS_TEMP_DIRS[@]}"; do + [[ -n "$directory" && -d "$directory" ]] || continue + case "$(basename "$directory")" in + doctor-uv.*|doctor-node.*) + rm -rf -- "$directory" || \ + printf '临时目录清理失败:%s\n' "$directory" >&2 + ;; + *) printf '跳过不安全的临时目录清理目标:%s\n' "$directory" >&2 ;; + esac + done +} + +macos_should_pause() { + [[ -t 0 && -t 1 && -z "${CI:-}" && "${DOCTOR_NONINTERACTIVE:-0}" != "1" ]] +} + +macos_on_exit() { + local status="$1" + trap - EXIT + macos_cleanup_temp_dirs + if [[ "$status" -ne 0 ]]; then + printf '\n操作失败(退出码 %s)。请查看上方信息。\n' "$status" >&2 + fi + if macos_should_pause && { [[ "$status" -ne 0 ]] || [[ "$MACOS_PAUSE_ON_SUCCESS" == "1" ]]; }; then + printf '\n按回车键关闭此窗口…' + IFS= read -r _ || true + fi + exit "$status" +} + +macos_install_exit_trap() { + MACOS_PAUSE_ON_SUCCESS="${1:-0}" + trap 'macos_on_exit "$?"' EXIT +} + +macos_die() { + printf '错误:%s\n' "$1" >&2 + exit 1 +} + +macos_require_darwin() { + if [[ "$(uname -s)" != "Darwin" ]]; then + macos_die "此入口只能在 macOS 上运行。" + fi +} + +macos_locate_uv() { + local candidate + candidate="$(command -v uv 2>/dev/null || true)" + if [[ -n "$candidate" && -x "$candidate" ]]; then + MACOS_UV_BIN="$candidate" + return 0 + fi + + if [[ -n "${HOME:-}" ]]; then + for candidate in "$HOME/.local/bin/uv" "$HOME/.cargo/bin/uv"; do + if [[ -x "$candidate" ]]; then + MACOS_UV_BIN="$candidate" + return 0 + fi + done + fi + for candidate in /opt/homebrew/bin/uv /usr/local/bin/uv; do + if [[ -x "$candidate" ]]; then + MACOS_UV_BIN="$candidate" + return 0 + fi + done + return 1 +} + +macos_ensure_uv() { + local curl_bin installer temp_root + if macos_locate_uv; then + return 0 + fi + + curl_bin="$(command -v curl 2>/dev/null || true)" + [[ -n "$curl_bin" ]] || macos_die "未找到 uv,也未找到用于安装 uv 的 curl。" + temp_root="${TMPDIR:-/tmp}" + temp_root="${temp_root%/}" + [[ -n "$temp_root" ]] || temp_root="/" + installer="$(mktemp -d "$temp_root/doctor-uv.XXXXXX")" + macos_register_temp_dir "$installer" + + printf '未检测到 uv,正在通过官方 HTTPS 安装器安装…\n' >&2 + if ! "$curl_bin" --proto '=https' --tlsv1.2 -fsSL \ + 'https://astral.sh/uv/install.sh' -o "$installer/install.sh"; then + macos_die "uv 安装器下载失败,请检查网络后重试。" + fi + if ! UV_NO_MODIFY_PATH=1 /bin/sh "$installer/install.sh"; then + macos_die "uv 安装失败。" + fi + hash -r + macos_locate_uv || macos_die "uv 已安装,但未在标准位置找到可执行文件。" +} diff --git a/app/scripts/package_macos.sh b/app/scripts/package_macos.sh new file mode 100644 index 000000000..49c7ea8e2 --- /dev/null +++ b/app/scripts/package_macos.sh @@ -0,0 +1,151 @@ +#!/usr/bin/env bash +set -euo pipefail + +script_dir="$(cd "$(dirname "$0")" && pwd -P)" +project_root="$(cd "$script_dir/.." && pwd -P)" +# shellcheck source=macos_helpers.sh +source "$script_dir/macos_helpers.sh" +macos_install_exit_trap 1 +macos_require_darwin + +NODE_BIN="" +NPM_BIN="" + +use_node_pair() { + local node_candidate="$1" + local npm_candidate="$2" + local major version + [[ -x "$node_candidate" && -x "$npm_candidate" ]] || return 1 + version="$("$node_candidate" --version 2>/dev/null || true)" + major="${version#v}" + major="${major%%.*}" + case "$major" in + ''|*[!0-9]*) return 1 ;; + esac + [[ "$major" -ge 20 ]] || return 1 + NODE_BIN="$node_candidate" + NPM_BIN="$npm_candidate" + export PATH="$(dirname "$NODE_BIN"):$PATH" +} + +locate_node() { + local bin_dir node_candidate npm_candidate + node_candidate="$(command -v node 2>/dev/null || true)" + npm_candidate="$(command -v npm 2>/dev/null || true)" + if use_node_pair "$node_candidate" "$npm_candidate"; then + return 0 + fi + + for bin_dir in /opt/homebrew/bin /usr/local/bin; do + if use_node_pair "$bin_dir/node" "$bin_dir/npm"; then + return 0 + fi + done + + if [[ -n "${HOME:-}" ]]; then + for node_candidate in "$HOME"/.nvm/versions/node/*/bin/node; do + [[ -x "$node_candidate" ]] || continue + npm_candidate="$(dirname "$node_candidate")/npm" + if use_node_pair "$node_candidate" "$npm_candidate"; then + return 0 + fi + done + fi + return 1 +} + +install_local_node() { + local architecture archive archive_path cache_root curl_bin download_dir + local expected extracted install_dir node_version shasums_path actual + node_version="${DOCTOR_NODE_VERSION:-22.14.0}" + case "$(uname -m)" in + arm64) architecture="arm64" ;; + x86_64) architecture="x64" ;; + *) macos_die "不支持的 Mac CPU 架构:$(uname -m)" ;; + esac + + if [[ -n "${XDG_CACHE_HOME:-}" ]]; then + cache_root="$XDG_CACHE_HOME/DoctorWorkstation/tools" + elif [[ -n "${HOME:-}" ]]; then + cache_root="$HOME/Library/Caches/DoctorWorkstation/tools" + else + macos_die "无法确定 Node 工具缓存目录:HOME 与 XDG_CACHE_HOME 均未设置。" + fi + install_dir="$cache_root/node-v$node_version-darwin-$architecture" + if use_node_pair "$install_dir/bin/node" "$install_dir/bin/npm"; then + return 0 + fi + if [[ -e "$install_dir" ]]; then + macos_die "Node 缓存不完整,请删除后重试:$install_dir" + fi + + curl_bin="$(command -v curl 2>/dev/null || true)" + [[ -n "$curl_bin" ]] || macos_die "未找到用于下载 Node.js 的 curl。" + mkdir -p "$cache_root" + download_dir="$(mktemp -d "$cache_root/doctor-node.XXXXXX")" + macos_register_temp_dir "$download_dir" + archive="node-v$node_version-darwin-$architecture.tar.gz" + archive_path="$download_dir/$archive" + shasums_path="$download_dir/SHASUMS256.txt" + + printf '未检测到 Node.js 20+ 与 npm,正在下载 Node.js %s(%s)…\n' \ + "$node_version" "$architecture" + if ! "$curl_bin" --proto '=https' --tlsv1.2 -fsSL \ + "https://nodejs.org/dist/v$node_version/$archive" -o "$archive_path"; then + macos_die "Node.js 下载失败,请检查网络后重试。" + fi + if ! "$curl_bin" --proto '=https' --tlsv1.2 -fsSL \ + "https://nodejs.org/dist/v$node_version/SHASUMS256.txt" -o "$shasums_path"; then + macos_die "Node.js 校验文件下载失败。" + fi + expected="$(/usr/bin/awk -v file="$archive" '$2 == file { print $1; exit }' "$shasums_path")" + actual="$(/usr/bin/shasum -a 256 "$archive_path" | /usr/bin/awk '{print $1}')" + [[ -n "$expected" && "$actual" == "$expected" ]] || macos_die "Node.js 下载包 SHA-256 校验失败。" + + /usr/bin/tar -xzf "$archive_path" -C "$download_dir" + extracted="$download_dir/node-v$node_version-darwin-$architecture" + [[ -d "$extracted" ]] || macos_die "Node.js 下载包结构无效。" + if [[ ! -e "$install_dir" ]]; then + /bin/mv "$extracted" "$install_dir" + fi + use_node_pair "$install_dir/bin/node" "$install_dir/bin/npm" || \ + macos_die "Node.js 安装完成,但 node/npm 无法执行。" +} + +macos_ensure_uv +cd "$project_root" +printf '正在同步 Python 与 PyInstaller 构建依赖…\n' +"$MACOS_UV_BIN" sync --locked --extra build +python_bin="$project_root/.venv/bin/python" +[[ -x "$python_bin" ]] || macos_die "uv 未生成可用的构建 Python:$python_bin" + +locate_node || install_local_node +printf 'Node.js: %s;npm: %s\n' \ + "$("$NODE_BIN" --version)" "$("$NPM_BIN" --version)" +printf '正在安装锁定的 companion 依赖…\n' +"$NPM_BIN" ci --prefix "$project_root/video_companion" --no-audit --no-fund + +printf '正在构建 DoctorWorkstation.app…\n' +PYINSTALLER_PYTHON="$python_bin" SKIP_FRONTEND_INSTALL=1 \ + /bin/bash "$script_dir/build_macos.sh" + +artifact="$project_root/dist/DoctorWorkstation.app" +project_version="$(/usr/bin/awk -F '"' '/^version = "/ { print $2; exit }' \ + "$project_root/pyproject.toml")" +[[ -n "$project_version" ]] || macos_die "无法从 pyproject.toml 读取版本号。" +case "$(uname -m)" in + arm64) release_arch="arm64" ;; + x86_64) release_arch="x64" ;; + *) macos_die "不支持的 Mac CPU 架构:$(uname -m)" ;; +esac +release_zip="$project_root/dist/DoctorWorkstation-macOS-$release_arch-$project_version.zip" +checksum_file="$release_zip.sha256" +rm -f -- "$release_zip" "$checksum_file" +printf '正在生成可分发 ZIP…\n' +/usr/bin/ditto -c -k --sequesterRsrc --keepParent "$artifact" "$release_zip" +release_hash="$(/usr/bin/shasum -a 256 "$release_zip" | /usr/bin/awk '{print $1}')" +printf '%s %s\n' "$release_hash" "$(basename "$release_zip")" >"$checksum_file" + +printf '\n打包成功:%s\n' "$artifact" +printf '分发包:%s\n' "$release_zip" +printf 'SHA-256:%s\n' "$release_hash" diff --git a/app/scripts/package_windows.ps1 b/app/scripts/package_windows.ps1 new file mode 100644 index 000000000..1ce334e6b --- /dev/null +++ b/app/scripts/package_windows.ps1 @@ -0,0 +1,198 @@ +[CmdletBinding()] +param( + [switch]$ValidateOnly +) + +$ErrorActionPreference = "Stop" +$ProjectRoot = (Resolve-Path (Join-Path $PSScriptRoot "..")).Path +$BuildScript = Join-Path $PSScriptRoot "build_windows.ps1" +$BuildEnvironment = Join-Path $ProjectRoot ".venv-build" +$BuildPython = Join-Path $BuildEnvironment "Scripts\python.exe" +$FallbackPython = Join-Path $ProjectRoot ".venv\Scripts\python.exe" +$CompanionRoot = Join-Path $ProjectRoot "video_companion" +$PackageLock = Join-Path $CompanionRoot "package-lock.json" +$Artifact = Join-Path $ProjectRoot "dist\DoctorWorkstation" +$Executable = Join-Path $Artifact "DoctorWorkstation.exe" +$DistributionRoot = Join-Path $ProjectRoot "dist" +$ReleaseLauncherTemplate = Join-Path $ProjectRoot "packaging\windows\start_release.bat" +$ReleaseLauncher = Join-Path $DistributionRoot "Start_DoctorWorkstation.bat" +$ProjectMetadata = Join-Path $ProjectRoot "pyproject.toml" + +function Test-BuildPython { + param([Parameter(Mandatory = $true)][string]$Candidate) + + if (-not (Test-Path -LiteralPath $Candidate -PathType Leaf)) { + return $false + } + try { + & $Candidate -c "import sys, httpx, PyInstaller, PySide6; raise SystemExit(0 if sys.version_info >= (3, 11) else 1)" 2>$null + return $LASTEXITCODE -eq 0 + } + catch { + return $false + } +} + +function Find-Application { + param([Parameter(Mandatory = $true)][string]$Name) + + $Command = Get-Command $Name -CommandType Application -ErrorAction SilentlyContinue | + Select-Object -First 1 + if ($Command) { return $Command.Source } + return $null +} + +try { + foreach ($RequiredFile in @( + $BuildScript, + $PackageLock, + (Join-Path $ProjectRoot "uv.lock"), + $ProjectMetadata, + $ReleaseLauncherTemplate + )) { + if (-not (Test-Path -LiteralPath $RequiredFile -PathType Leaf)) { + throw "Required build file is missing: $RequiredFile" + } + } + + $Npm = Find-Application -Name "npm.cmd" + $Node = Find-Application -Name "node.exe" + if (-not $Npm -or -not $Node) { + throw "Node.js and npm are required to build the video companion." + } + $NodeVersionText = (& $Node --version).Trim().TrimStart("v") + $NodeVersion = [version]$NodeVersionText + if ($NodeVersion.Major -lt 20) { + throw "Node.js 20 or newer is required; found $NodeVersionText" + } + + $Uv = Find-Application -Name "uv" + if ($ValidateOnly) { + if (-not $Uv -and + -not (Test-BuildPython -Candidate $BuildPython) -and + -not (Test-BuildPython -Candidate $FallbackPython)) { + throw "Neither uv nor a usable Python environment with build dependencies was found." + } + Write-Host "Windows package entry validation passed." + exit 0 + } + + if ($Uv) { + Write-Host "Preparing locked Python build dependencies in $BuildEnvironment ..." + $PreviousProjectEnvironment = [Environment]::GetEnvironmentVariable( + "UV_PROJECT_ENVIRONMENT", + "Process" + ) + [Environment]::SetEnvironmentVariable( + "UV_PROJECT_ENVIRONMENT", + $BuildEnvironment, + "Process" + ) + Push-Location $ProjectRoot + try { + & $Uv sync --frozen --extra build + if ($LASTEXITCODE -ne 0) { + throw "uv sync for build dependencies failed with exit code $LASTEXITCODE" + } + } + finally { + Pop-Location + [Environment]::SetEnvironmentVariable( + "UV_PROJECT_ENVIRONMENT", + $PreviousProjectEnvironment, + "Process" + ) + } + } + elseif (Test-BuildPython -Candidate $BuildPython) { + Write-Host "Using existing build environment: $BuildPython" + } + elseif (Test-BuildPython -Candidate $FallbackPython) { + $BuildPython = $FallbackPython + Write-Host "Using existing project environment with build dependencies: $BuildPython" + } + else { + throw "Install uv or prepare .venv-build with the project's build dependencies." + } + + if (-not (Test-BuildPython -Candidate $BuildPython)) { + throw "The prepared build Python is unusable: $BuildPython" + } + + Write-Host "Installing locked video companion dependencies..." + & $Npm ci --prefix $CompanionRoot --no-audit --no-fund + if ($LASTEXITCODE -ne 0) { + throw "npm ci failed with exit code $LASTEXITCODE" + } + + Write-Host "Running the existing Windows release build..." + & $BuildScript -Python $BuildPython -SkipFrontendInstall + if (-not (Test-Path -LiteralPath $Executable -PathType Leaf)) { + throw "Build completed without the expected executable: $Executable" + } + + $ProjectText = [System.IO.File]::ReadAllText($ProjectMetadata) + $VersionMatch = [regex]::Match( + $ProjectText, + '(?m)^\s*version\s*=\s*"([^"]+)"' + ) + if (-not $VersionMatch.Success) { + throw "Unable to read the project version from $ProjectMetadata" + } + $ProjectVersion = $VersionMatch.Groups[1].Value + $ReleaseZip = Join-Path $DistributionRoot ( + "DoctorWorkstation-Windows-x64-$ProjectVersion.zip" + ) + $ChecksumFile = Join-Path $DistributionRoot "SHA256SUMS.txt" + Copy-Item -LiteralPath $ReleaseLauncherTemplate -Destination $ReleaseLauncher -Force + if (Test-Path -LiteralPath $ReleaseZip) { + Remove-Item -LiteralPath $ReleaseZip -Force + } + + Write-Host "Creating the distributable ZIP..." + $SevenZip = Find-Application -Name "7z.exe" + if ($SevenZip) { + Push-Location $DistributionRoot + try { + & $SevenZip a -tzip -mx=5 -mmt=on $ReleaseZip ` + ".\DoctorWorkstation" ".\Start_DoctorWorkstation.bat" + if ($LASTEXITCODE -ne 0) { + throw "7-Zip failed with exit code $LASTEXITCODE" + } + } + finally { + Pop-Location + } + } + else { + Compress-Archive ` + -LiteralPath @($Artifact, $ReleaseLauncher) ` + -DestinationPath $ReleaseZip ` + -CompressionLevel Optimal + } + if (-not (Test-Path -LiteralPath $ReleaseZip -PathType Leaf)) { + throw "Packaging completed without the expected ZIP: $ReleaseZip" + } + + $ReleaseHash = (Get-FileHash -LiteralPath $ReleaseZip -Algorithm SHA256).Hash + $ChecksumLine = "$ReleaseHash $([System.IO.Path]::GetFileName($ReleaseZip))`r`n" + $Utf8WithoutBom = New-Object System.Text.UTF8Encoding($false) + [System.IO.File]::WriteAllText($ChecksumFile, $ChecksumLine, $Utf8WithoutBom) + + Write-Host "Windows package complete." -ForegroundColor Green + Write-Host "Artifact: $Artifact" -ForegroundColor Green + Write-Host "Release ZIP: $ReleaseZip" -ForegroundColor Green + Write-Host "SHA-256: $ReleaseHash" -ForegroundColor Green + exit 0 +} +catch { + $FailureExitCode = if ($LASTEXITCODE -is [int] -and $LASTEXITCODE -ne 0) { + $LASTEXITCODE + } + else { + 1 + } + Write-Host "Windows packaging failed." -ForegroundColor Red + Write-Host $_.Exception.Message -ForegroundColor Red + exit $FailureExitCode +} diff --git a/app/scripts/run_macos.sh b/app/scripts/run_macos.sh new file mode 100644 index 000000000..2e1bfacfa --- /dev/null +++ b/app/scripts/run_macos.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +set -euo pipefail + +script_dir="$(cd "$(dirname "$0")" && pwd -P)" +project_root="$(cd "$script_dir/.." && pwd -P)" +# shellcheck source=macos_helpers.sh +source "$script_dir/macos_helpers.sh" +macos_install_exit_trap 0 +macos_require_darwin + +artifact="$project_root/dist/DoctorWorkstation.app" +artifact_executable="$artifact/Contents/MacOS/DoctorWorkstation" +if [[ -d "$artifact" && -x "$artifact_executable" ]]; then + printf '正在打开已构建应用:%s\n' "$artifact" + if /usr/bin/open "$artifact"; then + printf '应用已启动。\n' + exit 0 + fi + macos_die "DoctorWorkstation.app 存在,但 Finder 无法打开它。" +fi + +if [[ -e "$artifact" ]]; then + printf '检测到不完整的应用产物,将改为启动源码:%s\n' "$artifact" >&2 +else + printf '尚无已构建应用,正在准备源码运行环境。\n' +fi + +macos_ensure_uv +cd "$project_root" +printf '正在同步 Python 运行依赖(首次运行可能需要几分钟)…\n' +"$MACOS_UV_BIN" sync --locked +printf '正在启动医生工作站…\n' +"$MACOS_UV_BIN" run --frozen doctor-workstation + diff --git a/app/scripts/run_windows.ps1 b/app/scripts/run_windows.ps1 new file mode 100644 index 000000000..185d07092 --- /dev/null +++ b/app/scripts/run_windows.ps1 @@ -0,0 +1,133 @@ +[CmdletBinding()] +param( + [switch]$ValidateOnly +) + +$ErrorActionPreference = "Stop" +$ProjectRoot = (Resolve-Path (Join-Path $PSScriptRoot "..")).Path +$FrozenExecutable = Join-Path $ProjectRoot "dist\DoctorWorkstation\DoctorWorkstation.exe" +$ProjectPython = Join-Path $ProjectRoot ".venv\Scripts\python.exe" +$SourceRoot = Join-Path $ProjectRoot "src" + +function Test-ProjectPython { + param([Parameter(Mandatory = $true)][string]$Candidate) + + if (-not (Test-Path -LiteralPath $Candidate -PathType Leaf)) { + return $false + } + try { + & $Candidate -c "import sys, httpx, PySide6; raise SystemExit(0 if sys.version_info >= (3, 11) else 1)" 2>$null + return $LASTEXITCODE -eq 0 + } + catch { + return $false + } +} + +function Find-Uv { + $Command = Get-Command uv -CommandType Application -ErrorAction SilentlyContinue | + Select-Object -First 1 + if ($Command) { return $Command.Source } + return $null +} + +try { + if (Test-Path -LiteralPath $FrozenExecutable -PathType Leaf) { + Write-Host "Using packaged application: $FrozenExecutable" + if ($ValidateOnly) { + Write-Host "Windows run entry validation passed." + exit 0 + } + & $FrozenExecutable + $ApplicationExitCode = $LASTEXITCODE + if ($null -eq $ApplicationExitCode) { $ApplicationExitCode = 0 } + if ($ApplicationExitCode -ne 0) { + Write-Host "DoctorWorkstation exited with code $ApplicationExitCode" -ForegroundColor Red + } + exit $ApplicationExitCode + } + + $Python = $null + if (Test-ProjectPython -Candidate $ProjectPython) { + $Python = $ProjectPython + Write-Host "Using existing project environment: $ProjectPython" + } + else { + $Uv = Find-Uv + if (-not $Uv) { + throw "No packaged application or usable .venv was found, and uv is not installed." + } + if ($ValidateOnly) { + Write-Host "Source fallback is available through uv: $Uv" + Write-Host "Windows run entry validation passed." + exit 0 + } + Write-Host "Preparing the project environment with uv..." + $PreviousProjectEnvironment = [Environment]::GetEnvironmentVariable( + "UV_PROJECT_ENVIRONMENT", + "Process" + ) + [Environment]::SetEnvironmentVariable( + "UV_PROJECT_ENVIRONMENT", + (Join-Path $ProjectRoot ".venv"), + "Process" + ) + Push-Location $ProjectRoot + try { + & $Uv sync --frozen + if ($LASTEXITCODE -ne 0) { + throw "uv sync failed with exit code $LASTEXITCODE" + } + } + finally { + Pop-Location + [Environment]::SetEnvironmentVariable( + "UV_PROJECT_ENVIRONMENT", + $PreviousProjectEnvironment, + "Process" + ) + } + if (-not (Test-ProjectPython -Candidate $ProjectPython)) { + throw "uv completed, but the project Python is still unusable: $ProjectPython" + } + $Python = $ProjectPython + } + + if ($ValidateOnly) { + Write-Host "Windows run entry validation passed." + exit 0 + } + + $PreviousPythonPath = [Environment]::GetEnvironmentVariable("PYTHONPATH", "Process") + $env:PYTHONPATH = if ($PreviousPythonPath) { + $SourceRoot + [System.IO.Path]::PathSeparator + $PreviousPythonPath + } + else { + $SourceRoot + } + Push-Location $ProjectRoot + try { + & $Python -m doctor_workstation + $ApplicationExitCode = $LASTEXITCODE + } + finally { + Pop-Location + [Environment]::SetEnvironmentVariable("PYTHONPATH", $PreviousPythonPath, "Process") + } + if ($null -eq $ApplicationExitCode) { $ApplicationExitCode = 0 } + if ($ApplicationExitCode -ne 0) { + Write-Host "DoctorWorkstation exited with code $ApplicationExitCode" -ForegroundColor Red + } + exit $ApplicationExitCode +} +catch { + $FailureExitCode = if ($LASTEXITCODE -is [int] -and $LASTEXITCODE -ne 0) { + $LASTEXITCODE + } + else { + 1 + } + Write-Host "Unable to start DoctorWorkstation." -ForegroundColor Red + Write-Host $_.Exception.Message -ForegroundColor Red + exit $FailureExitCode +} diff --git a/app/src/doctor_workstation/__init__.py b/app/src/doctor_workstation/__init__.py new file mode 100644 index 000000000..e1f905f79 --- /dev/null +++ b/app/src/doctor_workstation/__init__.py @@ -0,0 +1,5 @@ +"""Zhenyang doctor workstation.""" + +__all__ = ["__version__"] + +__version__ = "0.1.0" diff --git a/app/src/doctor_workstation/__main__.py b/app/src/doctor_workstation/__main__.py new file mode 100644 index 000000000..1d6d6980f --- /dev/null +++ b/app/src/doctor_workstation/__main__.py @@ -0,0 +1,19 @@ +import os +import sys +import traceback + +from doctor_workstation.app import main + + +def _run() -> int: + try: + return main() + except Exception: + if "--smoke-test" not in sys.argv and os.getenv("DOCTOR_SMOKE_TEST") != "1": + raise + traceback.print_exc() + return 1 + + +if __name__ == "__main__": + raise SystemExit(_run()) diff --git a/app/src/doctor_workstation/app.py b/app/src/doctor_workstation/app.py new file mode 100644 index 000000000..d6c656c3e --- /dev/null +++ b/app/src/doctor_workstation/app.py @@ -0,0 +1,716 @@ +"""Application composition root for the doctor workstation.""" + +from __future__ import annotations + +import logging +import os +import sys +import time +from contextlib import suppress +from typing import Any + +from PySide6.QtCore import QObject, Qt, QTimer +from PySide6.QtGui import QGuiApplication, QIcon +from PySide6.QtWidgets import ( + QApplication, + QDialog, + QFrame, + QHBoxLayout, + QLabel, + QPushButton, + QVBoxLayout, + QWidget, +) + +from doctor_workstation.config import AppConfig +from doctor_workstation.core import Session +from doctor_workstation.core.errors import AuthenticationExpiredError +from doctor_workstation.logging_setup import configure_logging +from doctor_workstation.resources import resource_path, video_dist_path +from doctor_workstation.services import ( + DemoDoctorRepository, + RemoteDoctorRepository, + TokenStore, + build_repository, +) +from doctor_workstation.ui import LoginWindow, ShellWindow, apply_theme +from doctor_workstation.ui.widgets import ( + friendly_error, + run_async, + set_authentication_expired_handler, + show_toast, +) +from doctor_workstation.video import BackendMode, launch_video_call +from doctor_workstation.video.window import WEBENGINE_AVAILABLE + +LOGGER = logging.getLogger(__name__) + + +class _UnconfiguredRepository: + """Login boundary used until an administrator supplies a backend URL.""" + + def login( + self, + account: str, + password: str, + *, + remember_account: bool = False, + ) -> Session: + del account, password, remember_account + raise ValueError("请先展开“服务器设置”,填写管理员提供的 HTTPS 接口地址。") + + def get_current_user(self) -> None: + return None + + +class DemoVideoDialog(QDialog): + """Non-network video-room preview used only by the explicit demo mode.""" + + def __init__(self, patient_name: str, parent: QWidget | None = None) -> None: + super().__init__(parent) + self._seconds = 0 + self.setWindowTitle("视频面诊 · 演示模式") + self.setMinimumSize(760, 520) + self.resize(980, 660) + self.setModal(False) + self.setStyleSheet( + "QDialog{background:#0B1210;}" + "QLabel{color:#EAF2EE;}" + "QFrame#RemoteStage{background:#14211E;border:1px solid #2C403A;border-radius:18px;}" + "QFrame#LocalStage{background:#20312C;border:1px solid #3C554D;border-radius:14px;}" + "QPushButton{min-width:96px;min-height:42px;border-radius:21px;background:#253A34;" + "color:#F4F8F6;border:1px solid #3C554D;}" + "QPushButton:hover{background:#304A42;}" + "QPushButton#Hangup{background:#B94B44;border-color:#CF625B;}" + ) + + root = QVBoxLayout(self) + root.setContentsMargins(22, 18, 22, 22) + root.setSpacing(14) + header = QHBoxLayout() + title = QLabel(f"与 {patient_name or '患者'} 的视频面诊") + title.setStyleSheet("font-size:18px;font-weight:700;") + header.addWidget(title) + header.addStretch(1) + demo = QLabel("● 演示模式 · 未连接腾讯云") + demo.setStyleSheet("color:#91B9AC;font-size:12px;") + header.addWidget(demo) + self.duration_label = QLabel("00:00") + self.duration_label.setStyleSheet("font-weight:700;") + header.addWidget(self.duration_label) + root.addLayout(header) + + stage = QFrame() + stage.setObjectName("RemoteStage") + stage_layout = QVBoxLayout(stage) + stage_layout.setContentsMargins(22, 22, 22, 22) + stage_layout.addStretch(1) + avatar = QLabel((patient_name or "患")[:1]) + avatar.setAlignment(Qt.AlignmentFlag.AlignCenter) + avatar.setFixedSize(104, 104) + avatar.setStyleSheet( + "background:#DDF1EC;color:#0F6D64;border-radius:52px;font-size:42px;font-weight:700;" + ) + stage_layout.addWidget(avatar, 0, Qt.AlignmentFlag.AlignHCenter) + waiting = QLabel("等待患者接听…") + waiting.setAlignment(Qt.AlignmentFlag.AlignCenter) + waiting.setStyleSheet("font-size:17px;font-weight:600;") + stage_layout.addWidget(waiting) + hint = QLabel("生产模式将通过后端短时 UserSig 初始化腾讯 TUICallKit") + hint.setAlignment(Qt.AlignmentFlag.AlignCenter) + hint.setStyleSheet("color:#80948D;font-size:12px;") + stage_layout.addWidget(hint) + stage_layout.addStretch(1) + + local = QFrame(stage) + local.setObjectName("LocalStage") + local.setGeometry(24, 24, 178, 112) + local_layout = QVBoxLayout(local) + local_label = QLabel("医生画面") + local_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + local_label.setStyleSheet("color:#A9BDB6;font-weight:600;") + local_layout.addWidget(local_label) + root.addWidget(stage, 1) + + controls = QHBoxLayout() + controls.addStretch(1) + self.mic_button = QPushButton("麦克风 开") + self.mic_button.setCheckable(True) + self.mic_button.toggled.connect( + lambda muted: self.mic_button.setText("麦克风 关" if muted else "麦克风 开") + ) + controls.addWidget(self.mic_button) + self.camera_button = QPushButton("摄像头 开") + self.camera_button.setCheckable(True) + self.camera_button.toggled.connect( + lambda off: self.camera_button.setText("摄像头 关" if off else "摄像头 开") + ) + controls.addWidget(self.camera_button) + hangup = QPushButton("结束面诊") + hangup.setObjectName("Hangup") + hangup.clicked.connect(self.close) + controls.addWidget(hangup) + controls.addStretch(1) + root.addLayout(controls) + + self._timer = QTimer(self) + self._timer.timeout.connect(self._tick) + self._timer.start(1000) + + def _tick(self) -> None: + self._seconds += 1 + minutes, seconds = divmod(self._seconds, 60) + self.duration_label.setText(f"{minutes:02d}:{seconds:02d}") + + +class ApplicationController(QObject): + """Own windows, repositories and the authenticated application lifecycle.""" + + def __init__(self, application: QApplication, config: AppConfig) -> None: + super().__init__() + self.application = application + self.config = config + self.token_store = TokenStore(config.config_dir / "credentials.json") + self.demo_repository = DemoDoctorRepository() + self.remote_repository: RemoteDoctorRepository | None = None + self.login_window: LoginWindow | None = None + self.shell_window: ShellWindow | None = None + self.current_repository: Any = None + self.current_demo_mode = config.demo_mode + self.video_calls: dict[str, Any] = {} + self.video_pending: dict[str, object] = {} + self.demo_video_dialogs: dict[str, DemoVideoDialog] = {} + self._restore_generation = 0 + self._restore_in_progress = False + self._restore_worker: Any = None + self._shutting_down = False + self._authentication_expiry_in_progress = False + self._rebuild_remote_repository() + set_authentication_expired_handler(self._on_authentication_expired) + application.aboutToQuit.connect(self.shutdown) + + def start(self) -> None: + """Show login immediately, then validate a production token off-thread.""" + + self._show_login() + self._begin_session_restore() + + def _base_repository(self) -> Any: + return self.remote_repository or _UnconfiguredRepository() + + def _show_login(self) -> None: + if self.login_window is None: + self.login_window = LoginWindow( + self._base_repository(), + self.config, + self.demo_repository, + ) + self.login_window.login_succeeded.connect(self._on_login_succeeded) + self.login_window.config_changed.connect(self._on_config_changed) + self.login_window.demo_mode_changed.connect(self._on_demo_mode_changed) + self._apply_window_icon(self.login_window) + else: + self.login_window.repository = self._base_repository() + self.login_window.config = self.config + if not self.login_window.demo_check.isChecked(): + self.login_window.active_repository = self._base_repository() + self.login_window.show() + self.login_window.raise_() + self.login_window.activateWindow() + + def _on_config_changed(self, payload: Any) -> None: + previous_connection = ( + self.config.api_base_url, + self.config.request_timeout, + self.config.verify_ssl, + ) + if isinstance(payload, AppConfig): + updated = payload + elif isinstance(payload, dict): + aliases = { + "base_url": "api_base_url", + "read_timeout": "request_timeout", + } + changes = {aliases.get(key, key): value for key, value in payload.items()} + allowed = { + "api_base_url", + "demo_mode", + "video_mode", + "video_web_url", + "verify_ssl", + "request_timeout", + "log_level", + "remembered_account", + } + updated = self.config.with_updates( + **{key: value for key, value in changes.items() if key in allowed} + ) + else: + return + self.config = updated + with suppress(OSError): + self.config.save_preferences() + next_connection = ( + self.config.api_base_url, + self.config.request_timeout, + self.config.verify_ssl, + ) + if next_connection != previous_connection: + self._cancel_session_restore() + self._rebuild_remote_repository() + if self.login_window is not None: + self.login_window.repository = self._base_repository() + if not self.login_window.demo_check.isChecked(): + self.login_window.active_repository = self._base_repository() + if self.login_window is not None: + self.login_window.config = self.config + + def _on_demo_mode_changed(self, enabled: bool) -> None: + self.current_demo_mode = enabled + if enabled: + self._cancel_session_restore() + + def _rebuild_remote_repository(self) -> None: + old = self.remote_repository + self.remote_repository = None + if self.config.api_base_url: + repository = build_repository( + demo=False, + base_url=self.config.api_base_url, + token_store=self.token_store, + timeout=self.config.request_timeout, + verify=self.config.verify_ssl, + ) + if isinstance(repository, RemoteDoctorRepository): + self.remote_repository = repository + if old is not None and old is not self.current_repository: + with suppress(Exception): + old.client.close() + + def _begin_session_restore(self) -> None: + """Validate a scoped persisted token without racing manual login.""" + + repository = self.remote_repository + if ( + self._shutting_down + or self.config.demo_mode + or repository is None + or self.current_repository is not None + ): + return + self._restore_generation += 1 + generation = self._restore_generation + self._restore_in_progress = True + if self.login_window is not None: + self.login_window.set_session_restore_pending(True) + self._restore_worker = run_async( + repository.restore_session, + on_success=lambda session: self._on_restore_success( + session, + repository, + generation, + ), + on_error=lambda error: self._on_restore_error( + error, + repository, + generation, + ), + on_finished=lambda: self._on_restore_finished(repository, generation), + ) + + def _restore_is_current( + self, + repository: RemoteDoctorRepository, + generation: int, + ) -> bool: + """Return whether a restore callback still owns the login surface.""" + + return ( + not self._shutting_down + and self._restore_in_progress + and generation == self._restore_generation + and repository is self.remote_repository + ) + + def _finish_session_restore( + self, + repository: RemoteDoctorRepository, + generation: int, + ) -> bool: + """Release login controls only for the currently active restore.""" + + if not self._restore_is_current(repository, generation): + return False + self._restore_in_progress = False + self._restore_worker = None + if self.login_window is not None: + self.login_window.set_session_restore_pending(False) + return True + + def _on_restore_success( + self, + session: object, + repository: RemoteDoctorRepository, + generation: int, + ) -> None: + """Enter the shell only for a current, fully validated session.""" + + if not self._finish_session_restore(repository, generation): + return + if session is None: + return + if not isinstance(session, Session) or not session.authenticated: + with suppress(Exception): + repository.logout() + self._login_guard_error("已保存的登录状态无效,请重新登录。") + return + self._on_login_succeeded( + { + "session": session, + "user": session.user, + "repository": repository, + "demo_mode": False, + "restored_session": True, + } + ) + + def _on_restore_error( + self, + error: Exception, + repository: RemoteDoctorRepository, + generation: int, + ) -> None: + """Return control to login after a current restore attempt fails.""" + + if not self._finish_session_restore(repository, generation): + return + if isinstance(error, AuthenticationExpiredError): + message = "登录状态已失效,请重新登录。" + else: + message = f"自动恢复登录失败:{friendly_error(error)}" + self._login_guard_error(message) + + def _on_restore_finished( + self, + repository: RemoteDoctorRepository, + generation: int, + ) -> None: + """Release controls when a worker finishes without a result callback.""" + + self._finish_session_restore(repository, generation) + + def _cancel_session_restore(self) -> None: + """Invalidate late callbacks and re-enable manual login controls.""" + + self._restore_generation += 1 + if not self._restore_in_progress: + return + self._restore_in_progress = False + self._restore_worker = None + if self.login_window is not None: + self.login_window.set_session_restore_pending(False) + + def _on_login_succeeded(self, payload: dict[str, Any]) -> None: + self._cancel_session_restore() + session = payload.get("session") + repository = payload.get("repository") + if not isinstance(session, Session) or repository is None: + self._login_guard_error("登录响应不完整,请重试。") + return + if session.password_change_required: + with suppress(Exception): + repository.logout() + self._login_guard_error("该账号需要先修改初始密码,请在管理后台完成后重新登录。") + return + if session.work_wechat_binding_required: + with suppress(Exception): + repository.logout() + self._login_guard_error("该账号需要先绑定企业微信,请在管理后台完成绑定后重新登录。") + return + + demo_mode = bool(payload.get("demo_mode")) + if not demo_mode and not session.menu: + with suppress(Exception): + repository.logout() + self._login_guard_error("当前账号没有可用医生端菜单,请联系管理员授权。") + return + + self.current_repository = repository + self._authentication_expiry_in_progress = False + self.current_demo_mode = demo_mode + self.shell_window = ShellWindow(repository, payload, session.permissions) + self.shell_window.logout_requested.connect(self._logout) + self.shell_window.video_requested.connect(self._request_video) + self._apply_window_icon(self.shell_window) + if self.login_window is not None: + self.login_window.hide() + self.shell_window.show() + self.shell_window.raise_() + self.shell_window.activateWindow() + + def _login_guard_error(self, message: str) -> None: + if self.login_window is not None: + self.login_window.error_banner.show_message(message, "warning") + self.login_window.show() + + def _on_authentication_expired(self, error: AuthenticationExpiredError) -> bool: + """Consume an active-shell expiry and atomically return to login.""" + + if self.shell_window is None or self.current_repository is None: + return False + if self._authentication_expiry_in_progress: + return True + self._authentication_expiry_in_progress = True + LOGGER.info( + "authenticated session expired", + extra={"api_code": error.code, "request_id": error.request_id}, + ) + self._logout(message="登录状态已失效,请重新登录。") + return True + + def _logout(self, *, message: str = "") -> None: + """Clear authenticated resources and return to the login window.""" + + calls = tuple(self.video_calls.values()) + for call in calls: + with suppress(Exception): + call.close() + self._wait_for_video_lifecycle(calls, timeout=1.25) + self.video_calls.clear() + self.video_pending.clear() + for dialog in self.demo_video_dialogs.values(): + dialog.close() + self.demo_video_dialogs.clear() + if self.current_repository is not None: + with suppress(Exception): + self.current_repository.logout() + self.current_repository = None + if self.shell_window is not None: + self.shell_window.close() + self.shell_window.deleteLater() + self.shell_window = None + self._show_login() + if message and self.login_window is not None: + self.login_window.error_banner.show_message(message, "warning") + + def _request_video(self, payload: dict[str, Any]) -> None: + parent = self.shell_window + if parent is None or self.current_repository is None: + return + patient_id = payload.get("patient_id") + diagnosis_id = payload.get("diagnosis_id") + patient_name = str(payload.get("patient_name") or "患者") + if patient_id in (None, "") or diagnosis_id in (None, ""): + show_toast(parent, "患者或诊单信息不完整,无法发起视频。", "danger", 4200) + return + + call_key = str(diagnosis_id) + if ( + call_key in self.video_pending + or call_key in self.video_calls + or call_key in self.demo_video_dialogs + ): + show_toast(parent, "该问诊的视频正在准备或通话中。", "info", 3600) + return + + if self.current_demo_mode: + dialog = DemoVideoDialog(patient_name, parent) + dialog.finished.connect( + lambda _result, key=call_key, item=dialog: self._forget_demo_dialog( + key, + item, + ) + ) + self.demo_video_dialogs[call_key] = dialog + dialog.show() + return + + show_toast(parent, "正在获取安全通话凭证…", "info") + repository = self.current_repository + marker = object() + self.video_pending[call_key] = marker + + def get_ticket() -> Any: + return repository.get_call_ticket( + patient_id=int(patient_id), + diagnosis_id=int(diagnosis_id), + ) + + run_async( + get_ticket, + on_success=lambda ticket: self._launch_video( + ticket, + diagnosis_id=diagnosis_id, + patient_id=patient_id, + repository=repository, + call_key=call_key, + marker=marker, + ), + on_error=lambda error: self._video_ticket_error( + call_key, + marker, + parent, + error, + ), + ) + + def _video_ticket_error( + self, + call_key: str, + marker: object, + parent: QWidget, + error: Exception, + ) -> None: + if self.video_pending.get(call_key) is not marker: + return + self.video_pending.pop(call_key, None) + if self.shell_window is parent: + show_toast( + parent, + f"视频准备失败:{friendly_error(error)}", + "danger", + 5200, + ) + + def _launch_video( + self, + ticket: Any, + *, + diagnosis_id: Any, + patient_id: Any, + repository: Any, + call_key: str, + marker: object, + ) -> None: + if self.video_pending.get(call_key) is not marker: + return + self.video_pending.pop(call_key, None) + if ( + self.shell_window is None + or self.current_repository is not repository + or call_key in self.video_calls + ): + return + try: + mode = BackendMode.parse(self.config.video_mode) + if mode is BackendMode.BROWSER: + raise ValueError("当前后端未提供一次性通话交接票据,浏览器视频模式已安全停用。") + if not WEBENGINE_AVAILABLE: + raise ValueError("当前安装缺少 QtWebEngine,无法打开受信任的视频窗口。") + call = launch_video_call( + ticket, + repository=repository, + diagnosis_id=diagnosis_id, + patient_id=patient_id, + backend_mode=mode, + local_dist=video_dist_path(), + remote_url=self.config.video_web_url or None, + logger=logging.getLogger("doctor_workstation.video"), + ) + except Exception as error: + LOGGER.exception("video call could not be launched") + show_toast( + self.shell_window, + f"视频启动失败:{friendly_error(error)}", + "danger", + 5600, + ) + return + self.video_calls[call_key] = call + qt_window = getattr(call, "qt_window", None) + if qt_window is not None: + qt_window.destroyed.connect( + lambda _obj=None, key=call_key, expected=call: self._release_video_call( + key, + expected, + ) + ) + + def _release_video_call(self, call_key: str, call: Any) -> None: + if self.video_calls.get(call_key) is call: + self.video_calls.pop(call_key, None) + + def _forget_demo_dialog(self, call_key: str, dialog: DemoVideoDialog) -> None: + if self.demo_video_dialogs.get(call_key) is dialog: + self.demo_video_dialogs.pop(call_key, None) + dialog.deleteLater() + + @staticmethod + def _wait_for_video_lifecycle(calls: tuple[Any, ...], *, timeout: float) -> bool: + """Give queued endCall writes one short shared deadline after media closes.""" + + deadline = time.monotonic() + max(0.0, timeout) + complete = True + for call in calls: + remaining = deadline - time.monotonic() + if remaining <= 0: + complete = False + break + wait = getattr(call, "wait_for_lifecycle", None) + if callable(wait) and not wait(remaining): + complete = False + if not complete: + LOGGER.warning("video lifecycle cleanup exceeded its bounded deadline") + return complete + + @staticmethod + def _apply_window_icon(window: QWidget) -> None: + icon_file = resource_path("icon.svg") + if icon_file.exists(): + window.setWindowIcon(QIcon(str(icon_file))) + + def shutdown(self) -> None: + """Invalidate asynchronous restoration and release owned resources.""" + + if self._shutting_down: + return + self._shutting_down = True + self._cancel_session_restore() + set_authentication_expired_handler(None) + calls = tuple(self.video_calls.values()) + for call in calls: + with suppress(Exception): + call.close() + self._wait_for_video_lifecycle(calls, timeout=1.25) + if self.remote_repository is not None: + with suppress(Exception): + self.remote_repository.client.close() + + +def _create_application(argv: list[str]) -> QApplication: + with suppress(AttributeError): + QGuiApplication.setHighDpiScaleFactorRoundingPolicy( + Qt.HighDpiScaleFactorRoundingPolicy.PassThrough + ) + application = QApplication(argv) + application.setApplicationName("臻阳堂医生工作站") + application.setApplicationDisplayName("臻阳堂医生工作站") + application.setOrganizationName("ZhenYangTang") + application.setOrganizationDomain("zhenyangtang.com") + application.setQuitOnLastWindowClosed(True) + icon_file = resource_path("icon.svg") + if icon_file.exists(): + application.setWindowIcon(QIcon(str(icon_file))) + apply_theme(application) + return application + + +def main(argv: list[str] | None = None) -> int: + """Start the GUI application and return its process exit code.""" + + config = AppConfig.load() + configure_logging(config.log_dir, config.log_level) + LOGGER.info("doctor workstation starting", extra={"demo_mode": config.demo_mode}) + raw_argv = list(sys.argv if argv is None else argv) + smoke_test = "--smoke-test" in raw_argv + application = _create_application( + [argument for argument in raw_argv if argument != "--smoke-test"] + ) + controller = ApplicationController(application, config) + controller.start() + if smoke_test or os.getenv("DOCTOR_SMOKE_TEST") == "1": + QTimer.singleShot(1200, application.quit) + return application.exec() + + +__all__ = ["ApplicationController", "DemoVideoDialog", "main"] diff --git a/app/src/doctor_workstation/config.py b/app/src/doctor_workstation/config.py new file mode 100644 index 000000000..045757f9a --- /dev/null +++ b/app/src/doctor_workstation/config.py @@ -0,0 +1,172 @@ +"""Application configuration and per-user preferences. + +Secrets are intentionally excluded: the desktop client only receives a short-lived +TRTC UserSig from the authenticated backend and never stores an SDKSecretKey. +""" + +from __future__ import annotations + +import json +import os +from contextlib import suppress +from dataclasses import asdict, dataclass, fields, replace +from pathlib import Path +from typing import Any +from urllib.parse import urlsplit, urlunsplit + +try: + from dotenv import load_dotenv +except ImportError: # pragma: no cover - optional during pure unit tests + load_dotenv = None + +try: + from platformdirs import user_config_dir, user_log_dir +except ImportError: # pragma: no cover - deterministic fallback + user_config_dir = None + user_log_dir = None + + +APP_NAME = "ZhenyangDoctor" +APP_AUTHOR = "Zhenyangtang" + + +def _as_bool(value: str | bool | None, default: bool) -> bool: + if isinstance(value, bool): + return value + if value is None: + return default + return value.strip().lower() in {"1", "true", "yes", "on", "y"} + + +def _safe_timeout(value: str | int | float | None, default: float = 30.0) -> float: + try: + parsed = float(value) # type: ignore[arg-type] + except (TypeError, ValueError): + return default + return max(3.0, min(parsed, 120.0)) + + +def _config_home() -> Path: + override = os.getenv("DOCTOR_CONFIG_DIR", "").strip() + if override: + return Path(override).expanduser() + if user_config_dir is not None: + return Path(user_config_dir(APP_NAME, APP_AUTHOR)) + return Path.home() / f".{APP_NAME.lower()}" + + +def _log_home() -> Path: + override = os.getenv("DOCTOR_LOG_DIR", "").strip() + if override: + return Path(override).expanduser() + if user_log_dir is not None: + return Path(user_log_dir(APP_NAME, APP_AUTHOR)) + return _config_home() / "logs" + + +def normalize_api_base_url(value: str) -> str: + """Return a normalized HTTP(S) base URL ending in ``/adminapi``. + + Empty values are accepted for demo mode. Credentials, fragments and query + strings are rejected to prevent accidentally persisting tokens in settings. + """ + + raw = (value or "").strip().rstrip("/") + if not raw: + return "" + parts = urlsplit(raw) + if parts.scheme not in {"http", "https"} or not parts.netloc: + raise ValueError("服务器地址必须是完整的 http:// 或 https:// 地址") + if parts.username or parts.password or parts.query or parts.fragment: + raise ValueError("服务器地址不能包含账号、密码、查询参数或片段") + path = parts.path.rstrip("/") + if not path.endswith("/adminapi"): + path = f"{path}/adminapi" if path else "/adminapi" + return urlunsplit((parts.scheme, parts.netloc, path, "", "")) + + +@dataclass(frozen=True, slots=True) +class AppConfig: + """Runtime configuration loaded from environment and user preferences.""" + + api_base_url: str = "" + demo_mode: bool = True + video_mode: str = "embedded" + video_web_url: str = "" + verify_ssl: bool = True + request_timeout: float = 30.0 + log_level: str = "INFO" + remembered_account: str = "" + + @property + def config_dir(self) -> Path: + return _config_home() + + @property + def log_dir(self) -> Path: + return _log_home() + + @property + def preferences_file(self) -> Path: + return self.config_dir / "preferences.json" + + @classmethod + def load(cls, env_file: Path | None = None) -> AppConfig: + if load_dotenv is not None: + load_dotenv(dotenv_path=env_file, override=False) + + raw_url = os.getenv("DOCTOR_API_BASE_URL", "") + try: + api_url = normalize_api_base_url(raw_url) + except ValueError: + api_url = "" + + config = cls( + api_base_url=api_url, + demo_mode=_as_bool(os.getenv("DOCTOR_DEMO_MODE"), True), + video_mode=os.getenv("DOCTOR_VIDEO_MODE", "embedded").strip().lower(), + video_web_url=os.getenv("DOCTOR_VIDEO_WEB_URL", "").strip(), + verify_ssl=_as_bool(os.getenv("DOCTOR_VERIFY_SSL"), True), + request_timeout=_safe_timeout(os.getenv("DOCTOR_REQUEST_TIMEOUT")), + log_level=os.getenv("DOCTOR_LOG_LEVEL", "INFO").strip().upper(), + ) + return config._merge_preferences() + + def _merge_preferences(self) -> AppConfig: + try: + payload = json.loads(self.preferences_file.read_text(encoding="utf-8")) + except (OSError, ValueError, TypeError): + return self + allowed = {item.name for item in fields(self)} + clean: dict[str, Any] = {key: value for key, value in payload.items() if key in allowed} + if "api_base_url" in clean: + try: + clean["api_base_url"] = normalize_api_base_url(str(clean["api_base_url"])) + except ValueError: + clean.pop("api_base_url", None) + if "video_mode" in clean and clean["video_mode"] not in {"embedded", "browser"}: + clean.pop("video_mode", None) + if "request_timeout" in clean: + clean["request_timeout"] = _safe_timeout(clean["request_timeout"]) + return replace(self, **clean) + + def save_preferences(self) -> None: + """Persist non-secret preferences atomically with user-only intent.""" + + self.config_dir.mkdir(parents=True, exist_ok=True) + target = self.preferences_file + temporary = target.with_suffix(".tmp") + payload = asdict(self) + temporary.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8") + with suppress(OSError): + os.chmod(temporary, 0o600) + temporary.replace(target) + + def with_updates(self, **changes: Any) -> AppConfig: + if "api_base_url" in changes: + changes["api_base_url"] = normalize_api_base_url(str(changes["api_base_url"])) + if "video_mode" in changes and changes["video_mode"] not in {"embedded", "browser"}: + raise ValueError("视频模式只能是 embedded 或 browser") + if "request_timeout" in changes: + changes["request_timeout"] = _safe_timeout(changes["request_timeout"]) + return replace(self, **changes) diff --git a/app/src/doctor_workstation/core/__init__.py b/app/src/doctor_workstation/core/__init__.py new file mode 100644 index 000000000..559857e67 --- /dev/null +++ b/app/src/doctor_workstation/core/__init__.py @@ -0,0 +1,57 @@ +"""UI-independent domain primitives for the doctor workstation.""" + +from .errors import ( + ApiBusinessError, + ApiError, + ApiHttpError, + ApiProtocolError, + ApiTimeoutError, + ApiTransportError, + AuthenticationError, + AuthenticationExpiredError, + InstallationRequiredError, + NeedBindWorkWechatError, + OpenNewPageError, + OpenPageRequiredError, + RepositoryNotFoundError, + WorkWechatBindingRequiredError, +) +from .models import ( + Appointment, + CallTicket, + Consultation, + PageResult, + Patient, + Prescription, + PrescriptionTemplate, + UserProfile, +) +from .permissions import PermissionSet +from .session import Session + +__all__ = [ + "ApiBusinessError", + "ApiError", + "ApiHttpError", + "ApiProtocolError", + "ApiTimeoutError", + "ApiTransportError", + "Appointment", + "AuthenticationError", + "AuthenticationExpiredError", + "CallTicket", + "Consultation", + "InstallationRequiredError", + "NeedBindWorkWechatError", + "OpenNewPageError", + "OpenPageRequiredError", + "PageResult", + "Patient", + "PermissionSet", + "Prescription", + "PrescriptionTemplate", + "RepositoryNotFoundError", + "Session", + "UserProfile", + "WorkWechatBindingRequiredError", +] diff --git a/app/src/doctor_workstation/core/errors.py b/app/src/doctor_workstation/core/errors.py new file mode 100644 index 000000000..3a916ee79 --- /dev/null +++ b/app/src/doctor_workstation/core/errors.py @@ -0,0 +1,93 @@ +"""Structured errors shared by HTTP and repository implementations.""" + +from __future__ import annotations + +from typing import Any + + +class ApiError(RuntimeError): + """Base API error carrying machine-readable response context.""" + + def __init__( + self, + message: str, + *, + code: int | None = None, + data: Any = None, + status_code: int | None = None, + request_id: str | None = None, + ) -> None: + """Initialise a structured API error.""" + + super().__init__(message) + self.message = message + self.code = code + self.data = data + self.status_code = status_code + self.request_id = request_id + + +class ApiTransportError(ApiError): + """A network failure occurred before a valid API response was received.""" + + +class ApiTimeoutError(ApiTransportError): + """A request exceeded its configured timeout and exhausted safe retries.""" + + +class ApiHttpError(ApiTransportError): + """The server returned a non-successful HTTP status code.""" + + +class ApiProtocolError(ApiError): + """The response was not valid JSON or did not contain a valid envelope.""" + + +class ApiBusinessError(ApiError): + """The API returned envelope code ``0`` for a rejected business action.""" + + +class AuthenticationExpiredError(ApiError): + """The API returned envelope code ``-1`` and the session must be cleared.""" + + +class WorkWechatBindingRequiredError(ApiError): + """The API returned code ``10`` and Enterprise WeChat binding is required.""" + + +class OpenPageRequiredError(ApiError): + """The API returned code ``2`` with an external page that needs user action.""" + + def __init__( + self, + message: str, + *, + url: str = "", + data: Any = None, + status_code: int | None = None, + request_id: str | None = None, + ) -> None: + """Initialise the redirect signal without opening a browser implicitly.""" + + super().__init__( + message, + code=2, + data=data, + status_code=status_code, + request_id=request_id, + ) + self.url = url + + +class InstallationRequiredError(ApiError): + """The legacy API returned code ``-2`` for a missing companion component.""" + + +class RepositoryNotFoundError(KeyError): + """A requested in-memory or remote domain object could not be found.""" + + +# Readable compatibility aliases for callers that use shorter exception names. +AuthenticationError = AuthenticationExpiredError +NeedBindWorkWechatError = WorkWechatBindingRequiredError +OpenNewPageError = OpenPageRequiredError diff --git a/app/src/doctor_workstation/core/models.py b/app/src/doctor_workstation/core/models.py new file mode 100644 index 000000000..038253365 --- /dev/null +++ b/app/src/doctor_workstation/core/models.py @@ -0,0 +1,913 @@ +"""Typed domain models used by the doctor workstation service layer. + +The production API is not backed by a published schema and has accumulated a +few field aliases over time. The ``from_dict`` factories in this module are +therefore deliberately conservative: known fields are normalised while the +complete source mapping is retained in ``raw`` for forward compatibility. +""" + +from __future__ import annotations + +from collections.abc import Callable, Mapping +from dataclasses import dataclass, field +from math import ceil +from typing import Any, Generic, TypeVar + +JSONDict = dict[str, Any] +T = TypeVar("T") +U = TypeVar("U") + + +def _mapping(value: object) -> Mapping[str, Any]: + return value if isinstance(value, Mapping) else {} + + +def _text(value: object, default: str = "") -> str: + if value is None: + return default + return str(value) + + +def _integer(value: object, default: int | None = 0) -> int | None: + if value is None or value == "": + return default + if isinstance(value, bool): + return int(value) + try: + return int(value) # type: ignore[arg-type] + except (TypeError, ValueError): + try: + return int(float(str(value))) + except (TypeError, ValueError): + return default + + +def _number(value: object) -> float | None: + if value is None or value == "": + return None + try: + return float(value) # type: ignore[arg-type] + except (TypeError, ValueError): + return None + + +def _boolean(value: object, default: bool = False) -> bool: + if value is None or value == "": + return default + if isinstance(value, str): + return value.strip().lower() not in {"0", "false", "no", "off", "null"} + return bool(value) + + +def _int_or_text(value: object, default: int | str = 0) -> int | str: + if value is None or value == "": + return default + converted = _integer(value, None) + return converted if converted is not None else str(value) + + +def _dict_list(value: object) -> list[JSONDict]: + if not isinstance(value, (list, tuple)): + return [] + return [dict(item) for item in value if isinstance(item, Mapping)] + + +def _string_list(value: object) -> list[str]: + """Return a clean list for APIs that alternate between CSV and arrays.""" + + values: object = value.split(",") if isinstance(value, str) else value + if not isinstance(values, (list, tuple, set, frozenset)): + return [] + return [text for item in values if (text := _text(item).strip())] + + +def _string_tuple(value: object) -> tuple[str, ...]: + if isinstance(value, str): + values: object = value.split(",") + else: + values = value + if not isinstance(values, (list, tuple, set, frozenset)): + return () + return tuple(item for item in (_text(entry).strip() for entry in values) if item) + + +def _role_tuple(value: object) -> tuple[int, ...]: + if isinstance(value, str): + values: object = value.split(",") + elif isinstance(value, (int, float)): + values = [value] + else: + values = value + if not isinstance(values, (list, tuple, set, frozenset)): + return () + result: list[int] = [] + for entry in values: + candidate = entry.get("id") if isinstance(entry, Mapping) else entry + role_id = _integer(candidate, None) + if role_id is not None and role_id not in result: + result.append(role_id) + return tuple(result) + + +def _formula_type(value: object) -> int | str: + """Normalise known main/aux formula labels while preserving unknown values.""" + + text = _text(value).strip() + lowered = text.lower() + if lowered in {"", "1", "main", "primary", "主方"}: + return "main" + if lowered in {"2", "aux", "auxiliary", "secondary", "辅方"}: + return "aux" + converted = _integer(value, None) + return converted if converted is not None else text + + +@dataclass(slots=True) +class UserProfile: + """Authenticated doctor profile returned by ``auth.admin/mySelf``.""" + + id: int = 0 + account: str = "" + name: str = "" + avatar: str = "" + phone: str = "" + role_ids: tuple[int, ...] = () + root: bool = False + department_id: int | None = None + department_name: str = "" + permissions: tuple[str, ...] = () + raw: JSONDict = field(default_factory=dict, repr=False, compare=False) + + @classmethod + def from_dict(cls, data: Mapping[str, Any] | None) -> UserProfile: + """Build a profile from either a user object or a ``mySelf`` result.""" + + outer = _mapping(data) + nested_user = outer.get("user") + source = _mapping(nested_user) if isinstance(nested_user, Mapping) else outer + roles = source.get("role_ids", source.get("role_id", source.get("roles"))) + permissions = outer.get("permissions", source.get("permissions", ())) + department = _mapping(source.get("department", source.get("dept"))) + return cls( + id=_integer(source.get("id", source.get("user_id")), 0) or 0, + account=_text(source.get("account", source.get("username"))), + name=_text( + source.get( + "name", + source.get("real_name", source.get("nickname", source.get("account"))), + ) + ), + avatar=_text(source.get("avatar")), + phone=_text(source.get("phone", source.get("mobile"))), + role_ids=_role_tuple(roles), + root=_boolean(source.get("root", source.get("is_root"))), + department_id=_integer( + source.get("department_id", source.get("dept_id", department.get("id"))), + None, + ), + department_name=_text( + source.get( + "department_name", + source.get("dept_name", department.get("name")), + ) + ), + permissions=_string_tuple(permissions), + raw=dict(source), + ) + + +@dataclass(slots=True) +class Appointment: + """A doctor appointment and the patient summary shown in queue views.""" + + id: int = 0 + patient_id: int = 0 + diagnosis_id: int | None = None + patient_name: str = "" + patient_phone: str = "" + gender: int | str | None = None + gender_desc: str = "" + age: int | None = None + height: float | None = None + weight: float | None = None + doctor_id: int | None = None + doctor_name: str = "" + assistant_id: int | None = None + assistant_name: str = "" + appointment_date: str = "" + appointment_time: str = "" + period: str = "" + appointment_type: int | str | None = None + appointment_type_text: str = "" + channel: int | str | None = None + channel_text: str = "" + status: int | str = 0 + status_desc: str = "" + diagnosis_confirmed: bool = False + has_prescription: bool = False + prescription_audit_status: int | None = None + prescription_void_status: int | None = None + remark: str = "" + raw: JSONDict = field(default_factory=dict, repr=False, compare=False) + + @classmethod + def from_dict(cls, data: Mapping[str, Any] | None) -> Appointment: + """Build an appointment while accepting historical API aliases.""" + + source = _mapping(data) + return cls( + id=_integer(source.get("id", source.get("appointment_id")), 0) or 0, + patient_id=_integer(source.get("patient_id", source.get("source_patient_id")), 0) or 0, + diagnosis_id=_integer(source.get("diagnosis_id"), None), + patient_name=_text(source.get("patient_name", source.get("name"))), + patient_phone=_text( + source.get("patient_phone", source.get("phone", source.get("phone_masked"))) + ), + gender=source.get("gender", source.get("gender_desc")), + gender_desc=_text(source.get("gender_desc")), + age=_integer(source.get("age"), None), + height=_number(source.get("height")), + weight=_number(source.get("weight")), + doctor_id=_integer(source.get("doctor_id"), None), + doctor_name=_text(source.get("doctor_name")), + assistant_id=_integer(source.get("assistant_id"), None), + assistant_name=_text(source.get("assistant_name")), + appointment_date=_text(source.get("appointment_date", source.get("date"))), + appointment_time=_text( + source.get( + "appointment_time", + source.get("appointment_time_text", source.get("time")), + ) + ), + period=_text(source.get("period")), + appointment_type=source.get("appointment_type", source.get("type")), + appointment_type_text=_text( + source.get("appointment_type_text", source.get("type_text")) + ), + channel=source.get("channel", source.get("appointment_channel")), + channel_text=_text(source.get("channel_text", source.get("channel_name"))), + status=_int_or_text(source.get("status"), 0), + status_desc=_text(source.get("status_desc", source.get("appointment_status_text"))), + diagnosis_confirmed=_boolean(source.get("diagnosis_confirmed")), + has_prescription=_boolean(source.get("has_prescription")), + prescription_audit_status=_integer(source.get("prescription_audit_status"), None), + prescription_void_status=_integer(source.get("prescription_void_status"), None), + remark=_text(source.get("remark")), + raw=dict(source), + ) + + +@dataclass(slots=True) +class Patient: + """A patient row from the doctor's scoped first-visit patient list.""" + + id: int = 0 + diagnosis_id: int | None = None + source_patient_id: int | None = None + name: str = "" + gender: int | str | None = None + gender_desc: str = "" + age: int | None = None + phone: str = "" + phone_masked: str = "" + has_id_card: bool = False + assistant_id: int | None = None + assistant_name: str = "" + appointment_id: int | None = None + appointment_doctor_id: int | None = None + appointment_doctor_name: str = "" + appointment_status: int | str | None = None + appointment_status_text: str = "" + appointment_time_text: str = "" + appointment_date: str = "" + appointment_time: str = "" + appointments: list[JSONDict] = field(default_factory=list) + revisit_count: int = 0 + confirmed: bool = False + confirmation_text: str = "" + diagnosis_date_text: str = "" + status_filter: str = "" + id_card: str = "" + region: str = "" + is_self_patient: bool = False + raw: JSONDict = field(default_factory=dict, repr=False, compare=False) + + @property + def patient_name(self) -> str: + """Return the backend-style alias for ``name``.""" + + return self.name + + @property + def patient_phone(self) -> str: + """Return the best available phone value under the queue-style alias.""" + + return self.phone_masked or self.phone + + @classmethod + def from_dict(cls, data: Mapping[str, Any] | None) -> Patient: + """Build a patient from a tolerant first-visit list row.""" + + source = _mapping(data) + diagnosis_id = _integer(source.get("diagnosis_id", source.get("id")), None) + item_id = _integer(source.get("id", diagnosis_id), 0) or 0 + return cls( + id=item_id, + diagnosis_id=diagnosis_id, + source_patient_id=_integer(source.get("source_patient_id"), None), + name=_text(source.get("patient_name", source.get("name"))), + gender=source.get("gender", source.get("gender_desc")), + gender_desc=_text(source.get("gender_desc")), + age=_integer(source.get("age"), None), + phone=_text(source.get("phone", source.get("patient_phone"))), + phone_masked=_text(source.get("phone_masked", source.get("phone"))), + has_id_card=_boolean(source.get("has_id_card")), + assistant_id=_integer(source.get("assistant_id"), None), + assistant_name=_text(source.get("assistant_name")), + appointment_id=_integer(source.get("appointment_id"), None), + appointment_doctor_id=_integer(source.get("appointment_doctor_id"), None), + appointment_doctor_name=_text(source.get("appointment_doctor_name")), + appointment_status=( + _int_or_text(source.get("appointment_status")) + if source.get("appointment_status") not in (None, "") + else None + ), + appointment_status_text=_text(source.get("appointment_status_text")), + appointment_time_text=_text(source.get("appointment_time_text")), + appointment_date=_text(source.get("appointment_date")), + appointment_time=_text(source.get("appointment_time")), + appointments=_dict_list(source.get("appointments")), + revisit_count=_integer(source.get("revisit_count"), 0) or 0, + confirmed=_boolean(source.get("confirmed", source.get("diagnosis_confirmed"))), + confirmation_text=_text(source.get("confirmation_text")), + diagnosis_date_text=_text(source.get("diagnosis_date_text")), + status_filter=_text(source.get("status_filter", source.get("visit_status"))), + id_card=_text(source.get("id_card")), + region=_text(source.get("region", source.get("region_text"))), + is_self_patient=_boolean(source.get("is_self_patient")), + raw=dict(source), + ) + + +@dataclass(slots=True) +class Consultation: + """A diagnosis/consultation row used by the consultation workspace.""" + + id: int = 0 + patient_id: int | None = None + appointment_id: int | None = None + patient_name: str = "" + patient_phone: str = "" + phone_masked: str = "" + id_card: str = "" + gender: int | str | None = None + gender_desc: str = "" + age: int | None = None + doctor_id: int | None = None + doctor_name: str = "" + assistant_id: int | None = None + assistant_name: str = "" + diagnosis_date: str = "" + appointment_date: str = "" + appointment_time: str = "" + period: str = "" + has_appointment: bool = False + appointment_status: int | str | None = None + appointment_status_text: str = "" + appointments: list[JSONDict] = field(default_factory=list) + consultation_type: int | str | None = None + clinical_diagnosis: str = "" + chief_complaint: str = "" + present_illness: str = "" + past_history: str = "" + allergy_history: str = "" + personal_history: str = "" + family_history: str = "" + current_medicine: str = "" + local_diagnosis: str = "" + prescription_opinion: str = "" + tongue: str = "" + pulse: str = "" + status: int | str = 0 + status_desc: str = "" + confirmed: bool = False + diagnosis_view_records: list[JSONDict] = field(default_factory=list) + has_prescription: bool = False + unserved_days: int | None = None + video_hint: str = "" + source: int | str | None = None + source_text: str = "" + remark: str = "" + raw: JSONDict = field(default_factory=dict, repr=False, compare=False) + + @classmethod + def from_dict(cls, data: Mapping[str, Any] | None) -> Consultation: + """Build a consultation from a diagnosis row or reception detail.""" + + source = _mapping(data) + nested = _mapping(source.get("diagnosis")) + if nested: + merged: JSONDict = dict(source) + merged.update(nested) + source = merged + appointments = _dict_list(source.get("appointments")) + appointment = _mapping(source.get("appointment", source.get("latest_appointment"))) + if not appointment: + appointment = appointments[0] if appointments else {} + view_records = _dict_list( + source.get("DiagnosisViewRecord", source.get("diagnosis_view_records")) + ) + confirmed_value: object = source.get("confirmed", source.get("diagnosis_confirmed")) + if confirmed_value in (None, "") and view_records: + confirmed_value = any(_boolean(item.get("is_confirmed")) for item in view_records) + explicit_has_appointment = source.get("has_appointment") + has_appointment = ( + _boolean(explicit_has_appointment) + if explicit_has_appointment not in (None, "") + else bool(appointment or appointments or source.get("appointment_id")) + ) + appointment_status_value = source.get("appointment_status") + if appointment_status_value in (None, ""): + appointment_status_value = appointment.get("status") + return cls( + id=_integer(source.get("id", source.get("diagnosis_id")), 0) or 0, + patient_id=_integer(source.get("patient_id", source.get("source_patient_id")), None), + appointment_id=_integer(source.get("appointment_id", appointment.get("id")), None), + patient_name=_text(source.get("patient_name", source.get("name"))), + patient_phone=_text(source.get("patient_phone", source.get("phone"))), + phone_masked=_text(source.get("phone_masked")), + id_card=_text(source.get("id_card")), + gender=source.get("gender", source.get("gender_desc")), + gender_desc=_text(source.get("gender_desc")), + age=_integer(source.get("age"), None), + doctor_id=_integer(source.get("doctor_id", appointment.get("doctor_id")), None), + doctor_name=_text(source.get("doctor_name", appointment.get("doctor_name"))), + assistant_id=_integer(source.get("assistant_id"), None), + assistant_name=_text(source.get("assistant_name")), + diagnosis_date=_text(source.get("diagnosis_date", source.get("diagnosis_date_text"))), + appointment_date=_text( + source.get( + "appointment_date", + source.get( + "latest_appointment_date", + appointment.get("appointment_date", appointment.get("date")), + ), + ) + ), + appointment_time=_text( + source.get( + "appointment_time", + source.get( + "appointment_time_text", + source.get( + "latest_appointment_time", + appointment.get("appointment_time", appointment.get("time_text")), + ), + ), + ) + ), + period=_text(source.get("period", appointment.get("period"))), + has_appointment=has_appointment, + appointment_status=( + _int_or_text(appointment_status_value) + if appointment_status_value not in (None, "") + else None + ), + appointment_status_text=_text( + source.get( + "appointment_status_text", + appointment.get("status_text", appointment.get("status_desc")), + ) + ), + appointments=appointments, + consultation_type=source.get("consultation_type", source.get("visit_type")), + clinical_diagnosis=_text(source.get("clinical_diagnosis")), + chief_complaint=_text(source.get("chief_complaint", source.get("complaint"))), + present_illness=_text( + source.get("present_illness", source.get("present_illness_history")) + ), + past_history=_text(source.get("past_history")), + allergy_history=_text(source.get("allergy_history")), + personal_history=_text(source.get("personal_history")), + family_history=_text(source.get("family_history")), + current_medicine=_text(source.get("current_medicine")), + local_diagnosis=_text(source.get("local_diagnosis")), + prescription_opinion=_text(source.get("prescription_opinion")), + tongue=_text(source.get("tongue")), + pulse=_text(source.get("pulse", source.get("pulse_condition"))), + # Diagnosis enablement and appointment workflow are separate domains. + status=_int_or_text(source.get("status"), 0), + status_desc=_text(source.get("status_desc")), + confirmed=_boolean(confirmed_value), + diagnosis_view_records=view_records, + has_prescription=_boolean(source.get("has_prescription")), + unserved_days=_integer( + source.get("unserved_days", source.get("unserved_day_count")), None + ), + video_hint=_text(source.get("video_hint", source.get("call_hint"))), + source=source.get("source", source.get("diagnosis_source")), + source_text=_text(source.get("source_text", source.get("source_name"))), + remark=_text(source.get("remark")), + raw=dict(source), + ) + + @property + def diagnosis_confirmed(self) -> bool: + """Return the appointment-list alias for the confirmation flag.""" + + return self.confirmed + + +@dataclass(slots=True) +class PrescriptionTemplate: + """A reusable prescription-library formula owned by a doctor.""" + + id: int = 0 + name: str = "" + formula_type: int | str = 1 + herbs: list[JSONDict] = field(default_factory=list) + is_public: bool = False + disable_edit: bool = False + creator_id: int | None = None + creator_name: str = "" + create_time: str = "" + update_time: str = "" + raw: JSONDict = field(default_factory=dict, repr=False, compare=False) + + @property + def prescription_name(self) -> str: + """Return the API field alias for the template name.""" + + return self.name + + @classmethod + def from_dict(cls, data: Mapping[str, Any] | None) -> PrescriptionTemplate: + """Build a prescription template from a list or detail response.""" + + source = _mapping(data) + return cls( + id=_integer(source.get("id"), 0) or 0, + name=_text(source.get("prescription_name", source.get("name"))), + formula_type=_formula_type(source.get("formula_type")), + herbs=_dict_list(source.get("herbs")), + is_public=_boolean(source.get("is_public")), + disable_edit=_boolean(source.get("disable_edit")), + creator_id=_integer(source.get("creator_id"), None), + creator_name=_text(source.get("creator_name")), + create_time=_text(source.get("create_time")), + update_time=_text(source.get("update_time")), + raw=dict(source), + ) + + def to_api_dict(self, *, include_id: bool = True) -> JSONDict: + """Serialise this template using the server's field names.""" + + payload: JSONDict = { + "prescription_name": self.name, + "formula_type": "辅方" if _formula_type(self.formula_type) == "aux" else "主方", + "herbs": [dict(item) for item in self.herbs], + "is_public": int(self.is_public), + "disable_edit": int(self.disable_edit), + } + if include_id and self.id: + payload["id"] = self.id + return payload + + +@dataclass(slots=True) +class Prescription: + """An issued prescription, including audit state and dosage information.""" + + id: int = 0 + diagnosis_id: int | None = None + appointment_id: int | None = None + case_record: JSONDict = field(default_factory=dict) + sn: str = "" + patient_name: str = "" + phone: str = "" + phone_masked: str = "" + gender: int | str | None = None + age: int | None = None + visit_no: str = "" + prescription_date: str = "" + prescription_type: int | str | None = None + herbs: list[JSONDict] = field(default_factory=list) + clinical_diagnosis: str = "" + tongue: str = "" + tongue_image: str = "" + pulse: str = "" + pulse_condition: str = "" + dosage_amount: float | None = None + dosage_unit: str = "" + dosage_bag_count: int | None = None + need_decoction: bool = False + bags_per_dose: int | None = None + dose_count: int | None = None + dose_unit: str = "" + usage_days: int | None = None + times_per_day: int | None = None + usage_instruction: str = "" + usage_time: str = "" + usage_way: str = "" + dietary_taboo: list[str] = field(default_factory=list) + usage_notes: str = "" + aux_usage: JSONDict = field(default_factory=dict) + doctor_name: str = "" + doctor_signature: str = "" + creator_id: int | None = None + assistant_name: str = "" + is_system_auto: bool = False + is_shared: bool = False + visible_role_ids: tuple[int, ...] = () + audit_status: int | None = None + audit_time: str = "" + audit_by_name: str = "" + audit_remark: str = "" + business_prescription_audit_status: int | None = None + business_prescription_audit_rejected: bool = False + business_prescription_audit_remark: str = "" + void_status: int | None = None + void_by_name: str = "" + void_time: str = "" + has_prescription_order: bool = False + prescription_order_id: int | None = None + order_no: str = "" + recipient_name: str = "" + recipient_phone: str = "" + shipping_province: str = "" + shipping_city: str = "" + shipping_district: str = "" + shipping_address: str = "" + pharmacy_remark: str = "" + remark_assistant: str = "" + medication_days: int | None = None + pill_requirement: str = "" + create_time: str = "" + raw: JSONDict = field(default_factory=dict, repr=False, compare=False) + + @classmethod + def from_dict(cls, data: Mapping[str, Any] | None) -> Prescription: + """Build a prescription from a compact list row or a full detail object.""" + + source = _mapping(data) + return cls( + id=_integer(source.get("id"), 0) or 0, + diagnosis_id=_integer(source.get("diagnosis_id"), None), + appointment_id=_integer(source.get("appointment_id"), None), + case_record=dict(_mapping(source.get("case_record"))), + sn=_text(source.get("sn")), + patient_name=_text(source.get("patient_name")), + phone=_text(source.get("phone", source.get("patient_phone"))), + phone_masked=_text(source.get("phone_masked")), + gender=source.get("gender", source.get("gender_desc")), + age=_integer(source.get("age"), None), + visit_no=_text(source.get("visit_no")), + prescription_date=_text(source.get("prescription_date")), + prescription_type=source.get("prescription_type"), + herbs=_dict_list(source.get("herbs")), + clinical_diagnosis=_text(source.get("clinical_diagnosis")), + tongue=_text(source.get("tongue")), + tongue_image=_text(source.get("tongue_image")), + pulse=_text(source.get("pulse")), + pulse_condition=_text(source.get("pulse_condition")), + dosage_amount=_number(source.get("dosage_amount")), + dosage_unit=_text(source.get("dosage_unit")), + dosage_bag_count=_integer(source.get("dosage_bag_count"), None), + need_decoction=_boolean(source.get("need_decoction")), + bags_per_dose=_integer(source.get("bags_per_dose"), None), + dose_count=_integer(source.get("dose_count"), None), + dose_unit=_text(source.get("dose_unit")), + usage_days=_integer(source.get("usage_days"), None), + times_per_day=_integer(source.get("times_per_day"), None), + usage_instruction=_text(source.get("usage_instruction")), + usage_time=_text(source.get("usage_time")), + usage_way=_text(source.get("usage_way")), + dietary_taboo=_string_list(source.get("dietary_taboo")), + usage_notes=_text(source.get("usage_notes")), + aux_usage=dict(_mapping(source.get("aux_usage"))), + doctor_name=_text(source.get("doctor_name")), + doctor_signature=_text(source.get("doctor_signature")), + creator_id=_integer(source.get("creator_id"), None), + assistant_name=_text(source.get("assistant_name")), + is_system_auto=_boolean(source.get("is_system_auto")), + is_shared=_boolean(source.get("is_shared")), + visible_role_ids=_role_tuple(source.get("visible_role_ids")), + audit_status=_integer(source.get("audit_status"), None), + audit_time=_text(source.get("audit_time")), + audit_by_name=_text(source.get("audit_by_name")), + audit_remark=_text(source.get("audit_remark")), + business_prescription_audit_status=_integer( + source.get("business_prescription_audit_status"), None + ), + business_prescription_audit_rejected=_boolean( + source.get("business_prescription_audit_rejected") + ), + business_prescription_audit_remark=_text( + source.get("business_prescription_audit_remark") + ), + void_status=_integer(source.get("void_status"), None), + void_by_name=_text(source.get("void_by_name")), + void_time=_text(source.get("void_time")), + has_prescription_order=_boolean(source.get("has_prescription_order")), + prescription_order_id=_integer(source.get("prescription_order_id"), None), + order_no=_text(source.get("order_no")), + recipient_name=_text(source.get("recipient_name")), + recipient_phone=_text(source.get("recipient_phone")), + shipping_province=_text(source.get("shipping_province")), + shipping_city=_text(source.get("shipping_city")), + shipping_district=_text(source.get("shipping_district")), + shipping_address=_text(source.get("shipping_address")), + pharmacy_remark=_text(source.get("pharmacy_remark", source.get("pharmacy_note"))), + remark_assistant=_text(source.get("remark_assistant")), + medication_days=_integer(source.get("medication_days"), None), + pill_requirement=_text(source.get("pill_requirement", source.get("make_pill_remark"))), + create_time=_text(source.get("create_time")), + raw=dict(source), + ) + + def to_api_dict(self, *, include_id: bool = True) -> JSONDict: + """Serialise the complete editable prescription DTO for add/edit.""" + + payload: JSONDict = { + "diagnosis_id": self.diagnosis_id, + "appointment_id": self.appointment_id, + "case_record": dict(self.case_record), + "creator_id": self.creator_id, + "is_system_auto": int(self.is_system_auto), + "patient_name": self.patient_name, + "phone": self.phone, + "gender": self.gender, + "age": self.age, + "visit_no": self.visit_no, + "prescription_date": self.prescription_date, + "prescription_type": self.prescription_type, + "tongue": self.tongue, + "tongue_image": self.tongue_image, + "pulse": self.pulse, + "pulse_condition": self.pulse_condition, + "clinical_diagnosis": self.clinical_diagnosis, + "herbs": [dict(item) for item in self.herbs], + "dosage_amount": self.dosage_amount, + "dosage_unit": self.dosage_unit, + "dosage_bag_count": self.dosage_bag_count, + "need_decoction": int(self.need_decoction), + "bags_per_dose": self.bags_per_dose, + "dose_count": self.dose_count, + "dose_unit": self.dose_unit, + "usage_days": self.usage_days, + "times_per_day": self.times_per_day, + "usage_instruction": self.usage_instruction, + "usage_time": self.usage_time, + "usage_way": self.usage_way, + "dietary_taboo": list(self.dietary_taboo), + "usage_notes": self.usage_notes, + "aux_usage": dict(self.aux_usage), + "doctor_name": self.doctor_name, + "doctor_signature": self.doctor_signature, + "is_shared": int(self.is_shared), + "visible_role_ids": list(self.visible_role_ids), + "audit_status": self.audit_status, + } + if include_id and self.id: + payload["id"] = self.id + return {key: value for key, value in payload.items() if value is not None} + + +@dataclass(slots=True) +class PageResult(Generic[T]): + """A normalised paginated result with the API's optional extension data.""" + + items: list[T] = field(default_factory=list) + total: int = 0 + page_no: int = 1 + page_size: int = 20 + extend: JSONDict = field(default_factory=dict) + + @property + def lists(self) -> list[T]: + """Return ``items`` under the legacy API name used by the web client.""" + + return self.items + + @property + def count(self) -> int: + """Return ``total`` under the legacy API name used by the web client.""" + + return self.total + + @property + def pages(self) -> int: + """Return the number of pages, or zero when the result is empty.""" + + return ceil(self.total / self.page_size) if self.total and self.page_size else 0 + + @classmethod + def from_payload( + cls, + payload: object, + parser: Callable[[Mapping[str, Any]], T], + *, + page_no: int = 1, + page_size: int = 20, + ) -> PageResult[T]: + """Normalise common list/count aliases and parse only mapping rows.""" + + top_source = _mapping(payload) + if isinstance(payload, (list, tuple)): + rows: object = payload + source: Mapping[str, Any] = {} + else: + source = _mapping(payload) + rows = [] + nested = source.get("data") + if not any(key in source for key in ("lists", "items", "rows", "records")): + if isinstance(nested, Mapping): + source = nested + elif isinstance(nested, (list, tuple)): + rows = nested + source = {} + else: + rows = [] + if not rows: + rows = next( + ( + source[key] + for key in ("lists", "items", "rows", "records", "data") + if isinstance(source.get(key), (list, tuple)) + ), + [], + ) + parsed = [parser(row) for row in rows if isinstance(row, Mapping)] + total = _integer( + source.get("count", source.get("total", source.get("total_count"))), + len(parsed), + ) + result_page = _integer( + source.get("page_no", source.get("page", source.get("current_page"))), + page_no, + ) + result_size = _integer( + source.get("page_size", source.get("per_page", source.get("limit"))), + page_size, + ) + extend: JSONDict = {} + for candidate in ( + top_source.get("extend", top_source.get("meta")), + source.get("extend", source.get("meta")), + ): + if isinstance(candidate, Mapping): + extend.update(candidate) + return cls( + items=parsed, + total=max(total or 0, 0), + page_no=max(result_page or page_no, 1), + page_size=max(result_size or page_size, 1), + extend=extend, + ) + + def map(self, transform: Callable[[T], U]) -> PageResult[U]: + """Return a page with transformed items and unchanged pagination data.""" + + return PageResult( + items=[transform(item) for item in self.items], + total=self.total, + page_no=self.page_no, + page_size=self.page_size, + extend=dict(self.extend), + ) + + +@dataclass(slots=True) +class CallTicket: + """Short-lived Tencent IM/TRTC credentials for one consultation flow.""" + + sdk_app_id: int = 0 + user_id: str = "" + user_sig: str = "" + patient_user_id: str = "" + assistant_id: str = "" + diagnosis_id: int | None = None + room_id: str = "" + call_record_id: int | None = None + is_lochost_vod: bool = False + expires_at: int | None = None + raw: JSONDict = field(default_factory=dict, repr=False, compare=False) + + @classmethod + def from_dict(cls, data: Mapping[str, Any] | None) -> CallTicket: + """Build a call ticket from the backend's camelCase or snake_case form.""" + + source = _mapping(data) + return cls( + sdk_app_id=_integer(source.get("sdkAppId", source.get("sdk_app_id")), 0) or 0, + user_id=_text(source.get("userId", source.get("user_id"))), + user_sig=_text(source.get("userSig", source.get("user_sig"))), + patient_user_id=_text(source.get("patientUserId", source.get("patient_user_id"))), + assistant_id=_text(source.get("assistant_id", source.get("assistantId"))), + diagnosis_id=_integer(source.get("diagnosis_id"), None), + room_id=_text(source.get("room_id", source.get("roomId"))), + call_record_id=_integer(source.get("call_record_id", source.get("callRecordId")), None), + is_lochost_vod=_boolean(source.get("isLochostVod", source.get("is_lochost_vod"))), + expires_at=_integer(source.get("expires_at", source.get("expireTime")), None), + raw=dict(source), + ) diff --git a/app/src/doctor_workstation/core/permissions.py b/app/src/doctor_workstation/core/permissions.py new file mode 100644 index 000000000..5a3824509 --- /dev/null +++ b/app/src/doctor_workstation/core/permissions.py @@ -0,0 +1,152 @@ +"""Immutable permission helpers matching the admin client's semantics.""" + +from __future__ import annotations + +from collections.abc import Iterable, Iterator +from dataclasses import dataclass + + +def _normalise(values: Iterable[str] | str | None) -> frozenset[str]: + if values is None: + return frozenset() + candidates = (values,) if isinstance(values, str) else values + return frozenset(value.strip() for value in candidates if value and value.strip()) + + +def _requirements(values: tuple[object, ...]) -> tuple[str, ...]: + if len(values) == 1 and not isinstance(values[0], str): + candidate = values[0] + if isinstance(candidate, Iterable): + values = tuple(candidate) + return tuple(str(value).strip() for value in values if value is not None and str(value).strip()) + + +@dataclass(frozen=True, slots=True, init=False) +class PermissionSet: + """A permission collection supporting wildcard, AND and OR checks. + + ``permissions`` accepts the flat permission list returned by ``mySelf``. + ``pages`` and ``actions`` are optional categories for callers that keep UI + navigation and action capabilities separate; checks operate on their union. + """ + + permissions: frozenset[str] + page_permissions: frozenset[str] + action_permissions: frozenset[str] + + def __init__( + self, + permissions: Iterable[str] | str | None = None, + *, + pages: Iterable[str] | str | None = None, + actions: Iterable[str] | str | None = None, + page_permissions: Iterable[str] | str | None = None, + action_permissions: Iterable[str] | str | None = None, + ) -> None: + """Create an immutable, whitespace-normalised permission set.""" + + object.__setattr__(self, "permissions", _normalise(permissions)) + object.__setattr__( + self, + "page_permissions", + _normalise(pages) | _normalise(page_permissions), + ) + object.__setattr__( + self, + "action_permissions", + _normalise(actions) | _normalise(action_permissions), + ) + + @property + def is_superuser(self) -> bool: + """Return whether the global ``*`` wildcard is present.""" + + return "*" in self._all_permissions + + @property + def _all_permissions(self) -> frozenset[str]: + return self.permissions | self.page_permissions | self.action_permissions + + def has(self, permission: str) -> bool: + """Return whether an exact or wildcard grant covers ``permission``.""" + + required = permission.strip() + if not required: + return False + grants = self._all_permissions + if "*" in grants or required in grants: + return True + return any(grant.endswith("/*") and required.startswith(grant[:-1]) for grant in grants) + + def allows(self, permission: str) -> bool: + """Alias for :meth:`has`, convenient in UI guard code.""" + + return self.has(permission) + + def has_all(self, *permissions: object) -> bool: + """Return true when every requested permission is granted (AND).""" + + return all(self.has(permission) for permission in _requirements(permissions)) + + def all(self, *permissions: object) -> bool: + """Alias for :meth:`has_all`, mirroring the web client's AND helper.""" + + return self.has_all(*permissions) + + def has_any(self, *permissions: object) -> bool: + """Return true when at least one requested permission is granted (OR).""" + + return any(self.has(permission) for permission in _requirements(permissions)) + + def any(self, *permissions: object) -> bool: + """Alias for :meth:`has_any`, mirroring ``v-perms`` OR semantics.""" + + return self.has_any(*permissions) + + def can_access_page(self, permission: str) -> bool: + """Check the permission protecting a page or navigation entry.""" + + return self.has(permission) + + def has_page(self, permission: str) -> bool: + """Alias for :meth:`can_access_page`.""" + + return self.can_access_page(permission) + + def can_perform_action(self, permission: str) -> bool: + """Check the permission protecting a button or write action.""" + + return self.has(permission) + + def has_action(self, permission: str) -> bool: + """Alias for :meth:`can_perform_action`.""" + + return self.can_perform_action(permission) + + def can(self, page_or_permission: str, action: str | None = None) -> bool: + """Check a direct permission or a ``page/action`` combination.""" + + if action is None: + return self.has(page_or_permission) + permission = f"{page_or_permission.rstrip('/')}/{action.lstrip('/')}" + return self.has(permission) + + def __contains__(self, permission: object) -> bool: + """Support ``permission in permission_set`` checks.""" + + return isinstance(permission, str) and self.has(permission) + + def __iter__(self) -> Iterator[str]: + """Iterate over all explicit grants in stable sorted order.""" + + return iter(sorted(self._all_permissions)) + + def __len__(self) -> int: + """Return the number of distinct explicit grants.""" + + return len(self._all_permissions) + + def __bool__(self) -> bool: + """Return whether at least one grant exists.""" + + return bool(self._all_permissions) diff --git a/app/src/doctor_workstation/core/session.py b/app/src/doctor_workstation/core/session.py new file mode 100644 index 000000000..2fae53a24 --- /dev/null +++ b/app/src/doctor_workstation/core/session.py @@ -0,0 +1,40 @@ +"""Authenticated session state independent of the UI framework.""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Any + +from .models import UserProfile +from .permissions import PermissionSet + + +@dataclass(slots=True) +class Session: + """The token, user, permissions and login guards for one signed-in doctor.""" + + token: str = "" + user: UserProfile = field(default_factory=UserProfile) + permissions: PermissionSet = field(default_factory=PermissionSet) + menu: list[dict[str, Any]] = field(default_factory=list) + is_paw: int = 1 + need_bind_work_wechat: bool = False + metadata: dict[str, Any] = field(default_factory=dict, repr=False) + + @property + def authenticated(self) -> bool: + """Return whether this session contains a non-empty access token.""" + + return bool(self.token.strip()) + + @property + def password_change_required(self) -> bool: + """Return whether first-login password replacement is required.""" + + return self.is_paw == 0 + + @property + def work_wechat_binding_required(self) -> bool: + """Return whether the user must bind Enterprise WeChat before use.""" + + return self.need_bind_work_wechat diff --git a/app/src/doctor_workstation/logging_setup.py b/app/src/doctor_workstation/logging_setup.py new file mode 100644 index 000000000..17fcc07e0 --- /dev/null +++ b/app/src/doctor_workstation/logging_setup.py @@ -0,0 +1,58 @@ +"""Structured application logging with credential redaction.""" + +from __future__ import annotations + +import logging +import re +from logging.handlers import RotatingFileHandler +from pathlib import Path + +_SECRET_PATTERNS = ( + re.compile(r'(?i)(token|usersig|authorization)(["\'\s:=]+)([^,\s"\']+)'), + re.compile(r'(?i)(password)(["\'\s:=]+)([^,\s"\']+)'), +) + + +class SecretRedactionFilter(logging.Filter): + """Remove known credential-shaped values from every rendered log record.""" + + def filter(self, record: logging.LogRecord) -> bool: + rendered = record.getMessage() + for pattern in _SECRET_PATTERNS: + rendered = pattern.sub(r"\1\2", rendered) + record.msg = rendered + record.args = () + return True + + +def configure_logging(log_dir: Path, level: str = "INFO") -> Path: + """Configure console and rotating file logging and return the log path.""" + + log_dir.mkdir(parents=True, exist_ok=True) + log_file = log_dir / "doctor-workstation.log" + numeric_level = getattr(logging, level.upper(), logging.INFO) + formatter = logging.Formatter( + fmt="%(asctime)s %(levelname)s %(name)s — %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + ) + redaction = SecretRedactionFilter() + + root = logging.getLogger() + root.setLevel(numeric_level) + root.handlers.clear() + + file_handler = RotatingFileHandler( + log_file, + maxBytes=2 * 1024 * 1024, + backupCount=4, + encoding="utf-8", + ) + file_handler.setFormatter(formatter) + file_handler.addFilter(redaction) + root.addHandler(file_handler) + + console = logging.StreamHandler() + console.setFormatter(formatter) + console.addFilter(redaction) + root.addHandler(console) + return log_file diff --git a/app/src/doctor_workstation/resources.py b/app/src/doctor_workstation/resources.py new file mode 100644 index 000000000..fbee0b182 --- /dev/null +++ b/app/src/doctor_workstation/resources.py @@ -0,0 +1,28 @@ +"""Locate bundled resources in source and PyInstaller builds.""" + +from __future__ import annotations + +import sys +from pathlib import Path + + +def project_root() -> Path: + frozen_root = getattr(sys, "_MEIPASS", None) + if frozen_root: + return Path(frozen_root) + return Path(__file__).resolve().parents[2] + + +def resource_path(*parts: str) -> Path: + return project_root().joinpath("resources", *parts) + + +def video_dist_path() -> Path: + candidates = ( + project_root() / "video_companion" / "dist" / "index.html", + project_root() / "video_companion_dist" / "index.html", + ) + for candidate in candidates: + if candidate.exists(): + return candidate + return resource_path("video", "index.html") diff --git a/app/src/doctor_workstation/services/__init__.py b/app/src/doctor_workstation/services/__init__.py new file mode 100644 index 000000000..db2f6858b --- /dev/null +++ b/app/src/doctor_workstation/services/__init__.py @@ -0,0 +1,27 @@ +"""Transport, credential and repository adapters for the doctor workstation.""" + +from .api_client import ApiClient +from .factory import build_repository +from .mock_repository import DEMO_PERMISSIONS, DemoDoctorRepository +from .repository import ( + PRESCRIPTION_LIBRARY_PERMISSIONS, + PRESCRIPTION_PERMISSIONS, + AuditAction, + DoctorRepository, + RemoteDoctorRepository, +) +from .token_store import KeyringLike, TokenStore + +__all__ = [ + "ApiClient", + "AuditAction", + "DEMO_PERMISSIONS", + "DemoDoctorRepository", + "DoctorRepository", + "KeyringLike", + "PRESCRIPTION_LIBRARY_PERMISSIONS", + "PRESCRIPTION_PERMISSIONS", + "RemoteDoctorRepository", + "TokenStore", + "build_repository", +] diff --git a/app/src/doctor_workstation/services/api_client.py b/app/src/doctor_workstation/services/api_client.py new file mode 100644 index 000000000..5b8cd0f6c --- /dev/null +++ b/app/src/doctor_workstation/services/api_client.py @@ -0,0 +1,348 @@ +"""Synchronous HTTP client for the legacy admin API envelope.""" + +from __future__ import annotations + +import time +from collections.abc import Callable, Mapping +from threading import RLock +from typing import Any +from urllib.parse import urlsplit, urlunsplit + +import httpx + +from doctor_workstation.core.errors import ( + ApiBusinessError, + ApiHttpError, + ApiProtocolError, + ApiTimeoutError, + ApiTransportError, + AuthenticationExpiredError, + InstallationRequiredError, + OpenPageRequiredError, + WorkWechatBindingRequiredError, +) + + +class ApiClient: + """A small, testable client implementing the admin API contract. + + The supplied base URL may be either the site origin or an URL already + ending in ``/adminapi``. Timeout retries are deliberately limited to GET + requests so that medical write operations are never submitted twice. + """ + + API_VERSION = "1.9.4" + + def __init__( + self, + base_url: str, + *, + token: str = "", + timeout: float | httpx.Timeout = 30.0, + max_retries: int = 2, + retry_backoff: float = 0.0, + verify: bool = True, + transport: httpx.BaseTransport | None = None, + client: httpx.Client | None = None, + sleep: Callable[[float], None] = time.sleep, + ) -> None: + """Create a client without performing any network requests.""" + + if max_retries < 0: + raise ValueError("max_retries must be non-negative") + if retry_backoff < 0: + raise ValueError("retry_backoff must be non-negative") + if client is not None and transport is not None: + raise ValueError("pass either client or transport, not both") + self.base_url = self.normalise_base_url(base_url) + self.timeout = timeout + self.max_retries = max_retries + self.retry_backoff = retry_backoff + self._sleep = sleep + self._token = token.strip() + self._lock = RLock() + self._owns_client = client is None + self._client = client or httpx.Client(transport=transport, verify=verify) + + @staticmethod + def normalise_base_url(base_url: str) -> str: + """Return an absolute URL ending in exactly one ``/adminapi/``.""" + + candidate = base_url.strip() + parsed = urlsplit(candidate) + if parsed.scheme not in {"http", "https"} or not parsed.netloc: + raise ValueError("base_url must be an absolute http(s) URL") + if parsed.query or parsed.fragment: + raise ValueError("base_url must not include query parameters or fragments") + path = parsed.path.rstrip("/") + if path.lower().endswith("/adminapi"): + normalised_path = f"{path}/" + else: + normalised_path = f"{path}/adminapi/" if path else "/adminapi/" + return urlunsplit((parsed.scheme, parsed.netloc, normalised_path, "", "")) + + @property + def token(self) -> str: + """Return the current in-memory access token.""" + + with self._lock: + return self._token + + @token.setter + def token(self, value: str) -> None: + """Replace the in-memory access token used by later requests.""" + + with self._lock: + self._token = value.strip() + + def set_token(self, token: str) -> None: + """Set the authentication token; provided for explicit session code.""" + + self.token = token + + def clear_token(self) -> None: + """Remove the authentication token from memory.""" + + self.token = "" + + def get( + self, + endpoint: str, + params: Mapping[str, Any] | None = None, + *, + headers: Mapping[str, str] | None = None, + ) -> Any: + """Issue a GET request and return the unwrapped envelope data.""" + + return self.request("GET", endpoint, params=params, headers=headers) + + def post( + self, + endpoint: str, + payload: Mapping[str, Any] | None = None, + *, + json: Mapping[str, Any] | None = None, + headers: Mapping[str, str] | None = None, + ) -> Any: + """Issue a non-retried JSON POST and return the unwrapped data.""" + + if payload is not None and json is not None: + raise ValueError("pass either payload or json, not both") + body = json if json is not None else payload + return self.request("POST", endpoint, json=body or {}, headers=headers) + + def post_multipart( + self, + endpoint: str, + *, + files: Mapping[str, Any], + data: Mapping[str, Any] | None = None, + headers: Mapping[str, str] | None = None, + ) -> Any: + """Issue a non-retried multipart POST and return unwrapped data. + + ``httpx`` owns the multipart boundary. In particular this method does + not inherit the JSON ``Content-Type`` used by ordinary API writes. + File objects remain owned by the caller and are consumed synchronously. + """ + + if not files: + raise ValueError("multipart files must not be empty") + return self.request( + "POST", + endpoint, + data=data or {}, + files=files, + headers=headers, + ) + + def request( + self, + method: str, + endpoint: str, + *, + params: Mapping[str, Any] | None = None, + json: Mapping[str, Any] | None = None, + data: Mapping[str, Any] | None = None, + files: Mapping[str, Any] | None = None, + headers: Mapping[str, str] | None = None, + ) -> Any: + """Issue one API request with structured transport/envelope errors.""" + + verb = method.upper().strip() + if verb not in {"GET", "POST"}: + raise ValueError("ApiClient only supports GET and POST") + if verb == "GET" and (json is not None or data is not None or files is not None): + raise ValueError("GET requests cannot include a body") + if json is not None and (data is not None or files is not None): + raise ValueError("JSON and multipart/form data are mutually exclusive") + if files is not None and verb != "POST": + raise ValueError("multipart uploads require POST") + url = self._endpoint_url(endpoint) + request_headers = self._headers( + headers, + json_content_type=files is None and data is None, + ) + attempts = self.max_retries + 1 if verb == "GET" else 1 + response: httpx.Response | None = None + for attempt in range(attempts): + try: + response = self._client.request( + verb, + url, + params=dict(params) if params is not None else None, + json=dict(json) if verb == "POST" and json is not None else None, + data=dict(data) if verb == "POST" and data is not None else None, + files=dict(files) if files is not None else None, + headers=request_headers, + timeout=self.timeout, + ) + break + except httpx.TimeoutException as exc: + if attempt + 1 < attempts: + delay = self.retry_backoff * (2**attempt) + if delay: + self._sleep(delay) + continue + raise ApiTimeoutError( + f"{verb} {endpoint} timed out after {attempt + 1} attempt(s)", + data={"method": verb, "endpoint": endpoint, "attempts": attempt + 1}, + ) from exc + except httpx.RequestError as exc: + raise ApiTransportError( + f"{verb} {endpoint} failed: {exc}", + data={"method": verb, "endpoint": endpoint}, + ) from exc + if response is None: # Defensive; the loop always returns or raises. + raise ApiTransportError(f"{verb} {endpoint} produced no response") + return self._unwrap(response) + + def close(self) -> None: + """Close the internally-created HTTP transport.""" + + if self._owns_client: + self._client.close() + + def __enter__(self) -> ApiClient: + """Return this client for use as a context manager.""" + + return self + + def __exit__(self, exc_type: object, exc: object, traceback: object) -> None: + """Close owned resources when leaving a context manager.""" + + self.close() + + def _endpoint_url(self, endpoint: str) -> str: + value = endpoint.strip() + parsed = urlsplit(value) + if parsed.scheme or parsed.netloc: + raise ValueError("endpoint must be a relative API path") + path = parsed.path.lstrip("/") + if path.lower().startswith("adminapi/"): + path = path[len("adminapi/") :] + if not path: + raise ValueError("endpoint must not be empty") + suffix = f"?{parsed.query}" if parsed.query else "" + return f"{self.base_url}{path}{suffix}" + + def _headers( + self, + extra: Mapping[str, str] | None, + *, + json_content_type: bool = True, + ) -> dict[str, str]: + result = { + "Accept": "application/json", + "version": self.API_VERSION, + } + if json_content_type: + result["Content-Type"] = "application/json;charset=UTF-8" + token = self.token + if token: + result["token"] = token + if extra: + result.update(extra) + if not json_content_type: + for key in tuple(result): + if key.lower() == "content-type": + result.pop(key) + return result + + @staticmethod + def _request_id(response: httpx.Response) -> str | None: + return response.headers.get("x-request-id") or response.headers.get("request-id") + + def _unwrap(self, response: httpx.Response) -> Any: + request_id = self._request_id(response) + if not 200 <= response.status_code < 300: + raise ApiHttpError( + f"API returned HTTP {response.status_code}", + status_code=response.status_code, + request_id=request_id, + ) + try: + envelope = response.json() + except (ValueError, UnicodeDecodeError) as exc: + raise ApiProtocolError( + "API response is not valid JSON", + status_code=response.status_code, + request_id=request_id, + ) from exc + if not isinstance(envelope, Mapping): + raise ApiProtocolError( + "API response envelope must be an object", + data=envelope, + status_code=response.status_code, + request_id=request_id, + ) + raw_code = envelope.get("code") + try: + if isinstance(raw_code, bool): + raise ValueError + code = int(raw_code) + except (TypeError, ValueError) as exc: + raise ApiProtocolError( + "API response envelope has no valid code", + data=dict(envelope), + status_code=response.status_code, + request_id=request_id, + ) from exc + data = envelope.get("data") + message = str(envelope.get("msg") or envelope.get("message") or "").strip() + if code == 1: + return data + context = { + "code": code, + "data": data, + "status_code": response.status_code, + "request_id": request_id, + } + if code == 0: + if not message and isinstance(data, str): + message = data + raise ApiBusinessError(message or "API rejected the operation", **context) + if code == -1: + raise AuthenticationExpiredError(message or "Login has expired", **context) + if code == 10: + raise WorkWechatBindingRequiredError( + message or "Enterprise WeChat binding is required", **context + ) + if code == 2: + target = str(_mapping(data).get("url") or "") + raise OpenPageRequiredError( + message or "The operation must continue in another page", + url=target, + data=data, + status_code=response.status_code, + request_id=request_id, + ) + if code == -2: + raise InstallationRequiredError( + message or "A required companion component is not installed", **context + ) + raise ApiProtocolError(message or f"Unsupported API envelope code: {code}", **context) + + +def _mapping(value: object) -> Mapping[str, Any]: + return value if isinstance(value, Mapping) else {} diff --git a/app/src/doctor_workstation/services/demo_repository.py b/app/src/doctor_workstation/services/demo_repository.py new file mode 100644 index 000000000..6ab9fcd0a --- /dev/null +++ b/app/src/doctor_workstation/services/demo_repository.py @@ -0,0 +1,5 @@ +"""Compatibility module exporting the in-memory demo repository.""" + +from .mock_repository import DEMO_PERMISSIONS, DemoDoctorRepository + +__all__ = ["DEMO_PERMISSIONS", "DemoDoctorRepository"] diff --git a/app/src/doctor_workstation/services/factory.py b/app/src/doctor_workstation/services/factory.py new file mode 100644 index 000000000..ac88759d2 --- /dev/null +++ b/app/src/doctor_workstation/services/factory.py @@ -0,0 +1,46 @@ +"""Small construction helper used by the application bootstrap layer.""" + +from __future__ import annotations + +import httpx + +from .api_client import ApiClient +from .mock_repository import DemoDoctorRepository +from .repository import DoctorRepository, RemoteDoctorRepository +from .token_store import TokenStore + + +def build_repository( + *, + demo: bool, + base_url: str | None = None, + token_store: TokenStore | None = None, + client: ApiClient | None = None, + token: str = "", + timeout: float | httpx.Timeout = 30.0, + max_retries: int = 2, + verify: bool = True, +) -> DoctorRepository: + """Build a demo or remote repository without depending on ``AppConfig``. + + ``client`` is primarily useful for tests or advanced bootstrap code. For + normal remote use, provide ``base_url`` and this factory creates the + correctly configured :class:`ApiClient`. + """ + + if demo: + if client is not None: + raise ValueError("client cannot be supplied in demo mode") + return DemoDoctorRepository() + api_client = client + if api_client is None: + if base_url is None or not base_url.strip(): + raise ValueError("base_url is required in remote mode") + api_client = ApiClient( + base_url, + token=token, + timeout=timeout, + max_retries=max_retries, + verify=verify, + ) + return RemoteDoctorRepository(api_client, token_store) diff --git a/app/src/doctor_workstation/services/mock_repository.py b/app/src/doctor_workstation/services/mock_repository.py new file mode 100644 index 000000000..5294fc994 --- /dev/null +++ b/app/src/doctor_workstation/services/mock_repository.py @@ -0,0 +1,2611 @@ +"""Mutable, deterministic demonstration repository with no network dependency.""" + +from __future__ import annotations + +from collections.abc import Mapping +from copy import deepcopy +from datetime import date, datetime, timedelta +from os import PathLike +from pathlib import Path +from threading import RLock +from typing import Any, Literal, TypeVar + +from doctor_workstation.core.errors import ApiBusinessError, RepositoryNotFoundError +from doctor_workstation.core.models import ( + Appointment, + CallTicket, + Consultation, + PageResult, + Patient, + Prescription, + PrescriptionTemplate, + UserProfile, +) +from doctor_workstation.core.permissions import PermissionSet +from doctor_workstation.core.session import Session + +from .repository import ( + AuditAction, + _audit_action, + _body, + _identified_body, + _material_kind, + _prescription_payload, + _server_materials, + _template_payload, +) + +ItemT = TypeVar("ItemT") + + +DEMO_PERMISSIONS: tuple[str, ...] = ( + "doctor.appointment/lists", + "doctor.appointment/reception", + "doctor.appointment/notifyAssistant", + "doctor.appointment/addDoctorNote", + "doctor.appointment/doctorNotes", + "doctor.appointment/deleteDoctorNoteImage", + "doctor.appointment/complete", + "doctor.appointment/prescription", + "doctor.appointment/cancel", + "tcm.diagnosis/lists", + "tcm.diagnosis/edit", + "tcm.diagnosis/add", + "tcm.diagnosis/delete", + "tcm.diagnosis/readonlyDetail", + "tcm.diagnosis/videoQr", + "tcm.diagnosis/kaifang", + "tcm.diagnosis/getCallSignature", + "tcm.diagnosis/startCall", + "tcm.diagnosis/endCall", + "tcm.diagnosis/bindCallRoom", + "firstvisit.myPatient/lists", + "firstvisit.myPatient/orders", + "firstvisit.myPatient/progress", + "tcm.prescriptionLibrary/lists", + "tcm.prescriptionLibrary/add", + "tcm.prescriptionLibrary/edit", + "tcm.prescriptionLibrary/delete", + "wcf.prescription/add", + "wcf.prescription/read", + "wcf.prescription/edit", + "wcf.prescription/delete", + "tcm.prescription/lists", + "tcm.prescription/detail", + "cf.prescription/add", + "cf.prescription/read", + "cf.prescription/edit", + "cf.prescription/audit", + "cf.prescription/del", + "tcm.prescription/patchPatient", + "tcm.prescriptionOrder/create", + "tcm.prescriptionOrder/lists", + "tcm.prescriptionOrder/detail", + "tcm.prescriptionOrder/edit", + "tcm.prescriptionOrder/auditPrescription", + "tcm.prescriptionOrder/auditPayment", + "tcm.prescriptionOrder/ddcode", + "tcm.prescriptionOrder/ship", + "tcm.prescriptionOrder/addPayOrder", + "tcm.prescriptionOrder/complete", + "tcm.prescriptionOrder/refund", + "tcm.prescriptionOrder/withdraw", + "tcm.prescriptionOrder/uploadToPharmacy", + "tcm.diagnosis/assign", + "tcm.diagnosis/guahao", + "tcm.diagnosis/fillIdCard", + "doctor.medicine/lists", +) + + +class DemoDoctorRepository: + """Provide complete synthetic doctor data and real in-memory mutations. + + The documented demo credentials are ``doctor`` / ``doctor123``. No + password is retained after validation and every public data method returns + a deep copy so callers cannot accidentally bypass repository mutations. + """ + + DEMO_ACCOUNT = "doctor" + DEMO_PASSWORD = "doctor123" + DEMO_TOKEN = "demo-doctor-token" + + def __init__(self, *, today: date | None = None) -> None: + """Initialise a fresh, isolated demonstration data set.""" + + self._lock = RLock() + self._today = today or date.today() + self._session: Session | None = None + self._notified_appointments: set[int] = set() + self._appointments = self._build_appointments() + self._patients = self._build_patients() + self._consultations = self._build_consultations() + self._templates = self._build_templates() + self._prescriptions = self._build_prescriptions() + self._medicines = self._build_medicines() + self._patient_orders = self._build_patient_orders() + self._doctor_notes: dict[int, list[dict[str, Any]]] = { + 501: [ + { + "id": 1, + "diagnosis_id": 501, + "content": "晨起口干较前减轻,继续观察睡眠。", + "tongue_images": [], + "report_files": [], + "create_time": f"{self._today.isoformat()} 08:35:00", + } + ], + 502: [], + 503: [], + 504: [], + } + self._calls: dict[int, dict[str, Any]] = {} + self._assign_logs: dict[int, list[dict[str, Any]]] = { + 501: [ + { + "id": 1, + "diagnosis_id": 501, + "assistant_id": 2001, + "assistant_name": "周医助", + "create_time": f"{self._today.isoformat()} 08:20:00", + } + ], + 502: [], + 503: [], + 504: [], + } + self._tracking_notes: dict[int, list[dict[str, Any]]] = { + 501: [], + 502: [], + 503: [], + 504: [], + } + self._todos: dict[int, list[dict[str, Any]]] = { + 501: [], + 502: [], + 503: [], + 504: [], + } + self._next_note_id = 2 + self._next_material_id = 1 + self._next_call_id = 1 + self._next_order_id = max((row["id"] for row in self._patient_orders), default=0) + 1 + self._next_todo_id = 1 + + def login( + self, + account: str, + password: str, + *, + remember_account: bool = False, + ) -> Session: + """Validate the fixed demo credentials and return an all-access session.""" + + del remember_account + + if account.strip() != self.DEMO_ACCOUNT or password != self.DEMO_PASSWORD: + raise ApiBusinessError("演示账号或密码错误", code=0) + with self._lock: + user = UserProfile( + id=1001, + account=self.DEMO_ACCOUNT, + name="陈医生(演示)", + avatar="", + phone="138****0001", + role_ids=(1,), + root=False, + department_id=10, + department_name="中医门诊", + permissions=("*", *DEMO_PERMISSIONS), + raw={"id": 1001, "role_id": 1, "is_paw": 1}, + ) + self._session = Session( + token=self.DEMO_TOKEN, + user=user, + permissions=PermissionSet(("*", *DEMO_PERMISSIONS)), + menu=self._demo_menu(), + is_paw=1, + need_bind_work_wechat=False, + metadata={"demo": True}, + ) + return deepcopy(self._session) + + def restore_session(self, token: str | None = None) -> Session | None: + """Restore the deterministic demo token without requesting a password.""" + + if token != self.DEMO_TOKEN: + return None + return self.login(self.DEMO_ACCOUNT, self.DEMO_PASSWORD) + + def get_session(self) -> Session: + """Return the current demo session, creating it for offline preview if needed.""" + + with self._lock: + if self._session is None: + return self.login(self.DEMO_ACCOUNT, self.DEMO_PASSWORD) + return deepcopy(self._session) + + def get_current_user(self) -> UserProfile: + """Return the synthetic doctor profile.""" + + return self.get_session().user + + def logout(self, *, forget_account: bool = False) -> None: + """Clear only authentication state; demo business data remains available.""" + + del forget_account + with self._lock: + self._session = None + + def list_appointments( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[Appointment]: + """Return demo appointments filtered by patient, status and date.""" + + with self._lock: + rows = list(self._appointments) + keyword = str(filters.get("patient_name") or filters.get("keyword") or "").strip() + if keyword: + rows = [row for row in rows if keyword.lower() in row.patient_name.lower()] + if filters.get("status") not in (None, ""): + status = str(filters["status"]) + rows = [row for row in rows if str(row.status) == status] + start_date = str(filters.get("start_date") or "") + end_date = str(filters.get("end_date") or "") + if ( + str(filters.get("status") or "") in {"1", "4"} + and not start_date + and not end_date + and not filters.get("diag_scope_relax") + ): + start_date = end_date = self._today.isoformat() + if start_date: + rows = [row for row in rows if row.appointment_date >= start_date] + if end_date: + rows = [row for row in rows if row.appointment_date <= end_date] + status_counts: dict[str, int] = {} + for row in self._appointments: + key = str(row.status) + status_counts[key] = status_counts.get(key, 0) + 1 + return _page(rows, page_no, page_size, {"status_count": status_counts}) + + def list_reception_queue( + self, + *, + status: int, + keyword: str = "", + page_no: int = 1, + page_size: int = 15, + on_date: date | str | None = None, + ) -> PageResult[Appointment]: + """Return a deterministic reception queue limited to one date.""" + + if status not in {1, 4}: + raise ValueError("reception status must be 1 or 4") + day = on_date.isoformat() if isinstance(on_date, date) else str(on_date or "") + day = day.strip() or self._today.isoformat() + return self.list_appointments( + status=status, + keyword=keyword, + start_date=day, + end_date=day, + page_no=page_no, + page_size=page_size, + ) + + def list_appointment_rosters( + self, + *, + doctor_id: int, + start_date: str, + end_date: str, + status: int = 1, + page_no: int = 1, + page_size: int = 100, + ) -> PageResult[dict[str, Any]]: + """Return seven-day demo rosters for the configured doctor.""" + + if doctor_id <= 0: + raise ValueError("doctor_id must be positive") + if not start_date.strip() or not end_date.strip(): + raise ValueError("start_date and end_date are required") + if start_date > end_date: + raise ValueError("start_date cannot be after end_date") + rows: list[dict[str, Any]] = [] + if doctor_id == 1001 and status == 1: + cursor = date.fromisoformat(start_date) + boundary = date.fromisoformat(end_date) + while cursor <= boundary: + rows.append( + { + "id": 10_000 + len(rows), + "doctor_id": doctor_id, + "doctor_name": "陈医生(演示)", + "date": cursor.isoformat(), + "status": 1, + "period": "all", + } + ) + cursor += timedelta(days=1) + return _page(rows, page_no, page_size) + + def get_available_appointment_slots( + self, + *, + doctor_id: int, + appointment_date: str, + period: str = "all", + ) -> dict[str, Any]: + """Return deterministic demo slots with current bookings marked unavailable.""" + + if doctor_id <= 0: + raise ValueError("doctor_id must be positive") + if not appointment_date.strip(): + raise ValueError("appointment_date is required") + if doctor_id != 1001: + return {"slots": [], "doctor_id": doctor_id, "appointment_date": appointment_date} + booked = { + row.appointment_time.split("-", 1)[0] + for row in self._appointments + if row.doctor_id == doctor_id + and row.appointment_date == appointment_date + and str(row.status) in {"1", "4"} + } + times = ("09:00", "09:30", "10:00", "10:30", "14:00", "14:30", "15:00") + return { + "doctor_id": doctor_id, + "appointment_date": appointment_date, + "period": period or "all", + "slots": [{"time": value, "available": value not in booked} for value in times], + } + + def get_reception(self, appointment_id: int) -> dict[str, Any]: + """Return a current aggregate view including all newly added notes.""" + + with self._lock: + appointment = self._find_appointment(appointment_id) + consultation = next( + (row for row in self._consultations if row.id == appointment.diagnosis_id), + None, + ) + return deepcopy( + { + "appointment": _appointment_dict(appointment), + "diagnosis": dict(consultation.raw) if consultation else {}, + "doctor_notes": self._doctor_notes.get(appointment.diagnosis_id or 0, []), + } + ) + + def notify_assistant(self, appointment_id: int) -> dict[str, Any]: + """Record that the demo appointment's assistant was notified.""" + + with self._lock: + self._find_appointment(appointment_id) + self._notified_appointments.add(appointment_id) + return {"id": appointment_id, "notified": True} + + def upload_material( + self, + path: str | PathLike[str], + material_type: Literal["image", "file", "tongue_images", "report_files"], + cid: int = 0, + ) -> str: + """Copy a local-material identity into a safe synthetic server URI.""" + + if cid < 0: + raise ValueError("cid must be non-negative") + source = Path(path) + if not source.is_file(): + raise FileNotFoundError(f"material file does not exist: {source}") + kind = _material_kind(material_type) + with self._lock: + material_id = self._next_material_id + self._next_material_id += 1 + safe_name = source.name.replace("\\", "_").replace("/", "_") + return f"/demo/uploads/{kind}/{material_id}-{safe_name}" + + def add_doctor_note( + self, + diagnosis_id: int, + content: str = "", + *, + tongue_images: list[str] | tuple[str, ...] | None = None, + report_files: list[str] | tuple[str, ...] | None = None, + ) -> dict[str, Any]: + """Append a durable note to this repository instance.""" + + if len(content) > 500: + raise ValueError("doctor note content cannot exceed 500 characters") + if len(tongue_images or ()) > 99 or len(report_files or ()) > 99: + raise ValueError("doctor note media cannot exceed 99 items per type") + if not content.strip() and not tongue_images and not report_files: + raise ValueError("a note must contain text, an image or a report") + with self._lock: + if not any(row.id == diagnosis_id for row in self._consultations): + raise RepositoryNotFoundError(f"consultation {diagnosis_id} not found") + clean_tongue = _server_materials(tongue_images, "tongue_images") + clean_reports = _server_materials(report_files, "report_files") + note = { + "id": self._next_note_id, + "diagnosis_id": diagnosis_id, + "content": content.strip(), + "tongue_images": clean_tongue, + "report_files": clean_reports, + "create_time": datetime.now().replace(microsecond=0).isoformat(sep=" "), + } + self._next_note_id += 1 + self._doctor_notes.setdefault(diagnosis_id, []).append(note) + return deepcopy(note) + + def get_doctor_notes(self, diagnosis_id: int) -> list[dict[str, Any]]: + """Return all demo notes for a diagnosis in insertion order.""" + + with self._lock: + return deepcopy(self._doctor_notes.get(diagnosis_id, [])) + + def delete_doctor_note_image( + self, + note_id: int, + image_type: str, + image_path: str, + ) -> dict[str, Any]: + """Remove one media path while retaining the surrounding demo note.""" + + if image_type not in {"tongue_images", "report_files"}: + raise ValueError("image_type must be tongue_images or report_files") + with self._lock: + for notes in self._doctor_notes.values(): + for note in notes: + if int(note.get("id") or 0) != note_id: + continue + values = note.get(image_type) + if not isinstance(values, list) or image_path not in values: + raise RepositoryNotFoundError("doctor-note image not found") + values.remove(image_path) + return { + "note_id": note_id, + "image_type": image_type, + "image_path": image_path, + "deleted": True, + } + raise RepositoryNotFoundError(f"doctor note {note_id} not found") + + def complete_appointment(self, appointment_id: int) -> dict[str, Any]: + """Persistently transition a demo appointment to completed status ``3``.""" + + with self._lock: + appointment = self._find_appointment(appointment_id) + if str(appointment.status) not in {"1", "4"}: + raise ApiBusinessError("当前挂号状态不可完成接诊", code=0) + appointment.status = 3 + appointment.status_desc = "已完成" + appointment.raw["status"] = 3 + appointment.raw["status_desc"] = "已完成" + for patient in self._patients: + if patient.appointment_id == appointment_id: + patient.appointment_status = 3 + patient.appointment_status_text = "已完成" + patient.status_filter = "completed" + patient.raw.update( + { + "appointment_status": 3, + "appointment_status_text": "已完成", + "status_filter": "completed", + } + ) + for consultation in self._consultations: + if consultation.appointment_id == appointment_id: + consultation.appointment_status = 3 + consultation.appointment_status_text = "已完成" + # Retain the legacy status transition expected by existing + # consumers while keeping the explicit domains separated. + consultation.status = 3 + consultation.status_desc = "已完成" + consultation.raw.update( + { + "status": 3, + "status_desc": "已完成", + "appointment_status": 3, + "appointment_status_text": "已完成", + } + ) + return {"id": appointment_id, "status": 3, "status_desc": "已完成"} + + def list_prescription_templates( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[PrescriptionTemplate]: + """Return templates with the same name/type/public filters as production.""" + + with self._lock: + rows = list(self._templates) + name = str(filters.get("prescription_name") or filters.get("keyword") or "").strip() + if name: + rows = [row for row in rows if name.lower() in row.name.lower()] + if filters.get("formula_type") not in (None, ""): + formula_type = _formula_key(filters["formula_type"]) + rows = [row for row in rows if _formula_key(row.formula_type) == formula_type] + if filters.get("is_public") not in (None, ""): + public = _bool(filters["is_public"]) + rows = [row for row in rows if row.is_public is public] + return _page(rows, page_no, page_size) + + def get_prescription_template(self, template_id: int) -> PrescriptionTemplate: + """Return one current demo template.""" + + with self._lock: + return deepcopy(self._find_template(template_id)) + + def create_prescription_template( + self, + template: PrescriptionTemplate | Mapping[str, Any] | None = None, + **fields: Any, + ) -> PrescriptionTemplate: + """Create and retain a new in-memory prescription template.""" + + body = _template_payload(template, fields, include_id=False) + with self._lock: + template_id = max((item.id for item in self._templates), default=0) + 1 + body.update( + { + "id": template_id, + "creator_id": 1001, + "creator_name": "陈医生(演示)", + "create_time": datetime.now().replace(microsecond=0).isoformat(sep=" "), + } + ) + created = PrescriptionTemplate.from_dict(body) + self._templates.append(created) + return deepcopy(created) + + def update_prescription_template( + self, + template: int | PrescriptionTemplate | Mapping[str, Any], + changes: Mapping[str, Any] | None = None, + **fields: Any, + ) -> PrescriptionTemplate: + """Merge edits into and retain an existing in-memory template.""" + + with self._lock: + if isinstance(template, int): + template_id = template + original = self._find_template(template_id) + body: dict[str, Any] = { + "id": original.id, + "prescription_name": original.name, + "formula_type": original.formula_type, + "herbs": deepcopy(original.herbs), + "is_public": int(original.is_public), + "disable_edit": int(original.disable_edit), + "creator_id": original.creator_id, + "creator_name": original.creator_name, + "create_time": original.create_time, + } + incoming = dict(changes or {}) + incoming.update(fields) + if "name" in incoming and "prescription_name" not in incoming: + incoming["prescription_name"] = incoming.pop("name") + body.update(incoming) + else: + incoming = dict(changes or {}) + incoming.update(fields) + body = _template_payload(template, incoming, include_id=True) + template_id = int(body.get("id") or 0) + original = self._find_template(template_id) + body.setdefault("creator_id", original.creator_id) + body.setdefault("creator_name", original.creator_name) + body.setdefault("create_time", original.create_time) + if not str(body.get("prescription_name") or "").strip(): + raise ValueError("prescription template name is required") + updated = PrescriptionTemplate.from_dict(body) + index = self._templates.index(original) + self._templates[index] = updated + return deepcopy(updated) + + def delete_prescription_template(self, template_id: int) -> dict[str, Any]: + """Remove a template from this repository instance.""" + + with self._lock: + template = self._find_template(template_id) + self._templates.remove(template) + return {"id": template_id, "deleted": True} + + def list_medicines( + self, + *, + name: str = "", + page_no: int = 1, + page_size: int = 100, + status: int = 1, + ) -> PageResult[dict[str, Any]]: + """Return selectable demo medicines with exact-name search support.""" + + with self._lock: + rows = [row for row in self._medicines if int(row.get("status", 0)) == status] + if name.strip(): + needle = name.strip().lower() + rows = [row for row in rows if needle in str(row.get("name", "")).lower()] + return _page(rows, page_no, page_size) + + def list_prescriptions( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[Prescription]: + """Return issued demo prescriptions with common production filters.""" + + with self._lock: + rows = list(self._prescriptions) + patient_name = str(filters.get("patient_name") or "").strip() + sn = str(filters.get("sn") or "").strip() + keyword = str(filters.get("keyword") or "").strip() + if patient_name: + rows = [row for row in rows if patient_name.lower() in row.patient_name.lower()] + if sn: + rows = [row for row in rows if sn.lower() in row.sn.lower()] + if keyword: + rows = [ + row + for row in rows + if keyword.lower() in row.sn.lower() + or keyword.lower() in row.patient_name.lower() + ] + audit_value = filters.get( + "audit_filter", filters.get("audit_status", filters.get("status")) + ) + if audit_value not in (None, "", "all"): + audit_text = str(audit_value).lower() + if audit_text in {"pending", "0"}: + rows = [row for row in rows if row.audit_status == 0] + elif audit_text in {"passed", "1"}: + rows = [row for row in rows if row.audit_status == 1] + elif audit_text in {"not_passed", "rejected", "2"}: + rows = [ + row + for row in rows + if row.audit_status == 2 or row.business_prescription_audit_rejected + ] + source_filter = str(filters.get("source_filter") or "").lower() + if source_filter == "system": + rows = [row for row in rows if row.is_system_auto] + elif source_filter == "manual": + rows = [row for row in rows if not row.is_system_auto] + creator_ids = filters.get("creator_ids") + if isinstance(creator_ids, (list, tuple, set)) and creator_ids: + creator_set = {int(value) for value in creator_ids} + rows = [row for row in rows if row.creator_id in creator_set] + start_time = str(filters.get("start_time") or "") + end_time = str(filters.get("end_time") or "") + if start_time: + rows = [row for row in rows if row.create_time >= start_time] + if end_time: + rows = [row for row in rows if row.create_time <= end_time] + return _page(rows, page_no, page_size) + + def get_prescription(self, prescription_id: int) -> Prescription: + """Return one issued demo prescription by identifier.""" + + with self._lock: + for prescription in self._prescriptions: + if prescription.id == prescription_id: + return deepcopy(prescription) + raise RepositoryNotFoundError(f"prescription {prescription_id} not found") + + def create_prescription( + self, + prescription: Prescription | Mapping[str, Any] | None = None, + **fields: Any, + ) -> Prescription: + """Create and retain a complete issued prescription DTO.""" + + body = _prescription_payload(prescription, fields, include_id=False) + with self._lock: + prescription_id = max((row.id for row in self._prescriptions), default=0) + 1 + body.setdefault("sn", f"RX{self._today.strftime('%Y%m%d')}{prescription_id}") + body.setdefault("audit_status", 0) + body.setdefault("void_status", 0) + body.setdefault("creator_id", 1001) + body.setdefault("doctor_name", "陈医生(演示)") + body.setdefault("create_time", datetime.now().replace(microsecond=0).isoformat(sep=" ")) + body["id"] = prescription_id + created = Prescription.from_dict(body) + self._prescriptions.append(created) + self._sync_prescription_flag(created.diagnosis_id) + return deepcopy(created) + + def update_prescription( + self, + prescription: int | Prescription | Mapping[str, Any], + changes: Mapping[str, Any] | None = None, + **fields: Any, + ) -> Prescription: + """Merge edits into an issued demo prescription and reset it pending.""" + + with self._lock: + prescription_id = ( + prescription + if isinstance(prescription, int) + else int( + prescription.id + if isinstance(prescription, Prescription) + else prescription.get("id") or 0 + ) + ) + original = self._find_prescription(prescription_id) + body = dict(original.raw) + body.update(original.to_api_dict()) + if not isinstance(prescription, int): + body.update( + prescription.to_api_dict() + if isinstance(prescription, Prescription) + else dict(prescription) + ) + body.update(changes or {}) + body.update(fields) + body["id"] = prescription_id + body["audit_status"] = 0 + body["audit_remark"] = "" + body["void_status"] = 0 + updated = Prescription.from_dict(body) + self._prescriptions[self._prescriptions.index(original)] = updated + self._sync_prescription_flag(updated.diagnosis_id) + return deepcopy(updated) + + def delete_prescription(self, prescription_id: int) -> dict[str, Any]: + """Delete an eligible demo prescription and update related list flags.""" + + with self._lock: + prescription = self._find_prescription(prescription_id) + if prescription.audit_status == 1 and not prescription.void_status: + raise ApiBusinessError("已审核通过的处方不可删除", code=0) + self._prescriptions.remove(prescription) + self._sync_prescription_flag(prescription.diagnosis_id) + return {"id": prescription_id, "deleted": True} + + def patch_prescription_patient( + self, + prescription_id: int, + *, + patient_name: str, + phone: str, + gender: int, + ) -> dict[str, Any]: + """Persist patient corrections without changing audit state.""" + + with self._lock: + prescription = self._find_prescription(prescription_id) + if prescription.void_status: + raise ApiBusinessError("已作废处方不可修正患者", code=0) + prescription.patient_name = patient_name.strip() + prescription.phone = phone.strip() + prescription.gender = gender + prescription.raw.update( + { + "patient_name": prescription.patient_name, + "phone": prescription.phone, + "gender": gender, + } + ) + for order in self._patient_orders: + if int(order.get("prescription_id") or 0) == prescription_id: + order.update( + {"patient_name": prescription.patient_name, "phone": prescription.phone} + ) + return { + "id": prescription_id, + "patient_name": prescription.patient_name, + "phone": prescription.phone, + "gender": gender, + } + + def audit_prescription( + self, + prescription_id: int, + *, + action: AuditAction, + remark: str = "", + ) -> dict[str, Any]: + """Apply approve/reject state, including reject-and-void semantics.""" + + action = _audit_action(action, remark) + with self._lock: + prescription = self._find_prescription(prescription_id) + prescription.audit_status = 1 if action == "approve" else 2 + prescription.audit_remark = remark.strip() + prescription.audit_by_name = "审核员(演示)" + prescription.audit_time = datetime.now().replace(microsecond=0).isoformat(sep=" ") + if action == "reject": + prescription.void_status = 1 + prescription.void_by_name = "审核员(演示)" + prescription.void_time = prescription.audit_time + prescription.raw.update( + { + "audit_status": prescription.audit_status, + "audit_remark": prescription.audit_remark, + "audit_by_name": prescription.audit_by_name, + "audit_time": prescription.audit_time, + "void_status": prescription.void_status, + } + ) + return { + "id": prescription_id, + "audit_status": prescription.audit_status, + "void_status": prescription.void_status, + "wecom_notify_ok": True, + } + + def void_prescription(self, prescription_id: int) -> dict[str, Any]: + """Void a demo prescription unless a business order is attached.""" + + with self._lock: + prescription = self._find_prescription(prescription_id) + if prescription.has_prescription_order: + raise ApiBusinessError("已有业务订单,处方不可作废", code=0) + prescription.void_status = 1 + prescription.void_by_name = "陈医生(演示)" + prescription.void_time = datetime.now().replace(microsecond=0).isoformat(sep=" ") + prescription.raw.update( + { + "void_status": 1, + "void_by_name": prescription.void_by_name, + "void_time": prescription.void_time, + } + ) + return {"id": prescription_id, "void_status": 1} + + def list_prescriptions_by_diagnosis(self, diagnosis_id: int) -> list[Prescription]: + """Return copies of all prescriptions for one diagnosis.""" + + with self._lock: + return deepcopy( + [row for row in self._prescriptions if row.diagnosis_id == diagnosis_id] + ) + + def get_prescription_by_appointment(self, appointment_id: int) -> Prescription | None: + """Return only the prescription explicitly linked to this appointment.""" + + with self._lock: + self._find_appointment(appointment_id) + match = next( + (row for row in self._prescriptions if row.appointment_id == appointment_id), + None, + ) + return deepcopy(match) + + def list_prescription_orders( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[dict[str, Any]]: + """List all demo fulfilment orders with exact common filters.""" + + with self._lock: + return _page(self._filter_orders(filters), page_no, page_size, self._order_summary()) + + def get_prescription_order(self, order_id: int) -> dict[str, Any]: + """Return one complete demo fulfilment order.""" + + with self._lock: + return deepcopy(self._find_order(order_id)) + + def create_prescription_order( + self, payload: Mapping[str, Any] | None = None, **fields: Any + ) -> dict[str, Any]: + """Create a mutable demo fulfilment order and link its prescription.""" + + body = _body(payload, fields) + with self._lock: + prescription = self._find_prescription(int(body.get("prescription_id") or 0)) + order = { + "id": self._next_order_id, + "order_no": f"PO{self._today.strftime('%Y%m%d')}{self._next_order_id}", + "prescription_id": prescription.id, + "diagnosis_id": int(body.get("diagnosis_id") or prescription.diagnosis_id or 0), + "patient_name": body.get("recipient_name") or prescription.patient_name, + "phone": body.get("recipient_phone") or prescription.phone, + "prescription_audit_status": 0, + "payment_slip_audit_status": 0, + "fulfillment_status": 1, + "amount": float(body.get("amount") or 0), + "create_time": datetime.now().replace(microsecond=0).isoformat(sep=" "), + **body, + } + self._next_order_id += 1 + self._patient_orders.append(order) + prescription.has_prescription_order = True + prescription.prescription_order_id = int(order["id"]) + prescription.order_no = str(order["order_no"]) + prescription.raw.update( + { + "has_prescription_order": 1, + "prescription_order_id": order["id"], + "order_no": order["order_no"], + } + ) + return deepcopy(order) + + def list_paid_prescription_orders( + self, + diagnosis_id: int, + *, + prescription_order_id: int | None = None, + ) -> dict[str, Any]: + """Return deterministic paid-order choices and deposit threshold.""" + + del prescription_order_id + return { + "lists": [ + { + "id": 9001, + "order_no": "PAY-DEMO-9001", + "diagnosis_id": diagnosis_id, + "pay_amount": 300.0, + "paid": 1, + } + ], + "deposit_min_amount": 50.0, + } + + def search_diagnosis_patients( + self, keyword: str, *, page_no: int = 1, page_size: int = 10 + ) -> PageResult[dict[str, Any]]: + """Search demo diagnoses for order creation.""" + + with self._lock: + rows = [dict(row.raw) for row in self._consultations] + if keyword.strip(): + needle = keyword.strip().lower() + rows = [ + row + for row in rows + if needle in str(row.get("patient_name", "")).lower() + or needle in str(row.get("phone", row.get("patient_phone", ""))).lower() + ] + return _page(rows, page_no, page_size) + + def get_dictionary(self, dictionary_type: str) -> list[dict[str, Any]]: + """Return every dictionary currently exposed by doctor UI filters.""" + + dictionaries: dict[str, list[dict[str, Any]]] = { + "server_order": [ + {"name": "基础调理", "value": "basic"}, + {"name": "复诊随访", "value": "follow_up"}, + ], + "diagnosis_type": [ + {"name": "中医诊断", "value": "tcm"}, + {"name": "中西医结合", "value": "integrated"}, + ], + "consultation_type": [ + {"name": "初诊", "value": "初诊"}, + {"name": "复诊", "value": "复诊"}, + ], + "syndrome_type": [ + {"name": "肝郁脾虚证", "value": "liver_spleen"}, + {"name": "痰湿中阻证", "value": "phlegm_damp"}, + ], + "appointment_channel_source": [ + {"name": "线上复诊", "value": "online"}, + {"name": "门诊预约", "value": "clinic"}, + ], + "channels": [ + { + "id": 1, + "name": "线上复诊", + "value": "online", + "status": 1, + "sort": 10, + }, + { + "id": 2, + "name": "门诊预约", + "value": "clinic", + "status": 1, + "sort": 20, + }, + ], + } + return deepcopy(dictionaries.get(dictionary_type, [])) + + def list_patients( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[Patient]: + """Return doctor-scoped demo patients and summary extension data.""" + + with self._lock: + rows = list(self._patients) + keyword = str(filters.get("keyword") or "").strip() + if keyword: + rows = [ + row + for row in rows + if keyword.lower() in row.name.lower() + or keyword in row.phone + or keyword in row.phone_masked + ] + status = str(filters.get("status_filter") or filters.get("status") or "").strip() + if status: + rows = [row for row in rows if row.status_filter == status] + start_date = str(filters.get("start_date") or "") + end_date = str(filters.get("end_date") or "") + if start_date: + rows = [row for row in rows if row.appointment_time_text >= start_date] + if end_date: + rows = [row for row in rows if row.appointment_time_text[:10] <= end_date] + summary = { + "today": sum( + row.appointment_time_text.startswith(self._today.isoformat()) + for row in self._patients + ), + "tomorrow": sum( + row.appointment_time_text.startswith( + (self._today + timedelta(days=1)).isoformat() + ) + for row in self._patients + ), + "day_after": 0, + } + return _page( + rows, + page_no, + page_size, + { + "summary": summary, + "scope": {"label": "演示数据(仅本机内存)"}, + }, + ) + + def patient_orders( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[dict[str, Any]]: + """Return the scoped demo order workspace and its summary extension.""" + + with self._lock: + return _page(self._filter_orders(filters), page_no, page_size, self._order_summary()) + + def patient_progress( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[dict[str, Any]]: + """Return mutable appointment progress plus schedule-mode metadata.""" + + with self._lock: + rows: list[dict[str, Any]] = [] + for appointment in self._appointments: + patient = next( + (item for item in self._patients if item.id == appointment.diagnosis_id), + None, + ) + row = _appointment_dict(appointment) + row.update( + { + "is_self_patient": int(patient.is_self_patient if patient else True), + "appointment_status": appointment.status, + "appointment_status_text": appointment.status_desc, + } + ) + rows.append(row) + keyword = str(filters.get("keyword") or "").strip().lower() + if keyword: + rows = [row for row in rows if keyword in str(row.get("patient_name", "")).lower()] + if filters.get("status") not in (None, ""): + rows = [row for row in rows if str(row.get("status")) == str(filters["status"])] + start_date = str(filters.get("start_date") or "") + end_date = str(filters.get("end_date") or "") + if start_date: + rows = [row for row in rows if str(row.get("appointment_date", "")) >= start_date] + if end_date: + rows = [row for row in rows if str(row.get("appointment_date", "")) <= end_date] + extend = { + "schedule_mode": "self", + "scope": {"label": "演示医生本人患者"}, + "summary": { + "waiting": sum(str(row.get("status")) == "1" for row in rows), + "completed": sum(str(row.get("status")) == "3" for row in rows), + "missed": sum(str(row.get("status")) == "4" for row in rows), + }, + } + return _page(rows, page_no, page_size, extend) + + def get_patient_order(self, order_id: int) -> dict[str, Any]: + """Return a complete patient-scoped demo order.""" + + return self.get_prescription_order(order_id) + + def edit_patient_order( + self, + order: int | Mapping[str, Any], + changes: Mapping[str, Any] | None = None, + **fields: Any, + ) -> dict[str, Any]: + """Persist arbitrary routed edit fields on a demo patient order.""" + + body = _identified_body(order, changes, fields) + with self._lock: + current = self._find_order(int(body["id"])) + current.update(body) + return deepcopy(current) + + def audit_patient_order_prescription( + self, + order_id: int, + action: AuditAction, + remark: str = "", + ) -> dict[str, Any]: + """Audit the prescription half of a demo fulfilment order.""" + + action = _audit_action(action, remark) + return self._update_order( + order_id, + prescription_audit_status=1 if action == "approve" else 2, + prescription_audit_remark=remark.strip(), + ) + + def revoke_patient_order_prescription_audit(self, order_id: int) -> dict[str, Any]: + """Reset the prescription audit to pending.""" + + return self._update_order( + order_id, prescription_audit_status=0, prescription_audit_remark="" + ) + + def audit_patient_order_payment( + self, + order_id: int, + action: AuditAction, + remark: str = "", + ) -> dict[str, Any]: + """Audit the payment half of a demo fulfilment order.""" + + action = _audit_action(action, remark) + return self._update_order( + order_id, + payment_slip_audit_status=1 if action == "approve" else 2, + payment_slip_audit_remark=remark.strip(), + ) + + def revoke_patient_order_payment_audit(self, order_id: int) -> dict[str, Any]: + """Reset the payment audit to pending.""" + + return self._update_order( + order_id, payment_slip_audit_status=0, payment_slip_audit_remark="" + ) + + def update_patient_order_shipping( + self, + order_id: int, + express_company: str, + tracking_number: str, + ) -> dict[str, Any]: + """Persist courier metadata on a demo order.""" + + return self._update_order( + order_id, + express_company=express_company.strip(), + tracking_number=tracking_number.strip(), + ) + + def ship_patient_order( + self, + order_id: int, + express_company: str, + tracking_number: str, + *, + ship_mode: str | None = None, + ) -> dict[str, Any]: + """Advance a demo order to shipped status 5.""" + + changes: dict[str, Any] = { + "fulfillment_status": 5, + "express_company": express_company.strip(), + "tracking_number": tracking_number.strip(), + } + if ship_mode is not None: + changes["ship_mode"] = ship_mode + return self._update_order(order_id, **changes) + + def add_patient_order_payment( + self, + order_id: int, + order_type: int, + pay_amount: float, + *, + pay_remark: str = "", + completion_request: int | None = None, + pay_create_type: str | None = None, + ) -> dict[str, Any]: + """Append a payment record and reset the payment audit.""" + + with self._lock: + order = self._find_order(order_id) + payments = order.setdefault("pay_orders", []) + if not isinstance(payments, list): + payments = order["pay_orders"] = [] + payment = { + "id": len(payments) + 1, + "order_type": order_type, + "pay_amount": pay_amount, + "pay_remark": pay_remark, + "pay_create_type": pay_create_type or "fubei", + } + payments.append(payment) + order["payment_slip_audit_status"] = 0 + if completion_request is not None: + order["completion_request"] = completion_request + return deepcopy(order) + + def complete_patient_order(self, order_id: int, fulfillment_status: int) -> dict[str, Any]: + """Persist the chosen terminal fulfilment status.""" + + return self._update_order(order_id, fulfillment_status=fulfillment_status) + + def refund_patient_order( + self, + order_id: int, + reason: str, + refund_amount: float | None = None, + ) -> dict[str, Any]: + """Refund a demo order and retain the reason and optional amount.""" + + if not reason.strip(): + raise ValueError("refund reason is required") + return self._update_order( + order_id, + fulfillment_status=8, + refund_reason=reason.strip(), + refund_amount=refund_amount, + ) + + def withdraw_patient_order(self, order_id: int) -> dict[str, Any]: + """Mark an eligible demo order withdrawn.""" + + return self._update_order(order_id, fulfillment_status=0, withdrawn=1) + + def upload_patient_order_to_pharmacy(self, order_id: int) -> dict[str, Any]: + """Record a successful pharmacy submission in demo state.""" + + return self._update_order( + order_id, + pharmacy_uploaded=1, + pharmacy_uploaded_at=datetime.now().replace(microsecond=0).isoformat(sep=" "), + ) + + def list_patient_assistants(self) -> list[dict[str, Any]]: + """Return deterministic medical assistants for assignment controls.""" + + return [ + {"id": 2001, "name": "周医助", "department_name": "中医门诊"}, + {"id": 2002, "name": "许医助", "department_name": "中医门诊"}, + ] + + def assign_patient( + self, + diagnosis_id: int, + assistant_id: int, + *, + is_inherit: int | None = None, + ) -> dict[str, Any]: + """Persist patient/diagnosis assignment and append its history.""" + + del is_inherit + return self._assign_diagnosis(diagnosis_id, assistant_id) + + def fill_patient_id_card(self, diagnosis_id: int, id_card: str) -> dict[str, Any]: + """Persist a demo identity card on patient and diagnosis raw data.""" + + if not id_card.strip(): + raise ValueError("id_card is required") + with self._lock: + patient = self._find_patient(diagnosis_id) + consultation = self._find_consultation(diagnosis_id) + patient.id_card = id_card.strip() + patient.has_id_card = True + patient.raw.update({"id_card": id_card.strip(), "has_id_card": 1}) + consultation.id_card = id_card.strip() + consultation.raw["id_card"] = id_card.strip() + return {"id": diagnosis_id, "id_card": id_card.strip(), "has_id_card": 1} + + def book_patient_appointment( + self, payload: Mapping[str, Any] | None = None, **fields: Any + ) -> dict[str, Any]: + """Create and link a mutable demo appointment from the full form DTO.""" + + body = _body(payload, fields) + diagnosis_id = int(body.get("diagnosis_id", body.get("id")) or 0) + with self._lock: + patient = self._find_patient(diagnosis_id) + consultation = self._find_consultation(diagnosis_id) + appointment_id = max((item.id for item in self._appointments), default=0) + 1 + row = { + "id": appointment_id, + "diagnosis_id": diagnosis_id, + "patient_id": consultation.patient_id, + "patient_name": patient.name, + "patient_phone": patient.phone_masked or patient.phone, + "doctor_id": int(body.get("doctor_id") or 1001), + "doctor_name": body.get("doctor_name") or "陈医生(演示)", + "assistant_id": patient.assistant_id, + "assistant_name": patient.assistant_name, + "appointment_date": body.get("appointment_date") or self._today.isoformat(), + "appointment_time": body.get("appointment_time", body.get("time", "09:00-09:30")), + "period": body.get("period", "上午"), + "status": 1, + "status_desc": "待接诊", + **body, + } + row["id"] = appointment_id + appointment = Appointment.from_dict(row) + self._appointments.append(appointment) + patient.appointment_id = appointment_id + patient.appointment_status = 1 + patient.appointment_status_text = "待接诊" + patient.appointment_time_text = ( + f"{appointment.appointment_date} {appointment.appointment_time}" + ) + patient.status_filter = "pending_interview" + consultation.appointment_id = appointment_id + consultation.has_appointment = True + consultation.appointment_status = 1 + consultation.appointment_status_text = "待接诊" + consultation.appointment_date = appointment.appointment_date + consultation.appointment_time = appointment.appointment_time + return deepcopy(_appointment_dict(appointment)) + + def cancel_patient_appointment(self, appointment_id: int) -> dict[str, Any]: + """Persist cancellation status 2 across all demo workspaces.""" + + with self._lock: + appointment = self._find_appointment(appointment_id) + if str(appointment.status) not in {"1", "4"}: + raise ApiBusinessError("当前挂号状态不可取消", code=0) + appointment.status = 2 + appointment.status_desc = "已取消" + appointment.raw.update({"status": 2, "status_desc": "已取消"}) + for patient in self._patients: + if patient.appointment_id == appointment_id: + patient.appointment_status = 2 + patient.appointment_status_text = "已取消" + patient.status_filter = "unbooked" + for consultation in self._consultations: + if consultation.appointment_id == appointment_id: + consultation.appointment_status = 2 + consultation.appointment_status_text = "已取消" + consultation.has_appointment = False + return {"id": appointment_id, "status": 2, "status_desc": "已取消"} + + def patient_detail(self, diagnosis_id: int) -> dict[str, Any]: + """Return the complete readonly diagnosis aggregate.""" + + return self.get_diagnosis_detail(diagnosis_id, readonly=True) + + def list_consultations( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[Consultation]: + """Return synthetic diagnosis records with tolerant search filters.""" + + with self._lock: + rows = list(self._consultations) + keyword = str(filters.get("patient_name") or filters.get("keyword") or "").strip() + if keyword: + needle = keyword.lower() + rows = [ + row + for row in rows + if needle in row.patient_name.lower() + or needle in row.patient_phone.lower() + or needle in row.phone_masked.lower() + ] + if filters.get("status") not in (None, ""): + status = str(filters["status"]) + rows = [row for row in rows if str(row.status) == status] + if filters.get("appointment_status") not in (None, ""): + appointment_status = str(filters["appointment_status"]) + rows = [row for row in rows if str(row.appointment_status) == appointment_status] + if filters.get("has_appointment") not in (None, ""): + has_appointment = _bool(filters["has_appointment"]) + rows = [row for row in rows if row.has_appointment is has_appointment] + confirmed_filter = filters.get("diagnosis_confirmed", filters.get("confirmed")) + if confirmed_filter not in (None, ""): + confirmed = _bool(confirmed_filter) + rows = [row for row in rows if row.confirmed is confirmed] + for filter_name, attribute_name in ( + ("diagnosis_type", "diagnosis_type"), + ("consultation_type", "consultation_type"), + ("syndrome_type", "syndrome_type"), + ): + value = str(filters.get(filter_name) or "").strip() + if value: + rows = [ + row + for row in rows + if str(row.raw.get(attribute_name) or getattr(row, attribute_name, "")) + == value + ] + if filters.get("assistant_id") not in (None, ""): + assistant_id = int(filters["assistant_id"]) + rows = [row for row in rows if row.assistant_id == assistant_id] + appointment_date = str(filters.get("appointment_date") or "") + if appointment_date: + rows = [row for row in rows if row.appointment_date == appointment_date] + start_date = str( + filters.get("latest_appointment_start_date") or filters.get("start_date") or "" + ) + end_date = str( + filters.get("latest_appointment_end_date") or filters.get("end_date") or "" + ) + if start_date: + rows = [row for row in rows if row.appointment_date >= start_date] + if end_date: + rows = [row for row in rows if row.appointment_date <= end_date] + channel = str(filters.get("latest_appointment_channel_source") or "").strip() + if channel: + rows = [ + row + for row in rows + if str(row.raw.get("latest_appointment_channel_source") or "") == channel + ] + assign_start = str(filters.get("latest_assign_start_date") or "") + assign_end = str(filters.get("latest_assign_end_date") or "") + if assign_start: + rows = [ + row + for row in rows + if str(row.raw.get("latest_assign_date") or "") >= assign_start + ] + if assign_end: + rows = [ + row + for row in rows + if str(row.raw.get("latest_assign_date") or "") <= assign_end + ] + if _bool(filters.get("pending_booking")): + rows = [row for row in rows if not row.has_appointment] + if _bool(filters.get("completed_appointment")): + rows = [ + row + for row in rows + if str(row.appointment_status) == "3" + or any(str(item.get("status")) == "3" for item in row.appointments) + ] + if _bool(filters.get("pending_assign")): + rows = [row for row in rows if not row.assistant_id] + sort_direction = str(filters.get("sort_unserved_days") or "").lower() + if sort_direction in {"asc", "desc"}: + rows.sort( + key=lambda row: ( + row.unserved_days is None, + row.unserved_days if row.unserved_days is not None else 0, + ), + reverse=sort_direction == "desc", + ) + return _page(rows, page_no, page_size) + + def get_diagnosis_detail(self, diagnosis_id: int, *, readonly: bool = False) -> dict[str, Any]: + """Return a complete demo diagnosis aggregate for edit or readonly views.""" + + del readonly + with self._lock: + consultation = self._find_consultation(diagnosis_id) + patient = self._find_patient(diagnosis_id) + appointment = ( + self._find_appointment(consultation.appointment_id) + if consultation.appointment_id is not None + else None + ) + diagnosis = dict(consultation.raw) + diagnosis.update( + { + "id": consultation.id, + "patient_id": consultation.patient_id, + "patient_name": consultation.patient_name, + "patient_phone": consultation.patient_phone, + "id_card": consultation.id_card, + "assistant_id": consultation.assistant_id, + "assistant_name": consultation.assistant_name, + "clinical_diagnosis": consultation.clinical_diagnosis, + "chief_complaint": consultation.chief_complaint, + "present_illness": consultation.present_illness, + "past_history": consultation.past_history, + "allergy_history": consultation.allergy_history, + "tongue": consultation.tongue, + "pulse": consultation.pulse, + "prescription_opinion": consultation.prescription_opinion, + "appointment_status": consultation.appointment_status, + "has_appointment": int(consultation.has_appointment), + } + ) + return deepcopy( + { + "diagnosis": diagnosis, + "patient": dict(patient.raw), + "appointment": _appointment_dict(appointment) if appointment else {}, + "unserved_days": consultation.unserved_days, + "doctor_notes": self._doctor_notes.get(diagnosis_id, []), + } + ) + + def diagnosis_readonly_detail(self, diagnosis_id: int) -> dict[str, Any]: + """Alias for the permission-aware demo readonly detail.""" + + return self.get_diagnosis_detail(diagnosis_id, readonly=True) + + def create_diagnosis( + self, diagnosis: Mapping[str, Any] | None = None, **fields: Any + ) -> dict[str, Any]: + """Create a new mutable demo diagnosis and matching patient row.""" + + body = _body(diagnosis, fields) + with self._lock: + diagnosis_id = max((row.id for row in self._consultations), default=500) + 1 + body["id"] = diagnosis_id + body.setdefault("diagnosis_id", diagnosis_id) + body.setdefault( + "source_patient_id", + max((row.source_patient_id or 0 for row in self._patients), default=300) + 1, + ) + body.setdefault("patient_id", body["source_patient_id"]) + body.setdefault("status", 1) + consultation = Consultation.from_dict(body) + patient = Patient.from_dict(body) + patient.id = diagnosis_id + patient.diagnosis_id = diagnosis_id + self._consultations.append(consultation) + self._patients.append(patient) + self._doctor_notes[diagnosis_id] = [] + self._assign_logs[diagnosis_id] = [] + self._tracking_notes[diagnosis_id] = [] + self._todos[diagnosis_id] = [] + return deepcopy(dict(consultation.raw)) + + def update_diagnosis( + self, + diagnosis: int | Mapping[str, Any], + changes: Mapping[str, Any] | None = None, + **fields: Any, + ) -> dict[str, Any]: + """Merge a full diagnosis form and synchronise patient list fields.""" + + body = _identified_body(diagnosis, changes, fields) + diagnosis_id = int(body["id"]) + with self._lock: + original = self._find_consultation(diagnosis_id) + merged = dict(original.raw) + merged.update(body) + updated = Consultation.from_dict(merged) + self._consultations[self._consultations.index(original)] = updated + patient = self._find_patient(diagnosis_id) + patient.name = updated.patient_name or patient.name + patient.phone = updated.patient_phone or patient.phone + patient.id_card = updated.id_card or patient.id_card + patient.gender = updated.gender + patient.age = updated.age + patient.raw.update( + { + "patient_name": patient.name, + "phone": patient.phone, + "id_card": patient.id_card, + "gender": patient.gender, + "age": patient.age, + } + ) + return deepcopy(dict(updated.raw)) + + def delete_diagnosis(self, diagnosis_id: int) -> dict[str, Any]: + """Delete a demo diagnosis and its patient-only auxiliary state.""" + + with self._lock: + consultation = self._find_consultation(diagnosis_id) + self._consultations.remove(consultation) + self._patients = [row for row in self._patients if row.id != diagnosis_id] + self._doctor_notes.pop(diagnosis_id, None) + self._assign_logs.pop(diagnosis_id, None) + self._tracking_notes.pop(diagnosis_id, None) + self._todos.pop(diagnosis_id, None) + return {"id": diagnosis_id, "deleted": True} + + def set_revisit_slot_start_offset(self, diagnosis_id: int, offset: int) -> dict[str, Any]: + """Persist the demo revisit-statistics offset.""" + + with self._lock: + consultation = self._find_consultation(diagnosis_id) + consultation.raw["revisit_slot_start_offset"] = offset + return {"id": diagnosis_id, "revisit_slot_start_offset": offset} + + def appointment_history( + self, diagnosis_id: int, *, page_no: int = 1, page_size: int = 500 + ) -> PageResult[Appointment]: + """Return every demo appointment linked to one diagnosis.""" + + with self._lock: + rows = [row for row in self._appointments if row.diagnosis_id == diagnosis_id] + return _page(rows, page_no, page_size) + + def assign_history( + self, diagnosis_id: int, *, page_no: int = 1, page_size: int = 20 + ) -> PageResult[dict[str, Any]]: + """Return mutable assignment history for one diagnosis.""" + + with self._lock: + return _page(self._assign_logs.get(diagnosis_id, []), page_no, page_size) + + def assign_diagnosis( + self, + diagnosis_id: int, + assistant_id: int, + *, + is_inherit: int | None = None, + ) -> dict[str, Any]: + """General diagnosis alias for the same assignment mutation.""" + + del is_inherit + return self._assign_diagnosis(diagnosis_id, assistant_id) + + def list_diagnosis_assistants(self) -> list[dict[str, Any]]: + """Return the same assistants available in patient assignment.""" + + return self.list_patient_assistants() + + def list_diagnosis_doctors(self) -> list[dict[str, Any]]: + """Return selectable demo doctors.""" + + return [{"id": 1001, "name": "陈医生(演示)", "department_name": "中医门诊"}] + + def check_diagnosis_phone(self, payload: Mapping[str, Any]) -> dict[str, Any]: + """Report whether a phone belongs to another demo diagnosis.""" + + phone = str(payload.get("phone") or "").strip() + excluded = int(payload.get("id") or 0) + duplicate = any( + row.id != excluded and phone and row.patient_phone == phone + for row in self._consultations + ) + return {"duplicate": duplicate} + + def check_diagnosis_id_card(self, payload: Mapping[str, Any]) -> dict[str, Any]: + """Report whether an identity card belongs to another demo diagnosis.""" + + id_card = str(payload.get("id_card") or "").strip() + excluded = int(payload.get("id") or 0) + duplicate = any( + row.id != excluded and id_card and row.id_card == id_card for row in self._consultations + ) + return {"duplicate": duplicate} + + def fill_diagnosis_id_card(self, diagnosis_id: int, id_card: str) -> dict[str, Any]: + """General diagnosis alias for the patient identity-card mutation.""" + + return self.fill_patient_id_card(diagnosis_id, id_card) + + def get_tracking_window( + self, + diagnosis_id: int, + *, + start_date: str = "", + end_date: str = "", + ) -> dict[str, Any]: + """Return representative blood, diet and exercise records.""" + + self._find_consultation(diagnosis_id) + return { + "diagnosis_id": diagnosis_id, + "start_date": start_date, + "end_date": end_date, + "blood_records": [ + { + "record_date": self._today.isoformat(), + "fasting_glucose": 5.8, + "systolic": 126, + "diastolic": 78, + } + ], + "diet_records": [{"record_date": self._today.isoformat(), "content": "清淡饮食"}], + "exercise_records": [ + {"record_date": self._today.isoformat(), "content": "步行 30 分钟"} + ], + } + + def list_tracking_notes(self, diagnosis_id: int) -> list[dict[str, Any]]: + """Return persisted demo tracking notes newest first.""" + + with self._lock: + self._find_consultation(diagnosis_id) + return deepcopy(list(reversed(self._tracking_notes[diagnosis_id]))) + + def add_tracking_note(self, diagnosis_id: int, content: str) -> dict[str, Any]: + """Append a durable demo tracking note.""" + + if not content.strip(): + raise ValueError("tracking_content is required") + with self._lock: + self._find_consultation(diagnosis_id) + note = { + "id": len(self._tracking_notes[diagnosis_id]) + 1, + "diagnosis_id": diagnosis_id, + "tracking_content": content.strip(), + "note_date": self._today.isoformat(), + } + self._tracking_notes[diagnosis_id].append(note) + return deepcopy(note) + + def list_diagnosis_todos( + self, + diagnosis_id: int, + *, + page_no: int = 1, + page_size: int = 20, + status: int | None = None, + creator_id: int | None = None, + ) -> PageResult[dict[str, Any]]: + """Return filtered mutable demo follow-up todos.""" + + with self._lock: + rows = list(self._todos.get(diagnosis_id, [])) + if status is not None: + rows = [row for row in rows if int(row.get("status", 0)) == status] + if creator_id is not None: + rows = [row for row in rows if int(row.get("creator_id", 0)) == creator_id] + return _page(rows, page_no, page_size) + + def add_diagnosis_todo( + self, diagnosis_id: int, content: str, remind_time: int + ) -> dict[str, Any]: + """Create and retain a demo follow-up todo.""" + + with self._lock: + self._find_consultation(diagnosis_id) + todo = { + "id": self._next_todo_id, + "diagnosis_id": diagnosis_id, + "content": content.strip(), + "remind_time": remind_time, + "status": 0, + "creator_id": 1001, + } + self._next_todo_id += 1 + self._todos[diagnosis_id].append(todo) + return deepcopy(todo) + + def cancel_diagnosis_todo(self, todo_id: int) -> dict[str, Any]: + """Persist cancellation on a demo todo.""" + + with self._lock: + for rows in self._todos.values(): + for todo in rows: + if int(todo.get("id") or 0) == todo_id: + todo["status"] = 2 + return deepcopy(todo) + raise RepositoryNotFoundError(f"diagnosis todo {todo_id} not found") + + def get_call_ticket(self, patient_id: int, diagnosis_id: int) -> CallTicket: + """Return non-production placeholder credentials for UI demonstration.""" + + with self._lock: + if not any(row.id == diagnosis_id for row in self._consultations): + raise RepositoryNotFoundError(f"consultation {diagnosis_id} not found") + return CallTicket( + sdk_app_id=1400000000, + user_id="doctor_1001", + user_sig="DEMO_ONLY_NOT_A_REAL_SIGNATURE", + patient_user_id=f"patient_{patient_id}", + assistant_id="assistant_2001", + diagnosis_id=diagnosis_id, + is_lochost_vod=False, + raw={"demo": True}, + ) + + def start_call( + self, diagnosis_id: int, patient_id: int, *, call_type: int = 2 + ) -> dict[str, Any]: + """Create a mutable demo call record.""" + + with self._lock: + self.get_call_ticket(patient_id, diagnosis_id) + record = { + "id": self._next_call_id, + "diagnosis_id": diagnosis_id, + "patient_id": patient_id, + "call_type": call_type, + "status": "ringing", + "room_id": "", + } + self._next_call_id += 1 + self._calls[diagnosis_id] = record + return deepcopy(record) + + def end_call(self, diagnosis_id: int) -> dict[str, Any]: + """Persistently mark the demo call record ended.""" + + with self._lock: + record = self._calls.get(diagnosis_id) + if record is None: + raise RepositoryNotFoundError(f"active call for {diagnosis_id} not found") + record["status"] = "ended" + record["ended_at"] = datetime.now().replace(microsecond=0).isoformat(sep=" ") + return deepcopy(record) + + def bind_call_room(self, diagnosis_id: int, room_id: str) -> dict[str, Any]: + """Persist the room identifier on the active demo call.""" + + if not room_id.strip(): + raise ValueError("room_id is required") + with self._lock: + record = self._calls.get(diagnosis_id) + if record is None: + raise RepositoryNotFoundError(f"active call for {diagnosis_id} not found") + record["room_id"] = room_id.strip() + record["status"] = "connected" + return { + "diagnosis_id": diagnosis_id, + "room_id": room_id.strip(), + "cloud_recording": {"started": False, "message": "演示模式不录制"}, + } + + def my_self(self) -> Session: + """Compatibility alias for :meth:`get_session`.""" + + return self.get_session() + + def reception(self, appointment_id: int) -> dict[str, Any]: + """Compatibility alias for :meth:`get_reception`.""" + + return self.get_reception(appointment_id) + + def add_prescription_template( + self, + template: PrescriptionTemplate | Mapping[str, Any] | None = None, + **fields: Any, + ) -> PrescriptionTemplate: + """Compatibility alias for :meth:`create_prescription_template`.""" + + return self.create_prescription_template(template, **fields) + + def edit_prescription_template( + self, + template: int | PrescriptionTemplate | Mapping[str, Any], + changes: Mapping[str, Any] | None = None, + **fields: Any, + ) -> PrescriptionTemplate: + """Compatibility alias for :meth:`update_prescription_template`.""" + + return self.update_prescription_template(template, changes, **fields) + + def _find_appointment(self, appointment_id: int) -> Appointment: + for appointment in self._appointments: + if appointment.id == appointment_id: + return appointment + raise RepositoryNotFoundError(f"appointment {appointment_id} not found") + + def _find_template(self, template_id: int) -> PrescriptionTemplate: + for template in self._templates: + if template.id == template_id: + return template + raise RepositoryNotFoundError(f"prescription template {template_id} not found") + + def _find_prescription(self, prescription_id: int) -> Prescription: + for prescription in self._prescriptions: + if prescription.id == prescription_id: + return prescription + raise RepositoryNotFoundError(f"prescription {prescription_id} not found") + + def _find_patient(self, diagnosis_id: int) -> Patient: + for patient in self._patients: + if patient.id == diagnosis_id or patient.diagnosis_id == diagnosis_id: + return patient + raise RepositoryNotFoundError(f"patient diagnosis {diagnosis_id} not found") + + def _find_consultation(self, diagnosis_id: int) -> Consultation: + for consultation in self._consultations: + if consultation.id == diagnosis_id: + return consultation + raise RepositoryNotFoundError(f"consultation {diagnosis_id} not found") + + def _find_order(self, order_id: int) -> dict[str, Any]: + for order in self._patient_orders: + if int(order.get("id") or 0) == order_id: + return order + raise RepositoryNotFoundError(f"prescription order {order_id} not found") + + def _update_order(self, order_id: int, **changes: Any) -> dict[str, Any]: + with self._lock: + order = self._find_order(order_id) + order.update(changes) + return deepcopy(order) + + def _assign_diagnosis(self, diagnosis_id: int, assistant_id: int) -> dict[str, Any]: + with self._lock: + assistants = { + int(item["id"]): str(item["name"]) for item in self.list_patient_assistants() + } + if assistant_id not in assistants: + raise RepositoryNotFoundError(f"assistant {assistant_id} not found") + assistant_name = assistants[assistant_id] + patient = self._find_patient(diagnosis_id) + consultation = self._find_consultation(diagnosis_id) + patient.assistant_id = assistant_id + patient.assistant_name = assistant_name + patient.raw.update({"assistant_id": assistant_id, "assistant_name": assistant_name}) + consultation.assistant_id = assistant_id + consultation.assistant_name = assistant_name + consultation.raw.update( + {"assistant_id": assistant_id, "assistant_name": assistant_name} + ) + for appointment in self._appointments: + if appointment.diagnosis_id == diagnosis_id: + appointment.assistant_id = assistant_id + appointment.assistant_name = assistant_name + appointment.raw.update( + {"assistant_id": assistant_id, "assistant_name": assistant_name} + ) + log = { + "id": sum(len(rows) for rows in self._assign_logs.values()) + 1, + "diagnosis_id": diagnosis_id, + "assistant_id": assistant_id, + "assistant_name": assistant_name, + "create_time": datetime.now().replace(microsecond=0).isoformat(sep=" "), + } + self._assign_logs.setdefault(diagnosis_id, []).append(log) + return deepcopy(log) + + def _filter_orders(self, filters: Mapping[str, Any]) -> list[dict[str, Any]]: + rows = list(self._patient_orders) + keyword = str(filters.get("keyword") or "").strip().lower() + if keyword: + rows = [ + row + for row in rows + if keyword in str(row.get("order_no", "")).lower() + or keyword in str(row.get("patient_name", "")).lower() + ] + for key in ( + "prescription_id", + "diagnosis_id", + "prescription_audit_status", + "payment_slip_audit_status", + "fulfillment_status", + ): + if filters.get(key) not in (None, ""): + rows = [row for row in rows if str(row.get(key)) == str(filters[key])] + start_date = str(filters.get("start_date") or "") + end_date = str(filters.get("end_date") or "") + if start_date: + rows = [row for row in rows if str(row.get("create_time", "")) >= start_date] + if end_date: + rows = [row for row in rows if str(row.get("create_time", "")) <= end_date] + return rows + + def _order_summary(self) -> dict[str, Any]: + rows = self._patient_orders + rejected = sum( + int(row.get("prescription_audit_status", 0)) == 2 + or int(row.get("payment_slip_audit_status", 0)) == 2 + for row in rows + ) + return { + "summary": { + "order_count": len(rows), + "effective_amount": sum(float(row.get("amount") or 0) for row in rows), + "pending_audit": sum( + int(row.get("prescription_audit_status", 0)) == 0 + or int(row.get("payment_slip_audit_status", 0)) == 0 + for row in rows + ), + "completed": sum( + int(row.get("fulfillment_status", 0)) in {3, 6, 7, 9, 10, 11, 12} + for row in rows + ), + "rejected": rejected, + "rejection_rate": rejected / len(rows) if rows else 0, + }, + "scope": {"label": "演示医生患者范围"}, + } + + def _sync_prescription_flag(self, diagnosis_id: int | None) -> None: + if diagnosis_id is None: + return + has_current = any( + row.diagnosis_id == diagnosis_id and not row.void_status for row in self._prescriptions + ) + for consultation in self._consultations: + if consultation.id == diagnosis_id: + consultation.has_prescription = has_current + consultation.raw["has_prescription"] = int(has_current) + for appointment in self._appointments: + if appointment.diagnosis_id == diagnosis_id: + appointment.has_prescription = has_current + appointment.raw["has_prescription"] = int(has_current) + + def _build_appointments(self) -> list[Appointment]: + today = self._today.isoformat() + tomorrow = (self._today + timedelta(days=1)).isoformat() + return [ + Appointment.from_dict( + { + "id": 101, + "patient_id": 301, + "diagnosis_id": 501, + "patient_name": "林晓岚", + "patient_phone": "138****1203", + "gender": 2, + "age": 46, + "height": 162, + "weight": 58, + "doctor_id": 1001, + "doctor_name": "陈医生(演示)", + "assistant_id": 2001, + "assistant_name": "周医助", + "appointment_date": today, + "appointment_time": "09:00-09:30", + "period": "上午", + "status": 1, + "status_desc": "待接诊", + "diagnosis_confirmed": 1, + "has_prescription": 0, + "remark": "复诊,关注睡眠与口干。", + } + ), + Appointment.from_dict( + { + "id": 102, + "patient_id": 302, + "diagnosis_id": 502, + "patient_name": "赵明远", + "patient_phone": "186****4821", + "gender": 1, + "age": 53, + "doctor_id": 1001, + "doctor_name": "陈医生(演示)", + "assistant_id": 2001, + "assistant_name": "周医助", + "appointment_date": today, + "appointment_time": "10:00-10:30", + "period": "上午", + "status": 4, + "status_desc": "已过号", + "diagnosis_confirmed": 0, + "has_prescription": 1, + "prescription_audit_status": 1, + "remark": "电话未接通。", + } + ), + Appointment.from_dict( + { + "id": 103, + "patient_id": 303, + "diagnosis_id": 503, + "patient_name": "吴诗雨", + "patient_phone": "159****7732", + "gender": 2, + "age": 35, + "doctor_id": 1001, + "doctor_name": "陈医生(演示)", + "assistant_id": 2002, + "assistant_name": "许医助", + "appointment_date": tomorrow, + "appointment_time": "14:00-14:30", + "period": "下午", + "status": 1, + "status_desc": "待接诊", + "diagnosis_confirmed": 1, + "has_prescription": 0, + "remark": "初诊。", + } + ), + ] + + def _build_patients(self) -> list[Patient]: + return [ + Patient.from_dict( + { + "id": 501, + "diagnosis_id": 501, + "source_patient_id": 301, + "patient_name": "林晓岚", + "gender_desc": "女", + "age": 46, + "phone": "13800131203", + "phone_masked": "138****1203", + "has_id_card": 1, + "assistant_id": 2001, + "assistant_name": "周医助", + "appointment_id": 101, + "appointment_doctor_id": 1001, + "appointment_doctor_name": "陈医生(演示)", + "appointment_status": 1, + "appointment_status_text": "待接诊", + "appointment_time_text": f"{self._today.isoformat()} 09:00", + "revisit_count": 2, + "confirmed": 1, + "confirmation_text": "已确认", + "diagnosis_date_text": "第 3 次复诊", + "status_filter": "pending_interview", + "is_self_patient": 1, + } + ), + Patient.from_dict( + { + "id": 502, + "diagnosis_id": 502, + "source_patient_id": 302, + "patient_name": "赵明远", + "gender_desc": "男", + "age": 53, + "phone": "18600004821", + "phone_masked": "186****4821", + "has_id_card": 1, + "assistant_id": 2001, + "assistant_name": "周医助", + "appointment_id": 102, + "appointment_doctor_id": 1001, + "appointment_doctor_name": "陈医生(演示)", + "appointment_status": 4, + "appointment_status_text": "已过号", + "appointment_time_text": f"{self._today.isoformat()} 10:00", + "revisit_count": 1, + "confirmed": 0, + "confirmation_text": "待确认", + "diagnosis_date_text": "第 2 次复诊", + "status_filter": "missed", + "is_self_patient": 1, + } + ), + Patient.from_dict( + { + "id": 503, + "diagnosis_id": 503, + "source_patient_id": 303, + "patient_name": "吴诗雨", + "gender_desc": "女", + "age": 35, + "phone": "15900007732", + "phone_masked": "159****7732", + "has_id_card": 0, + "assistant_id": 2002, + "assistant_name": "许医助", + "appointment_id": 103, + "appointment_doctor_id": 1001, + "appointment_doctor_name": "陈医生(演示)", + "appointment_status": 1, + "appointment_status_text": "待接诊", + "appointment_time_text": ( + f"{(self._today + timedelta(days=1)).isoformat()} 14:00" + ), + "revisit_count": 0, + "confirmed": 1, + "confirmation_text": "已确认", + "diagnosis_date_text": "初诊", + "status_filter": "pending_interview", + "is_self_patient": 1, + } + ), + Patient.from_dict( + { + "id": 504, + "diagnosis_id": 504, + "source_patient_id": 304, + "patient_name": "周安然", + "gender_desc": "女", + "age": 41, + "phone": "13700006618", + "phone_masked": "137****6618", + "has_id_card": 1, + "assistant_id": None, + "assistant_name": "", + "appointment_id": None, + "appointment_status": None, + "appointment_status_text": "待预约", + "appointment_time_text": "", + "revisit_count": 1, + "confirmed": 0, + "confirmation_text": "待确认", + "diagnosis_date_text": "待预约复诊", + "status_filter": "unbooked", + "is_self_patient": 1, + } + ), + ] + + def _build_consultations(self) -> list[Consultation]: + return [ + Consultation.from_dict( + { + "id": 501, + "patient_id": 301, + "appointment_id": 101, + "patient_name": "林晓岚", + "patient_phone": "138****1203", + "gender": 2, + "age": 46, + "doctor_id": 1001, + "doctor_name": "陈医生(演示)", + "assistant_id": 2001, + "assistant_name": "周医助", + "diagnosis_date": self._today.isoformat(), + "appointment_date": self._today.isoformat(), + "appointment_time": "09:00-09:30", + "appointments": [ + { + "id": 101, + "status": 1, + "appointment_date": self._today.isoformat(), + }, + { + "id": 91, + "status": 3, + "appointment_date": (self._today - timedelta(days=30)).isoformat(), + }, + ], + "diagnosis_type": "tcm", + "consultation_type": "复诊", + "syndrome_type": "liver_spleen", + "latest_appointment_channel_source": "online", + "latest_assign_date": self._today.isoformat(), + "unserved_days": 1, + "clinical_diagnosis": "肝郁脾虚证", + "tongue": "舌淡红,苔薄白", + "pulse": "弦细", + "status": 1, + "status_desc": "待接诊", + "has_appointment": 1, + "appointment_status": 1, + "appointment_status_text": "待接诊", + "confirmed": 1, + "has_prescription": 0, + "remark": "复诊,关注睡眠与口干。", + } + ), + Consultation.from_dict( + { + "id": 502, + "patient_id": 302, + "appointment_id": 102, + "patient_name": "赵明远", + "patient_phone": "186****4821", + "gender": 1, + "age": 53, + "doctor_id": 1001, + "doctor_name": "陈医生(演示)", + "assistant_id": 2001, + "assistant_name": "周医助", + "diagnosis_date": self._today.isoformat(), + "appointment_date": self._today.isoformat(), + "appointment_time": "10:00-10:30", + "appointments": [ + { + "id": 102, + "status": 4, + "appointment_date": self._today.isoformat(), + } + ], + "diagnosis_type": "integrated", + "consultation_type": "复诊", + "syndrome_type": "phlegm_damp", + "latest_appointment_channel_source": "clinic", + "latest_assign_date": (self._today - timedelta(days=2)).isoformat(), + "unserved_days": 8, + "clinical_diagnosis": "痰湿中阻证", + "tongue": "舌胖,苔白腻", + "pulse": "滑", + "status": 4, + "status_desc": "已过号", + "has_appointment": 1, + "appointment_status": 4, + "appointment_status_text": "已过号", + "confirmed": 0, + "has_prescription": 1, + "remark": "电话未接通。", + } + ), + Consultation.from_dict( + { + "id": 503, + "patient_id": 303, + "appointment_id": 103, + "patient_name": "吴诗雨", + "patient_phone": "159****7732", + "gender": 2, + "age": 35, + "doctor_id": 1001, + "doctor_name": "陈医生(演示)", + "assistant_id": 2002, + "assistant_name": "许医助", + "diagnosis_date": (self._today + timedelta(days=1)).isoformat(), + "appointment_date": (self._today + timedelta(days=1)).isoformat(), + "appointment_time": "14:00-14:30", + "appointments": [ + { + "id": 103, + "status": 1, + "appointment_date": (self._today + timedelta(days=1)).isoformat(), + } + ], + "diagnosis_type": "tcm", + "consultation_type": "初诊", + "syndrome_type": "liver_spleen", + "latest_appointment_channel_source": "online", + "latest_assign_date": self._today.isoformat(), + "unserved_days": 0, + "clinical_diagnosis": "待辨证", + "status": 1, + "status_desc": "待接诊", + "has_appointment": 1, + "appointment_status": 1, + "appointment_status_text": "待接诊", + "confirmed": 1, + "has_prescription": 0, + "remark": "初诊。", + } + ), + Consultation.from_dict( + { + "id": 504, + "patient_id": 304, + "appointment_id": None, + "patient_name": "周安然", + "patient_phone": "137****6618", + "gender": 2, + "age": 41, + "doctor_id": 1001, + "doctor_name": "陈医生(演示)", + "assistant_id": None, + "assistant_name": "", + "diagnosis_date": (self._today - timedelta(days=14)).isoformat(), + "appointment_date": "", + "appointment_time": "", + "diagnosis_type": "integrated", + "consultation_type": "复诊", + "syndrome_type": "phlegm_damp", + "clinical_diagnosis": "气阴两虚证", + "status": 1, + "status_desc": "启用", + "has_appointment": 0, + "appointment_status": None, + "confirmed": 0, + "has_prescription": 0, + "latest_assign_date": "", + "unserved_days": 14, + "remark": "待预约、待分配医助。", + } + ), + ] + + def _build_templates(self) -> list[PrescriptionTemplate]: + return [ + PrescriptionTemplate.from_dict( + { + "id": 701, + "prescription_name": "疏肝健脾基础方", + "formula_type": 1, + "herbs": [ + {"medicine_id": 11, "name": "柴胡", "dosage": "10g"}, + {"medicine_id": 12, "name": "白芍", "dosage": "15g"}, + {"medicine_id": 13, "name": "茯苓", "dosage": "15g"}, + ], + "is_public": 0, + "disable_edit": 0, + "creator_id": 1001, + "creator_name": "陈医生(演示)", + "create_time": "2026-07-15 10:30:00", + } + ), + PrescriptionTemplate.from_dict( + { + "id": 702, + "prescription_name": "安神助眠加减方", + "formula_type": 2, + "herbs": [ + {"medicine_id": 21, "name": "酸枣仁", "dosage": "20g"}, + {"medicine_id": 22, "name": "夜交藤", "dosage": "30g"}, + ], + "is_public": 1, + "disable_edit": 0, + "creator_id": 1001, + "creator_name": "陈医生(演示)", + "create_time": "2026-07-18 16:20:00", + } + ), + ] + + def _build_prescriptions(self) -> list[Prescription]: + return [ + Prescription.from_dict( + { + "id": 801, + "diagnosis_id": 502, + "appointment_id": 102, + "case_record": { + "diagnosis_id": 502, + "appointment_id": 102, + "clinical_diagnosis": "痰湿中阻证", + }, + "sn": "RX20260810001", + "patient_name": "赵明远", + "phone": "186****4821", + "gender": 1, + "age": 53, + "visit_no": "2", + "prescription_date": self._today.isoformat(), + "prescription_type": "汤剂", + "herbs": [ + {"medicine_id": 31, "name": "半夏", "dosage": "9g", "formula_type": 1}, + {"medicine_id": 13, "name": "茯苓", "dosage": "15g", "formula_type": 1}, + ], + "clinical_diagnosis": "痰湿中阻证", + "usage_days": 7, + "times_per_day": 2, + "usage_instruction": "早晚温服", + "doctor_name": "陈医生(演示)", + "creator_id": 1001, + "assistant_name": "周医助", + "audit_status": 1, + "void_status": 0, + "has_prescription_order": 1, + "create_time": f"{self._today.isoformat()} 09:42:00", + } + ), + Prescription.from_dict( + { + "id": 802, + "diagnosis_id": 501, + "appointment_id": 101, + "case_record": { + "diagnosis_id": 501, + "appointment_id": 101, + "clinical_diagnosis": "肝郁脾虚证", + }, + "sn": "RX20260810002", + "patient_name": "林晓岚", + "phone": "138****1203", + "gender": 2, + "age": 46, + "visit_no": "3", + "prescription_date": self._today.isoformat(), + "prescription_type": "汤剂", + "herbs": [], + "clinical_diagnosis": "肝郁脾虚证", + "doctor_name": "陈医生(演示)", + "creator_id": 1001, + "assistant_name": "周医助", + "audit_status": 0, + "void_status": 0, + "has_prescription_order": 0, + "create_time": f"{self._today.isoformat()} 10:05:00", + } + ), + ] + + @staticmethod + def _build_medicines() -> list[dict[str, Any]]: + """Build medicines used by template and issued-prescription examples.""" + + names = ("柴胡", "白芍", "茯苓", "酸枣仁", "夜交藤", "半夏", "黄芪", "甘草") + return [ + { + "id": index, + "medicine_id": index, + "name": name, + "status": 1, + "unit": "g", + "specification": "饮片", + } + for index, name in enumerate(names, start=11) + ] + + def _build_patient_orders(self) -> list[dict[str, Any]]: + """Build a mutable patient-order example covering the action matrix.""" + + return [ + { + "id": 901, + "order_no": "PO20260810001", + "prescription_id": 801, + "diagnosis_id": 502, + "patient_id": 302, + "patient_name": "赵明远", + "phone": "186****4821", + "recipient_name": "赵明远", + "recipient_phone": "18600004821", + "shipping_address": "河南省洛阳市演示路 1 号", + "service_channel": "线上复诊", + "service_package": "基础调理", + "ship_mode": "direct", + "amount": 368.0, + "prescription_audit_status": 1, + "payment_slip_audit_status": 1, + "fulfillment_status": 2, + "medication_days": 7, + "remark_extra": "演示订单", + "remark_assistant": "患者希望工作日收货", + "assistant_id": 2001, + "assistant_name": "周医助", + "doctor_id": 1001, + "doctor_name": "陈医生(演示)", + "creator_id": 2001, + "creator_name": "周医助", + "create_time": f"{self._today.isoformat()} 10:15:00", + "pay_orders": [{"id": 9001, "order_no": "PAY-DEMO-9001", "pay_amount": 368.0}], + } + ] + + @staticmethod + def _demo_menu() -> list[dict[str, Any]]: + return [ + { + "name": "接诊台", + "paths": "/reception", + "component": "patient/reception/index", + "perms": "doctor.appointment/lists", + "sort": 10, + "is_show": 1, + "is_disable": 0, + }, + { + "name": "处方库", + "paths": "/prescription-library", + "component": "consumer/prescription/list", + "perms": "tcm.prescriptionLibrary/lists", + "sort": 20, + "is_show": 1, + "is_disable": 0, + }, + { + "name": "已开处方", + "paths": "/prescriptions", + "component": "consumer/prescription/index", + "perms": "tcm.prescription/lists", + "sort": 30, + "is_show": 1, + "is_disable": 0, + }, + { + "name": "我的患者", + "paths": "/patients", + "component": "first_visit/my_patients/index", + "perms": "firstvisit.myPatient/lists", + "sort": 40, + "is_show": 1, + "is_disable": 0, + }, + { + "name": "问诊列表", + "paths": "/consultations", + "component": "tcm/diagnosis/index", + "perms": "tcm.diagnosis/lists", + "sort": 50, + "is_show": 1, + "is_disable": 0, + }, + ] + + +def _page( + rows: list[ItemT], + page_no: int, + page_size: int, + extend: Mapping[str, Any] | None = None, +) -> PageResult[ItemT]: + if page_no < 1 or page_size < 1: + raise ValueError("page_no and page_size must be positive") + start = (page_no - 1) * page_size + return PageResult( + items=deepcopy(rows[start : start + page_size]), + total=len(rows), + page_no=page_no, + page_size=page_size, + extend=deepcopy(dict(extend or {})), + ) + + +def _bool(value: object) -> bool: + if isinstance(value, str): + return value.strip().lower() not in {"", "0", "false", "no", "off"} + return bool(value) + + +def _formula_key(value: object) -> str: + text = str(value or "").strip().lower() + return "aux" if text in {"2", "aux", "auxiliary", "secondary", "辅方"} else "main" + + +def _appointment_dict(appointment: Appointment) -> dict[str, Any]: + result = dict(appointment.raw) + result.update( + { + "id": appointment.id, + "status": appointment.status, + "status_desc": appointment.status_desc, + "has_prescription": int(appointment.has_prescription), + } + ) + return result diff --git a/app/src/doctor_workstation/services/remote_repository.py b/app/src/doctor_workstation/services/remote_repository.py new file mode 100644 index 000000000..2bc5bd07f --- /dev/null +++ b/app/src/doctor_workstation/services/remote_repository.py @@ -0,0 +1,17 @@ +"""Compatibility module exporting the production doctor repository.""" + +from .repository import ( + PRESCRIPTION_LIBRARY_PERMISSIONS, + PRESCRIPTION_PERMISSIONS, + AuditAction, + DoctorRepository, + RemoteDoctorRepository, +) + +__all__ = [ + "AuditAction", + "DoctorRepository", + "PRESCRIPTION_LIBRARY_PERMISSIONS", + "PRESCRIPTION_PERMISSIONS", + "RemoteDoctorRepository", +] diff --git a/app/src/doctor_workstation/services/repository.py b/app/src/doctor_workstation/services/repository.py new file mode 100644 index 000000000..afe45266d --- /dev/null +++ b/app/src/doctor_workstation/services/repository.py @@ -0,0 +1,2027 @@ +"""Remote repository adapting the confirmed admin endpoints to domain models.""" + +from __future__ import annotations + +import mimetypes +from collections.abc import Mapping +from contextlib import suppress +from datetime import date +from os import PathLike +from pathlib import Path +from typing import Any, Final, Literal, Protocol + +from doctor_workstation.core.errors import ( + ApiProtocolError, + ApiTransportError, + AuthenticationExpiredError, +) +from doctor_workstation.core.models import ( + Appointment, + CallTicket, + Consultation, + PageResult, + Patient, + Prescription, + PrescriptionTemplate, + UserProfile, +) +from doctor_workstation.core.permissions import PermissionSet +from doctor_workstation.core.session import Session + +from .api_client import ApiClient +from .token_store import TokenStore + +AuditAction = Literal["approve", "reject"] + +PRESCRIPTION_LIBRARY_PERMISSIONS: Final[dict[str, str]] = { + "create": "wcf.prescription/add", + "read": "wcf.prescription/read", + "update": "wcf.prescription/edit", + "delete": "wcf.prescription/delete", +} +"""Canonical permissions used by the routed prescription-library view.""" + +PRESCRIPTION_PERMISSIONS: Final[dict[str, str]] = { + "create": "cf.prescription/add", + "read": "cf.prescription/read", + "update": "cf.prescription/edit", + "audit": "cf.prescription/audit", + "delete": "cf.prescription/del", + "patch_patient": "tcm.prescription/patchPatient", + "create_order": "tcm.prescriptionOrder/create", + "list_orders": "tcm.prescriptionOrder/lists", + "set_ship_mode": "tcm.prescriptionOrder/setShipMode", + "edit_extra_remark": "tcm.prescriptionOrder/editRemarkExtra", +} +"""Canonical permissions used by the routed issued-prescription view.""" + + +class DoctorRepository(Protocol): + """UI-facing contract shared by remote and fully in-memory repositories.""" + + def login( + self, + account: str, + password: str, + *, + remember_account: bool = False, + ) -> Session: + """Authenticate a doctor and return a validated, complete session.""" + + def list_appointments( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[Appointment]: + """Return a filtered appointment page.""" + + def list_patients( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[Patient]: + """Return a doctor-scoped patient page.""" + + def list_consultations( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[Consultation]: + """Return a diagnosis/consultation page.""" + + def list_prescription_templates( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[PrescriptionTemplate]: + """Return a prescription-library page.""" + + def list_prescriptions( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[Prescription]: + """Return an issued-prescription page.""" + + def get_reception(self, appointment_id: int) -> dict[str, Any]: + """Return the aggregate reception record for one appointment.""" + + def get_doctor_notes(self, diagnosis_id: int) -> list[dict[str, Any]]: + """Return doctor notes and media for one diagnosis.""" + + def upload_material( + self, + path: str | PathLike[str], + material_type: Literal["image", "file", "tongue_images", "report_files"], + cid: int = 0, + ) -> str: + """Upload one local note material and return its server URI.""" + + def get_prescription_template(self, template_id: int) -> PrescriptionTemplate: + """Return one prescription-library record.""" + + def create_prescription_template( + self, + template: PrescriptionTemplate | Mapping[str, Any] | None = None, + **fields: Any, + ) -> PrescriptionTemplate: + """Create a prescription-library record.""" + + def update_prescription_template( + self, + template: int | PrescriptionTemplate | Mapping[str, Any], + changes: Mapping[str, Any] | None = None, + **fields: Any, + ) -> PrescriptionTemplate: + """Update a prescription-library record.""" + + def delete_prescription_template(self, template_id: int) -> Any: + """Delete a prescription-library record.""" + + def get_prescription(self, prescription_id: int) -> Prescription: + """Return one issued prescription.""" + + def create_prescription( + self, + prescription: Prescription | Mapping[str, Any] | None = None, + **fields: Any, + ) -> Prescription: + """Create an issued prescription.""" + + def update_prescription( + self, + prescription: int | Prescription | Mapping[str, Any], + changes: Mapping[str, Any] | None = None, + **fields: Any, + ) -> Prescription: + """Update an issued prescription.""" + + def delete_prescription(self, prescription_id: int) -> Any: + """Delete an issued prescription.""" + + def patch_prescription_patient( + self, + prescription_id: int, + *, + patient_name: str, + phone: str, + gender: int, + ) -> Any: + """Correct the patient identity printed on a prescription.""" + + def audit_prescription( + self, + prescription_id: int, + *, + action: AuditAction, + remark: str = "", + ) -> Any: + """Approve or reject an issued prescription.""" + + def list_medicines( + self, + *, + name: str = "", + page_no: int = 1, + page_size: int = 100, + status: int = 1, + ) -> PageResult[dict[str, Any]]: + """Return selectable active medicines.""" + + def patient_orders( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[dict[str, Any]]: + """Return the doctor-scoped patient-order workspace.""" + + def patient_progress( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[dict[str, Any]]: + """Return the doctor-scoped interview-progress workspace.""" + + def patient_detail(self, diagnosis_id: int) -> dict[str, Any]: + """Return a patient's permission-aware readonly diagnosis detail.""" + + def appointment_history( + self, diagnosis_id: int, *, page_no: int = 1, page_size: int = 500 + ) -> PageResult[Appointment]: + """Return all appointments associated with a diagnosis.""" + + def assign_history( + self, diagnosis_id: int, *, page_no: int = 1, page_size: int = 20 + ) -> PageResult[dict[str, Any]]: + """Return medical-assistant assignment history.""" + + def list_patient_assistants(self) -> list[dict[str, Any]]: + """Return assistants selectable from the patient workspace.""" + + def assign_patient( + self, + diagnosis_id: int, + assistant_id: int, + *, + is_inherit: int | None = None, + ) -> Any: + """Assign or reassign a patient diagnosis to an assistant.""" + + def fill_patient_id_card(self, diagnosis_id: int, id_card: str) -> Any: + """Complete a patient's identity card through the scoped endpoint.""" + + def book_patient_appointment( + self, payload: Mapping[str, Any] | None = None, **fields: Any + ) -> Any: + """Create an appointment from the patient workspace.""" + + def cancel_patient_appointment(self, appointment_id: int) -> Any: + """Cancel an appointment from the patient workspace.""" + + def get_diagnosis_detail(self, diagnosis_id: int, *, readonly: bool = False) -> dict[str, Any]: + """Return an editable or permission-aware readonly diagnosis detail.""" + + def update_diagnosis( + self, + diagnosis: int | Mapping[str, Any], + changes: Mapping[str, Any] | None = None, + **fields: Any, + ) -> dict[str, Any]: + """Update a diagnosis using its full form DTO.""" + + def restore_session(self, token: str | None = None) -> Session | None: + """Restore and validate a previously issued access token.""" + + def get_session(self) -> Session: + """Return the authoritative current session.""" + + def get_current_user(self) -> UserProfile: + """Return the current authenticated profile.""" + + def logout(self, *, forget_account: bool = False) -> None: + """Clear authentication and optionally remembered account metadata.""" + + def list_reception_queue( + self, + *, + status: int, + keyword: str = "", + page_no: int = 1, + page_size: int = 15, + on_date: date | str | None = None, + ) -> PageResult[Appointment]: + """Return one same-day reception queue.""" + + def list_appointment_rosters( + self, + *, + doctor_id: int, + start_date: str, + end_date: str, + status: int = 1, + page_no: int = 1, + page_size: int = 100, + ) -> PageResult[dict[str, Any]]: + """Return one doctor's dated appointment rosters.""" + + def get_available_appointment_slots( + self, + *, + doctor_id: int, + appointment_date: str, + period: str = "all", + ) -> dict[str, Any]: + """Return server-authoritative available slots for one doctor/date.""" + + def notify_assistant(self, appointment_id: int) -> Any: + """Notify the assistant assigned to an appointment.""" + + def add_doctor_note( + self, + diagnosis_id: int, + content: str = "", + *, + tongue_images: list[str] | tuple[str, ...] | None = None, + report_files: list[str] | tuple[str, ...] | None = None, + ) -> Any: + """Append text and media to a diagnosis note.""" + + def delete_doctor_note_image( + self, + note_id: int, + image_type: Literal["tongue_images", "report_files"], + image_path: str, + ) -> Any: + """Delete one image or report from a note.""" + + def complete_appointment(self, appointment_id: int) -> Any: + """Mark one appointment complete.""" + + def void_prescription(self, prescription_id: int) -> Any: + """Void a diagnosis-context prescription.""" + + def list_prescriptions_by_diagnosis(self, diagnosis_id: int) -> list[Prescription]: + """Return prescriptions linked to one diagnosis.""" + + def get_prescription_by_appointment(self, appointment_id: int) -> Prescription | None: + """Return the prescription linked to an appointment, if present.""" + + def list_prescription_orders( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[dict[str, Any]]: + """Return prescription fulfilment orders.""" + + def get_prescription_order(self, order_id: int) -> dict[str, Any]: + """Return one prescription fulfilment order.""" + + def create_prescription_order( + self, payload: Mapping[str, Any] | None = None, **fields: Any + ) -> dict[str, Any]: + """Create a prescription fulfilment order.""" + + def list_paid_prescription_orders( + self, + diagnosis_id: int, + *, + prescription_order_id: int | None = None, + ) -> dict[str, Any]: + """Return paid orders eligible for association.""" + + def search_diagnosis_patients( + self, keyword: str, *, page_no: int = 1, page_size: int = 10 + ) -> PageResult[dict[str, Any]]: + """Search diagnoses for an order patient selector.""" + + def get_dictionary(self, dictionary_type: str) -> list[dict[str, Any]]: + """Return one configuration dictionary.""" + + def get_patient_order(self, order_id: int) -> dict[str, Any]: + """Return a patient-scoped order detail.""" + + def edit_patient_order( + self, + order: int | Mapping[str, Any], + changes: Mapping[str, Any] | None = None, + **fields: Any, + ) -> Any: + """Edit a patient-scoped order.""" + + def audit_patient_order_prescription( + self, order_id: int, action: AuditAction, remark: str = "" + ) -> Any: + """Audit a patient order's prescription.""" + + def revoke_patient_order_prescription_audit(self, order_id: int) -> Any: + """Revoke a patient order's prescription audit.""" + + def audit_patient_order_payment( + self, order_id: int, action: AuditAction, remark: str = "" + ) -> Any: + """Audit a patient order's payment.""" + + def revoke_patient_order_payment_audit(self, order_id: int) -> Any: + """Revoke a patient order's payment audit.""" + + def update_patient_order_shipping( + self, order_id: int, express_company: str, tracking_number: str + ) -> Any: + """Update a patient order's courier fields.""" + + def ship_patient_order( + self, + order_id: int, + express_company: str, + tracking_number: str, + *, + ship_mode: Literal["gancao", "direct"] | None = None, + ) -> Any: + """Advance a patient order to shipped.""" + + def add_patient_order_payment( + self, + order_id: int, + order_type: int, + pay_amount: float, + *, + pay_remark: str = "", + completion_request: int | None = None, + pay_create_type: Literal["fubei", "express_cod"] | None = None, + ) -> Any: + """Add a payment to a shipped patient order.""" + + def complete_patient_order(self, order_id: int, fulfillment_status: int) -> Any: + """Complete a patient order.""" + + def refund_patient_order( + self, order_id: int, reason: str, refund_amount: float | None = None + ) -> Any: + """Refund a patient order.""" + + def withdraw_patient_order(self, order_id: int) -> Any: + """Withdraw a patient order.""" + + def upload_patient_order_to_pharmacy(self, order_id: int) -> Any: + """Submit a patient order to a pharmacy.""" + + def diagnosis_readonly_detail(self, diagnosis_id: int) -> dict[str, Any]: + """Return the readonly diagnosis aggregate.""" + + def create_diagnosis( + self, diagnosis: Mapping[str, Any] | None = None, **fields: Any + ) -> dict[str, Any]: + """Create a diagnosis.""" + + def delete_diagnosis(self, diagnosis_id: int) -> Any: + """Delete a diagnosis.""" + + def set_revisit_slot_start_offset(self, diagnosis_id: int, offset: int) -> Any: + """Set a diagnosis revisit-statistics offset.""" + + def assign_diagnosis( + self, + diagnosis_id: int, + assistant_id: int, + *, + is_inherit: int | None = None, + ) -> Any: + """Assign a diagnosis to an assistant.""" + + def list_diagnosis_assistants(self) -> list[dict[str, Any]]: + """Return assistants selectable in diagnosis forms.""" + + def list_diagnosis_doctors(self) -> list[dict[str, Any]]: + """Return doctors selectable in diagnosis forms.""" + + def get_tracking_window( + self, + diagnosis_id: int, + *, + start_date: str = "", + end_date: str = "", + ) -> dict[str, Any]: + """Return a diagnosis tracking date window.""" + + def list_tracking_notes(self, diagnosis_id: int) -> list[dict[str, Any]]: + """Return diagnosis tracking notes.""" + + def add_tracking_note(self, diagnosis_id: int, content: str) -> Any: + """Append a diagnosis tracking note.""" + + def check_diagnosis_phone(self, payload: Mapping[str, Any]) -> Any: + """Check diagnosis phone uniqueness.""" + + def check_diagnosis_id_card(self, payload: Mapping[str, Any]) -> Any: + """Check diagnosis identity-card uniqueness.""" + + def fill_diagnosis_id_card(self, diagnosis_id: int, id_card: str) -> Any: + """Fill a diagnosis identity card.""" + + def list_diagnosis_todos( + self, + diagnosis_id: int, + *, + page_no: int = 1, + page_size: int = 20, + status: int | None = None, + creator_id: int | None = None, + ) -> PageResult[dict[str, Any]]: + """Return diagnosis follow-up todos.""" + + def add_diagnosis_todo(self, diagnosis_id: int, content: str, remind_time: int) -> Any: + """Create a diagnosis follow-up todo.""" + + def cancel_diagnosis_todo(self, todo_id: int) -> Any: + """Cancel a diagnosis follow-up todo.""" + + def get_call_ticket(self, patient_id: int, diagnosis_id: int) -> CallTicket: + """Return short-lived call credentials.""" + + def start_call(self, diagnosis_id: int, patient_id: int, *, call_type: int = 2) -> Any: + """Create a call record.""" + + def end_call(self, diagnosis_id: int) -> Any: + """End the active diagnosis call.""" + + def bind_call_room(self, diagnosis_id: int, room_id: str) -> Any: + """Bind a TRTC room to the active call.""" + + def my_self(self) -> Session: + """Compatibility alias for :meth:`get_session`.""" + + def reception(self, appointment_id: int) -> dict[str, Any]: + """Compatibility alias for :meth:`get_reception`.""" + + def add_prescription_template( + self, + template: PrescriptionTemplate | Mapping[str, Any] | None = None, + **fields: Any, + ) -> PrescriptionTemplate: + """Compatibility alias for prescription-template creation.""" + + def edit_prescription_template( + self, + template: int | PrescriptionTemplate | Mapping[str, Any], + changes: Mapping[str, Any] | None = None, + **fields: Any, + ) -> PrescriptionTemplate: + """Compatibility alias for prescription-template editing.""" + + +class RemoteDoctorRepository: + """Translate doctor-workstation operations into confirmed admin endpoints.""" + + def __init__(self, client: ApiClient, token_store: TokenStore | None = None) -> None: + """Create a repository around an API client and optional token store.""" + + self.client = client + self.token_store = token_store + self._login_metadata: dict[str, Any] = {} + self._session: Session | None = None + + def login( + self, + account: str, + password: str, + *, + remember_account: bool = False, + ) -> Session: + """Authenticate, validate ``mySelf``, then persist the issued token. + + Token persistence is the final step of the transaction. A failed + profile/session validation clears both the candidate in memory and any + previously persisted token, so a partial login cannot survive restart. + """ + + clean_account = account.strip() + if not clean_account or not password: + raise ValueError("account and password are required") + try: + result = _require_mapping( + self.client.post( + "login/account", + {"account": clean_account, "password": password, "terminal": 1}, + ), + "login/account", + ) + token = str(result.get("token") or "").strip() + if not token: + raise ApiProtocolError( + "login/account returned no token", + data=dict(result), + ) + self.client.set_token(token) + self._login_metadata = dict(result) + session = self.get_session() + if not isinstance(session, Session) or not session.authenticated: + raise ApiProtocolError( + "auth.admin/mySelf returned an incomplete session", + data=dict(result), + ) + if self.token_store is not None: + self.token_store.save_token( + token, + account=clean_account if remember_account else "", + scope=self.client.base_url, + ) + except Exception: + self._clear_authentication(clear_persisted=True) + raise + self._session = session + return session + + def restore_session(self, token: str | None = None) -> Session | None: + """Restore a persisted token and validate it by loading ``mySelf``.""" + + candidate = token + persisted_candidate = candidate is None + if candidate is None and self.token_store is not None: + candidate = self.token_store.load_token(scope=self.client.base_url) + if not candidate or not candidate.strip(): + self._clear_authentication(clear_persisted=False) + return None + clean_token = candidate.strip() + self.client.set_token(clean_token) + self._login_metadata.clear() + try: + session = self.get_session() + if not isinstance(session, Session) or not session.authenticated: + raise ApiProtocolError("persisted token returned an incomplete session") + except AuthenticationExpiredError: + self._clear_authentication(clear_persisted=persisted_candidate) + raise + except ApiTransportError: + # A transient transport failure must not destroy an otherwise valid + # persisted credential; it remains available on the next startup. + self._clear_authentication(clear_persisted=False) + raise + except Exception: + # Protocol and business/control-flow failures are deterministic for + # this token and must not be replayed on every application launch. + self._clear_authentication(clear_persisted=persisted_candidate) + raise + self._session = session + return session + + def get_session(self) -> Session: + """Load the current user, permissions and dynamic menu from ``mySelf``.""" + + result = _require_mapping(self.client.get("auth.admin/mySelf"), "auth.admin/mySelf") + user = UserProfile.from_dict(result) + permission_values = _strings(result.get("permissions")) or user.permissions + user.permissions = permission_values + menu = _safe_menu(result.get("menu")) + is_paw = _to_int(user.raw.get("is_paw", self._login_metadata.get("is_paw", 1)), 1) + need_bind = _to_bool( + self._login_metadata.get( + "need_bind_work_wechat", result.get("need_bind_work_wechat", False) + ) + ) + session = Session( + token=self.client.token, + user=user, + permissions=PermissionSet(permission_values), + menu=menu, + is_paw=is_paw, + need_bind_work_wechat=need_bind, + metadata={ + key: value + for key, value in self._login_metadata.items() + if key not in {"token", "password"} + }, + ) + self._session = session + return session + + def get_current_user(self) -> UserProfile: + """Return the current authenticated user profile.""" + + return self._session.user if self._session is not None else self.get_session().user + + def logout(self, *, forget_account: bool = False) -> None: + """Clear local authentication without implicitly retrying a remote write.""" + + self.client.clear_token() + self._login_metadata.clear() + self._session = None + if self.token_store is not None: + if forget_account: + self.token_store.clear() + else: + self.token_store.clear_token() + + def _clear_authentication(self, *, clear_persisted: bool) -> None: + """Reset partial authentication state without masking its root error.""" + + self.client.clear_token() + self._login_metadata.clear() + self._session = None + if clear_persisted and self.token_store is not None: + with suppress(Exception): + self.token_store.clear_token() + + def list_appointments( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[Appointment]: + """List appointments using ``doctor.appointment/lists``. + + Reception callers historically use this generic method with status 1 + or 4. Those two queue states are always scoped to the local calendar + day unless the caller explicitly supplies a date range. History + callers use :meth:`appointment_history` and are never narrowed here. + """ + + request_filters = dict(filters) + if request_filters.get("keyword") and not request_filters.get("patient_name"): + request_filters["patient_name"] = request_filters.pop("keyword") + if ( + str(request_filters.get("status") or "") in {"1", "4"} + and not request_filters.get("start_date") + and not request_filters.get("end_date") + and not request_filters.get("diag_scope_relax") + ): + today = date.today().isoformat() + request_filters.update({"start_date": today, "end_date": today}) + payload = self.client.get( + "doctor.appointment/lists", + _page_params(page_no, page_size, request_filters), + ) + return PageResult.from_payload( + payload, Appointment.from_dict, page_no=page_no, page_size=page_size + ) + + def list_reception_queue( + self, + *, + status: int, + keyword: str = "", + page_no: int = 1, + page_size: int = 15, + on_date: date | str | None = None, + ) -> PageResult[Appointment]: + """Return one of the two reception queues, forcibly scoped to one day.""" + + if status not in {1, 4}: + raise ValueError("reception status must be 1 or 4") + day = on_date.isoformat() if isinstance(on_date, date) else str(on_date or "") + day = day.strip() or date.today().isoformat() + return self.list_appointments( + status=status, + keyword=keyword, + start_date=day, + end_date=day, + page_no=page_no, + page_size=page_size, + ) + + def list_appointment_rosters( + self, + *, + doctor_id: int, + start_date: str, + end_date: str, + status: int = 1, + page_no: int = 1, + page_size: int = 100, + ) -> PageResult[dict[str, Any]]: + """Load one doctor's active rosters through ``doctor.roster/lists``.""" + + if doctor_id <= 0: + raise ValueError("doctor_id must be positive") + clean_start = start_date.strip() + clean_end = end_date.strip() + if not clean_start or not clean_end: + raise ValueError("start_date and end_date are required") + if clean_start > clean_end: + raise ValueError("start_date cannot be after end_date") + payload = self.client.get( + "doctor.roster/lists", + _page_params( + page_no, + page_size, + { + "doctor_id": doctor_id, + "start_date": clean_start, + "end_date": clean_end, + "status": status, + }, + ), + ) + return PageResult.from_payload( + payload, + lambda row: dict(row), + page_no=page_no, + page_size=page_size, + ) + + def get_available_appointment_slots( + self, + *, + doctor_id: int, + appointment_date: str, + period: str = "all", + ) -> dict[str, Any]: + """Load server-authoritative slots through ``availableSlots``.""" + + if doctor_id <= 0: + raise ValueError("doctor_id must be positive") + clean_date = appointment_date.strip() + if not clean_date: + raise ValueError("appointment_date is required") + payload = self.client.get( + "doctor.appointment/availableSlots", + { + "doctor_id": doctor_id, + "appointment_date": clean_date, + "period": period.strip() or "all", + }, + ) + return dict(_require_mapping(payload, "doctor.appointment/availableSlots")) + + def get_reception(self, appointment_id: int) -> dict[str, Any]: + """Load aggregated appointment, diagnosis and doctor-note details.""" + + return dict( + _require_mapping( + self.client.get("doctor.appointment/reception", {"id": appointment_id}), + "doctor.appointment/reception", + ) + ) + + def upload_material( + self, + path: str | PathLike[str], + material_type: Literal["image", "file", "tongue_images", "report_files"], + cid: int = 0, + ) -> str: + """Upload a local note material and return only its server reference.""" + + if cid < 0: + raise ValueError("cid must be non-negative") + kind = _material_kind(material_type) + source = Path(path) + if not source.is_file(): + raise FileNotFoundError(f"material file does not exist: {source}") + mime_type = mimetypes.guess_type(source.name)[0] or "application/octet-stream" + endpoint = f"upload/{kind}" + with source.open("rb") as stream: + payload = self.client.post_multipart( + endpoint, + files={"file": (source.name, stream, mime_type)}, + data={"cid": str(cid)}, + ) + return _normalise_material_reference(payload, endpoint) + + def notify_assistant(self, appointment_id: int) -> Any: + """Ask the server to notify the assigned medical assistant.""" + + return self.client.post("doctor.appointment/notifyAssistant", {"id": appointment_id}) + + def add_doctor_note( + self, + diagnosis_id: int, + content: str = "", + *, + tongue_images: list[str] | tuple[str, ...] | None = None, + report_files: list[str] | tuple[str, ...] | None = None, + ) -> Any: + """Append a doctor's text, tongue images and report files to a diagnosis.""" + + if len(content) > 500: + raise ValueError("doctor note content cannot exceed 500 characters") + if len(tongue_images or ()) > 99 or len(report_files or ()) > 99: + raise ValueError("doctor note media cannot exceed 99 items per type") + if not content.strip() and not tongue_images and not report_files: + raise ValueError("a note must contain text, an image or a report") + clean_tongue = _server_materials(tongue_images, "tongue_images") + clean_reports = _server_materials(report_files, "report_files") + body: dict[str, Any] = {"diagnosis_id": diagnosis_id, "content": content.strip()} + if tongue_images is not None: + body["tongue_images"] = clean_tongue + if report_files is not None: + body["report_files"] = clean_reports + return self.client.post("doctor.appointment/addDoctorNote", body) + + def get_doctor_notes(self, diagnosis_id: int) -> list[dict[str, Any]]: + """Load all text and media notes for one diagnosis.""" + + payload = self.client.get("doctor.appointment/doctorNotes", {"diagnosis_id": diagnosis_id}) + return _mapping_rows(payload) + + def delete_doctor_note_image( + self, + note_id: int, + image_type: Literal["tongue_images", "report_files"], + image_path: str, + ) -> Any: + """Delete one tongue image or report attachment from a doctor note.""" + + if image_type not in {"tongue_images", "report_files"}: + raise ValueError("image_type must be tongue_images or report_files") + if not image_path.strip(): + raise ValueError("image_path is required") + return self.client.post( + "doctor.appointment/deleteDoctorNoteImage", + { + "note_id": note_id, + "image_type": image_type, + "image_path": image_path.strip(), + }, + ) + + def complete_appointment(self, appointment_id: int) -> Any: + """Mark an appointment complete using the server-authoritative action.""" + + return self.client.post("doctor.appointment/complete", {"id": appointment_id}) + + def list_prescription_templates( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[PrescriptionTemplate]: + """List reusable formulas from ``tcm.prescriptionLibrary/lists``.""" + + request_filters = dict(filters) + if request_filters.get("keyword") and not request_filters.get("prescription_name"): + request_filters["prescription_name"] = request_filters.pop("keyword") + if request_filters.get("formula_type") not in (None, ""): + request_filters["formula_type"] = _formula_type_for_api(request_filters["formula_type"]) + payload = self.client.get( + "tcm.prescriptionLibrary/lists", + _page_params(page_no, page_size, request_filters), + ) + return PageResult.from_payload( + payload, + PrescriptionTemplate.from_dict, + page_no=page_no, + page_size=page_size, + ) + + def get_prescription_template(self, template_id: int) -> PrescriptionTemplate: + """Load one prescription-library formula by identifier.""" + + result = _require_mapping( + self.client.get("tcm.prescriptionLibrary/detail", {"id": template_id}), + "tcm.prescriptionLibrary/detail", + ) + return PrescriptionTemplate.from_dict(result) + + def create_prescription_template( + self, + template: PrescriptionTemplate | Mapping[str, Any] | None = None, + **fields: Any, + ) -> PrescriptionTemplate: + """Create a reusable formula and return its normalised representation.""" + + body = _template_payload(template, fields, include_id=False) + result = self.client.post("tcm.prescriptionLibrary/add", body) + merged = dict(body) + if isinstance(result, Mapping): + merged.update(result) + elif isinstance(result, (int, str)): + merged["id"] = result + return PrescriptionTemplate.from_dict(merged) + + def update_prescription_template( + self, + template: int | PrescriptionTemplate | Mapping[str, Any], + changes: Mapping[str, Any] | None = None, + **fields: Any, + ) -> PrescriptionTemplate: + """Update an existing formula and return the submitted server state.""" + + extra = dict(changes or {}) + extra.update(fields) + if isinstance(template, int): + extra["id"] = template + source: PrescriptionTemplate | Mapping[str, Any] | None = None + else: + source = template + body = _template_payload(source, extra, include_id=True) + if not _to_int(body.get("id"), 0): + raise ValueError("template id is required") + result = self.client.post("tcm.prescriptionLibrary/edit", body) + merged = dict(body) + if isinstance(result, Mapping): + merged.update(result) + return PrescriptionTemplate.from_dict(merged) + + def delete_prescription_template(self, template_id: int) -> Any: + """Delete a reusable formula by identifier.""" + + return self.client.post("tcm.prescriptionLibrary/delete", {"id": template_id}) + + def list_medicines( + self, + *, + name: str = "", + page_no: int = 1, + page_size: int = 100, + status: int = 1, + ) -> PageResult[dict[str, Any]]: + """List selectable medicines using the exact medicine-picker contract.""" + + payload = self.client.get( + "doctor.medicine/lists", + _page_params( + page_no, + page_size, + {"name": name.strip(), "status": status}, + ), + ) + return PageResult.from_payload( + payload, + lambda row: dict(row), + page_no=page_no, + page_size=page_size, + ) + + def list_prescriptions( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[Prescription]: + """List issued prescriptions using ``tcm.prescription/lists``.""" + + request_filters = dict(filters) + if str(request_filters.get("audit_filter") or "").lower() == "all": + request_filters["audit_filter"] = "" + if str(request_filters.get("source_filter") or "").lower() == "all": + request_filters["source_filter"] = "" + keyword = str(request_filters.pop("keyword", "") or "").strip() + if keyword: + key = ( + "sn" + if keyword.upper().startswith(("RX", "CF")) or keyword.isdigit() + else "patient_name" + ) + request_filters.setdefault(key, keyword) + status = request_filters.pop("status", None) + legacy_status = request_filters.pop("audit_status", None) + if status in (None, ""): + status = legacy_status + if status not in (None, ""): + status_text = str(status).strip().lower() + audit_filter = ( + status_text + if status_text in {"pending", "passed", "not_passed", "rejected"} + else {0: "pending", 1: "passed", 2: "rejected"}.get(_to_int(status, -99)) + ) + if audit_filter: + request_filters["audit_filter"] = audit_filter + payload = self.client.get( + "tcm.prescription/lists", + _page_params(page_no, page_size, request_filters), + ) + return PageResult.from_payload( + payload, Prescription.from_dict, page_no=page_no, page_size=page_size + ) + + def get_prescription(self, prescription_id: int) -> Prescription: + """Load one issued prescription using ``tcm.prescription/detail``.""" + + result = _require_mapping( + self.client.get("tcm.prescription/detail", {"id": prescription_id}), + "tcm.prescription/detail", + ) + return Prescription.from_dict(result) + + def create_prescription( + self, + prescription: Prescription | Mapping[str, Any] | None = None, + **fields: Any, + ) -> Prescription: + """Create an issued prescription with the complete admin form DTO.""" + + body = _prescription_payload(prescription, fields, include_id=False) + result = self.client.post("tcm.prescription/add", body) + return Prescription.from_dict(_merge_result(body, result)) + + def update_prescription( + self, + prescription: int | Prescription | Mapping[str, Any], + changes: Mapping[str, Any] | None = None, + **fields: Any, + ) -> Prescription: + """Edit a prescription; the server resets audit state authoritatively.""" + + extra = dict(changes or {}) + extra.update(fields) + if isinstance(prescription, int): + extra["id"] = prescription + source: Prescription | Mapping[str, Any] | None = None + else: + source = prescription + body = _prescription_payload(source, extra, include_id=True) + if not _to_int(body.get("id"), 0): + raise ValueError("prescription id is required") + result = self.client.post("tcm.prescription/edit", body) + return Prescription.from_dict(_merge_result(body, result)) + + def delete_prescription(self, prescription_id: int) -> Any: + """Delete an editable, non-approved prescription.""" + + return self.client.post("tcm.prescription/delete", {"id": prescription_id}) + + def patch_prescription_patient( + self, + prescription_id: int, + *, + patient_name: str, + phone: str, + gender: int, + ) -> Any: + """Correct name, phone and gender without changing audit state.""" + + clean_name = patient_name.strip() + if not clean_name: + raise ValueError("patient_name is required") + return self.client.post( + "tcm.prescription/patchPatient", + { + "id": prescription_id, + "patient_name": clean_name, + "phone": phone.strip(), + "gender": gender, + }, + ) + + def audit_prescription( + self, + prescription_id: int, + *, + action: AuditAction, + remark: str = "", + ) -> Any: + """Approve or reject; rejection requires the admin view's remark.""" + + action = _audit_action(action, remark) + return self.client.post( + "tcm.prescription/audit", + {"id": prescription_id, "action": action, "remark": remark.strip()}, + ) + + def void_prescription(self, prescription_id: int) -> Any: + """Void a diagnosis-context prescription when no business order blocks it.""" + + return self.client.post("tcm.prescription/void", {"id": prescription_id}) + + def list_prescriptions_by_diagnosis(self, diagnosis_id: int) -> list[Prescription]: + """Return all prescriptions attached to one diagnosis.""" + + payload = self.client.get( + "tcm.prescription/listByDiagnosis", {"diagnosis_id": diagnosis_id} + ) + return PageResult.from_payload(payload, Prescription.from_dict).items + + def get_prescription_by_appointment(self, appointment_id: int) -> Prescription | None: + """Return the prescription attached to an appointment, if one exists.""" + + payload = self.client.get( + "tcm.prescription/getByAppointment", {"appointment_id": appointment_id} + ) + if payload in (None, "", [], {}): + return None + if isinstance(payload, Mapping): + for key in ("prescription", "detail"): + if isinstance(payload.get(key), Mapping): + return Prescription.from_dict(payload[key]) + return Prescription.from_dict(payload) + rows = PageResult.from_payload(payload, Prescription.from_dict).items + return rows[0] if rows else None + + def list_prescription_orders( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[dict[str, Any]]: + """List prescription fulfilment orders without changing their data scope.""" + + payload = self.client.get( + "tcm.prescriptionOrder/lists", + _page_params(page_no, page_size, filters), + ) + return PageResult.from_payload( + payload, lambda row: dict(row), page_no=page_no, page_size=page_size + ) + + def get_prescription_order(self, order_id: int) -> dict[str, Any]: + """Return one prescription fulfilment order.""" + + return dict( + _require_mapping( + self.client.get("tcm.prescriptionOrder/detail", {"id": order_id}), + "tcm.prescriptionOrder/detail", + ) + ) + + def create_prescription_order( + self, payload: Mapping[str, Any] | None = None, **fields: Any + ) -> dict[str, Any]: + """Create a fulfilment order from the admin three-step DTO.""" + + body = _body(payload, fields) + for key in ("prescription_id", "diagnosis_id", "recipient_name", "recipient_phone"): + if body.get(key) in (None, ""): + raise ValueError(f"{key} is required") + result = self.client.post("tcm.prescriptionOrder/create", body) + return _merge_result(body, result) + + def list_paid_prescription_orders( + self, + diagnosis_id: int, + *, + prescription_order_id: int | None = None, + ) -> dict[str, Any]: + """Return selectable paid orders and the server deposit threshold.""" + + params: dict[str, Any] = {"diagnosis_id": diagnosis_id} + if prescription_order_id is not None: + params["prescription_order_id"] = prescription_order_id + payload = self.client.get("tcm.prescriptionOrder/paidPayOrders", params) + if isinstance(payload, Mapping): + return dict(payload) + return {"lists": _mapping_rows(payload), "deposit_min_amount": None} + + def search_diagnosis_patients( + self, keyword: str, *, page_no: int = 1, page_size: int = 10 + ) -> PageResult[dict[str, Any]]: + """Search diagnosis patients for prescription-order creation.""" + + payload = self.client.get( + "tcm.diagnosis/searchPatient", + _page_params(page_no, page_size, {"keyword": keyword.strip()}), + ) + return PageResult.from_payload( + payload, lambda row: dict(row), page_no=page_no, page_size=page_size + ) + + def get_dictionary(self, dictionary_type: str) -> list[dict[str, Any]]: + """Return configuration dictionary options used by order forms.""" + + payload = self.client.get("config/dict", {"type": dictionary_type}) + return _mapping_rows(payload) + + def list_patients( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[Patient]: + """List patients within the server-authoritative first-visit data scope.""" + + request_filters = dict(filters) + if "status" in request_filters and "status_filter" not in request_filters: + request_filters["status_filter"] = request_filters.pop("status") + payload = self.client.get( + "firstvisit.myPatient/lists", + _page_params(page_no, page_size, request_filters), + ) + return PageResult.from_payload( + payload, Patient.from_dict, page_no=page_no, page_size=page_size + ) + + def patient_orders( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[dict[str, Any]]: + """List orders in the server-scoped patient order workspace.""" + + payload = self.client.get( + "firstvisit.myPatient/orders", + _page_params(page_no, page_size, filters), + ) + return PageResult.from_payload( + payload, lambda row: dict(row), page_no=page_no, page_size=page_size + ) + + def patient_progress( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[dict[str, Any]]: + """List interview progress and preserve all schedule/scope extension data.""" + + payload = self.client.get( + "firstvisit.myPatient/progress", + _page_params(page_no, page_size, filters), + ) + return PageResult.from_payload( + payload, lambda row: dict(row), page_no=page_no, page_size=page_size + ) + + def get_patient_order(self, order_id: int) -> dict[str, Any]: + """Return an order through the patient-data-scope endpoint.""" + + return dict( + _require_mapping( + self.client.get("firstvisit.myPatient/orderDetail", {"id": order_id}), + "firstvisit.myPatient/orderDetail", + ) + ) + + def edit_patient_order( + self, + order: int | Mapping[str, Any], + changes: Mapping[str, Any] | None = None, + **fields: Any, + ) -> Any: + """Edit an order through the patient-scoped endpoint.""" + + body = _identified_body(order, changes, fields) + return self.client.post("firstvisit.myPatient/orderEdit", body) + + def audit_patient_order_prescription( + self, + order_id: int, + action: AuditAction, + remark: str = "", + ) -> Any: + """Audit the prescription side of a scoped patient order.""" + + action = _audit_action(action, remark) + return self.client.post( + "firstvisit.myPatient/orderAuditPrescription", + {"id": order_id, "action": action, "remark": remark.strip()}, + ) + + def revoke_patient_order_prescription_audit(self, order_id: int) -> Any: + """Revoke a scoped order's prescription audit.""" + + return self.client.post("firstvisit.myPatient/orderRevokeRxAudit", {"id": order_id}) + + def audit_patient_order_payment( + self, + order_id: int, + action: AuditAction, + remark: str = "", + ) -> Any: + """Audit the payment side of a scoped patient order.""" + + action = _audit_action(action, remark) + return self.client.post( + "firstvisit.myPatient/orderAuditPayment", + {"id": order_id, "action": action, "remark": remark.strip()}, + ) + + def revoke_patient_order_payment_audit(self, order_id: int) -> Any: + """Revoke a scoped order's payment audit.""" + + return self.client.post("firstvisit.myPatient/orderRevokePayAudit", {"id": order_id}) + + def update_patient_order_shipping( + self, + order_id: int, + express_company: str, + tracking_number: str, + ) -> Any: + """Update courier metadata regardless of fulfilment state.""" + + return self.client.post( + "firstvisit.myPatient/orderDdcode", + { + "id": order_id, + "express_company": express_company.strip(), + "tracking_number": tracking_number.strip(), + }, + ) + + def ship_patient_order( + self, + order_id: int, + express_company: str, + tracking_number: str, + *, + ship_mode: Literal["gancao", "direct"] | None = None, + ) -> Any: + """Advance a scoped order to shipped and store courier metadata.""" + + body: dict[str, Any] = { + "id": order_id, + "express_company": express_company.strip(), + "tracking_number": tracking_number.strip(), + } + if ship_mode is not None: + body["ship_mode"] = ship_mode + return self.client.post("firstvisit.myPatient/orderShip", body) + + def add_patient_order_payment( + self, + order_id: int, + order_type: int, + pay_amount: float, + *, + pay_remark: str = "", + completion_request: int | None = None, + pay_create_type: Literal["fubei", "express_cod"] | None = None, + ) -> Any: + """Add a payment to a shipped scoped order.""" + + body: dict[str, Any] = { + "id": order_id, + "order_type": order_type, + "pay_amount": pay_amount, + } + if pay_remark: + body["pay_remark"] = pay_remark + if completion_request is not None: + body["completion_request"] = completion_request + if pay_create_type is not None: + body["pay_create_type"] = pay_create_type + return self.client.post("firstvisit.myPatient/orderAddPayOrder", body) + + def complete_patient_order(self, order_id: int, fulfillment_status: int) -> Any: + """Complete a scoped order with the selected terminal business state.""" + + return self.client.post( + "firstvisit.myPatient/orderComplete", + {"id": order_id, "fulfillment_status": fulfillment_status}, + ) + + def refund_patient_order( + self, + order_id: int, + reason: str, + refund_amount: float | None = None, + ) -> Any: + """Refund a scoped patient order; a reason is mandatory.""" + + if not reason.strip(): + raise ValueError("refund reason is required") + body: dict[str, Any] = {"id": order_id, "reason": reason.strip()} + if refund_amount is not None: + body["refund_amount"] = refund_amount + return self.client.post("firstvisit.myPatient/orderRefund", body) + + def withdraw_patient_order(self, order_id: int) -> Any: + """Withdraw an eligible scoped patient order.""" + + return self.client.post("firstvisit.myPatient/orderWithdraw", {"id": order_id}) + + def upload_patient_order_to_pharmacy(self, order_id: int) -> Any: + """Submit an eligible scoped order to its selected pharmacy.""" + + return self.client.post("firstvisit.myPatient/orderUploadToPharmacy", {"id": order_id}) + + def list_patient_assistants(self) -> list[dict[str, Any]]: + """List medical assistants available within the current patient scope.""" + + return _mapping_rows(self.client.get("firstvisit.myPatient/assistants")) + + def assign_patient( + self, + diagnosis_id: int, + assistant_id: int, + *, + is_inherit: int | None = None, + ) -> Any: + """Assign a patient and optionally inherit the assignment downstream.""" + + body: dict[str, Any] = {"id": diagnosis_id, "assistant_id": assistant_id} + if is_inherit is not None: + body["is_inherit"] = is_inherit + return self.client.post("firstvisit.myPatient/assign", body) + + def fill_patient_id_card(self, diagnosis_id: int, id_card: str) -> Any: + """Fill a patient's identity card using the patient-scope mutation.""" + + if not id_card.strip(): + raise ValueError("id_card is required") + return self.client.post( + "firstvisit.myPatient/fillIdCard", + {"id": diagnosis_id, "id_card": id_card.strip()}, + ) + + def book_patient_appointment( + self, payload: Mapping[str, Any] | None = None, **fields: Any + ) -> Any: + """Create an appointment while preserving the full routed form DTO.""" + + return self.client.post("firstvisit.myPatient/createAppointment", _body(payload, fields)) + + def cancel_patient_appointment(self, appointment_id: int) -> Any: + """Cancel an appointment through the patient-scoped endpoint.""" + + return self.client.post("firstvisit.myPatient/cancelAppointment", {"id": appointment_id}) + + def patient_detail(self, diagnosis_id: int) -> dict[str, Any]: + """Compatibility name for permission-aware readonly diagnosis details.""" + + return self.get_diagnosis_detail(diagnosis_id, readonly=True) + + def list_consultations( + self, *, page_no: int = 1, page_size: int = 20, **filters: Any + ) -> PageResult[Consultation]: + """List diagnosis records using ``tcm.diagnosis/lists``.""" + + request_filters = dict(filters) + start_date = str(request_filters.pop("start_date", "") or "").strip() + end_date = str(request_filters.pop("end_date", "") or "").strip() + if start_date and start_date == end_date: + request_filters.setdefault("appointment_date", start_date) + else: + if start_date: + request_filters.setdefault("latest_appointment_start_date", start_date) + if end_date: + request_filters.setdefault("latest_appointment_end_date", end_date) + if request_filters.get("status") not in (None, ""): + status = _to_int(request_filters.pop("status"), 0) + if status == 3: + request_filters.setdefault("completed_appointment", 1) + else: + request_filters.setdefault("appointment_status", status) + payload = self.client.get( + "tcm.diagnosis/lists", + _page_params(page_no, page_size, request_filters), + ) + return PageResult.from_payload( + payload, Consultation.from_dict, page_no=page_no, page_size=page_size + ) + + def get_diagnosis_detail(self, diagnosis_id: int, *, readonly: bool = False) -> dict[str, Any]: + """Load a full diagnosis using the appropriate routed endpoint.""" + + endpoint = "tcm.diagnosis/readonlyDetail" if readonly else "tcm.diagnosis/detail" + return dict( + _require_mapping( + self.client.get(endpoint, {"id": diagnosis_id}), + endpoint, + ) + ) + + def diagnosis_readonly_detail(self, diagnosis_id: int) -> dict[str, Any]: + """Alias for the hidden permission-aware readonly diagnosis route.""" + + return self.get_diagnosis_detail(diagnosis_id, readonly=True) + + def create_diagnosis( + self, diagnosis: Mapping[str, Any] | None = None, **fields: Any + ) -> dict[str, Any]: + """Create a diagnosis using the complete edit-form mapping.""" + + body = _body(diagnosis, fields) + result = self.client.post("tcm.diagnosis/add", body) + return _merge_result(body, result) + + def update_diagnosis( + self, + diagnosis: int | Mapping[str, Any], + changes: Mapping[str, Any] | None = None, + **fields: Any, + ) -> dict[str, Any]: + """Edit a diagnosis without discarding forward-compatible fields.""" + + body = _identified_body(diagnosis, changes, fields) + result = self.client.post("tcm.diagnosis/edit", body) + return _merge_result(body, result) + + def delete_diagnosis(self, diagnosis_id: int) -> Any: + """Delete a diagnosis through its canonical endpoint.""" + + return self.client.post("tcm.diagnosis/delete", {"id": diagnosis_id}) + + def set_revisit_slot_start_offset(self, diagnosis_id: int, offset: int) -> Any: + """Set the diagnosis revisit-statistics starting offset.""" + + return self.client.post( + "tcm.diagnosis/setRevisitSlotStartOffset", + {"id": diagnosis_id, "revisit_slot_start_offset": offset}, + ) + + def appointment_history( + self, diagnosis_id: int, *, page_no: int = 1, page_size: int = 500 + ) -> PageResult[Appointment]: + """Load appointment history with the audited relaxed diagnosis scope.""" + + payload = self.client.get( + "doctor.appointment/lists", + _page_params( + page_no, + page_size, + {"diagnosis_id": diagnosis_id, "diag_scope_relax": 1}, + ), + ) + return PageResult.from_payload( + payload, Appointment.from_dict, page_no=page_no, page_size=page_size + ) + + def assign_history( + self, diagnosis_id: int, *, page_no: int = 1, page_size: int = 20 + ) -> PageResult[dict[str, Any]]: + """Load diagnosis assignment history.""" + + payload = self.client.get("tcm.diagnosis/assignLogList", {"id": diagnosis_id}) + return PageResult.from_payload( + payload, lambda row: dict(row), page_no=page_no, page_size=page_size + ) + + def assign_diagnosis( + self, + diagnosis_id: int, + assistant_id: int, + *, + is_inherit: int | None = None, + ) -> Any: + """Assign a diagnosis through the general diagnosis endpoint.""" + + body: dict[str, Any] = {"id": diagnosis_id, "assistant_id": assistant_id} + if is_inherit is not None: + body["is_inherit"] = is_inherit + return self.client.post("tcm.diagnosis/assign", body) + + def list_diagnosis_assistants(self) -> list[dict[str, Any]]: + """Return assistants available to diagnosis assignment.""" + + return _mapping_rows(self.client.get("tcm.diagnosis/getAssistants")) + + def list_diagnosis_doctors(self) -> list[dict[str, Any]]: + """Return doctors available to diagnosis forms and appointments.""" + + return _mapping_rows(self.client.get("tcm.diagnosis/getDoctors")) + + def check_diagnosis_phone(self, payload: Mapping[str, Any]) -> Any: + """Check diagnosis phone uniqueness with the unmodified form contract.""" + + return self.client.post("tcm.diagnosis/checkPhone", dict(payload)) + + def check_diagnosis_id_card(self, payload: Mapping[str, Any]) -> Any: + """Check diagnosis identity-card uniqueness.""" + + return self.client.post("tcm.diagnosis/checkIdCard", dict(payload)) + + def fill_diagnosis_id_card(self, diagnosis_id: int, id_card: str) -> Any: + """Fill an identity card through the general diagnosis endpoint.""" + + return self.client.post( + "tcm.diagnosis/fillIdCard", + {"id": diagnosis_id, "id_card": id_card.strip()}, + ) + + def get_tracking_window( + self, + diagnosis_id: int, + *, + start_date: str = "", + end_date: str = "", + ) -> dict[str, Any]: + """Load lazy blood, diet and exercise tracking data for a date window.""" + + return dict( + _require_mapping( + self.client.get( + "tcm.diagnosis/trackingWindow", + { + "id": diagnosis_id, + "start_date": start_date, + "end_date": end_date, + }, + ), + "tcm.diagnosis/trackingWindow", + ) + ) + + def list_tracking_notes(self, diagnosis_id: int) -> list[dict[str, Any]]: + """Return date-grouped tracking notes newest first.""" + + return _mapping_rows( + self.client.get("tcm.diagnosis/trackingNotes", {"diagnosis_id": diagnosis_id}) + ) + + def add_tracking_note(self, diagnosis_id: int, content: str) -> Any: + """Append a textual daily tracking note.""" + + if not content.strip(): + raise ValueError("tracking_content is required") + return self.client.post( + "tcm.diagnosis/addTrackingNote", + {"diagnosis_id": diagnosis_id, "tracking_content": content.strip()}, + ) + + def list_diagnosis_todos( + self, + diagnosis_id: int, + *, + page_no: int = 1, + page_size: int = 20, + status: int | None = None, + creator_id: int | None = None, + ) -> PageResult[dict[str, Any]]: + """Return diagnosis follow-up todos.""" + + payload = self.client.get( + "tcm.diagnosisTodo/lists", + _page_params( + page_no, + page_size, + { + "diagnosis_id": diagnosis_id, + "status": status, + "creator_id": creator_id, + }, + ), + ) + return PageResult.from_payload( + payload, lambda row: dict(row), page_no=page_no, page_size=page_size + ) + + def add_diagnosis_todo(self, diagnosis_id: int, content: str, remind_time: int) -> Any: + """Create a follow-up todo using a Unix-seconds reminder.""" + + return self.client.post( + "tcm.diagnosisTodo/add", + { + "diagnosis_id": diagnosis_id, + "content": content.strip(), + "remind_time": remind_time, + }, + ) + + def cancel_diagnosis_todo(self, todo_id: int) -> Any: + """Cancel an outstanding diagnosis todo.""" + + return self.client.post("tcm.diagnosisTodo/cancel", {"id": todo_id}) + + def get_call_ticket(self, patient_id: int, diagnosis_id: int) -> CallTicket: + """Obtain short-lived Tencent credentials for a consultation call.""" + + result = _require_mapping( + self.client.post( + "tcm.diagnosis/getCallSignature", + {"patient_id": patient_id, "diagnosis_id": diagnosis_id}, + ), + "tcm.diagnosis/getCallSignature", + ) + ticket = CallTicket.from_dict(result) + if ticket.diagnosis_id is None: + ticket.diagnosis_id = diagnosis_id + return ticket + + def start_call(self, diagnosis_id: int, patient_id: int, *, call_type: int = 2) -> Any: + """Create the server-side call record before ringing participants.""" + + return self.client.post( + "tcm.diagnosis/startCall", + { + "diagnosis_id": diagnosis_id, + "patient_id": patient_id, + "call_type": call_type, + }, + ) + + def end_call(self, diagnosis_id: int) -> Any: + """End the active call/recording associated with a diagnosis.""" + + return self.client.post("tcm.diagnosis/endCall", {"diagnosis_id": diagnosis_id}) + + def bind_call_room(self, diagnosis_id: int, room_id: str) -> Any: + """Bind the actual TRTC room to the active call record.""" + + if not room_id.strip(): + raise ValueError("room_id is required") + return self.client.post( + "tcm.diagnosis/bindCallRoom", + {"diagnosis_id": diagnosis_id, "room_id": room_id.strip()}, + ) + + # Compatibility aliases keep UI naming independent from endpoint history. + def my_self(self) -> Session: + """Compatibility alias for :meth:`get_session`.""" + + return self.get_session() + + def reception(self, appointment_id: int) -> dict[str, Any]: + """Compatibility alias for :meth:`get_reception`.""" + + return self.get_reception(appointment_id) + + def add_prescription_template( + self, + template: PrescriptionTemplate | Mapping[str, Any] | None = None, + **fields: Any, + ) -> PrescriptionTemplate: + """Compatibility alias for :meth:`create_prescription_template`.""" + + return self.create_prescription_template(template, **fields) + + def edit_prescription_template( + self, + template: int | PrescriptionTemplate | Mapping[str, Any], + changes: Mapping[str, Any] | None = None, + **fields: Any, + ) -> PrescriptionTemplate: + """Compatibility alias for :meth:`update_prescription_template`.""" + + return self.update_prescription_template(template, changes, **fields) + + +def _page_params(page_no: int, page_size: int, filters: Mapping[str, Any]) -> dict[str, Any]: + if page_no < 1 or page_size < 1: + raise ValueError("page_no and page_size must be positive") + result = { + key: value + for key, value in filters.items() + if value is not None and not (isinstance(value, (list, tuple, set)) and not value) + } + result.update({"page_no": page_no, "page_size": page_size}) + return result + + +def _require_mapping(value: object, endpoint: str) -> Mapping[str, Any]: + if not isinstance(value, Mapping): + raise ApiProtocolError(f"{endpoint} returned an object of the wrong shape", data=value) + return value + + +def _material_kind( + material_type: str, +) -> Literal["image", "file"]: + """Map reception concepts to the two audited upload endpoints.""" + + value = material_type.strip().lower() + if value in {"image", "tongue_images"}: + return "image" + if value in {"file", "report_files"}: + return "file" + raise ValueError("material_type must be image/file or tongue_images/report_files") + + +def _is_local_material_reference(value: str) -> bool: + """Return whether a would-be server URI is a local/unsafe path.""" + + text = value.strip() + lower = text.lower() + return ( + lower.startswith("file:") + or text.startswith(("\\\\", "//")) + or (len(text) >= 3 and text[0].isalpha() and text[1] == ":" and text[2] in "\\/") + or "\\" in text + ) + + +def _normalise_material_reference(value: object, endpoint: str) -> str: + """Extract a safe server ``uri``/``url`` from an upload response.""" + + candidate: object = value + if isinstance(value, Mapping): + candidate = value.get("uri") or value.get("url") + if candidate in (None, "") and isinstance(value.get("data"), Mapping): + nested = value["data"] + candidate = nested.get("uri") or nested.get("url") + reference = str(candidate or "").strip() + if not reference: + raise ApiProtocolError( + f"{endpoint} returned no material uri/url", + data=value, + ) + if _is_local_material_reference(reference): + raise ApiProtocolError( + f"{endpoint} returned an unsafe local material path", + data=value, + ) + return reference + + +def _server_materials( + values: list[str] | tuple[str, ...] | None, + field: str, +) -> list[str]: + """Validate that a note JSON contains server references, never local paths.""" + + result: list[str] = [] + for raw_value in values or (): + value = str(raw_value).strip() + if not value: + raise ValueError(f"{field} contains an empty material reference") + if _is_local_material_reference(value): + raise ValueError(f"{field} must contain server uri/url values, not local paths") + result.append(value) + return result + + +def _strings(value: object) -> tuple[str, ...]: + if isinstance(value, str): + candidates: object = value.split(",") + else: + candidates = value + if not isinstance(candidates, (list, tuple, set, frozenset)): + return () + return tuple(item for item in (str(value).strip() for value in candidates) if item) + + +def _to_int(value: object, default: int = 0) -> int: + try: + return int(value) # type: ignore[arg-type] + except (TypeError, ValueError): + return default + + +def _to_bool(value: object) -> bool: + if isinstance(value, str): + return value.strip().lower() not in {"", "0", "false", "no", "off"} + return bool(value) + + +def _template_payload( + template: PrescriptionTemplate | Mapping[str, Any] | None, + fields: Mapping[str, Any], + *, + include_id: bool, +) -> dict[str, Any]: + if isinstance(template, PrescriptionTemplate): + result = template.to_api_dict(include_id=include_id) + elif isinstance(template, Mapping): + result = dict(template) + elif template is None: + result = {} + else: + raise TypeError("template must be a PrescriptionTemplate or mapping") + result.update(fields) + if "name" in result and "prescription_name" not in result: + result["prescription_name"] = result.pop("name") + if "formula_type" in result: + result["formula_type"] = _formula_type_for_api(result["formula_type"]) + if "is_public" in result: + result["is_public"] = int(_to_bool(result["is_public"])) + if "disable_edit" in result: + result["disable_edit"] = int(_to_bool(result["disable_edit"])) + if "herbs" in result and isinstance(result["herbs"], (list, tuple)): + result["herbs"] = [dict(item) for item in result["herbs"] if isinstance(item, Mapping)] + if not str(result.get("prescription_name") or "").strip(): + raise ValueError("prescription template name is required") + result.pop("raw", None) + if not include_id: + result.pop("id", None) + return result + + +def _formula_type_for_api(value: object) -> str: + text = str(value or "").strip().lower() + return "辅方" if text in {"2", "aux", "auxiliary", "secondary", "辅方"} else "主方" + + +def _mapping_rows(value: object) -> list[dict[str, Any]]: + """Extract mapping rows from direct arrays or tolerant page envelopes.""" + + return PageResult.from_payload(value, lambda row: dict(row)).items + + +def _body( + payload: Mapping[str, Any] | None, + fields: Mapping[str, Any], +) -> dict[str, Any]: + """Merge a forward-compatible mutation body without retaining ``raw``.""" + + result = dict(payload or {}) + result.update(fields) + result.pop("raw", None) + return result + + +def _identified_body( + value: int | Mapping[str, Any], + changes: Mapping[str, Any] | None, + fields: Mapping[str, Any], +) -> dict[str, Any]: + """Build an edit payload from either an identifier or a current mapping.""" + + result = {"id": value} if isinstance(value, int) else dict(value) + result.update(changes or {}) + result.update(fields) + result.pop("raw", None) + if not _to_int(result.get("id"), 0): + raise ValueError("id is required") + return result + + +def _prescription_payload( + prescription: Prescription | Mapping[str, Any] | None, + fields: Mapping[str, Any], + *, + include_id: bool, +) -> dict[str, Any]: + """Build the complete prescription add/edit DTO while preserving aliases.""" + + if isinstance(prescription, Prescription): + result = prescription.to_api_dict(include_id=include_id) + elif isinstance(prescription, Mapping): + result = dict(prescription) + elif prescription is None: + result = {} + else: + raise TypeError("prescription must be a Prescription or mapping") + result.update(fields) + result.pop("raw", None) + if "herbs" in result and isinstance(result["herbs"], (list, tuple)): + result["herbs"] = [dict(item) for item in result["herbs"] if isinstance(item, Mapping)] + if "visible_role_ids" in result and isinstance( + result["visible_role_ids"], (tuple, set, frozenset) + ): + result["visible_role_ids"] = list(result["visible_role_ids"]) + if "need_decoction" in result: + result["need_decoction"] = int(_to_bool(result["need_decoction"])) + if "is_shared" in result: + result["is_shared"] = int(_to_bool(result["is_shared"])) + if not include_id: + result.pop("id", None) + return result + + +def _merge_result(body: Mapping[str, Any], result: object) -> dict[str, Any]: + """Merge common mutation response shapes over the submitted body.""" + + merged = dict(body) + if isinstance(result, Mapping): + nested = result.get("data") + merged.update(nested if isinstance(nested, Mapping) else result) + elif isinstance(result, (int, str)): + merged["id"] = result + return merged + + +def _audit_action(action: str, remark: str) -> AuditAction: + """Validate the two audit actions and the routed rejection boundary.""" + + normalised = action.strip().lower() + if normalised not in {"approve", "reject"}: + raise ValueError("action must be approve or reject") + if normalised == "reject" and not remark.strip(): + raise ValueError("remark is required when rejecting") + return normalised # type: ignore[return-value] + + +def _safe_menu(value: object) -> list[dict[str, Any]]: + """Copy dynamic menu JSON without evaluating or coercing untrusted objects. + + Unknown JSON fields are intentionally preserved so the composition root can + honour future backend menu metadata. Non-string keys and non-JSON runtime + objects are dropped, which prevents callables or framework objects from + leaking into navigation construction. + """ + + if not isinstance(value, (list, tuple)): + return [] + result: list[dict[str, Any]] = [] + for item in value: + safe = _safe_json_mapping(item) + if safe is not None: + result.append(safe) + return result + + +def _safe_json_mapping(value: object) -> dict[str, Any] | None: + if not isinstance(value, Mapping): + return None + result: dict[str, Any] = {} + for key, candidate in value.items(): + if not isinstance(key, str): + continue + safe = _safe_json_value(candidate) + if safe is not _UNSAFE: + result[key] = safe + return result + + +_UNSAFE: Final[object] = object() + + +def _safe_json_value(value: object) -> Any: + if value is None or isinstance(value, (str, int, float, bool)): + return value + if isinstance(value, Mapping): + return _safe_json_mapping(value) + if isinstance(value, (list, tuple)): + return [safe for item in value if (safe := _safe_json_value(item)) is not _UNSAFE] + return _UNSAFE diff --git a/app/src/doctor_workstation/services/token_store.py b/app/src/doctor_workstation/services/token_store.py new file mode 100644 index 000000000..3d20663f9 --- /dev/null +++ b/app/src/doctor_workstation/services/token_store.py @@ -0,0 +1,261 @@ +"""Token persistence using OS keyring with a restricted-file fallback.""" + +from __future__ import annotations + +import json +import os +import stat +import tempfile +from contextlib import suppress +from pathlib import Path +from typing import Any, Protocol + + +class KeyringLike(Protocol): + """The small subset shared by the optional keyring module and its backends.""" + + def get_password(self, service: str, username: str) -> str | None: + """Return a stored secret or ``None``.""" + + def set_password(self, service: str, username: str, password: str) -> None: + """Persist one secret.""" + + def delete_password(self, service: str, username: str) -> None: + """Delete one secret.""" + + +_AUTO_KEYRING = object() + + +class TokenStore: + """Store access tokens, but never user passwords. + + If a working ``keyring`` backend is importable, the token is stored there + and the JSON file contains at most the remembered account name and the + non-secret API scope. Otherwise the JSON file is atomically written with + owner-only ``0600`` permissions. + """ + + def __init__( + self, + path: str | os.PathLike[str] | None = None, + *, + service_name: str = "zyt-doctor-workstation", + token_name: str = "access-token", + keyring_backend: KeyringLike | None | object = _AUTO_KEYRING, + ) -> None: + """Create a token store without writing any files.""" + + self.path = Path(path) if path is not None else self.default_path() + self.service_name = service_name + self.token_name = token_name + self._keyring = self._load_keyring(keyring_backend) + self._uses_keyring = self._probe_keyring() + + @staticmethod + def default_path() -> Path: + """Return a per-user fallback credential path for the current platform.""" + + if os.name == "nt": + root = Path(os.environ.get("LOCALAPPDATA", Path.home() / "AppData" / "Local")) + else: + root = Path(os.environ.get("XDG_DATA_HOME", Path.home() / ".local" / "share")) + return root / "ZYTDoctorWorkstation" / "credentials.json" + + @property + def uses_keyring(self) -> bool: + """Return whether token operations currently use a working keyring.""" + + return self._uses_keyring + + def load_token(self, *, scope: str | None = None) -> str | None: + """Load a token, optionally requiring an exact persisted API scope. + + Supplying ``scope`` is the safe choice for automatic login restoration: + an older unscoped token, or a token issued by another API base URL, is + never returned to the caller. + """ + + data = self._read_file() + if scope is not None: + expected_scope = self._normalise_scope(scope) + stored_scope = self._normalise_scope(data.get("scope")) + if not expected_scope or stored_scope != expected_scope: + return None + + if self._uses_keyring and self._keyring is not None: + try: + token = self._keyring.get_password(self.service_name, self.token_name) + if token: + return token + except Exception: + self._uses_keyring = False + value = data.get("token") + return str(value) if isinstance(value, str) and value else None + + def save_token( + self, + token: str, + *, + account: str | None = None, + scope: str | None = None, + ) -> None: + """Persist a token plus optional account and API-scope metadata. + + Passing an empty ``account`` explicitly forgets a previously remembered + account. Passwords are never accepted or persisted. + """ + + cleaned = token.strip() + if not cleaned: + self.clear_token() + if account is not None: + self.save_account(account) + return + data = self._read_file() + if account is not None: + account_value = account.strip() + if account_value: + data["account"] = account_value + else: + data.pop("account", None) + if scope is not None: + scope_value = self._normalise_scope(scope) + if scope_value: + data["scope"] = scope_value + else: + data.pop("scope", None) + if self._uses_keyring and self._keyring is not None: + try: + self._keyring.set_password(self.service_name, self.token_name, cleaned) + data.pop("token", None) + self._write_file(data) + return + except Exception: + self._uses_keyring = False + data["token"] = cleaned + self._write_file(data) + + def clear_token(self) -> None: + """Delete the token while retaining an explicitly remembered account.""" + + if self._uses_keyring and self._keyring is not None: + try: + self._keyring.delete_password(self.service_name, self.token_name) + except Exception: + self._uses_keyring = False + data = self._read_file() + data.pop("token", None) + data.pop("scope", None) + self._write_file(data) + + def load_account(self) -> str | None: + """Load the remembered login account; no password is ever stored.""" + + value = self._read_file().get("account") + return str(value) if isinstance(value, str) and value else None + + def save_account(self, account: str) -> None: + """Remember only the account name used to pre-fill the login form.""" + + data = self._read_file() + cleaned = account.strip() + if cleaned: + data["account"] = cleaned + else: + data.pop("account", None) + self._write_file(data) + + def clear_account(self) -> None: + """Forget the remembered account without changing the stored token.""" + + self.save_account("") + + def clear(self) -> None: + """Delete both token and remembered account information.""" + + if self._uses_keyring and self._keyring is not None: + try: + self._keyring.delete_password(self.service_name, self.token_name) + except Exception: + self._uses_keyring = False + try: + self.path.unlink(missing_ok=True) + except OSError: + self._write_file({}) + + def get_token(self) -> str | None: + """Compatibility alias for :meth:`load_token`.""" + + return self.load_token() + + def set_token(self, token: str) -> None: + """Compatibility alias for :meth:`save_token`.""" + + self.save_token(token) + + def delete_token(self) -> None: + """Compatibility alias for :meth:`clear_token`.""" + + self.clear_token() + + @staticmethod + def _load_keyring(candidate: KeyringLike | None | object) -> KeyringLike | None: + if candidate is not _AUTO_KEYRING: + return candidate if candidate is not None else None # type: ignore[return-value] + try: + import keyring # type: ignore[import-not-found] + + return keyring + except (ImportError, RuntimeError): + return None + + def _probe_keyring(self) -> bool: + if self._keyring is None: + return False + try: + self._keyring.get_password(self.service_name, self.token_name) + return True + except Exception: + return False + + @staticmethod + def _normalise_scope(value: object) -> str: + """Return a stable comparison form for a non-secret API base URL.""" + + return str(value or "").strip().rstrip("/") + + def _read_file(self) -> dict[str, Any]: + try: + content = self.path.read_text(encoding="utf-8") + value = json.loads(content) + except (FileNotFoundError, OSError, UnicodeError, json.JSONDecodeError): + return {} + if not isinstance(value, dict): + return {} + # Explicit allow-list guarantees accidental password-like fields are ignored. + return {key: value[key] for key in ("token", "account", "scope") if key in value} + + def _write_file(self, data: dict[str, Any]) -> None: + safe = {key: data[key] for key in ("token", "account", "scope") if data.get(key)} + if not safe: + with suppress(OSError): + self.path.unlink(missing_ok=True) + return + self.path.parent.mkdir(parents=True, exist_ok=True) + temp_fd, temp_name = tempfile.mkstemp(prefix=f".{self.path.name}.", dir=self.path.parent) + temp_path = Path(temp_name) + try: + os.chmod(temp_path, stat.S_IRUSR | stat.S_IWUSR) + with os.fdopen(temp_fd, "w", encoding="utf-8", newline="\n") as handle: + temp_fd = -1 + json.dump(safe, handle, ensure_ascii=False, separators=(",", ":")) + handle.flush() + os.fsync(handle.fileno()) + os.replace(temp_path, self.path) + os.chmod(self.path, stat.S_IRUSR | stat.S_IWUSR) + finally: + if temp_fd >= 0: + os.close(temp_fd) + with suppress(OSError): + temp_path.unlink(missing_ok=True) diff --git a/app/src/doctor_workstation/ui/__init__.py b/app/src/doctor_workstation/ui/__init__.py new file mode 100644 index 000000000..1db885b24 --- /dev/null +++ b/app/src/doctor_workstation/ui/__init__.py @@ -0,0 +1,7 @@ +"""Qt Widgets user interface for the doctor workstation.""" + +from .login import LoginWindow +from .shell import ShellWindow +from .theme import apply_theme + +__all__ = ["LoginWindow", "ShellWindow", "apply_theme"] diff --git a/app/src/doctor_workstation/ui/dialogs/__init__.py b/app/src/doctor_workstation/ui/dialogs/__init__.py new file mode 100644 index 000000000..95df99f91 --- /dev/null +++ b/app/src/doctor_workstation/ui/dialogs/__init__.py @@ -0,0 +1,5 @@ +"""Reusable doctor-workstation dialogs.""" + +from .diagnosis import DiagnosisDialog + +__all__ = ["DiagnosisDialog"] diff --git a/app/src/doctor_workstation/ui/dialogs/diagnosis.py b/app/src/doctor_workstation/ui/dialogs/diagnosis.py new file mode 100644 index 000000000..b5f7747b9 --- /dev/null +++ b/app/src/doctor_workstation/ui/dialogs/diagnosis.py @@ -0,0 +1,920 @@ +"""Patient diagnosis detail/editor used by the scoped patient workspace.""" + +from __future__ import annotations + +import re +from collections.abc import Mapping, Sequence +from typing import Any + +from PySide6.QtCore import Qt, Signal +from PySide6.QtWidgets import ( + QDialog, + QDialogButtonBox, + QFormLayout, + QFrame, + QGridLayout, + QHBoxLayout, + QLabel, + QPlainTextEdit, + QScrollArea, + QTableWidget, + QTableWidgetItem, + QTabWidget, + QVBoxLayout, + QWidget, +) + +from ..widgets import ( + MessageBanner, + display_text, + first_value, + friendly_error, + gender_text, + get_value, + has_permission, + invoke, + page_items, + page_total, + run_async, + section_title, +) + +_PHONE_PERMISSION = "tcm.diagnosis/phonePlain" +_PATIENT_ORDERS_PERMISSION = "tcm.diagnosis/patientOrders" +_PHONE_PATTERN = re.compile(r"^1[3-9]\d{9}$") +_ID_CARD_PATTERN = re.compile( + r"^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$" +) + +_DIAGNOSIS_FIELDS = ( + ("患者姓名", "patient_name", "患者姓名"), + ("手机号", "phone", "11 位手机号"), + ("身份证号", "id_card", "18 位身份证号(可选)"), + ("性别", "gender", "1=男,0=女"), + ("年龄", "age", "患者年龄"), + ("诊断日期", "diagnosis_date", "YYYY-MM-DD"), + ("诊断类型", "diagnosis_type", "初诊/复诊类型"), + ("证型", "syndrome_type", "中医证型"), + ("糖尿病类型", "diabetes_type", "糖尿病分型"), + ("糖尿病发现年", "diabetes_discovery_year", "发现年份或病程描述"), + ("当地医院诊断", "local_hospital_diagnosis", "多项以顿号分隔"), + ("当地医院", "local_hospital_name", "当地就诊医院"), + ("婚姻状态", "marital_status", "婚姻状态"), + ("身高", "height", "cm"), + ("体重", "weight", "kg"), + ("地区", "region", "所在地区"), + ("收缩压", "systolic_pressure", "mmHg"), + ("舒张压", "diastolic_pressure", "mmHg"), + ("空腹血糖", "fasting_blood_sugar", "mmol/L"), + ("主诉", "chief_complaint", "患者此次就诊的主要诉求"), + ("现病史", "present_illness", "主要症状、持续时间与变化"), + ("症状", "symptoms", "当前主要症状"), + ("既往史", "past_history", "既往史;多项可用顿号分隔"), + ("外伤史", "trauma_history", "0/1 或具体说明"), + ("手术史", "surgery_history", "0/1 或具体说明"), + ("过敏史", "allergy_history", "0/1 或具体说明"), + ("家族史", "family_history", "0/1 或具体说明"), + ("妊娠史", "pregnancy_history", "0/1 或具体说明"), + ("食欲", "appetite", "多项以顿号分隔"), + ("饮水", "water_intake", "饮水情况"), + ("饮食", "diet_condition", "多项以顿号分隔"), + ("体重变化", "weight_change", "体重变化"), + ("身体感觉", "body_feeling", "多项以顿号分隔"), + ("睡眠", "sleep_condition", "多项以顿号分隔"), + ("眼部", "eye_condition", "多项以顿号分隔"), + ("头部感觉", "head_feeling", "多项以顿号分隔"), + ("出汗", "sweat_condition", "多项以顿号分隔"), + ("皮肤", "skin_condition", "多项以顿号分隔"), + ("小便", "urine_condition", "多项以顿号分隔"), + ("大便", "stool_condition", "多项以顿号分隔"), + ("肾脏情况", "kidney_condition", "多项以顿号分隔"), + ("脂肪肝程度", "fatty_liver_degree", "脂肪肝程度"), + ("舌象", "tongue", "舌质、舌苔等观察"), + ("舌苔", "tongue_coating", "舌苔记录"), + ("脉象", "pulse", "脉象记录"), + ("临床诊断", "clinical_diagnosis", "填写临床诊断"), + ("治则", "treatment_principle", "治疗原则"), + ("处方", "prescription", "处方摘要"), + ("处方意见", "prescription_opinion", "辨证与处方意见"), + ("医嘱", "doctor_advice", "医生嘱托"), + ("当前用药", "current_medications", "患者当前用药"), + ("补充备注", "remark", "其他需要记录的信息"), +) + +_LIST_FIELDS = { + "local_hospital_diagnosis", + "appetite", + "diet_condition", + "body_feeling", + "sleep_condition", + "eye_condition", + "head_feeling", + "sweat_condition", + "skin_condition", + "urine_condition", + "stool_condition", + "kidney_condition", +} +_INTEGER_FIELDS = { + "gender", + "age", + "marital_status", + "systolic_pressure", + "diastolic_pressure", + "trauma_history", + "surgery_history", + "allergy_history", + "family_history", + "pregnancy_history", +} +_FLOAT_FIELDS = {"height", "weight", "fasting_blood_sugar"} +_PATIENT_BASIC_FIELDS = {"patient_name", "phone", "id_card", "gender", "age"} + + +def _mask_phone(value: Any) -> str: + text = str(value or "").strip() + return f"{text[:3]}****{text[-4:]}" if len(text) == 11 else ("***" if text else "") + + +def _mask_id_card(value: Any) -> str: + text = str(value or "").strip() + if len(text) == 18: + return f"{text[:6]}********{text[-4:]}" + if len(text) == 15: + return f"{text[:6]}*****{text[-4:]}" + return "***" if text else "" + + +def _truthy(value: Any) -> bool: + if isinstance(value, str): + return value.strip().lower() not in {"", "0", "false", "no", "off"} + return bool(value) + + +def _editor_text(value: Any) -> str: + if isinstance(value, Sequence) and not isinstance(value, (str, bytes, bytearray)): + return "、".join(str(item) for item in value) + return "" if value is None else str(value) + + +def _duplicate_found(value: Any) -> bool: + for key in ("exists", "duplicate", "data.exists", "data.duplicate"): + candidate = get_value(value, key, None) + if candidate is not None: + if isinstance(candidate, str): + return candidate.strip().lower() not in {"", "0", "false", "no", "off"} + return bool(candidate) + return False + + +def _field_value(key: str, text: str, original: Any) -> Any: + value = text.strip() + if isinstance(original, Sequence) and not isinstance(original, (str, bytes, bytearray)): + return [item.strip() for item in re.split(r"[,,、]", value) if item.strip()] + if isinstance(original, bool): + return value.lower() not in {"", "0", "false", "no", "off"} + if isinstance(original, int) or (original in (None, "") and key in _INTEGER_FIELDS): + return _int(value, 0) if value else "" + if isinstance(original, float) or (original in (None, "") and key in _FLOAT_FIELDS): + try: + return float(value) if value else "" + except ValueError: + return value + if key in _LIST_FIELDS: + return [item.strip() for item in re.split(r"[,,、]", value) if item.strip()] + return value + + +def _invoke_first(repository: Any, names: Sequence[str], **kwargs: Any) -> Any: + """Call the first repository method present while keeping keyword tolerance.""" + + for name in names: + if callable(getattr(repository, name, None)): + return invoke(repository, name, **kwargs) + return invoke(repository, names[0], **kwargs) + + +def _mapping(value: Any) -> Mapping[str, Any]: + return value if isinstance(value, Mapping) else {} + + +def _int(value: Any, default: int = 0) -> int: + try: + return int(value) + except (TypeError, ValueError): + return default + + +class DiagnosisDialog(QDialog): + """Load a diagnosis and its server-backed histories without blocking Qt.""" + + saved = Signal() + + def __init__( + self, + repository: Any, + parent: QWidget | None = None, + *, + permissions: Any = None, + ) -> None: + super().__init__(parent) + self.repository = repository + self.permissions = ( + permissions + if permissions is not None + else getattr(parent, "permissions", None) + if parent is not None + else None + ) + self._can_phone_plain = has_permission(self.permissions, _PHONE_PERMISSION, default=False) + self._can_patient_orders = has_permission( + self.permissions, _PATIENT_ORDERS_PERMISSION, default=False + ) + self._diagnosis_id = 0 + self._patient_id = 0 + self._editable = False + self._generation = 0 + self._save_generation = 0 + self._orders_generation = 0 + self._orders_page = 1 + self._orders_page_size = 10 + self._orders_total = 0 + self._detail: Any = None + self._field_originals: dict[str, Any] = {} + + self.setModal(True) + self.setWindowTitle("患者信息详情") + self.setMinimumSize(680, 520) + self.resize(880, 680) + + root = QVBoxLayout(self) + root.setContentsMargins(20, 18, 20, 18) + root.setSpacing(12) + heading = QHBoxLayout() + identity = QVBoxLayout() + identity.setSpacing(2) + self.title_label = QLabel("患者信息详情") + self.title_label.setProperty("role", "pageTitle") + identity.addWidget(self.title_label) + self.meta_label = QLabel("正在准备诊单…") + self.meta_label.setProperty("role", "muted") + identity.addWidget(self.meta_label) + heading.addLayout(identity, 1) + self.mode_label = QLabel("只读") + self.mode_label.setObjectName("StatusBadge") + self.mode_label.setProperty("kind", "neutral") + heading.addWidget(self.mode_label, 0, Qt.AlignmentFlag.AlignTop) + root.addLayout(heading) + + self.banner = MessageBanner() + root.addWidget(self.banner) + self.tabs = QTabWidget() + self.tabs.setObjectName("DiagnosisTabs") + self.tabs.addTab(self._build_overview_tab(), "患者与病历") + self.tabs.addTab(self._build_notes_tab(), "医生备注") + self.tabs.addTab(self._build_history_tab("appointment"), "挂号记录") + self.tabs.addTab(self._build_history_tab("assign"), "指派记录") + if self._can_patient_orders: + self.tabs.addTab(self._build_orders_tab(), "患者订单") + root.addWidget(self.tabs, 1) + + self.buttons = QDialogButtonBox(QDialogButtonBox.StandardButton.Close) + self.save_button = self.buttons.addButton( + "保存病历", QDialogButtonBox.ButtonRole.AcceptRole + ) + self.save_button.setProperty("variant", "primary") + self.save_button.clicked.connect(self._save) + self.buttons.rejected.connect(self.reject) + root.addWidget(self.buttons) + + def _build_overview_tab(self) -> QWidget: + scroll = QScrollArea() + scroll.setWidgetResizable(True) + scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + content = QWidget() + layout = QVBoxLayout(content) + layout.setContentsMargins(4, 12, 4, 16) + layout.setSpacing(12) + + summary = QFrame() + summary.setObjectName("SubtleCard") + summary_layout = QGridLayout(summary) + summary_layout.setContentsMargins(14, 12, 14, 12) + summary_layout.setHorizontalSpacing(18) + summary_layout.setVerticalSpacing(10) + self.summary_fields: dict[str, QLabel] = {} + fields = ( + ("患者", "patient"), + ("手机", "phone"), + ("身份证", "id_card"), + ("性别 / 年龄", "gender_age"), + ("身高 / 体重", "body"), + ("预约", "appointment"), + ("医生 / 医助", "staff"), + ("血压", "pressure"), + ("空腹血糖", "blood_sugar"), + ) + for index, (caption, key) in enumerate(fields): + row, column = divmod(index, 2) + box = QVBoxLayout() + label = QLabel(caption) + label.setProperty("role", "muted") + value = QLabel("—") + value.setWordWrap(True) + value.setStyleSheet("font-weight:600;") + box.addWidget(label) + box.addWidget(value) + summary_layout.addLayout(box, row, column) + self.summary_fields[key] = value + layout.addWidget(summary) + + layout.addWidget(section_title("病历内容")) + form_host = QFrame() + form_host.setObjectName("SubtleCard") + form = QFormLayout(form_host) + form.setContentsMargins(14, 12, 14, 12) + form.setHorizontalSpacing(16) + form.setVerticalSpacing(10) + self.edit_fields: dict[str, QPlainTextEdit] = {} + for caption, key, placeholder in _DIAGNOSIS_FIELDS: + edit = QPlainTextEdit() + edit.setPlaceholderText(placeholder) + edit.setMinimumHeight(46) + edit.setMaximumHeight(82) + form.addRow(caption, edit) + self.edit_fields[key] = edit + layout.addWidget(form_host) + layout.addStretch(1) + scroll.setWidget(content) + return scroll + + def _build_notes_tab(self) -> QWidget: + widget = QWidget() + layout = QVBoxLayout(widget) + layout.setContentsMargins(4, 12, 4, 12) + self.notes_table = QTableWidget(0, 3) + self.notes_table.setHorizontalHeaderLabels(["时间", "医生", "内容"]) + self.notes_table.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers) + self.notes_table.setSelectionBehavior(QTableWidget.SelectionBehavior.SelectRows) + self.notes_table.verticalHeader().setVisible(False) + self.notes_table.horizontalHeader().setStretchLastSection(True) + self.notes_table.setColumnWidth(0, 150) + self.notes_table.setColumnWidth(1, 110) + layout.addWidget(self.notes_table) + return widget + + def _build_history_tab(self, kind: str) -> QWidget: + widget = QWidget() + layout = QVBoxLayout(widget) + layout.setContentsMargins(4, 12, 4, 12) + if kind == "appointment": + table = QTableWidget(0, 7) + table.setHorizontalHeaderLabels( + ["状态", "患者", "医生", "医助", "预约日期", "时段", "备注"] + ) + widths = (88, 110, 100, 100, 105, 80) + self.appointment_table = table + else: + table = QTableWidget(0, 6) + table.setHorizontalHeaderLabels( + ["操作时间", "原医助", "新医助", "继承", "操作人", "账号"] + ) + widths = (145, 100, 100, 70, 100) + self.assign_table = table + table.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers) + table.setSelectionBehavior(QTableWidget.SelectionBehavior.SelectRows) + table.verticalHeader().setVisible(False) + table.horizontalHeader().setStretchLastSection(True) + for index, width in enumerate(widths): + table.setColumnWidth(index, width) + layout.addWidget(table) + return widget + + def _build_orders_tab(self) -> QWidget: + widget = QWidget() + layout = QVBoxLayout(widget) + layout.setContentsMargins(4, 12, 4, 12) + self.orders_table = QTableWidget(0, 8) + self.orders_table.setHorizontalHeaderLabels( + ["订单号", "处方", "患者/收货人", "手机", "金额", "发货", "状态", "创建时间"] + ) + self.orders_table.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers) + self.orders_table.setSelectionBehavior(QTableWidget.SelectionBehavior.SelectRows) + self.orders_table.verticalHeader().setVisible(False) + self.orders_table.horizontalHeader().setStretchLastSection(True) + for index, width in enumerate((130, 70, 120, 110, 90, 90, 100)): + self.orders_table.setColumnWidth(index, width) + layout.addWidget(self.orders_table, 1) + footer = QHBoxLayout() + self.orders_summary = QLabel("共 0 条") + self.orders_summary.setProperty("role", "muted") + footer.addWidget(self.orders_summary) + footer.addStretch(1) + self.orders_previous = QLabel('上一页') + self.orders_previous.setTextInteractionFlags(Qt.TextInteractionFlag.TextBrowserInteraction) + self.orders_previous.linkActivated.connect(lambda _link: self._change_orders_page(-1)) + footer.addWidget(self.orders_previous) + self.orders_page_label = QLabel("1 / 1") + footer.addWidget(self.orders_page_label) + self.orders_next = QLabel('下一页') + self.orders_next.setTextInteractionFlags(Qt.TextInteractionFlag.TextBrowserInteraction) + self.orders_next.linkActivated.connect(lambda _link: self._change_orders_page(1)) + footer.addWidget(self.orders_next) + layout.addLayout(footer) + return widget + + def open_for(self, diagnosis_id: int, *, editable: bool = False, seed: Any = None) -> None: + """Open immediately, then replace the seed with authoritative server data.""" + + self._diagnosis_id = int(diagnosis_id) + self._patient_id = 0 + self._editable = bool( + editable and has_permission(self.permissions, "tcm.diagnosis/edit", default=True) + ) + self._generation += 1 + self._save_generation += 1 + self._orders_generation += 1 + self._orders_page = 1 + self._orders_total = 0 + generation = self._generation + self._detail = seed + self.setWindowTitle("编辑患者病历" if self._editable else "患者信息详情") + self.title_label.setText("编辑患者病历" if self._editable else "患者信息详情") + self.mode_label.setText("可编辑" if self._editable else "只读") + self.mode_label.setProperty("kind", "success" if self._editable else "neutral") + self.mode_label.style().unpolish(self.mode_label) + self.mode_label.style().polish(self.mode_label) + self.save_button.setVisible(self._editable) + for key, field in self.edit_fields.items(): + field.setReadOnly( + not self._editable or (key in {"phone", "id_card"} and not self._can_phone_plain) + ) + self._clear_tables() + if seed is not None: + self._render(seed, [], []) + self.banner.show_message("正在加载完整诊单与历史记录…", "info") + self.open() + diagnosis_id_snapshot = self._diagnosis_id + editable_snapshot = self._editable + run_async( + lambda: self._load_bundle(diagnosis_id_snapshot, editable_snapshot), + on_success=lambda result: self._apply_bundle(result, generation), + on_error=lambda error: self._load_error(error, generation), + on_finished=lambda: None, + ) + + def _load_bundle(self, diagnosis_id: int, editable: bool) -> dict[str, Any]: + detail_names = ( + ("get_diagnosis_detail", "patient_detail", "diagnosis_readonly_detail") + if editable + else ("patient_detail", "diagnosis_readonly_detail", "get_diagnosis_detail") + ) + detail = _invoke_first( + self.repository, + detail_names, + diagnosis_id=diagnosis_id, + id=diagnosis_id, + readonly=not editable, + ) + appointments: list[Any] = [] + assignments: list[Any] = [] + history_errors: list[str] = [] + try: + appointments = page_items( + _invoke_first( + self.repository, + ("appointment_history",), + diagnosis_id=diagnosis_id, + page_no=1, + page_size=500, + ) + ) + except Exception as error: # history failure must not hide the diagnosis + history_errors.append(f"挂号记录:{friendly_error(error)}") + try: + assignments = page_items( + _invoke_first( + self.repository, + ("assign_history",), + diagnosis_id=diagnosis_id, + page_no=1, + page_size=50, + ) + ) + except Exception as error: # history failure must not hide the diagnosis + history_errors.append(f"指派记录:{friendly_error(error)}") + orders: list[Any] = [] + orders_total = 0 + diagnosis = get_value(detail, "diagnosis", None) or detail or {} + patient = get_value(detail, "patient", None) or {} + patient_id = _int( + first_value( + diagnosis, + "patient_id", + "source_patient_id", + default=first_value(patient, "patient_id", "id", default=0), + ), + 0, + ) + if self._can_patient_orders: + try: + order_result = self._query_orders(diagnosis_id, patient_id, 1) + orders = page_items(order_result) + orders_total = page_total(order_result, len(orders)) + except Exception as error: # order failure must not hide the diagnosis + history_errors.append(f"患者订单:{friendly_error(error)}") + return { + "detail": detail, + "appointments": appointments, + "assignments": assignments, + "patient_id": patient_id, + "orders": orders, + "orders_total": orders_total, + "history_errors": history_errors, + } + + def _query_orders(self, diagnosis_id: int, patient_id: int, page: int) -> Any: + filters: dict[str, Any] = { + "context_diagnosis_id": diagnosis_id, + "scene": "diagnosis_edit", + } + if patient_id > 0: + filters["patient_id"] = patient_id + return _invoke_first( + self.repository, + ("list_prescription_orders",), + page_no=page, + page_size=self._orders_page_size, + **filters, + ) + + def _apply_bundle(self, result: Any, generation: int) -> None: + if generation != self._generation: + return + detail = get_value(result, "detail", None) + appointments = get_value(result, "appointments", []) or [] + assignments = get_value(result, "assignments", []) or [] + self._detail = detail + self._patient_id = _int(get_value(result, "patient_id", 0), 0) + self._render(detail, appointments, assignments) + if self._can_patient_orders: + self._orders_total = int(get_value(result, "orders_total", 0) or 0) + self._fill_orders(get_value(result, "orders", []) or []) + self._update_orders_pager() + errors = get_value(result, "history_errors", []) or [] + if errors: + self.banner.show_message(";".join(str(item) for item in errors), "warning") + else: + self.banner.clear() + + def _load_error(self, error: Exception, generation: int) -> None: + if generation == self._generation: + self.banner.show_message(friendly_error(error), "danger") + + def _render(self, detail: Any, appointments: Sequence[Any], assignments: Sequence[Any]) -> None: + diagnosis = get_value(detail, "diagnosis", None) or detail or {} + patient = get_value(detail, "patient", None) or {} + appointment = get_value(detail, "appointment", None) or {} + patient_name = first_value( + diagnosis, + "patient_name", + "name", + default=first_value(patient, "patient_name", "name", default="未命名患者"), + ) + gender = gender_text( + first_value( + diagnosis, + "gender_desc", + "gender", + default=first_value(patient, "gender_desc", "gender"), + ) + ) + age = display_text(first_value(diagnosis, "age", default=first_value(patient, "age"))) + self.meta_label.setText(f"诊单 #{self._diagnosis_id} · {patient_name} · {gender} · {age}岁") + self.summary_fields["patient"].setText(display_text(patient_name)) + self.summary_fields["phone"].setText( + display_text( + first_value( + diagnosis, + "phone", + "patient_phone", + default=first_value( + patient, + "phone", + "patient_phone", + default=first_value(appointment, "patient_phone"), + ), + ) + if self._can_phone_plain + else _mask_phone( + first_value( + diagnosis, + "phone", + "patient_phone", + default=first_value( + patient, + "phone", + "patient_phone", + default=first_value(appointment, "patient_phone"), + ), + ) + ) + ) + ) + id_card = first_value( + diagnosis, + "id_card", + default=first_value(patient, "id_card", default=""), + ) + self.summary_fields["id_card"].setText( + display_text(id_card if self._can_phone_plain else _mask_id_card(id_card)) + ) + self.summary_fields["gender_age"].setText(f"{gender} / {age}岁") + self.summary_fields["body"].setText( + f"{display_text(first_value(diagnosis, 'height', default=first_value(patient, 'height')))} cm / " + f"{display_text(first_value(diagnosis, 'weight', default=first_value(patient, 'weight')))} kg" + ) + appointment_text = " ".join( + part + for part in ( + display_text(first_value(appointment, "appointment_date"), ""), + display_text( + first_value(appointment, "appointment_time", "appointment_time_text"), "" + ), + ) + if part + ) + self.summary_fields["appointment"].setText(appointment_text or "暂无预约") + self.summary_fields["staff"].setText( + f"{display_text(first_value(appointment, 'doctor_name'))} / " + f"{display_text(first_value(appointment, 'assistant_name'))}" + ) + self.summary_fields["pressure"].setText( + f"{display_text(first_value(diagnosis, 'systolic_pressure'))} / " + f"{display_text(first_value(diagnosis, 'diastolic_pressure'))} mmHg" + ) + self.summary_fields["blood_sugar"].setText( + f"{display_text(first_value(diagnosis, 'fasting_blood_sugar'))} mmol/L" + ) + basic_locked = _truthy( + first_value(diagnosis, "patient_basic_locked", default=False) + ) or not _truthy(first_value(diagnosis, "can_edit_patient_basic", default=True)) + self._field_originals.clear() + for key, field in self.edit_fields.items(): + raw = first_value( + diagnosis, + key, + default=first_value( + patient, + key, + default=first_value( + diagnosis, + "patient_phone" if key == "phone" else key, + default="", + ), + ), + ) + self._field_originals[key] = raw + if key == "phone" and not self._can_phone_plain: + rendered = _mask_phone(raw) + elif key == "id_card" and not self._can_phone_plain: + rendered = _mask_id_card(raw) + else: + rendered = _editor_text(raw) + field.setPlainText(rendered) + field.setReadOnly( + not self._editable + or (key in _PATIENT_BASIC_FIELDS and basic_locked) + or (key in {"phone", "id_card"} and not self._can_phone_plain) + ) + + notes = ( + get_value(detail, "doctor_notes", None) + or get_value(diagnosis, "doctor_notes", None) + or [] + ) + if not isinstance(notes, (list, tuple)): + notes = [notes] + self._fill_notes(notes) + self._fill_appointments(appointments) + self._fill_assignments(assignments) + + def _clear_tables(self) -> None: + self.notes_table.setRowCount(0) + self.appointment_table.setRowCount(0) + self.assign_table.setRowCount(0) + if self._can_patient_orders: + self.orders_table.setRowCount(0) + self.orders_summary.setText("共 0 条") + self.orders_page_label.setText("1 / 1") + + @staticmethod + def _set_row(table: QTableWidget, row: int, values: Sequence[Any]) -> None: + for column, value in enumerate(values): + item = QTableWidgetItem(display_text(value)) + item.setToolTip(item.text() if len(item.text()) > 18 else "") + table.setItem(row, column, item) + + def _fill_notes(self, rows: Sequence[Any]) -> None: + self.notes_table.setRowCount(len(rows)) + for index, row in enumerate(rows): + self._set_row( + self.notes_table, + index, + ( + first_value(row, "create_time", "created_at", "time"), + first_value(row, "doctor_name", "creator_name", default="医生"), + first_value(row, "content", "note", "remark"), + ), + ) + + def _fill_appointments(self, rows: Sequence[Any]) -> None: + self.appointment_table.setRowCount(len(rows)) + for index, row in enumerate(rows): + self._set_row( + self.appointment_table, + index, + ( + first_value(row, "status_desc", "status_text", "status"), + first_value(row, "patient_name"), + first_value(row, "doctor_name"), + first_value(row, "assistant_name"), + first_value(row, "appointment_date"), + first_value(row, "appointment_time", "period"), + first_value(row, "remark"), + ), + ) + + def _fill_assignments(self, rows: Sequence[Any]) -> None: + self.assign_table.setRowCount(len(rows)) + for index, row in enumerate(rows): + self._set_row( + self.assign_table, + index, + ( + first_value(row, "create_time_text", "create_time"), + first_value(row, "from_assistant_name", default="—"), + first_value(row, "to_assistant_name", "assistant_name", default="—"), + "是" if bool(first_value(row, "is_inherit", default=False)) else "否", + first_value(row, "operator_name"), + first_value(row, "operator_account"), + ), + ) + + def _fill_orders(self, rows: Sequence[Any]) -> None: + self.orders_table.setRowCount(len(rows)) + for index, row in enumerate(rows): + self._set_row( + self.orders_table, + index, + ( + first_value(row, "order_no", "sn", "id"), + first_value(row, "prescription_id"), + first_value(row, "recipient_name", "patient_name"), + first_value(row, "recipient_phone", "phone"), + first_value(row, "amount"), + first_value(row, "ship_mode", "express_company"), + first_value(row, "status_text", "fulfillment_status_text", "status"), + first_value(row, "create_time", "created_at"), + ), + ) + + def _update_orders_pager(self) -> None: + pages = max(1, (self._orders_total + self._orders_page_size - 1) // self._orders_page_size) + self.orders_summary.setText(f"共 {self._orders_total} 条") + self.orders_page_label.setText(f"{self._orders_page} / {pages}") + self.orders_previous.setEnabled(self._orders_page > 1) + self.orders_next.setEnabled(self._orders_page < pages) + + def _change_orders_page(self, offset: int) -> None: + if not self._can_patient_orders or self._diagnosis_id <= 0: + return + pages = max(1, (self._orders_total + self._orders_page_size - 1) // self._orders_page_size) + target_page = self._orders_page + offset + if target_page < 1 or target_page > pages: + return + self._orders_generation += 1 + generation = self._orders_generation + diagnosis_id = self._diagnosis_id + patient_id = self._patient_id + self.banner.show_message("正在加载患者订单…", "info") + run_async( + lambda: self._query_orders(diagnosis_id, patient_id, target_page), + on_success=lambda result: self._apply_orders_page( + result, diagnosis_id, target_page, generation + ), + on_error=lambda error: self._orders_error(error, diagnosis_id, generation), + ) + + def _apply_orders_page( + self, + result: Any, + diagnosis_id: int, + page: int, + generation: int, + ) -> None: + if generation != self._orders_generation or diagnosis_id != self._diagnosis_id: + return + rows = page_items(result) + self._orders_page = page + self._orders_total = page_total(result, len(rows)) + self._fill_orders(rows) + self._update_orders_pager() + self.banner.clear() + + def _orders_error(self, error: Exception, diagnosis_id: int, generation: int) -> None: + if generation == self._orders_generation and diagnosis_id == self._diagnosis_id: + self.banner.show_message(friendly_error(error), "danger") + + def _save(self) -> None: + if not self._editable or self._diagnosis_id <= 0: + return + diagnosis_id = self._diagnosis_id + changes = { + key: _field_value(key, field.toPlainText(), self._field_originals.get(key)) + for key, field in self.edit_fields.items() + if key not in {"phone", "id_card"} or self._can_phone_plain + } + patient_name = str(changes.get("patient_name") or "").strip() + if not patient_name: + self.banner.show_message("请输入患者姓名。", "warning") + self.edit_fields["patient_name"].setFocus() + return + phone = str(changes.get("phone") or "").strip() + if self._can_phone_plain and not _PHONE_PATTERN.fullmatch(phone): + self.banner.show_message("手机号格式不正确。", "warning") + self.edit_fields["phone"].setFocus() + return + id_card = str(changes.get("id_card") or "").strip() + if self._can_phone_plain and id_card and not _ID_CARD_PATTERN.fullmatch(id_card): + self.banner.show_message("身份证号格式不正确。", "warning") + self.edit_fields["id_card"].setFocus() + return + self._save_generation += 1 + generation = self._save_generation + self.save_button.setEnabled(False) + self.banner.show_message("正在保存病历…", "info") + run_async( + lambda: self._validate_and_save(diagnosis_id, changes), + on_success=lambda _result: self._save_success(generation), + on_error=lambda error: self._save_error(error, generation), + on_finished=lambda: self._save_finished(generation), + ) + + def _validate_and_save(self, diagnosis_id: int, changes: Mapping[str, Any]) -> Any: + if self._can_phone_plain: + phone = str(changes.get("phone") or "").strip() + phone_result = _invoke_first( + self.repository, + ("check_diagnosis_phone",), + payload={"phone": phone, "id": diagnosis_id}, + ) + if _duplicate_found(phone_result): + raise ValueError( + str( + first_value( + phone_result, "message", "data.message", default="手机号已存在。" + ) + ) + ) + id_card = str(changes.get("id_card") or "").strip() + if id_card: + id_card_result = _invoke_first( + self.repository, + ("check_diagnosis_id_card",), + payload={"id_card": id_card, "id": diagnosis_id}, + ) + if _duplicate_found(id_card_result): + raise ValueError( + str( + first_value( + id_card_result, + "message", + "data.message", + default="身份证号已存在。", + ) + ) + ) + return _invoke_first( + self.repository, + ("update_diagnosis",), + diagnosis=diagnosis_id, + changes=dict(changes), + ) + + def _save_success(self, generation: int) -> None: + if generation != self._save_generation: + return + self.banner.show_message("病历已保存。", "success") + self.saved.emit() + + def _save_error(self, error: Exception, generation: int) -> None: + if generation == self._save_generation: + self.banner.show_message(friendly_error(error), "danger") + + def _save_finished(self, generation: int) -> None: + if generation == self._save_generation: + self.save_button.setEnabled(True) + + +__all__ = ["DiagnosisDialog"] diff --git a/app/src/doctor_workstation/ui/dialogs/prescription.py b/app/src/doctor_workstation/ui/dialogs/prescription.py new file mode 100644 index 000000000..4f9fff75d --- /dev/null +++ b/app/src/doctor_workstation/ui/dialogs/prescription.py @@ -0,0 +1,2318 @@ +"""Prescription-specific dialogs and editors. + +The widgets in this module intentionally depend on repository protocols only. +Remote and demo repositories can therefore expose the same canonical method +names without coupling the UI to a concrete service implementation. +""" + +from __future__ import annotations + +import base64 +import html +import json +import re +from collections.abc import Iterable, Mapping, Sequence +from datetime import date +from pathlib import Path +from typing import Any + +from PySide6.QtCore import QBuffer, QByteArray, QDate, QIODevice, QPoint, Qt, QTimer, Signal +from PySide6.QtGui import ( + QColor, + QImage, + QMouseEvent, + QPageSize, + QPainter, + QPen, + QTextDocument, +) +from PySide6.QtPrintSupport import QPrintDialog, QPrinter +from PySide6.QtWidgets import ( + QAbstractItemView, + QCheckBox, + QComboBox, + QDateEdit, + QDialog, + QDialogButtonBox, + QDoubleSpinBox, + QFileDialog, + QFormLayout, + QFrame, + QHBoxLayout, + QHeaderView, + QLabel, + QLineEdit, + QListWidget, + QListWidgetItem, + QMessageBox, + QPushButton, + QScrollArea, + QSpinBox, + QTableWidget, + QTableWidgetItem, + QTabWidget, + QTextBrowser, + QTextEdit, + QVBoxLayout, + QWidget, +) + +from ..widgets import ( + MessageBanner, + display_text, + first_value, + friendly_error, + get_value, + invoke, + page_items, + page_total, + run_async, +) + + +def _int(value: Any, default: int = 0) -> int: + try: + return int(value) + except (TypeError, ValueError): + return default + + +def _float(value: Any, default: float = 0.0) -> float: + try: + return float(value) + except (TypeError, ValueError): + return default + + +def _bool(value: Any) -> bool: + if isinstance(value, str): + return value.strip().lower() not in {"", "0", "false", "no", "off"} + return bool(value) + + +def _mapping(value: Any) -> dict[str, Any]: + if isinstance(value, Mapping): + return dict(value) + raw = getattr(value, "raw", None) + result = dict(raw) if isinstance(raw, Mapping) else {} + fields = getattr(value, "__dataclass_fields__", {}) + for name in fields: + if name != "raw": + result[name] = getattr(value, name, None) + return result + + +def _formula(value: Any) -> str: + text = str(value or "").strip().lower() + return "辅方" if text in {"2", "aux", "auxiliary", "secondary", "辅方"} else "主方" + + +def _repository_action(repository: Any, names: str | Sequence[str], **kwargs: Any) -> Any: + """Call the first available canonical/compatibility repository method.""" + + candidates = (names,) if isinstance(names, str) else tuple(names) + for name in candidates: + if callable(getattr(repository, name, None)): + return invoke(repository, name, **kwargs) + raise AttributeError(f"repository has none of: {', '.join(candidates)}") + + +def _set_combo_data(combo: QComboBox, value: Any, fallback: int = 0) -> None: + index = combo.findData(value) + if index < 0: + text = str(value or "") + index = combo.findText(text) + combo.setCurrentIndex(index if index >= 0 else fallback) + + +def _duplicate_herb_names(herbs: Sequence[Mapping[str, Any]]) -> list[str]: + seen: set[str] = set() + duplicates: list[str] = [] + for herb in herbs: + name = str(herb.get("name") or herb.get("medicine_name") or "").strip() + key = "".join(name.split()).casefold() + if key and key in seen and name not in duplicates: + duplicates.append(name) + seen.add(key) + return duplicates + + +class RemoteMedicineComboBox(QComboBox): + """Editable remote medicine selector retaining both id and canonical name.""" + + search_failed = Signal(str) + + def __init__( + self, + repository: Any, + *, + medicine_id: Any = None, + name: str = "", + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.repository = repository + self._generation = 0 + self._selected_id = _int(medicine_id, 0) or None + # The admin selector preserves legacy rows whose API payload has a name + # but no medicine id. New/changed text must still be selected from the + # remote master-data list rather than submitted as arbitrary input. + self._legacy_name = str(name or "").strip() if self._selected_id is None else "" + self.setEditable(True) + self.setInsertPolicy(QComboBox.InsertPolicy.NoInsert) + self.setMaxVisibleItems(14) + self.setMinimumWidth(190) + self.lineEdit().setPlaceholderText("搜索药材名称或拼音首字母") + self.lineEdit().textEdited.connect(self._queue_search) + self.currentIndexChanged.connect(self._selection_changed) + self._timer = QTimer(self) + self._timer.setSingleShot(True) + self._timer.setInterval(250) + self._timer.timeout.connect(self._search) + if name: + self.addItem(str(name), self._selected_id) + self.setCurrentIndex(0) + self.setEditText(str(name)) + + @property + def medicine_id(self) -> int | None: + data = self.currentData() + value = _int(data, 0) + return value or self._selected_id + + @property + def medicine_name(self) -> str: + return self.currentText().strip() + + @property + def has_valid_selection(self) -> bool: + name = self.medicine_name + return bool(self.medicine_id) or bool(self._legacy_name and name == self._legacy_name) + + def set_value(self, medicine_id: Any, name: Any) -> None: + self._selected_id = _int(medicine_id, 0) or None + canonical_name = str(name or "").strip() + self._legacy_name = canonical_name if self._selected_id is None else "" + self.blockSignals(True) + self.clear() + if canonical_name: + self.addItem(canonical_name, self._selected_id) + self.setCurrentIndex(0) + self.setEditText(canonical_name) + self.blockSignals(False) + + def showPopup(self) -> None: + if self.count() <= 1: + self._queue_search(self.currentText()) + self._timer.stop() + self._search() + super().showPopup() + + def _queue_search(self, _text: str) -> None: + self._selected_id = None + self._legacy_name = "" + self._timer.start() + + def _search(self) -> None: + query = self.currentText().strip() + self._generation += 1 + generation = self._generation + run_async( + lambda: _repository_action( + self.repository, + "list_medicines", + name=query, + page_no=1, + page_size=100, + status=1, + ), + on_success=lambda result: self._apply_options(result, query, generation), + on_error=lambda error: self._search_error(error, generation), + ) + + def _apply_options(self, result: Any, query: str, generation: int) -> None: + if generation != self._generation: + return + rows = page_items(result) + current_text = self.currentText().strip() + self.blockSignals(True) + self.clear() + for row in rows: + medicine_id = _int(first_value(row, "id", "medicine_id"), 0) + name = str(first_value(row, "name", "medicine_name", default="")).strip() + if not medicine_id or not name: + continue + supplier = str(first_value(row, "supplier", default="")).strip() + unit = str(first_value(row, "unit", default="")).strip() + label = name + meta = " · ".join(part for part in (supplier, unit, f"ID {medicine_id}") if part) + if meta: + label = f"{name} {meta}" + self.addItem(label, {"id": medicine_id, "name": name}) + self.setEditText(current_text or query) + self.blockSignals(False) + + def _search_error(self, error: Exception, generation: int) -> None: + if generation == self._generation: + self.search_failed.emit(friendly_error(error)) + + def _selection_changed(self, index: int) -> None: + data = self.itemData(index) + if isinstance(data, Mapping): + self._selected_id = _int(data.get("id"), 0) or None + name = str(data.get("name") or "").strip() + if name: + self._legacy_name = "" + self.setEditText(name) + else: + self._selected_id = _int(data, 0) or self._selected_id + + +class HerbRowWidget(QFrame): + remove_requested = Signal(object) + + def __init__( + self, + repository: Any, + herb: Any = None, + *, + formula_type: str = "主方", + locked: bool = False, + show_formula: bool = False, + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.setObjectName("SubtleCard") + self._locked = locked + layout = QHBoxLayout(self) + layout.setContentsMargins(10, 7, 10, 7) + layout.setSpacing(8) + self.formula_combo = QComboBox() + self.formula_combo.addItem("主方", "主方") + self.formula_combo.addItem("辅方", "辅方") + _set_combo_data( + self.formula_combo, + _formula(first_value(herb, "formula_type", default=formula_type)), + ) + self.formula_combo.setVisible(show_formula) + self.formula_combo.setEnabled(not locked) + layout.addWidget(self.formula_combo) + self.medicine = RemoteMedicineComboBox( + repository, + medicine_id=first_value(herb, "medicine_id", "id", default=None), + name=str(first_value(herb, "name", "medicine_name", default="")), + ) + self.medicine.setEnabled(not locked) + layout.addWidget(self.medicine, 1) + self.dosage = QDoubleSpinBox() + self.dosage.setRange(0, 99999) + self.dosage.setDecimals(1) + self.dosage.setSingleStep(0.5) + self.dosage.setSuffix(" g") + self.dosage.setValue(_float(first_value(herb, "dosage", "amount", default=0))) + self.dosage.setEnabled(not locked) + self.dosage.setMaximumWidth(130) + layout.addWidget(self.dosage) + self.remove_button = QPushButton("删除") + self.remove_button.setProperty("variant", "ghost") + self.remove_button.setVisible(not locked) + self.remove_button.clicked.connect(lambda: self.remove_requested.emit(self)) + layout.addWidget(self.remove_button) + + @property + def locked(self) -> bool: + return self._locked + + def value(self) -> dict[str, Any]: + result: dict[str, Any] = { + "name": self.medicine.medicine_name, + "dosage": self.dosage.value(), + "formula_type": self.formula_combo.currentData(), + } + if self.medicine.medicine_id: + result["medicine_id"] = self.medicine.medicine_id + if self._locked: + result["locked"] = True + return result + + +class HerbEditor(QWidget): + """Scrollable main/auxiliary herb row editor.""" + + def __init__( + self, + repository: Any, + *, + show_formula: bool = False, + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.repository = repository + self.show_formula = show_formula + self.rows: list[HerbRowWidget] = [] + self._locked = False + root = QVBoxLayout(self) + root.setContentsMargins(0, 0, 0, 0) + root.setSpacing(8) + actions = QHBoxLayout() + self.main_button = QPushButton("+ 添加主方药材") + self.main_button.setProperty("variant", "secondary") + self.main_button.clicked.connect(lambda: self.add_row(formula_type="主方")) + actions.addWidget(self.main_button) + self.aux_button = QPushButton("+ 添加辅方药材") + self.aux_button.setProperty("variant", "secondary") + self.aux_button.clicked.connect(lambda: self.add_row(formula_type="辅方")) + self.aux_button.setVisible(show_formula) + actions.addWidget(self.aux_button) + actions.addStretch(1) + root.addLayout(actions) + self.lock_banner = MessageBanner() + root.addWidget(self.lock_banner) + scroll = QScrollArea() + scroll.setWidgetResizable(True) + scroll.setMinimumHeight(220) + host = QWidget() + self.rows_layout = QVBoxLayout(host) + self.rows_layout.setContentsMargins(0, 0, 4, 0) + self.rows_layout.setSpacing(7) + self.rows_layout.addStretch(1) + scroll.setWidget(host) + root.addWidget(scroll, 1) + + @property + def locked(self) -> bool: + return self._locked + + def clear(self) -> None: + for row in self.rows: + row.deleteLater() + self.rows.clear() + + def set_rows(self, herbs: Iterable[Any], *, locked: bool = False) -> None: + self.clear() + self._locked = locked + self.main_button.setEnabled(not locked) + self.aux_button.setEnabled(not locked) + if locked: + self.lock_banner.show_message( + "该处方含“禁用修改”模板,药材已锁定;可重新导入模板覆盖。", + "warning", + ) + else: + self.lock_banner.clear() + for herb in herbs: + row_locked = locked or _bool(first_value(herb, "locked", default=False)) + self.add_row(herb, locked=row_locked) + + def add_row( + self, + herb: Any = None, + *, + formula_type: str = "主方", + locked: bool | None = None, + ) -> HerbRowWidget: + row = HerbRowWidget( + self.repository, + herb, + formula_type=formula_type, + locked=self._locked if locked is None else locked, + show_formula=self.show_formula, + ) + row.remove_requested.connect(self.remove_row) + self.rows.append(row) + self.rows_layout.insertWidget(max(0, self.rows_layout.count() - 1), row) + return row + + def remove_row(self, row: HerbRowWidget) -> None: + if self._locked or row.locked: + return + if row in self.rows: + self.rows.remove(row) + row.deleteLater() + + def values(self) -> list[dict[str, Any]]: + return [row.value() for row in self.rows if row.value()["name"]] + + +class SignaturePad(QWidget): + """Small handwritten signature surface serialised as a PNG data URL.""" + + changed = Signal() + + def __init__(self, parent: QWidget | None = None) -> None: + super().__init__(parent) + self.setMinimumSize(500, 150) + self.setCursor(Qt.CursorShape.CrossCursor) + self._image = QImage(1000, 300, QImage.Format.Format_ARGB32_Premultiplied) + self._image.fill(QColor("white")) + self._drawing = False + self._last = QPoint() + self._source = "" + self._has_strokes = False + + def clear(self) -> None: + self._image.fill(QColor("white")) + self._source = "" + self._has_strokes = False + self.update() + self.changed.emit() + + def set_signature(self, value: Any) -> None: + text = str(value or "") + self.clear() + if not text.startswith("data:image") or "," not in text: + return + try: + data = base64.b64decode(text.split(",", 1)[1]) + except (ValueError, TypeError): + return + image = QImage.fromData(data) + if image.isNull(): + return + self._image.fill(QColor("white")) + painter = QPainter(self._image) + painter.drawImage(self._image.rect(), image) + painter.end() + self._source = text + self._has_strokes = True + self.update() + + def is_empty(self) -> bool: + return not self._source and not self._has_strokes + + def data_url(self) -> str: + if self._source: + return self._source + if self.is_empty(): + return "" + byte_array = QByteArray() + buffer = QBuffer(byte_array) + buffer.open(QIODevice.OpenModeFlag.WriteOnly) + self._image.save(buffer, "PNG") + return "data:image/png;base64," + bytes(byte_array.toBase64()).decode("ascii") + + def paintEvent(self, _event: Any) -> None: + painter = QPainter(self) + painter.fillRect(self.rect(), QColor("white")) + painter.drawImage(self.rect(), self._image) + painter.setPen(QPen(QColor("#C7D0CB"), 1)) + painter.drawRect(self.rect().adjusted(0, 0, -1, -1)) + + def mousePressEvent(self, event: QMouseEvent) -> None: + if event.button() != Qt.MouseButton.LeftButton: + return + self._drawing = True + self._source = "" + self._last = self._image_point(event.position().toPoint()) + + def mouseMoveEvent(self, event: QMouseEvent) -> None: + if not self._drawing: + return + point = self._image_point(event.position().toPoint()) + painter = QPainter(self._image) + painter.setRenderHint(QPainter.RenderHint.Antialiasing) + painter.setPen( + QPen( + QColor("#15241D"), + 5, + Qt.PenStyle.SolidLine, + Qt.PenCapStyle.RoundCap, + Qt.PenJoinStyle.RoundJoin, + ) + ) + painter.drawLine(self._last, point) + painter.end() + self._last = point + self._has_strokes = True + self.update() + self.changed.emit() + + def mouseReleaseEvent(self, event: QMouseEvent) -> None: + if event.button() == Qt.MouseButton.LeftButton: + self._drawing = False + + def _image_point(self, point: QPoint) -> QPoint: + return QPoint( + int(point.x() * self._image.width() / max(1, self.width())), + int(point.y() * self._image.height() / max(1, self.height())), + ) + + +class PrescriptionTemplateDialog(QDialog): + """Create, edit, or read one reusable prescription-library template.""" + + def __init__( + self, + repository: Any, + template: Any = None, + *, + mode: str = "add", + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.repository = repository + self.template = template + self.mode = mode + self.template_id = first_value(template, "id", "template_id", default=None) + title = {"add": "新增处方模板", "edit": "编辑处方模板", "view": "查看处方模板"}[mode] + self.setWindowTitle(title) + self.resize(760, 690) + root = QVBoxLayout(self) + root.setContentsMargins(22, 20, 22, 20) + root.setSpacing(12) + heading = QLabel(title) + heading.setProperty("role", "pageTitle") + root.addWidget(heading) + hint = QLabel("模板保存可复用药材组合;“禁用修改”只锁定导入后的处方,不锁定模板维护。") + hint.setProperty("role", "muted") + hint.setWordWrap(True) + root.addWidget(hint) + form = QFormLayout() + self.name_edit = QLineEdit( + str(first_value(template, "prescription_name", "name", default="")) + ) + self.name_edit.setMaxLength(100) + self.name_edit.setPlaceholderText("请输入处方名称") + form.addRow("处方名称", self.name_edit) + self.formula_combo = QComboBox() + self.formula_combo.addItem("主方", "主方") + self.formula_combo.addItem("辅方", "辅方") + _set_combo_data( + self.formula_combo, + _formula(first_value(template, "formula_type", default="主方")), + ) + form.addRow("处方类型", self.formula_combo) + self.public_check = QCheckBox("所有医生可查看和使用") + self.public_check.setChecked(_bool(first_value(template, "is_public", default=False))) + form.addRow("公开范围", self.public_check) + self.disable_edit_check = QCheckBox("导入后禁用处方药材修改") + self.disable_edit_check.setChecked( + _bool(first_value(template, "disable_edit", default=False)) + ) + form.addRow("禁用修改", self.disable_edit_check) + root.addLayout(form) + root.addWidget(QLabel("药材配方")) + self.herbs = HerbEditor(repository, show_formula=False) + existing = get_value(template, "herbs", None) or [] + self.herbs.set_rows(existing, locked=False) + if not existing and mode != "view": + self.herbs.add_row(formula_type=self.formula_combo.currentData()) + root.addWidget(self.herbs, 1) + self.validation = MessageBanner() + root.addWidget(self.validation) + buttons = QDialogButtonBox(QDialogButtonBox.StandardButton.Close) + buttons.button(QDialogButtonBox.StandardButton.Close).setText( + "关闭" if mode == "view" else "取消" + ) + buttons.rejected.connect(self.reject) + if mode != "view": + self.save_button = buttons.addButton("保存模板", QDialogButtonBox.ButtonRole.AcceptRole) + self.save_button.setProperty("variant", "primary") + self.save_button.clicked.connect(self.accept) + else: + self.save_button = None + self.name_edit.setReadOnly(True) + self.formula_combo.setEnabled(False) + self.public_check.setEnabled(False) + self.disable_edit_check.setEnabled(False) + for row in self.herbs.rows: + row.medicine.setEnabled(False) + row.dosage.setEnabled(False) + row.remove_button.hide() + self.herbs.main_button.hide() + root.addWidget(buttons) + + def payload(self) -> dict[str, Any]: + herbs = [] + for row in self.herbs.values(): + item = dict(row) + item.pop("formula_type", None) + item.pop("locked", None) + herbs.append(item) + result: dict[str, Any] = { + "prescription_name": self.name_edit.text().strip(), + "formula_type": self.formula_combo.currentData(), + "herbs": herbs, + "is_public": int(self.public_check.isChecked()), + "disable_edit": int(self.disable_edit_check.isChecked()), + } + if self.template_id is not None: + result["id"] = self.template_id + return result + + def accept(self) -> None: + payload = self.payload() + if not payload["prescription_name"]: + self.validation.show_message("请输入处方名称。", "warning") + self.name_edit.setFocus() + return + if not payload["herbs"]: + self.validation.show_message("请至少添加一味药材。", "warning") + return + duplicate_names = _duplicate_herb_names(payload["herbs"]) + if duplicate_names: + self.validation.show_message("药材不可重复:" + "、".join(duplicate_names), "warning") + return + for index, herb in enumerate(payload["herbs"], 1): + if not str(herb.get("name") or "").strip(): + self.validation.show_message(f"第 {index} 味药材名称不能为空。", "warning") + return + if not self.herbs.rows[index - 1].medicine.has_valid_selection: + self.validation.show_message( + f"第 {index} 味药材必须从药材主数据中选择。", "warning" + ) + return + if _float(herb.get("dosage"), 0) <= 0: + self.validation.show_message(f"第 {index} 味药材剂量必须大于 0。", "warning") + return + self.validation.clear() + super().accept() + + +class TemplateImportDialog(QDialog): + """Paginated prescription-library selector used by the prescription editor.""" + + def __init__( + self, + repository: Any, + prescribing_creator_id: int, + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.repository = repository + self.prescribing_creator_id = prescribing_creator_id + self._page = 1 + self._page_size = 15 + self._generation = 0 + self._selected: Any = None + self.setWindowTitle("从处方库导入") + self.resize(850, 580) + root = QVBoxLayout(self) + filters = QHBoxLayout() + self.name_edit = QLineEdit() + self.name_edit.setPlaceholderText("处方名称") + self.name_edit.returnPressed.connect(self.search) + filters.addWidget(self.name_edit, 1) + self.formula_combo = QComboBox() + self.formula_combo.addItem("全部类型", "") + self.formula_combo.addItem("主方", "主方") + self.formula_combo.addItem("辅方", "辅方") + filters.addWidget(self.formula_combo) + query = QPushButton("查询") + query.clicked.connect(self.search) + filters.addWidget(query) + root.addLayout(filters) + mode_layout = QHBoxLayout() + mode_layout.addWidget(QLabel("导入方式")) + self.mode_combo = QComboBox() + self.mode_combo.addItem("覆盖同方型药材", "replace") + self.mode_combo.addItem("追加到末尾", "append") + mode_layout.addWidget(self.mode_combo) + mode_layout.addStretch(1) + root.addLayout(mode_layout) + self.banner = MessageBanner() + root.addWidget(self.banner) + self.table = QTableWidget(0, 6) + self.table.setHorizontalHeaderLabels( + ["处方名称", "类型", "药材数", "药材明细", "公开范围", "创建人"] + ) + self.table.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) + self.table.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection) + self.table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers) + self.table.verticalHeader().hide() + self.table.horizontalHeader().setSectionResizeMode(3, QHeaderView.ResizeMode.Stretch) + self.table.itemDoubleClicked.connect(lambda _item: self.accept()) + root.addWidget(self.table, 1) + pager = QHBoxLayout() + pager.addStretch(1) + self.total_label = QLabel("共 0 条") + pager.addWidget(self.total_label) + self.previous = QPushButton("上一页") + self.previous.clicked.connect(lambda: self._change_page(self._page - 1)) + pager.addWidget(self.previous) + self.page_label = QLabel("1 / 1") + pager.addWidget(self.page_label) + self.next = QPushButton("下一页") + self.next.clicked.connect(lambda: self._change_page(self._page + 1)) + pager.addWidget(self.next) + root.addLayout(pager) + buttons = QDialogButtonBox(QDialogButtonBox.StandardButton.Cancel) + buttons.button(QDialogButtonBox.StandardButton.Cancel).setText("取消") + buttons.rejected.connect(self.reject) + import_button = buttons.addButton("导入", QDialogButtonBox.ButtonRole.AcceptRole) + import_button.setProperty("variant", "primary") + import_button.clicked.connect(self.accept) + root.addWidget(buttons) + QTimer.singleShot(0, self.load) + + @property + def import_mode(self) -> str: + return str(self.mode_combo.currentData()) + + def selected_template(self) -> Any: + return self._selected + + def search(self) -> None: + self._page = 1 + self.load() + + def load(self) -> None: + self._generation += 1 + generation = self._generation + page = self._page + page_size = self._page_size + prescription_name = self.name_edit.text().strip() + formula_type = self.formula_combo.currentData() + prescribing_creator_id = self.prescribing_creator_id + self.banner.show_message("正在加载处方库…", "info") + run_async( + lambda: _repository_action( + self.repository, + ("list_prescription_templates", "prescription_library"), + page_no=page, + page_size=page_size, + prescription_name=prescription_name, + formula_type=formula_type, + prescribing_creator_id=prescribing_creator_id, + ), + on_success=lambda result: self._apply(result, generation), + on_error=lambda error: self._error(error, generation), + ) + + def _apply(self, result: Any, generation: int) -> None: + if generation != self._generation: + return + rows = page_items(result) + self.table.setRowCount(len(rows)) + for row_index, row in enumerate(rows): + herbs = get_value(row, "herbs", None) or [] + detail = "、".join( + f"{first_value(item, 'name', 'medicine_name', default='')} " + f"{first_value(item, 'dosage', 'amount', default='')}g" + for item in herbs + ) + values = ( + first_value(row, "prescription_name", "name"), + _formula(first_value(row, "formula_type")), + f"{len(herbs)}味", + detail, + "所有人可见" if _bool(first_value(row, "is_public")) else "仅自己可见", + first_value(row, "creator_name", "doctor_name"), + ) + for column, value in enumerate(values): + item = QTableWidgetItem(display_text(value)) + item.setData(Qt.ItemDataRole.UserRole, row) + self.table.setItem(row_index, column, item) + total = page_total(result, len(rows)) + page_count = max(1, (total + self._page_size - 1) // self._page_size) + self.total_label.setText(f"共 {total} 条") + self.page_label.setText(f"{self._page} / {page_count}") + self.previous.setEnabled(self._page > 1) + self.next.setEnabled(self._page < page_count) + self.banner.clear() + + def _error(self, error: Exception, generation: int) -> None: + if generation == self._generation: + self.banner.show_message(friendly_error(error), "danger") + + def _change_page(self, page: int) -> None: + if page >= 1: + self._page = page + self.load() + + def accept(self) -> None: + row = self.table.currentRow() + item = self.table.item(row, 0) if row >= 0 else None + self._selected = item.data(Qt.ItemDataRole.UserRole) if item is not None else None + if self._selected is None: + self.banner.show_message("请选择一条处方模板。", "warning") + return + super().accept() + + +_PASTE_SKIP = re.compile( + r"^(用法|用量|医嘱|忌口|水煎服|空腹|饭后|温水|内服|外用|备注|顿服|分服|ml|毫升|[×xX]\s*\d)" +) + + +def parse_pasted_herbs(text: str) -> list[dict[str, Any]]: + """Parse the admin-supported common recipe text forms.""" + + normalized = ( + text.replace("\r\n", "\n") + .replace("\r", "\n") + .translate(str.maketrans("0123456789", "0123456789")) + ) + normalized = re.sub(r"^\s*(?:Rp[::]*|处方[::]?|中药处方[::]?)\s*", "", normalized) + pieces: list[str] = [] + for line in normalized.splitlines(): + for piece in re.split(r"[、,,;;]", line): + cleaned = piece.strip() + if cleaned: + pieces.extend( + part.strip() + for part in re.split(r"\s+(?=[\u4e00-\u9fff]{2,})", cleaned) + if part.strip() + ) + result: list[dict[str, Any]] = [] + for piece in pieces: + if _PASTE_SKIP.search(piece) or re.match(r"^\d", piece): + continue + equal = re.match( + r"^(.+?)\s*各\s*(\d+(?:\.\d+)?)\s*(?:克|g|G)?$", + piece, + ) + if equal: + dosage = float(equal.group(2)) + names = [name for name in re.split(r"[、,,\s]+", equal.group(1)) if name] + result.extend({"name": name.strip(), "dosage": dosage} for name in names) + continue + matched = re.match(r"^(.+?)\s*(\d+(?:\.\d+)?)\s*(?:克|g|G|钱)?$", piece) + if matched: + name = re.sub(r"[((][^))]*[))]$", "", matched.group(1)).strip() + dosage = float(matched.group(2)) + if name and dosage > 0: + result.append({"name": name, "dosage": dosage}) + continue + name = re.sub(r"[((][^))]*[))]$", "", piece).strip() + if 2 <= len(name) <= 16: + result.append({"name": name, "dosage": 6.0}) + return result + + +class PasteHerbsDialog(QDialog): + """Text recipe importer that resolves exact medicine-library names.""" + + def __init__(self, repository: Any, parent: QWidget | None = None) -> None: + super().__init__(parent) + self.repository = repository + self.resolved: list[dict[str, Any]] = [] + self.setWindowTitle("导入药方(识别药材)") + self.resize(600, 470) + root = QVBoxLayout(self) + root.addWidget(QLabel("粘贴药名与剂量;仅药品库完全同名且唯一的药材会被录入主方。")) + self.text_edit = QTextEdit() + self.text_edit.setPlaceholderText("例如:黄芪15 党参12 茯苓10\n柴胡10g、白术12g") + root.addWidget(self.text_edit, 1) + self.mode_combo = QComboBox() + self.mode_combo.addItem("覆盖现有主方", "replace") + self.mode_combo.addItem("追加到末尾", "append") + root.addWidget(self.mode_combo) + self.banner = MessageBanner() + root.addWidget(self.banner) + buttons = QDialogButtonBox(QDialogButtonBox.StandardButton.Cancel) + buttons.rejected.connect(self.reject) + self.import_button = buttons.addButton("识别并导入", QDialogButtonBox.ButtonRole.AcceptRole) + self.import_button.clicked.connect(self.accept) + root.addWidget(buttons) + + @property + def import_mode(self) -> str: + return str(self.mode_combo.currentData()) + + def accept(self) -> None: + parsed = parse_pasted_herbs(self.text_edit.toPlainText()) + if not parsed: + self.banner.show_message("未能解析出药材,请检查格式。", "warning") + return + self.import_button.setEnabled(False) + self.banner.show_message("正在核对药品库…", "info") + + def resolve() -> tuple[list[dict[str, Any]], list[str]]: + accepted: list[dict[str, Any]] = [] + skipped: list[str] = [] + for herb in parsed: + result = _repository_action( + self.repository, + "list_medicines", + name=herb["name"], + page_no=1, + page_size=200, + status=1, + ) + exact = [ + row + for row in page_items(result) + if str(first_value(row, "name", default="")).strip() == herb["name"] + ] + if len(exact) != 1: + skipped.append(herb["name"]) + continue + accepted.append( + { + "medicine_id": _int(first_value(exact[0], "id", "medicine_id")), + "name": herb["name"], + "dosage": herb["dosage"], + "formula_type": "主方", + } + ) + return accepted, skipped + + run_async( + resolve, + on_success=self._resolved, + on_error=lambda error: self.banner.show_message(friendly_error(error), "danger"), + on_finished=lambda: self.import_button.setEnabled(True), + ) + + def _resolved(self, result: tuple[list[dict[str, Any]], list[str]]) -> None: + accepted, skipped = result + if not accepted: + self.banner.show_message( + "药品库没有唯一同名匹配:" + "、".join(dict.fromkeys(skipped)), + "warning", + ) + return + self.resolved = accepted + if skipped: + QMessageBox.information( + self, + "部分导入", + "已跳过非唯一同名药材:" + "、".join(dict.fromkeys(skipped)), + ) + super().accept() + + +class PrescriptionEditorDialog(QDialog): + """Full issued-prescription add/edit form matching the admin DTO.""" + + PRESCRIPTION_TYPES = ("浓缩水丸", "饮片", "颗粒", "丸剂", "散剂", "膏方", "汤剂") + DIETARY_OPTIONS = ( + "辛辣食物", + "生冷食物", + "油腻食物", + "海鲜", + "牛羊肉", + "鸡蛋", + "豆制品", + "酒类", + "浓茶", + "咖啡", + "烟草", + "萝卜", + ) + + def __init__( + self, + repository: Any, + prescription: Any = None, + *, + mode: str = "add", + current_user: Any = None, + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.repository = repository + self.prescription = prescription + self.mode = mode + self.current_user = current_user + self._source = _mapping(prescription) + self._prescribing_creator_id = _int( + first_value( + prescription, + "creator_id", + default=first_value(current_user, "id", "user_id", default=0), + ) + ) + self.setWindowTitle("新增处方" if mode == "add" else "编辑处方") + self.resize(920, 780) + root = QVBoxLayout(self) + root.setContentsMargins(20, 18, 20, 18) + self.tabs = QTabWidget() + self.tabs.addTab(self._build_basic_tab(), "患者与诊断") + self.tabs.addTab(self._build_herbs_tab(), "药材配方") + self.tabs.addTab(self._build_usage_tab(), "剂型与用法") + self.tabs.addTab(self._build_doctor_tab(), "医师签名") + root.addWidget(self.tabs, 1) + self.validation = MessageBanner() + root.addWidget(self.validation) + buttons = QDialogButtonBox( + QDialogButtonBox.StandardButton.Cancel | QDialogButtonBox.StandardButton.Save + ) + buttons.button(QDialogButtonBox.StandardButton.Cancel).setText("取消") + buttons.button(QDialogButtonBox.StandardButton.Save).setText("保存处方") + buttons.button(QDialogButtonBox.StandardButton.Save).setProperty("variant", "primary") + buttons.rejected.connect(self.reject) + buttons.accepted.connect(self.accept) + root.addWidget(buttons) + self._load_values() + + def _scroll_form(self) -> tuple[QWidget, QFormLayout]: + host = QWidget() + outer = QVBoxLayout(host) + outer.setContentsMargins(0, 0, 0, 0) + scroll = QScrollArea() + scroll.setWidgetResizable(True) + content = QWidget() + form = QFormLayout(content) + form.setContentsMargins(16, 16, 16, 16) + form.setHorizontalSpacing(18) + form.setVerticalSpacing(11) + scroll.setWidget(content) + outer.addWidget(scroll) + return host, form + + def _build_basic_tab(self) -> QWidget: + tab, form = self._scroll_form() + self.patient_name = QLineEdit() + self.patient_name.setMaxLength(50) + form.addRow("患者姓名 *", self.patient_name) + self.visit_no = QLineEdit() + form.addRow("门诊号", self.visit_no) + self.gender = QComboBox() + self.gender.addItem("男", 1) + self.gender.addItem("女", 0) + form.addRow("性别 *", self.gender) + self.age = QSpinBox() + self.age.setRange(0, 150) + form.addRow("年龄", self.age) + self.date_edit = QDateEdit(QDate.currentDate()) + self.date_edit.setDisplayFormat("yyyy-MM-dd") + self.date_edit.setCalendarPopup(True) + form.addRow("处方日期 *", self.date_edit) + self.tongue = QLineEdit() + form.addRow("面象", self.tongue) + self.tongue_image = QLineEdit() + form.addRow("舌象", self.tongue_image) + self.pulse = QLineEdit() + form.addRow("脉象", self.pulse) + self.pulse_condition = QLineEdit() + form.addRow("脉象详情", self.pulse_condition) + self.clinical_diagnosis = QTextEdit() + self.clinical_diagnosis.setMaximumHeight(100) + form.addRow("临床诊断 *", self.clinical_diagnosis) + return tab + + def _build_herbs_tab(self) -> QWidget: + tab = QWidget() + layout = QVBoxLayout(tab) + actions = QHBoxLayout() + self.import_library_button = QPushButton("从处方库导入") + self.import_library_button.setProperty("variant", "secondary") + self.import_library_button.clicked.connect(self._import_library) + actions.addWidget(self.import_library_button) + self.paste_button = QPushButton("导入药方文本") + self.paste_button.setProperty("variant", "secondary") + self.paste_button.clicked.connect(self._paste_herbs) + actions.addWidget(self.paste_button) + actions.addStretch(1) + layout.addLayout(actions) + self.herbs = HerbEditor(self.repository, show_formula=True) + layout.addWidget(self.herbs, 1) + return tab + + def _build_usage_tab(self) -> QWidget: + tab, form = self._scroll_form() + self.prescription_type = QComboBox() + for value in self.PRESCRIPTION_TYPES: + self.prescription_type.addItem(value, value) + self.prescription_type.currentIndexChanged.connect(self._type_changed) + form.addRow("处方类型 *", self.prescription_type) + self.dosage_amount = QDoubleSpinBox() + self.dosage_amount.setRange(0, 100000) + self.dosage_amount.setDecimals(2) + form.addRow("单次用量", self.dosage_amount) + self.dosage_unit = QComboBox() + self.dosage_unit.setEditable(True) + self.dosage_unit.addItems(["g", "ml"]) + form.addRow("用量单位", self.dosage_unit) + self.dosage_bag_count = QSpinBox() + self.dosage_bag_count.setRange(1, 99) + form.addRow("每次袋数", self.dosage_bag_count) + self.need_decoction = QCheckBox("需要代煎") + form.addRow("代煎", self.need_decoction) + self.bags_per_dose = QSpinBox() + self.bags_per_dose.setRange(1, 99) + form.addRow("每贴出包数", self.bags_per_dose) + self.dose_count = QSpinBox() + self.dose_count.setRange(1, 999) + form.addRow("剂数 *", self.dose_count) + self.dose_unit = QComboBox() + self.dose_unit.setEditable(True) + self.dose_unit.addItems(["剂", "丸", "袋", "盒", "瓶", "膏", "贴"]) + form.addRow("剂量单位", self.dose_unit) + self.times_per_day = QSpinBox() + self.times_per_day.setRange(1, 6) + form.addRow("主方每天次数", self.times_per_day) + self.usage_days = QSpinBox() + self.usage_days.setRange(1, 365) + form.addRow("主方服用天数", self.usage_days) + self.usage_instruction = QLineEdit() + self.usage_instruction.setMaxLength(200) + form.addRow("用法", self.usage_instruction) + self.usage_time = QComboBox() + self.usage_time.setEditable(True) + self.usage_time.addItems(["饭前", "饭后", "饭中", "空腹", "睡前", "晨起", "随时"]) + form.addRow("服用时间", self.usage_time) + self.usage_way = QComboBox() + self.usage_way.setEditable(True) + self.usage_way.addItems( + ["温水送服", "开水冲服", "黄酒送服", "淡盐水送服", "米汤送服", "嚼服", "含化"] + ) + form.addRow("服用方式", self.usage_way) + self.dietary_taboo = QLineEdit() + self.dietary_taboo.setPlaceholderText("多项用逗号分隔") + form.addRow("忌口", self.dietary_taboo) + self.usage_notes = QTextEdit() + self.usage_notes.setMaximumHeight(80) + form.addRow("其他说明", self.usage_notes) + aux_heading = QLabel("辅方用法") + aux_heading.setProperty("role", "sectionTitle") + form.addRow(aux_heading) + self.aux_dosage_amount = QDoubleSpinBox() + self.aux_dosage_amount.setRange(0, 100000) + self.aux_dosage_amount.setDecimals(2) + form.addRow("辅方单次用量", self.aux_dosage_amount) + self.aux_dosage_bag_count = QSpinBox() + self.aux_dosage_bag_count.setRange(1, 99) + form.addRow("辅方每次袋数", self.aux_dosage_bag_count) + self.aux_need_decoction = QCheckBox("辅方需要代煎") + form.addRow("辅方代煎", self.aux_need_decoction) + self.aux_bags_per_dose = QSpinBox() + self.aux_bags_per_dose.setRange(1, 99) + form.addRow("辅方每贴出包数", self.aux_bags_per_dose) + self.aux_times_per_day = QSpinBox() + self.aux_times_per_day.setRange(1, 6) + form.addRow("辅方每天次数", self.aux_times_per_day) + self.aux_usage_days = QSpinBox() + self.aux_usage_days.setRange(1, 365) + form.addRow("辅方服用天数", self.aux_usage_days) + self.aux_prescription_name = QLineEdit() + form.addRow("辅方模板名", self.aux_prescription_name) + return tab + + def _build_doctor_tab(self) -> QWidget: + tab = QWidget() + layout = QVBoxLayout(tab) + form = QFormLayout() + self.doctor_name = QLineEdit() + form.addRow("医生姓名 *", self.doctor_name) + layout.addLayout(form) + layout.addWidget(QLabel("医生手写签名 *")) + self.signature = SignaturePad() + layout.addWidget(self.signature) + clear = QPushButton("清空签名") + clear.clicked.connect(self.signature.clear) + layout.addWidget(clear, 0, Qt.AlignmentFlag.AlignRight) + layout.addStretch(1) + return tab + + def _load_values(self) -> None: + source = self._source + self.patient_name.setText(str(source.get("patient_name") or "")) + self.visit_no.setText(str(source.get("visit_no") or "")) + _set_combo_data(self.gender, source.get("gender", 1)) + self.age.setValue(_int(source.get("age"), 0)) + date_value = QDate.fromString( + str(source.get("prescription_date") or date.today().isoformat()), + "yyyy-MM-dd", + ) + self.date_edit.setDate(date_value if date_value.isValid() else QDate.currentDate()) + self.tongue.setText(str(source.get("tongue") or "")) + self.tongue_image.setText(str(source.get("tongue_image") or "")) + self.pulse.setText(str(source.get("pulse") or "")) + self.pulse_condition.setText(str(source.get("pulse_condition") or "")) + self.clinical_diagnosis.setPlainText(str(source.get("clinical_diagnosis") or "")) + _set_combo_data( + self.prescription_type, + source.get("prescription_type") or "浓缩水丸", + ) + self.dosage_amount.setValue(_float(source.get("dosage_amount"), 1)) + self.dosage_unit.setCurrentText( + str( + source.get("dosage_unit") + or ("ml" if self.prescription_type.currentData() == "饮片" else "g") + ) + ) + self.dosage_bag_count.setValue(max(1, _int(source.get("dosage_bag_count"), 1))) + self.need_decoction.setChecked(_bool(source.get("need_decoction"))) + self.bags_per_dose.setValue(max(1, _int(source.get("bags_per_dose"), 1))) + self.dose_count.setValue(max(1, _int(source.get("dose_count"), 7))) + self.dose_unit.setCurrentText(str(source.get("dose_unit") or "剂")) + self.times_per_day.setValue(max(1, _int(source.get("times_per_day"), 2))) + self.usage_days.setValue(max(1, _int(source.get("usage_days"), 7))) + self.usage_instruction.setText(str(source.get("usage_instruction") or "")) + self.usage_time.setCurrentText(str(source.get("usage_time") or "饭后")) + self.usage_way.setCurrentText(str(source.get("usage_way") or "温水送服")) + dietary = source.get("dietary_taboo") or "" + self.dietary_taboo.setText( + "、".join(str(item) for item in dietary) + if isinstance(dietary, (list, tuple)) + else str(dietary) + ) + self.usage_notes.setPlainText(str(source.get("usage_notes") or "")) + aux = source.get("aux_usage") + aux = dict(aux) if isinstance(aux, Mapping) else {} + self.aux_dosage_amount.setValue(_float(aux.get("dosage_amount"), 5)) + self.aux_dosage_bag_count.setValue(max(1, _int(aux.get("dosage_bag_count"), 1))) + self.aux_need_decoction.setChecked(_bool(aux.get("need_decoction"))) + self.aux_bags_per_dose.setValue(max(1, _int(aux.get("bags_per_dose"), 1))) + self.aux_times_per_day.setValue(max(1, _int(aux.get("times_per_day"), 3))) + self.aux_usage_days.setValue(max(1, _int(aux.get("usage_days"), 7))) + self.aux_prescription_name.setText(str(aux.get("prescription_name") or "")) + self.doctor_name.setText( + str( + source.get("doctor_name") + or first_value(self.current_user, "name", "real_name", default="") + ) + ) + self.signature.set_signature(source.get("doctor_signature")) + raw_herbs = source.get("herbs") or [] + locked = any(_bool(first_value(item, "locked", default=False)) for item in raw_herbs) + self.herbs.set_rows(raw_herbs, locked=locked) + if not raw_herbs: + self.herbs.add_row(formula_type="主方") + if self.mode == "edit": + self.patient_name.setReadOnly(True) + self.visit_no.setReadOnly(True) + + def _type_changed(self) -> None: + value = self.prescription_type.currentData() + if value == "饮片": + self.dosage_unit.setCurrentText("ml") + if self.dosage_amount.value() <= 0: + self.dosage_amount.setValue(50) + elif value == "浓缩水丸": + self.dosage_unit.setCurrentText("g") + if self.dosage_amount.value() <= 0: + self.dosage_amount.setValue(1) + else: + self.dosage_unit.setCurrentText("g") + + def _import_library(self) -> None: + if not self._prescribing_creator_id: + self.validation.show_message("无法确定开方医生,不能加载处方库。", "warning") + return + dialog = TemplateImportDialog( + self.repository, + self._prescribing_creator_id, + self, + ) + if dialog.exec() != QDialog.DialogCode.Accepted: + return + template = dialog.selected_template() + herbs = get_value(template, "herbs", None) or [] + formula_type = _formula(first_value(template, "formula_type", default="主方")) + imported = [] + locked = _bool(first_value(template, "disable_edit", default=False)) + for herb in herbs: + row = _mapping(herb) + row["formula_type"] = formula_type + if locked: + row["locked"] = True + else: + row.pop("locked", None) + imported.append(row) + current = self.herbs.values() + if dialog.import_mode == "replace": + current = [row for row in current if _formula(row.get("formula_type")) != formula_type] + combined = [*current, *imported] + self.herbs.set_rows(combined, locked=locked) + if formula_type == "辅方": + self.aux_prescription_name.setText( + str(first_value(template, "prescription_name", "name", default="")) + ) + + def _paste_herbs(self) -> None: + dialog = PasteHerbsDialog(self.repository, self) + if dialog.exec() != QDialog.DialogCode.Accepted: + return + current = self.herbs.values() + if dialog.import_mode == "replace": + current = [row for row in current if _formula(row.get("formula_type")) == "辅方"] + self.herbs.set_rows([*current, *dialog.resolved], locked=False) + + def payload(self) -> dict[str, Any]: + hidden_keys = ( + "id", + "diagnosis_id", + "creator_id", + "is_system_auto", + "is_shared", + "visible_role_ids", + "audit_status", + "audit_time", + "audit_by_name", + "audit_remark", + "business_prescription_audit_rejected", + "business_prescription_audit_remark", + ) + result = {key: self._source.get(key) for key in hidden_keys if key in self._source} + if self.mode == "add": + result["audit_status"] = 0 + result["creator_id"] = self._prescribing_creator_id + result.setdefault("is_shared", 0) + result.setdefault("visible_role_ids", []) + result.update( + { + "prescription_type": self.prescription_type.currentData(), + "dosage_amount": self.dosage_amount.value(), + "dosage_unit": self.dosage_unit.currentText().strip(), + "dosage_bag_count": self.dosage_bag_count.value(), + "need_decoction": int(self.need_decoction.isChecked()), + "bags_per_dose": self.bags_per_dose.value(), + "patient_name": self.patient_name.text().strip(), + "gender": self.gender.currentData(), + "age": self.age.value(), + "visit_no": self.visit_no.text().strip(), + "prescription_date": self.date_edit.date().toString("yyyy-MM-dd"), + "tongue": self.tongue.text().strip(), + "tongue_image": self.tongue_image.text().strip(), + "pulse": self.pulse.text().strip(), + "pulse_condition": self.pulse_condition.text().strip(), + "clinical_diagnosis": self.clinical_diagnosis.toPlainText().strip(), + "herbs": self.herbs.values(), + "dose_count": self.dose_count.value(), + "dose_unit": self.dose_unit.currentText().strip(), + "usage_days": self.usage_days.value(), + "times_per_day": self.times_per_day.value(), + "usage_instruction": self.usage_instruction.text().strip(), + "usage_time": self.usage_time.currentText().strip(), + "usage_way": self.usage_way.currentText().strip(), + "dietary_taboo": [ + item.strip() + for item in re.split(r"[,,、]", self.dietary_taboo.text()) + if item.strip() + ], + "usage_notes": self.usage_notes.toPlainText().strip(), + "doctor_name": self.doctor_name.text().strip(), + "doctor_signature": self.signature.data_url(), + "aux_usage": { + "dosage_amount": self.aux_dosage_amount.value(), + "dosage_bag_count": self.aux_dosage_bag_count.value(), + "need_decoction": int(self.aux_need_decoction.isChecked()), + "bags_per_dose": self.aux_bags_per_dose.value(), + "times_per_day": self.aux_times_per_day.value(), + "usage_days": self.aux_usage_days.value(), + "prescription_name": self.aux_prescription_name.text().strip(), + }, + } + ) + return result + + def accept(self) -> None: + payload = self.payload() + checks = ( + (payload["patient_name"], "请输入患者姓名。", self.patient_name, 0), + (payload["prescription_date"], "请输入处方日期。", self.date_edit, 0), + ( + payload["clinical_diagnosis"], + "请输入临床诊断。", + self.clinical_diagnosis, + 0, + ), + (payload["doctor_name"], "请输入医生姓名。", self.doctor_name, 3), + ( + payload["doctor_signature"], + "请在签名板手写医生签名。", + self.signature, + 3, + ), + ) + for value, message, widget, tab_index in checks: + if not value: + self.tabs.setCurrentIndex(tab_index) + self.validation.show_message(message, "warning") + widget.setFocus() + return + herbs = payload["herbs"] + if not herbs: + self.tabs.setCurrentIndex(1) + self.validation.show_message("请至少添加一味药材。", "warning") + return + duplicate_names = _duplicate_herb_names(herbs) + if duplicate_names: + self.tabs.setCurrentIndex(1) + self.validation.show_message("药材不可重复:" + "、".join(duplicate_names), "warning") + return + for index, herb in enumerate(herbs, 1): + if not str(herb.get("name") or "").strip(): + self.tabs.setCurrentIndex(1) + self.validation.show_message(f"第 {index} 味药材名称不能为空。", "warning") + return + if not self.herbs.rows[index - 1].medicine.has_valid_selection: + self.tabs.setCurrentIndex(1) + self.validation.show_message( + f"第 {index} 味药材必须从药材主数据中选择。", "warning" + ) + return + if _float(herb.get("dosage"), 0) <= 0: + self.tabs.setCurrentIndex(1) + self.validation.show_message(f"第 {index} 味药材剂量必须大于 0。", "warning") + return + self.validation.clear() + super().accept() + + +class PatchPatientDialog(QDialog): + """Narrow patient identity correction that preserves audit state.""" + + def __init__(self, prescription: Any, parent: QWidget | None = None) -> None: + super().__init__(parent) + self.prescription_id = _int(first_value(prescription, "id", "prescription_id")) + self.setWindowTitle("修正姓名、性别与手机号") + self.resize(460, 300) + root = QVBoxLayout(self) + form = QFormLayout() + form.addRow("处方编号", QLabel(str(self.prescription_id))) + self.patient_name = QLineEdit(str(first_value(prescription, "patient_name", default=""))) + self.patient_name.setMaxLength(50) + form.addRow("患者姓名 *", self.patient_name) + self.gender = QComboBox() + self.gender.addItem("男", 1) + self.gender.addItem("女", 0) + _set_combo_data(self.gender, first_value(prescription, "gender", default=1)) + form.addRow("性别 *", self.gender) + self.phone = QLineEdit(str(first_value(prescription, "phone", default=""))) + self.phone.setMaxLength(20) + form.addRow("手机号 *", self.phone) + root.addLayout(form) + root.addWidget(QLabel("仅更新处方笺显示信息,不改变审核状态;有关联订单时写入订单日志。")) + self.banner = MessageBanner() + root.addWidget(self.banner) + buttons = QDialogButtonBox( + QDialogButtonBox.StandardButton.Cancel | QDialogButtonBox.StandardButton.Save + ) + buttons.button(QDialogButtonBox.StandardButton.Save).setText("保存") + buttons.rejected.connect(self.reject) + buttons.accepted.connect(self.accept) + root.addWidget(buttons) + + def payload(self) -> dict[str, Any]: + return { + "id": self.prescription_id, + "patient_name": self.patient_name.text().strip(), + "gender": self.gender.currentData(), + "phone": self.phone.text().strip(), + } + + def accept(self) -> None: + payload = self.payload() + if not payload["patient_name"]: + self.banner.show_message("请输入患者姓名。", "warning") + return + if not payload["phone"]: + self.banner.show_message("请输入手机号。", "warning") + return + super().accept() + + +class AuditPrescriptionDialog(QDialog): + """Approve or reject a pending prescription with the canonical DTO.""" + + def __init__(self, prescription: Any, parent: QWidget | None = None) -> None: + super().__init__(parent) + self.prescription_id = _int(first_value(prescription, "id", "prescription_id")) + self.action = "" + self.setWindowTitle("处方审核") + self.resize(500, 300) + root = QVBoxLayout(self) + root.addWidget(QLabel("通过:处方保持有效。驳回:将同时作废处方,且必须填写审核意见。")) + self.remark = QTextEdit() + self.remark.setPlaceholderText("通过可简要说明;驳回必填") + self.remark.setMaximumHeight(120) + root.addWidget(self.remark) + self.banner = MessageBanner() + root.addWidget(self.banner) + buttons = QDialogButtonBox(QDialogButtonBox.StandardButton.Cancel) + buttons.rejected.connect(self.reject) + approve = buttons.addButton("审核通过", QDialogButtonBox.ButtonRole.AcceptRole) + approve.setProperty("variant", "primary") + approve.clicked.connect(lambda: self._choose("approve")) + reject = buttons.addButton("驳回处方", QDialogButtonBox.ButtonRole.DestructiveRole) + reject.setProperty("variant", "danger") + reject.clicked.connect(lambda: self._choose("reject")) + root.addWidget(buttons) + + def _choose(self, action: str) -> None: + if action == "reject" and not self.remark.toPlainText().strip(): + self.banner.show_message("驳回时请填写审核意见。", "warning") + return + self.action = action + super().accept() + + def payload(self) -> dict[str, Any]: + return { + "id": self.prescription_id, + "action": self.action, + "remark": self.remark.toPlainText().strip(), + } + + +def _herb_rows(value: Any) -> list[dict[str, Any]]: + herbs = get_value(value, "herbs", None) or [] + return [_mapping(item) for item in herbs] if isinstance(herbs, (list, tuple)) else [] + + +def _status_text(value: Any) -> str: + if _int(first_value(value, "void_status", "is_void"), 0) == 1: + return "已作废" + if _bool(first_value(value, "business_prescription_audit_rejected", default=False)): + return "已驳回(业务订单审核)" + status = _int(first_value(value, "audit_status", "status", default=0), 0) + return {0: "待审核", 1: "已通过", 2: "已驳回"}.get(status, display_text(status)) + + +def render_prescription_html(prescription: Any) -> str: + """Build a self-contained A4 prescription slip for preview/print/PDF.""" + + source = _mapping(prescription) + herbs = _herb_rows(prescription) + dose_count = max(1, _int(source.get("dose_count"), 1)) + main = [row for row in herbs if _formula(row.get("formula_type")) == "主方"] + aux = [row for row in herbs if _formula(row.get("formula_type")) == "辅方"] + + def esc(value: Any, default: str = "—") -> str: + text = display_text(value, default) + return html.escape(text) + + def herb_table(rows: list[dict[str, Any]], title: str) -> str: + if not rows: + return "" + body = "".join( + "" + f"{esc(row.get('name'))}" + f"{esc(row.get('dosage'))} g" + f"{esc(_float(row.get('dosage')) * dose_count)} g" + "" + for row in rows + ) + return ( + f"

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 literal 0 HcmV?d00001 diff --git a/app/artifacts/ui_acceptance/07_demo_video_980x660.png b/app/artifacts/ui_acceptance/07_demo_video_980x660.png new file mode 100644 index 0000000000000000000000000000000000000000..36d1467e50710f36a3dce8a3a99b13b0eeb488bf GIT binary patch literal 35303 zcmeFZXH=8h*Do4%D+nU65l|42jr1m6y2gTZ>C&6@-aEKAARrTNa#o)5D1z4o0sYk z$c;e=rZ_%EJ5J2xIF` zCCymvvp=s>KCZ0~{i_9at0nSY(KF7L$RTHL>dESxBsUels!v8r$`eyuf7~29RXj;c z+WF@<3KOAJXG|vT(F5tdOq)!caZiRgi`%X{E$9~FnmIXq^XiXFequa$e0ceP=~4Uu zy|KQYz+>3(e#J~y7O!K!8mlT}RN?M|@;wl=-#RkIuqx7u*$g}l+ZgaJbgdKvqjuSQAo#_NKMMI@?(Gq57#PK35VZNOfc+972U=c2FWfz6bdC5{QzvuLxzCfo}Qk4 z`)d%0NqgN){RavtZ0L7Oi*EVY!;YAzmpJ6!PxK9iJSeeRIW&|(l0ZUow_^P(?*sMS z$rCpyG17pMj;?6Py21(HIl(O~tQosu3Kp3LItVv5CeBhXT;xw;4>@+Ya0)svM>^Ek zK#Aq5=Vn^^Ki+;c(oJ$huW{PN~^>5 zlg6wUVIdSGp=JZ~@?eHgVy4W0e#zZo5^)`jtRaU$w#O@Nj}Lb!p>6L4HEwm|CXuoX z;{MH_bb4c+3Waon{;TM^TS#d`De^kwHZPuU(VL3#kiRX`Ot47g)qhRAV~Po6kf;)K z*xBFpcO*-o<)u{5e);A$bMuaQtKCqMR+Y6H^GoNepY7O4u1u-RAi|g**e9YRbMuBz#_bKt##Rg>NN)Z>e~|E>gzWH#;a}kLpYW-OmOEu(C{PN zT3o{J@>00Im!qVlq%qQ;^~H{e-O%a;LRDRT;Abz9rLUKoS9S=6MEWK+TJ~h)2(J*& zcYy76qYpuUjfr{UI9dCV4BuxfoFf;VeB9m4XNZgb{P}!g$vEQ-s3-^l{!YZ7mV+bY zZK0<4ik2ZJ@S>7_!pqu;q~4+|As<57ZA%~l>QuBl#>2m zEKa(f6<_GYxgI_Gjt{#Cq43&zZCvNh$;DOVwxpsLm9Lh=2I_St@>4_Oh;NUf{Gu1~ zlrQiPRynomGz$mvT)odMS>!(ZZ$AR7+en169WLSwS;iuwDa?A(n0hnB?IiMTD#h@= zYbE>c=@hd-law0e)KN59KdD95t0X-o?9RP^=&{rTHX!Kaz>0_{tTFiGB|wg3T=c_gDIQU_Ma!2jKf0wNtocGlYaAv@4SOF9#ePc} zhvUOw+VFGVt`WT`%bv6`Uj1s}`*)1V=+Q2}UdN}~&NfH<`WUdVxhQJUp@}le47R!j z`M_Ifm{xz6;N3Z(<<;bvQWN*%ZH+;95&a@>wbc4l^x3Tht_&Me1U#%HZKsl=sT-SP znCYm<-u)-^>C?h`GQxXYi2O~G6H%Y~jUru)rLW_HZ*`;&$KKZB2HAMkXq7c`u_bJ4 z*l9|MxZJ7JIDwv8;Z-mE7GJ7_Txz~R$=wt|m&HDTmGOd)A5U*m+YDwMd|HuBMz|Bs ze;HyN&|Yg_Y=(Lo1CJ*Qy_|4d?`r#+(V1T7WlLEb_4JJH{qQsc!>Yo7U1E{@!YJeaG_2lex$FqP<$u_PtX%3rTRZ5MTY{r^KnYEgakFeZKk1b|p5KY> zbrdEu5QTq?yK|fK!JkLlS@mII3#KiRwA@AwNj4{|@vwyYQe#ZkTaHi)#RQ%QX9u-% zt+d?QsMiO&m6i!SS_AFvHorcSDTJE+l)D%yF}$2^ypgUlQmnhTL}QR+8FhQERrcr! zb2H|0v)*GZfg<}=Ck-^bVxdFSagt+m1}KiDBqBu8sukBER}2Bj5h)SKJBkC-*<+8~JDcBLgM2VrO?NApCuUDClBAhxuiJ%2slR5KOxy zg(6$MMIo8sEMRurHi2+T)nQ>_p%<|?C^Z-(qZf*}Ws!g1@xIlkr!FO>&;8V{eAUd6HBd5yj zhm7ye<{HuvV-9WXwpLb|e-Q%Y$hE|ONHw6&zA*aE4J;V0iCR1rl$JK+OO%tt$yA(W zx{4HKjQaiL63ZJ|*}^ppHSFmJ@#t}eaHwa$Gc)l2IPXw6MPx{NlPDxGqY{% z*TW?1bF^4u{5$Y+<;eK#Cbf&Zr|;g>;qyF&wtFO40X536V(>}pp=yn8HZrB?AD!Q? z5h1qj)_ac?ga=Jz7oH_+1919)FsbU@PE5zLbC+of7e1=w5 zPDf8fYcyBXD=on}di?nDo#o4~jV2V(-2B}4<8e0d_KJnhqLCj)dA8Kd&GYiHOFb7h zD;2BcER+JeG5ys1P^mg+?r>uwnCEo?$Gj_ZNTaoP&CVUh-!ct>7azTSA)ixI zQ+-5453_8ttjo=k3C~O!d1L>Mt&F8GJKi>3%)CB;^@ySqiEDo^=7c+6&WY~Ll*9wX zVuQ^u(k$vX|Lwju9x%L~tOe7Ws<7Dm@ij*qn2yQWYml-meX*t>hNEBgOh;2sgI2m> zs!_@ggUqqwXu+X;tEE4wJ0$As?j}7k`_+)=B2eCY=zl~f(^lW7vDd_@#YH67%5QaP zqDMx|nUK{gtr1+HtSJ?k+}+r(Myv+YW!b|OW|E8Dzau%~v`Sbgh+iG@&oSga`UfZP za{C6m?27zkrHkU%*%k$zlI8hXDev*-2QPjP+U!{Rum7qH`$EEuJE=X2kS208sC{oG zpf-_SmfBg+#i?CW#U|o#uwL*xu{7htE|SlQX$&bA*1I|saJC`F6<>5jgmRifqwL2j zfEDvTSRLx`KdQjT|DwV9ZB4<^bgMHb=l;jp09>L_q{Ph77i+R!U0#=g7aCZ>6Zr+O z7YHZ(<^&wB#6|_(U+%wHPp(|#6#4z-V!Ud4dHIL78rOfvj490+uU$-KTVs^GgPP(GncI5Ejz~^uM0LqAn2tGbOTe;SqxmHFg z=e~W>B52_~sCBgjbMt~?B7bBjG#uXgMNLuybYa){Pbd|e$`gbM9UWo)I0_(=8rvy# z;{FmpG0Av!DaJhqnduS)ZgVut{OgA%`at~Ks(0n8vKNnEkOBo_^du;7j!pR^Ia7^! z>lb-hsZ%ZMrP6d?6j~Q+2@UsH8&0|GhP^A#ws{mqVK&&NCWF4In*Q|Q!VAB4=cDN_ z^l8~;7&M%^Q`?}yxm*jD(4A6!yb8-|eEytX)V{1E_7BK(9yQ0jewOxud-~?QEYY_= z{}fyg*hAd~Fm~irc9`%KK2Cq2=kB9Z8bix5Ps`w=Ph4(_`{swpadnOFj?@v^9Q}>) z-X4&z?9hZwZgi@eZ{gOYcS*50HB3*^sMB=zR=(BKPT8krHU(dL9eZ(AjjA7~EG5=o z5@*SSGaOh!F}pZKFO5F8KiuA_D=1)*447VyK%I5}Qc+=gI+^7Z4FoBn#OT$={6o*3 z{;h49SLc4w=S@?cm6ox$Sh;oX6l!jEthg}+2&r$(yB`gw+gbH6;mVhu4^CNVEH?D< zHhh|%o*uAJaKhJ23CDO3b;M_qpGyf>HP(5oRgAI5w%2*C`Cg141QU^4x+PI$8=-vV z+uQvJCk0^9hf5|?X7uwkiJ3p$<5bUm^VR;Y5M2~qi6{)^ifqtFlDSq2n)d$moFLvuESw6&g&&+luSFUetJY^?CP@*zD4%>^L@g(+@lZ*v(-UPn-t+4 z?~v05<0W2$T5Bv*>L+S$3ETZPW@CTOkSE>s-%9;V1vDsf_pBri5c*6Y$1TsL%qkA6w^@S!^9$0FaSkOZmX2OnY zBU^pY#3Zmm2l^sYl{>w2m+P{G-oR>@+mfoR!FG47af6?~NSTSL>|T+2p{ArHYjaB~ zVzQpPdOqv{vliD=WNp=E|H#;`!UshmChn&`>^cH&@@#&c&NIk;8up+T85^WNLoYgDh3XilS<0@>FWYvR|k zS)BNfEmsThK>_x?guhrnF%ayI67pbxJ;~e`nV%j`7vnQnm0l&i{Qi@{PK*(^Gni_g z@HPJhezS!;PJ~xdLV{~UGh#>eg8CkHpxenHlbg2};1o1h=;wEpFJaP$ImAXU(%v(k zSHtuC*u`t}WDk#h%*@P0 zZHj@MzWQ`e++!8f5zoDW$6!1+#)EH>@9rK71~{{evi-((+O>Ycv_>&apabfo=!L$d z2x6Rl_S^c+S|Upg>m9MbmBa2b2wqgGDkz*D)^928xNkid(quetbQfi0yD&8LPOs&*Z3!Vj{24S_xvfL_cVLn=)RVGo;U& zF?6f1udiK$Ej8inaAR(M{{8A1Ei|c>IWPZleVx?7?F_Y?-?dL=eW|NobuL;C8(+~$eJy&QpD(6LGQ{dN;CLX^W zm{<{DWro#eYZ+Ue7J@pe(X~nMn42rwD-ESHeNo-&*McxO7R<5Bv3KW>@tTn{R+y$R zyw1n>KH2L|Q}#sF48q3JD=qp#5i*w@p6RLijT&W~pZNXAVg;g^cU;hGw2)fbAUmMN``Ro6A&cVGW(yvF>B zRw>PvE^TjS)U?!yQKgjcZ`R0yg0&t-f5C;|g?A~0IXMHVK-(>*iHf?lrCnz)TIl0u z+0!|8K4v50nf3L!i_*wMzMdq3z1@Y*F($Tqee*oh1opCjqz$}|M~6i z@bIrWuNj{@PZKT**dPKJXI%iw1I`XlPEY+uF@Q6kC6m`apj7+*!OPy>e#llUkuSjZ z+0YIZ`(oG04xoD(XM3t!UcR!ki`~F&6wj}NHbR}cS@!mvxZM|a?z?Xk8OZj8&C&LZ2+AiC3<#uZK{8&v?4H_*`D}EDoPDUdBru z6=eR73RsQmEh~E>CWi3B2Q0xEg3eA)LO*^4%mXLf8bi&RYz=xfTJTkl3m4E%4NJ!UfO##q&+jx z!uBz*cuV^bt2nco6bs>b*Ct++ot;(R@!Y&$q1-yp2C1_5n|gIHuH7Q+ay-BmpQV)f z^D{rwMQwW4Qhn!i^uxg~{Rqd)dY`iow^;xS+*sEl-)hygdxz&QYny7D80j%OwwlXa zG-Y>_3osX^V}awI0`AySCt@%ueRz2?_%0D}27Vr++I^m7!zzQ{5pw`C&d<(xI#1w} z6H;E}+q3A%khJDMw4l@f+RcYDl6CvtwNzumrZeBZE$!U*6A0JBeA~uE4Jq^NY~}eM zy#<*8i^f0t8gCFWN_`oeKse}d+;dy(qJe&<7bB#5;VGe`oEw4ZVordegZC=~c`%iN z&MFaXtE1q;#)e^mio;%!-UbJ7`pKtDSQI5D>MZr7)9|Hb#w1bPzwdrY2zE5APvA^l zAY#e%I6uCPwP$z2T+}Qa0#q(yJ6NVPCJ11rP9YE@8@ecpZ1dK;o`;8*gfl1L@hfT5 zk7ZNM5b@Jihnlskvxc@jOX=%VaxCyj)n&li8^UG*PY2g(1xs{Ba1&{FmS20|PK;1byIbq^A;c9b5)0fY|B_+?|(K$P*N0^8|;i z*NGVN!N6_im=p7z-Q28~sr`LNwV)O^TT2TmvlJ=Kvcx=9D0GGXZS7i&DnK1r#@3JYE(L91a$Sfab+Nl*SdwVYqL?3s!PZwTBpL+TAF(W0Es<0!I6wx6#p@+p0a z4q8l6ovfpzF{qnIvb1JSH+h}x zF1Q^dn>E-~Z!NOyF613ZmlwiPL>^W!b9D$jL60c_%*&|)Lh;&fwhbQ2>OS7I04*4Cz;r-&JS(cTrhM_WTciU@Gp z0E_9dHbe>7g&uRWv7~2iex4)#FmXj7L&~MXH2C9UZzcb`+GoT&z|TQW9vvROJ^ej9 z!NGIAPmOqI;uOC&4C4;j=3ExC-hPBF;7}%^-KB*}eU74jl_{~Kd$1~fsXTTkMcC%N z-6}JIOSc1uQ-P1b-_@Ay#&NFbZG`O1)w{3#7296pG=Vl-=%BTwfr<81q~+yo3kBZf{U2eY?L#7* z1o_1Cl^b%ZOx}V?^Oa1$btfaU%`uDY-L3a4r)gu#>MBr30EB+9pHVqopZeg zu7|Jlv&vJj5$|JVSGn-ggO6awa@#+z2)RobRxT=sQV@|dbOk0-G)?_tVP$;<>wh0K znj_hfI&-#^8HB49ki+U~7Qd4xrlg`u9lD0OB-CRtmq4xA4*uW^advUhEi*xn_wNAb z*IcX2iQL-s^bhRH>o0WGwnH6<4CDCEpVMSE`bnD>$5fh{9MdEYjPn%YLny>poYKMH zkqJj36l!W}1u7R}(>a7&!8^kn`YtXm)ZALY-Eg!y1rXn#(BtEKJlgy1l9BD4oWMxt zCUxi#R!p~PUnpq=z!-+0#L9Xp6lP0!Nrc1H`1eNo#a~_R^}yG1#KpPg6gB`Sv7BGnrAj8jX0vx@#uT__GLO4MK74@W^w*j+HaTHV5(GdrD;2x8 z4{YXCoxg)Nk@wljxTM7EP`M6j5`N=MC+!}^5$nI;p#k-_fwrz4QG39DuSGX_VucmO zp0h)Vx1ch&rgAQ$Bfm6U9Ho#A;eH&AtjZyUHlMFI+>Z6Xah~ewYX@X^!A=K56}Y!; zTo0Txo}Qk7c3wo@l>9LSh~~i5#9Ff~5y7Z3%d}OrIz_a~%lS=!FK~yhA{-ZWzyDm- z#pJTdiY)C0okfQjHjMA1?g9;l_F!pHiDa|kEM%tcG?aFedEr$Xp`NEMDM?TEnmOb- z9OJd7VrI~w`fLX1Qaz8YD!Zxtwl&jNpKb!5oqAy$m!wunK3O-vG6{22kFls!MwGIJ zlQG<*^2UUh<&R51et7HAsmD)@h}G(B^G-`r_)<^J-?X@*uZ3P*k4*ZQdv^0?Tl^;$ zNrKO2RI2pnsEdmuJlHcR_o?Nsa-ItfjnvZo(~yirnmC~DsfXrS-Wrn$ICR!%T# zrA`A_T8eR#{wDSux~^bh;7>a|eDTqrIpp{V|5jjiJDCjaCrv1kse@uQ3@3Y1##&MucX3mfBYxW%rcfYLSP_o;HheqXQ3yPonD4~UmdIBBi)tUgXV1RM1o+n1*Cz*ZyhFNbbX53Z_Vh+(O$#~-O&&sPV`+5H^L?WVqA{)r^t>BsFh}a9+hbB+% z(+Lx&OE>^gj}N8z`t|Dz%=s#E3&c)ho;HAY` zk5VY;Ju?;$;Cqytlo;JxVkZ`OX0fwDPbuJ)qg?Jiw4aGP`QZh~Mkrpz&#|$$hs&CV ziOO#Esne-ZYrIh4Kz^Rc*11Y*Mtb*5{mYYqZV41?VkdvbQ{E5`oyrctg82c73HB`6 z#C?{kv)hUyO$?y`vO&=`gQ#N+>vQ=pndOvTeNA zC3OD7v>fY_Wu zKNNHaErO#v-WrTA=uN@_?i(#jXg;r|i&wB%We38en_lN37xmENuuGiz<=3BoT@d-d zE44?CCM5w^%_Qd1q&a*h;Orn>+-(>rbiix%L0ryA+7ATA%v0E>+&06u%%t%;HeV%G+D`>2au8H&X_le@fuYf@2~6+A#2KJ46BQ@@ zL=h>X4yT=PStfD+To5FO5?AX<9~B_U=t2lb_#o-JBdLHz+2F>vg1K=j1wztk$wF2( zA}K~p`?lD+s790HlSE@Kol^J1$+1mCKXCdv?|lNE)p3L|K5lR@th}5+ASCh|5{~Dh zl`Dxzm|uT>*pG0^1Tdwntn8ngBne!GToR|ah0a7JzZWlFM7^Fv2b_ga0IO6{S!p+1 zj9hVQOsTdlH9{#6Q&LjOc=yo)GvqK)y*8Tl;!QgR^Gh?c*?(@5E?w-}DcG(m5@0t# zNcOa1(VjhlQ7XJpqu|Shknv07iudhqu?UK$#{R~J;s8r^XQDH9zit-cI`fNQMOwhF@PyR*pX_?!gSMtkf=;`VfmL!i zajVoTLA%VoMwCu%PDcC*-9Ib41RR4-%+Vdt+rg@;rcly?y!_kDrG}^k<(*y?5sr}i z+iI8j%Bi@|;eZv_#RM@sIXMM4Ixp@gTSec4YL;jpfM_niQN!qlq?Zg~d9Jy+d9X@Y zjwlQ-TCA#|RHR*9L@~QM1PgLJ*+bw1*TzdGh)}X`B_$ju>Na5TkF0EL!^K)|&22N( z9XcRLn;EdX5)oTq*_DL*{(PB9Uo@Idpkp^yEFreS>b@s{Wr7SHz|r!Rnp^wy^fd5r z#fky9TIP5mffb%F7ZB)7;57ygGcz+bCtI+#&*qJehgaM+*i=1TJyjGHv9?uuC2Y(B zGwaEFz}Sk5Pc`BMQc+)M`p)f9uQ<9XAoJVl7XmEBJFSL{jdi<`{{6A3`W$z_%;2#oU}GzdhR4v;U3`y3%p=%N6XM*Hkp zestSlSYPVS9Lbe8XKr2*vbyCzD$BK6N?~?72%>%Du(yQ%?h>jTGB7lEmL%yqD&t!RhXKOcb#OlSRV&}d% z*!V{paEIfb5m$ozp;B}g8->;B$W>}kuIWWP>CURFjI?pSoF$f8dG{6sQpVgQ2Fe~$ z{vUkg2`7H-d~fST>nB&8o|B`Vr^!JrD2`+T{nliStn5pmWDE))iv(i$}uVsTPAy*!>j|p+L8CKO5bwC0Y^7;Z2QB( zyLW9pT>Z_U_V#+}3Z+J3w7(DoxY7@pOoOa93U3DUZCqElK&79sN;hX`R}X<@cLA@> zd^=a}dM=O@^*H>UiTgYQb9>)|t7bnLNKYQr?Gqugi*XePzYsdi##ZDAKjd3(Q2L0BoXN@b z2@XkPIb~TQwGfWd+nAkEx!Qqe=))(cf2-$JXh`ZIbnQMmfnn(IJUJa^;I6q1s*W~a zNP1mF5|Ji%eR9y-2vy8OrK`UEnpA&OJU|D^P2A*fN8BVm%VT4u-ycq9o3NF}-#oui z|Mt!2*PoyqPM#yc$~iWHiK!m1R5|u^cKybEZ+uV~Rs}kT%u}We3L_O}rgLi)?1pdS zOK(bnkWk6MJx~@?@R{~!j%W#W12Ho|mRV`Tjpi8TK3i>&;fROhzEC$IpoL|_#dF~8 zGsfJJm3W`W{+;u#IbXNQKw8&GLceufdx?PRG)xR6HbEY-|L^kOil3M&IBFEdk;D(Q zOm*Y>`*H1Rg_<2DJ4KxKZwjz0)pb=>gZskD0GqS1b`Mj77T++#!<EoZZc6JXf~|>(++98fVzc$V zf_08bM#=j)X8vLvYg?^0^VOEtm#7KfCiB~VIFn6RPX8!y-r$Z%AlM;Om z^3#r$JoL(EP!;!HU+3?JzeHGD#-_T5wLp{aG(fGxFJEl@Egweb<>g8|l^CtNO1`w~ zP@I`)?>9MJXMO}ol$Wz>l?OF=KOA>8hQdKA^iGmdfzA)j|BO3j_w8{)=fdmY#$l~T z@F#S4Tzwc%kAT=s4^cXTYLEzkf&V}B;BYYfd0C(J3!_(W>)`F3wD3EjL_dMsSmuoC zQt~8oT;33=V6jJogl1`SRntW+n6`dloZ4-r;ikFDpG4H zE8fp@ixPSd03n-5OE;^_q@l0+2*B(t>{R&bc8DO2>Q^4VDgvVY!JQaC zyuUY@>G*n*2jtKNS}!-9kXA?(gZd+-2A$|a7phj(`;u9Pt)2i959ZpSNWEoiFMr}1 z36n@S$r=YHLHFelmpP#{^&k^;;!jn=}x)Z1T>m)}8FqhN9u7R$oMrp=egspW}RN#ba6 zxH7&(U<|`QTylV~m`U3IC9!~OSKFA-;^W87sYd{{p$|M;hq!gpC44%nSg`{5gz*|D zY_X4!pWhkt3ykoAztvNd)4>%9!_#GWt5UMCF0rYV6NtI|ewt(%r^&ZXxHgbU!N3byp-2W_;-%Szihj#ndR(ex|3JMAe4`nUW zD4>O!2b&WUQ@<{HyMv6Ldi9tH+*AntL@nX9VP@3*Wby1Y9=5mCjj+cGuRj)G7J!+u zM~`PMT_r&GviR#KE3uK@zHKvBXW{O?--Ed<1s?fM(UQZ<`mNEgEFi~>xj7kY)srS; zE<-??qm_TDD0PnAk^D~sTcCkh^}n7gipOZ%27apb)NO zpJ*Mn5!GwFI;!bXKCAQca&km4Eg-az+mz@M`2xkvqt1pq^yX&fV&{ivk)l@~_T$dR z_K)4V!`&Mck{XNQg@n+5X|!-1H;EV47Nrh$|A?>rb;5fBF2og0YYnB z9x+W~vH5z^_ds1i3+BD1m+&HUC+LUs&a`5y>cqdQjX7kSjOU@}ViUJ$Q`dda@&C0v z?*EcaPd+(e&J>1>h18tR|t_Pyk zW)Sv<0APQJUntow!REJ4qPC2FVuwS2CQOogw@e}nMg)2v0n{`#U$V^`5)OD)q2`$6 z?&88Fr(bmrG%Gv;?X(63lPu=%4RvB}E?G0hh5BFF-=9Vs@4m-4%?~}%r~QusH#;7- z@i=nC9g>oixs@S2cw@f!UE{YB8{sbKd9d&MUv_?ZX_5&SE$@BbIQOM@B$)o!YR}*sb5e5_5moPkTficS5lp>*dJ65Q!p+2Cle#bW$z-_ua zHKljqz#|Xbt)WoIrRnMA+~M4OLs`FMF`g>}&cF51DK@PCh{}wSOH09uT#TrCTy5jW z+rs(XhNpVB#0ykMR@_$r%2d|V>q@s?+ye&Sl6}|rm$2#)$jEi*MkkFCezXeZQ0qY^-8p1p%k2K zAQh>d^Y+e;7)#SH;HP^1@?}U^>+fd3%=GbpKpwFGsyI(An9TFT+8Jc(0h6PK)T0K$ z^Yv&ikEVUkT_M{kJO8Clp~tr%h3)Sv ze6tSx_BRdDP@mL$&WBxNtfVySmtIW2)F6+RfL@E~<+%6hqjJjrDi-D)L7_kL7w`vF zSQE0PCB0S;{ykqO5Fnwuu@VQXcOMEqe!|f=94f{7mz3G>I8HEtD>xi8qRZ;f4M?R? z`EByd>+(Cd;iJTmhTrGs=f6KQ9nG{dA?q==L19D4`g$>^F~P@==O>dZ<>lpT_=q68 zd{$l~waaIq3h2l6t3uu?4mN^_4dl?yt}U@^S9$B~9EQM)(zTqpE#0{lT+(^%Lqj+q zK|XrSL6;9?dmP8=;?pe`q0k%30*7sHhwa??UFqwQuA7jTj-WE%Z_J zeEO9|N@Eo@eDf`Focf+CtMO!XB2{1p+rHVra2G4(sgs?XZU1C`0kS9T4Ldu_5Qv~k zT_IYlC9thRf82z0EuY-_Al2HhCT%hN`KYb|C^93hf>Oi$u9TVOAAn;(w)L3(Z+sZ4 z_4DpZzf>$4uXZpD_ZTcPJZtrltw;Ke)=@yb0{{a5DFK#ek=H0`>z0od+#cz=N5j9r zw+FZc*v3bo3F_mMlZ(3drq4`pryss({c-Ciq3(Sa91brbz4l?`8dxl&_|*E=uFORm zo@MhjsH$o4AO+iiu13`0VJY4Ia6bWR?BKmQxM)HQ#h2=RUu;so*b z;fh~9vxzmXbiwIz>X%L)VcB4sTvvMc7d!_W}&9AD; zgH>A}td1;!#pr>#9}`$14Z=Xs8$Lq`gq+r>Y7gof0pH0{@V_fcvdel^_9R~6pgVWV z(7?dnFx;UQKs%uozgs~!eky{={v=%+K%HH-D<#I!^uDo9tC@0)e3<0ey(* z5?C3E{PX}gWFgzxSJN}QMRwAJYs3v}jb@;NFTk$-TS@4u(lw9OA&XM-N-;XIVncW- zu#g|l0oH(s=e^}vUh6jLi(w`SZ2}hc8T$G0tq*Coqq*&Nmk&;8sqfz#Epsu~*SQ8c zxpgIwFWF)bRz({iNwG#`lv<3#MB+EjR92C#&mVA zSfqWAYCLZH==92Tp@<>k*;O9bATi`|#GGnq=*c9yV`%wD@&qDTXDyy*s8BmSE$w(I zsGufY#=>Yr4-r^0%UWz~JlvtfVchVtts172+rR;tm%Ex8nxYD)it+w~XaL7#`+g-8)y z73YAYF(aJORmtA&VUbbg$E#&(_yU%x_c_AruE^Z;Yd`mZs6LVenFy98df<~mKXhR< zRDn019bQc`{d;y}hEc}V`|aJst9w%bZ^RS;ru#?|yZlB1DFw#QaM~Y#=D=pa4 zuwn?6D1niI$qLCT!`kBNaS1XOd33FjEx*Q2Ow|V}m8U-Ym>}!+f1)ux89l3YB9ZaS z+HgXrX4(xcyTNw|O9wuYyAb#_AX4w;*#(GcF1&PYkOnzp9v+n7+=}OmM}< z&wFuy;u&N+=t{xplH4Jw08=0*CxcWpmQg|4)SsD{Y>I5oEhc0St=^GH$HkNar^ZKj zRL?G?Ivtg&=YY)n0JEzzD!|g;c^$kGMD{uuXEI2C=K-CUjwI)Na_{NV?6k=gefy&) zPqqgmVv)YLA#IqerOY!(f4Ws*6u_e+vQqaNAEi2E+pRyY1v|9p6zz4e+8yqO-DPYm zb9rBXH>xwCQX!q6>&eqLwvn43{Qth1N8X2@kJ?MCFFRN}=Xpckw#{?uDIZ$dc$}6L zs7Tib>=jZC^K8C)bJ7QSga-=hS%Lwp|AcGnn9zfobI<*@0!7-qyaFq?;nF>;ISq}B zsle^k_@pj2);I|K$Mt8TS3_iFXFu2@ulV?0c^utID`c;vJd!~|e(67Erd-E|tqh^y zCf^j}t$q45g=Wz65K5eGgdr@?OmZHI52{NGL)xPMZKOIjR+x6&eb!rBda~8gfT_+G zsR9r39BJP!+e0|rW(HNMuU}W9htYD|>b(ovFVjwJ*F`EBWT#LTGm<$%)2ggpu2PUv|)?0Gv>@ z=Y;(ySV2oHH}`Po2X&P8+3RGvnKL8kc^wOpTY)X)XD85l&l1$t1(V-2*WEQho*Tcc zwHfQ3`h^`EYk<9K>7f4f$2&$Tzt%&Cf=epsLuBAaUp04r)B#jM{D&spR8FFxh;M-I zWz$UqLuD9deT+IaF0E5+CvN_|JU(S-7H_e_Er%Rp7Y- z1lZB%yq0WDB_vcCS2xy>=dr*ACEhEea`3HFVzbjn7TJh!@;VITCtTqKEBS38G?#z< zJ6=~LmDkcqCGFOvC|nfw_W9X<@jpgAJ=l78gpRZiDc0m(C1Ko`MPj^4ZxmZ;)UFN< zuWDsaQ9qUxu}hXKv6u0gU5>It`Y@@sZ(Qx@)jC$hrKLrt*V?SCU~33AMhBiQg){~{ z%84#bjq0H!QP$YTsCv0~*jyQA!GKgppYmc;fDigC~`+fDxE)#2$KyTsQyF6&Nf znP=rncJl4rS4}hg+cX7Jre9PqzVgh`Kh5W$dzX4%Pimhb1?3_)^7cN(_d^8XK#MMKI2V ze)qazw`h4C1zct_FVjyij@4kemy51jS=WBrefU@FkdyZ2C0s@lD~`yvkAeNBIRJM! ztt*dv^3v76CX}Yuc|`g|s%Lp)RHU&LIFmm5JNXO3k!o`{=ukFeZMnRuJ-AO*0}Ssu z{~BSWgEZXwSG}ZCQX&U;Qx~|Oj*lhl_zgOl=#`~yG=F0=6!Y&^=v3{)7@{mG`T4OG z!`YZgSEOljMSSo-Jf15=yvF|Qn_1M3kL)Oshkd|j`t0ibyb1|hQtz~tJforJN=e}U z;}7lIB%-`_142xmf~Iq)++I0du%5ejFX%)>;d&okyRiXF!TMDR?e7zU zwzu4t|6k_)DJr5HHA1Akr2y_dHFoQ#h{;G!L{OM5G+yYdURojZysTe%9mK+G?Ra_y zRx>|sSzM5caT_c#k!>I zeng$TiJOzj?(9ozbCC9K#cx{06h`r$fqyfgsl$AIt>rFMlP;oY>^_I z$c*bdw%yY%ij*ZK^JZ5nt5o4KL*ek$v+$Y?Uc?}ew!d?yHeB6DTjgQA8I<~e+JJPB z=e}Sxhg!v`{Tv!{Rb0hN;|UoV3nWDE9DU%H8>g&_7S?h(enl|-*wS9-XOW-c^|VUO z^c)RpCW|+vhdd9jn*6e~ICuTS$Q5d@pbBIGcRxiF=@9g78s!aF9Q)b91TPfoav_wbI#VpienDP8EnIdEWe^n2yg>o}=D zS*_m4Z4epPAZ{0lKqy1 zybObbX+p5MocF|^00CWLnXHku+?Del_hL^K>T-X}u{;Tor@d_;@KwMRj~82;RI zm}+?S4=gv|N__pXpN(p?kbLK?P%_eXjfRtv5;E`gFYdC_fu~8ki6Y?H0b_k>GcPwf zKOQG~0#3E216S}@`=17mMUjT5Z9_3P4>MmDd&kK(-(si9VpCTt2;Hpn#|M9f#rYM& zC*?nMINZc$6SRu1eUMUQi{&-0FS?>%wBMEtP_B6se(A~YDSq1Zij_H!CX)hcBz*-b zfsX4xe+AGMzn)YOb2|X1S1?7q+G?pMe47|R7{tpEx%IJX09OAC*AA>52<0nXA=J)& zPL2Iu|9C1$4D}Tr{}6mezCML&1;Cd2a(&#*`tsVpp!YUdV56@6b`4=0I(;2ezZ79I z%niuTNTC0JMn-)4r1vyB`JlPUcKAu`{Cne*(2e<90OQL&&-Rk#jZ4qH7>{_ zrYouHR8&=E5Q4Y=6|qC27&(rMg)H>B4W|Uo{2fkOphjxzQ5nT zR9MJa!}kYdSL|wSijHf;GRcpZaVTrBCHk9Fk%Z#Q58&m$ACU$hdG}mXQxn6;)R1t2 zr<|b-s6VRnJ1YHeW>(As?u0w_k{eYp!QLRKS*&Qfw7mUE+57n3n@_4`3L=ng zx+nMVgpo7W`7S7wNO*vxX9vR`QbmxTChgyxLJhm($#y`rn#ZO@_)ZDjqR?L8#Q21& zKXTvN4@A>n4+Mb)$1RUV5Z{bZyyCQz-;$DQJ@#mnQ}UrLpA_;2h8Lv5*p!8wHhb}3 zGAWptoYwRpkN7JTdc}Z%xPqIf$6JGi8$pf-2i*5Gg-3@M-mhdD`k{~4D=*Ft1qT0s zQ~(#mhjV65PMf7K4B!qHw_$!U$WANi^icr*<59I7+V0HExVZOM?W$HP9QUlr24DYa zH`hnFAxF;OI9lrhM>7GJhuNBIGl(G2^cvS%jeyMgtAR{k-UOq_%^6wq+8ixk+rq33 z!$&GrGk2*wCUQSlTJ`W{$X@M%w%G8x3<g9ODES5XoNWws*AFWvgFkt zEY{){Q}^x)PGSiozpMt18y30yrq?0--T&)>H8J-^Z3eARdHLUK`PI6EM5QQhfg82U z(iFa1sN4VC)YRnpZbtj6T>3Ec$Gf*LZ}MDl4L=XVb$9n{f-C&3H4Y@9f7N)}uZcSR3GTzi_jO!K@O5|fc20n69XP}K z!*yH$xOtV32>FTmLkOHvr`)$3zz1g6@_YDGR0*{{cfNKp27|%r!;cP!*A8$vkoGb= zYZlyS!oeqckA8P=FE+M^JzWxPQk*-%-%*9{Z+eJSWU>>a)>J&bCv80q{9gDSX?Yn# zAdJ5@7OtX-$^Qv1{y%(tuL|7@^505FC{hRR6V7CNE^72nZ-DkeE7MLA9?N~XYI96W z-Q2qO85xHwt&Tz?19`W8gl})3;Dc!OVcP9Ys^R zkCq#6xKx{SmwFzJmhXW8jAoWXVai$e$i_r9Y#!;~fLd!F+8jk+Y@7aKliqC$yF9~x z%cSi&o!wJlybIxokTkgd6EEd_c>xV)TI%sgyt>NY+LO+ex7s~o9I$twGqqqGAaoYI z0=^Z6By@Htv0(M!G)^&*%O@d+h}=N8)^VsqowZxPx@OEF-o7$mq9&FxU_W^&Q&m~H z2xVYGGqK1T7i4EHl7e`790*&4-z32dN zeFOF$4uP;~3s< zl0edDC~;W#jKu2SXPb5tbq5aSTNQdd6QYhFzl>vSG3M_ZhU68MZgub=nFm^|b%*|V!2^Uo+rf=SC%WYw{0uTCIGv6UhUx;Tu zfJ}2;?RCZJ!J2Ba)JeNlMt4UC!E7;6BO@rVAC7r%VIlW2gkK-&I(2#wh(=GtoPIAFl22>M8keH{Om`c74hhUnX5f458t7Hzt(*j;4-l96~8>hK3%= zY(Hy%;mF|93DYPDd=hY4lP*cybGZ{rYb+74SbV0H)Bo09n9cYN-=4dUbxL<4x z*|9<>?Ttu)-52Vt_^(S)DiByja%J6SIO&uv*IljLbfdj3Elt#D-!jpnH!G|Pg^RiI^l2Y>8E9%d>8J&#aJEE|#umIfq^c<*AAB~U z#uj<#o8Q-YF72>6ys^PlV-A;OPK--t^U1*8p+Cd-Y>eheGO9RFZ<+!&|HS~1f9We3l6u}{d8RURQ%+H2%Sn@lNxnkn(Jfz6tKU9cCY;KeRsUmrc!#*ts~|J=6ttj9)DhIz1XV7cpkPkTidqe`}4bnZoblaPx3*8#i`n$ zuUC7-ug7!*+`QB5K7)i~gsr%RW{2y8yISyroq4Z}t$x;~#q|(9Ug(jPT|Xs9X06%D z;p(7i;Gn|~QyZ)2%^{<61BDT-ZI3Tqa`*$5Y@YD|@|?i)U*91l70rW&+(tXx5@bbtQb{dpJyHP%G# z+CF9re)V?IHu86hnzYxf`L~Vq)cYU_KZBK+fns)-)uyas(%7p(kK*9{!@6J5wH1D{j;3I}3JNE9;}l zN*BGM_%>E1rtGXN(P+Si9l7D)CGE={)EEdkeyf#eA`$leBdLG!wxLA7vG@UOOw**! zTu6AXAwZE$$^EBC6MC-N<#s}!FTZd&2$s;8#lJ2t!cPxRyiX4`p$8@qW0iM6#mK`Z z#|4}w+Vgd=N33N;zJD$m-TE`|Le~f=Oa#82N+9fFke9!b->dCB30FDj4v37r=8|3) zfYpl@JC)|>wICBucZ(kjI@^NBzReasLTKKXz)Va4Vq?->*|6p&v_+W-VQU^gG}?&> z+Lj~4+*!~CqO(72#M0H$pXPAuh;2AnJ?fm2*>+5ALY8B)G>sU!kAy^@LZ+xVKJ-uG z%r0F*#R9yTwc+0?Xlj);S@bA8D1KY{)$bNRERW)ek+btV$Z8KDU2o=2vQSDpkH45h z;L(2Mv`i14uW6F@oc;}$LDN(1eGA2B z$hvHI7)-6z1YvHgEGPz6Z?5J4&Rp*K z`W05wID8HHLQ+BgB*xS_(h8zKztuQ%?V4ZbiJY=1US+>;7S>T^!3#CwU72re-yege z+3?|vA_qnJUY%`}!@ho<5wej!k8+VvJ|7tvz>?9gU`B9EmN1L_jy0;V;X?zESn{wb zZFTUEWmp5px0+mO(C_M$%PZUM5o_`I&iw5Vm)+NYAsRi}Jq|14<*!_l`LjDqUoP30 znv$5pgp!0cPI2TkfwIYEK2Gl}d-yC{?mi=U;r|^n>WYE&m zH~!i-1=4&=cnCpL-MNxDNpo);6A+k1VheNLr#3v=#^6s4WuQMkev4uh60$RW($wAk zH$aK?X3;lj<6w0a6-7(?Ng}GS*%y*`<7vo0#V$1m*KPfCY3K!f_Dh>2AtjD?I=*tY z+C`#d;x`sM|JC7ay=MMm@8{=VFNui{7^t3x9WZ|Gl}ZTsMG}6 zY^-UUURQnG`RMV2XpL19G=P-EaF6}_FvLu-N}HZv_Q!3OPCMp`)Uv4#LkKEJa_tdYi6g^Xx(7 z1(BIdbeV59tXR2v8K3ml8JdKG_jhYBgFZ~#s z$fj>;w&nlu3Jv>Y<6}~DYXGy9%R*@|Y$rTq#!ZjB`|XKnyD9lwluqHpHTp&5=j+{TS@sK$Zg04=+ZT>do=3)1PSqmu)I z#Rbz6Wl}yo`okv+fMp@V%c{PYm6*Cmm~Rw0eKMja0~WQqEqXgO1FC2-0Z!reRhINb zmEyahWJL|9vE0%1q3PQBqKFm8#I!M9Q@sJe=I8w5)Ks)B4u|R)=G$0&=*d%Z9A*XLiKySriKV{AWR z%F3dsWp7FjT6Tr$$lqNOyt*fskDIoCMyyS)?eutchK`)IC_78$bbVav?pERG9bDnH zv{BY{8LzNyLMv+Xq-j<@L-@PQrj{`r4z0aW;}tp&cu&&O8U6H0De5%*;G{ZIp-$o3 zw{NV7fTVZv4Q4{5z->kUr6SF;eIk)aI2aupt9?d|9m}Ihrp)5v7m%yM7yTuWVQxT~ zfE0)x-}LYNVe=`Fe-t%_dU+zK*@&AK5tNuGET_|(HtFaDHX>bx@s_jCpC_yfx1H~Z zaTIfy*FeL|X;Y*=(^K`WnM%L_g-JdLKiBZ|06A_;|DD2#*fs zIC*=cTMIAc{d1|TQ%EcqY<$2IpsE>4h%=ZFtOrP#3JdVvd+5FkI`;CF%dHf+@su8l zw{JBYs|^IC0Gpg{0UN@6lYt}pVO>xm&ZRw;<~mUOcNAhn<|-|+y5DwBCseAu1B0j# zD||ymVfS~>bEa&Sce~%;9csAt7!P5>3KU z$39@@d6_po0``Kaop!`gIuR`&xP9+ArvatdSz}7v5$|SOTWlgTM>J*f2lu(pEltTl zbK3Msv8*(2x3{E4w&gvEt^xP+oAa65m#G015i-_sL*<@wi2KwW0d$FZqi4XpRgh~y zR;1(M(F`4Hu$HIi&acY}7q%79D9tkF5S*~uExKCkj-g>K6x1;8@l{%2wB(?bX??<} znjLbq&H9`Z=*kMm_v2m_bf!{=l7+N8qsjtkLFrs=%4HnZX4fhGLnZ5ckxxl5 zCPFm&?gRhv#zcz+e%Mo$vzbH-&HQdc7Er8Z@I(z-eacR0aUY!goio7*3tnRv)SR&) z4D2Ua$+IhcGRwXoUku-hQQ4>7MXcO}d9Sz<49U)2)cU{4McYKEx@u4p^ zHjxDhHN_q;Lpo~w&tqwrWjtEF(Yico8kEZyXDheOtEM*<djizWt`B30nDbLJHO4*d*>@78#FQh2x;j z*lzBWq3*1%(J(974`glwts0+@kU3$%xBS3sSUo;IKEkR_olF z?$D{ciw^X#q_gZ_2qk93ogFSF?+kF_@4{^ft*OK20vh}p0`MWle;7b0+&|hwBSM=N z9c7pjA>?QE*dKW{s~eWeo{}zTNg)LVQ5jRpVx!7x#$23nhJg!g_9`ulCCo%SchscQ zwg)8IcE8uzsU?L52Lm1BZMEbe++vT^44~#vU850()2m_Er2JQf@1&+uA5c%bYU_D_ zuhZuY3k%O_bY^3@!*bg~@FZ-%LaYhb=0BVL{7zcxZ91;?_0@~|W1{8}hOpS>2*1W5 zWRkEL$S`P8X>hbTABt^cB@rzz96{RE6JYrhM$7x3@3$UpHQG=7>Q=tv)T&G_`ncr! zJmjCExtkqtap{JjImoyWK1KG_+H&RkMH9u7D{0dzKli|V76gvwU&!fG)KdTN$bZucR?oD!X z@{P}-cs4k0S~h%tdY!<6@WRj1Oj zxY#%HhPGE|?E{N00@C0+F-zI@TF8G1HGnf%TfUDdbgASmeff}bkp zGZ==z_0qs?8UPYYAL)mZrEbZdZyr5jObEs{=0n$LZWp}r$MuhT%r(i^1z}Qpd!!*C zcPx!)#QV$T2gdav=X!bBNgD`u80>2gXE);THyiz}yxg?3wEP-_O3m=S8!Atb6(A^V zV%Z~^rCod36CzQraG>-cq?Q`Zc{GCfLCX>_oJo^Q@i&F*bahK$U)4Kiec(nMc7EO# z9`^RJiYpQtAhw}0;Ay1^zjy1_LcQOBM7gflynnEq0v5Oo8Epd)1`ayWy1pM*F7y{+@VV{ZMD47@*+=KS7MB&5hArGk zlEU1`jGpmkW@gBsBfKTEl9I!dNzr$7-*_irgd&dS=zvJ1-t7cSGgw+OfR~&d@4~Q- zxP*9jcaPh2_40+Pez4SMH^~IAi$znvg#?QR^X=Ch6sDpU*#((9>^B~`j%)+t1nADw zfoaR#a|J|?r+9WI`9cl<*STvS5?$|Lv47GT&M@IB6{U84u{|7>5)}t}H7@CHWd@M2`Lv~e;Z%k{Er z{1LRgEHi)A5!-wVOo6IbZ`>h`HM;j?P0AzM;es=NMq7(oQ{B5=U{ik9rT`iJaxi%f zxT(s9?u5aoT1}3k<~j=LtQTGaAgah)ARukP)|(hD!_lOsNE+|)hvWe zQ1rgmo;$$H=luL!i@+;%KaB8|VUct=*Afs~(`;786%!l7vontmF|IV2b#EN6tINx? zET3XB6m&c|O{9pWrJ|vM&xwj^?;RZEp6q>)W}WkR-dX>sBv$3!_->tuVry)4tcPV& zvC)2@sQmNebA=c~OQ2m>|FwKd!}5ysD(lReH`+|ntC-K{TUlYJjVJC|*Z<-IB<4^I zlZ*t(vRU@^W^L^R5Jab|cmevp&C4R=_D3nr$mYl={ceAIwjTBra{NQF)x#XovA;;+ z-2=+JGWosdR~MBRvYNJ@K#)1w3?5q_Gg5*%_*-<&LsZ@Y~=XJbRDs}Z2BV%6Haax9P`~g ze$SO?&aZLt*G1B;gRG8-jzMgyzx5nNC^4&TrpEEv2e+r%`VqyQorRIFBXx9=G%FWi zeof%tCaRA1i505{Si6;9mIR8&Z_`sHU;Hjw>pZV_Sqve+zJxN!1X8pNSu26)hdx`c zF0&`x_*_)P5OJQt>*O=6~7U+SV{MVI;(P8?Uh{e(Lrr07Xt(R=(%en z%P`|KROF(7j^ zIB2_U%Ur`F$cfwMaD|ULjt>5)pRH~u5ebtxm^dKvK{9LAwY2?^OvEKn{92q3YAsMj zR!p=$o)^Z+a5uQwk^C+PKCyoS%iPOF)r_g@1_{g8%ikN+7=+{cK>+hdGLgUcK;6uS z?Zug`AR}=f?gp+oT*)BkX|?)`85>k>%DC(KPNxevsH=bfn9>vEG4I2*r>B!x@yT3_ zA@92@T-fT2^joZnVRa2rD{$pfx6Ettf399#TVFTPv&BOdq4w)I+#LPtgmdy`g8@Wr0}R+eL^uHFiMdif$l3Z}H~gFP zNkc;|E0YSOOYK&aTYix1(As~`1s(-%&z4w6oiaj#7l+``TN)fOadEX;7PoIP8lXwO z4_O^yeHi5>kWU0~Cm6YjtPT48;$_WTJ=}G`TC;r`?vxC`yzEw^qi~L>)mbh?r>8&h z<%%n!ky)rVKUIfKzF-`x?dfUl7!u-aW;QH+Ef?kG+YTncEr7^YSFd+C0KGtSdd_AU z(G@Llv3v2PJ-H(Q(a17WEr>J+tq!h7+(z5+iO|x}8S*_DbeU_Io__uMH2~%X4+HOW zNtS})?^4MSV8E|o6%wdi7u4CaaYKcVo=SrwPp2H|`W)`wXGKgD6cCtn9ll$V3iK}# zq!W}uOo*3Pjmb(GibX5TNf7>Kg_U?l=y}Vf0U#W@W1|+y%$Q(opsA#!R3^g9r+c{& zmiz6+&-QR9qLO0!p*4WCuzB~y94USQzVvhhAN`3vPBm_g*+x53q=Kn!#J7F!;n>9x zE!#)mvJE5W&(MzWlhYH;R8W>)U_nzfGl4>2IwOM>r*daeb49aw1~oNxq*Wc?L$1=t zSvtd+LN)V6pw(1=y@?9UwJI|KN~burST`WQvGXJz9LR?pfB#W4Kkx56uh7wAULuw| z3R+fZ*8I_*Jpm&Lq(5TQBBBL#xdKkL@_=}sra zCTivyrE^E%xL)pjMZCA%Otl%@v9BsM5#?q^R@sj+kcn)Wj4z8k+(emjTuU@D)!Riy zAX9-{P#|V%V|!(>NWZ5r;!|NkjtN3%yVMU0eEn}T-rU6EBf-8nv^aRM=E`ECGn|>- z1|x`)1vv>;bt5;)#gG8v433(LD(F0z$)WuU0pxM);N~B$OaVSezK)ZR{@y;fmc0M= zLWg18+qN@7U>b6tQy6AVL8`M*a}Jnm%UdwkGF@FiBY0F56?r4s1?2*_r)z?eR}b#| z$X9|0l4IR8H8!P+YDXRYY+m1Guqvsj_)ah={OkM{ksa7k0IwKu0>UN=)t=pCQqB*1 zlsn3H<8Bc!5mmX#Vk$4gE2D5p4Gpb(!I-gakD;Rq{Q#y!>oqA44!$|EzWhKT{yT*#{dj zc6A{Ep<61`m8RvkY5gFUcbD7;cEOWVlar!l4y8`3*tHgu@zax&BerqT2M@ggBDQj4 z07%DmaYzd4Utz?L4?X@%!@%Cb{=D@?O3(7|h4$h4o`LA8*wx*l7i~A004xpsGqFef3IS&j_@fFI8_e_d-gUoyYdmby=$`*E zHE-d5v4g8-6@mq*P!vf=fe-Ip1<<9&ZBxF2T)Dz)g&?$`fG#gAJUk8^GF(h?Rm&^- z?@Me9`husHzl`xjn?F@)PgQ`k(O)C%eDr-R+gsbO9-arI-=@j~n|SDI%I@gb+n1V| zSV0;ybE3)BzxAwbfuU2BGnnGF0$`|lOZejTDK33XGg@Q?8SG1*jDU*;tQC0v@5ldb zg8w@T{_jNi|1lP@QDOpfwG9MnJO6~HC5(mvKdW@^)wz}no-JvFLEm+`KLN{3Q^SSS z6zv7kPW^NOM8#b+S_b^vGm&b?jh{XM{@LmLAO77%KD~;qbT+sY;HSeTN~dtp|8>=J zR5ndN&TD{TdH$nK#T4#;-wr|)XQa1|ln2kDQx1FBsRx;|jx+=p1C^hCEvN6I-g5aU zOuADbKmYf^3DQY$DgU46wCNidlTnr*;M5N03CoSYPMfQZ>l^wLRTuR9Lqv0tt|CWW zZ@rek$y=^lY98$G9T~a(&qd$p;4{*4b}DBS7(0Y{{Pe9mY+k%BX9ni^m#VUC^#1d) z?m%w6(Y|7(5bQM6U40KR%6ymY*EebKey?4ZS#G?5nNxrDQ~dcQ&WpM*U@z7C;p39~ z3iCqX`~UJ{USF!Q&JEv7b;>n%RS3_px78__c=0YCV!Zmk=Ena}6i+T+{^>E(0MlUe zdcMqRBn4?;h_8^VkNx}-HetlQ{l~bc;LB9#Mq7Kl-+>}xu6Oi60^`~L`DJI(zwL#| zJv(*t?#BL%;MbN;UHs+9OaH}`e%H~EU}Q9&cwXhcPSTb0YPaz&QtBErvVXvos1r8@ z3cenJ$qV;^JHn;rE2)~5>FMCF8&vt$<;YMbz}g33h1@ z0O|5F1AZ<#8{8jnB%{{YT=j)W0w1%3Fa%of=X{45>b7`c~ zo9F-7@LzYdci^#U$PpF~icP8N>U1sbZu4(K)hxnP(^dKM7-8MZ4f5Nxh@NHdhxt0$ z@&{g={M=)o2xA@XtrdJ!3xxXAt)g6+_~BfNi)|WX%qh}ogRau^+aIQt z4XccRjJ)i?JU>-jc<;O4AnQKqtB zu(;MU$J5Ap;XkPowxl7&MXr&OPNmSqGft$E!Yaag@qT)0eciYtTzt?N&3m98Ab@H%WQkF^KNg&s zTv&@nVY}u=+1%4os;G>`3=&9$eN%ovKXr5g*sHIU5qDZwlQ(xLy`$_#W%S_palM=8 zVS|2bPGT16U=Bb;hDM3%Q6G#L_KwvR7aR0p|B>4kER!3q$Uyo&8wou2Z)MGXj$FL6 zqzW`YRUadr)nB=5?^`m6p6^&BWM{~7PmP<^O26f9Kyrz&;g#r34?GA!DRB^x;`wx#wEvwnF(yg@w8pS$<_!!ShZiu+U=RV6AAu70%{yjg#;s`q%Md2Q)_Sa|pP(Jlb5OIcRVGhxxSawO)^o z;Fb{s>Vq30s+%p0+MMaBi;f4cYQ4D;Q%oB;n6M(ORsQdV*I+?V&@Dm!^CbH2$%KhW z?ES}jPd=HKbj(pO@n>5dsK*3vgv`8axLX@E_)uWb{lQ@^6Kg3F42st*HzY8xu}^!E zx2Oh(?5pzVRZ6B9*DV)YJyffhEvM8MF%{N%Cc|{}zNz$7HL8f*eBDdBcIzy=ZLfE4 zB%I9E3iL?TeH#6%xY#t5o|C)Njis_c>T|WDpYh?Ysb08WbaOf{~P*#==nBQdiQ6b9A?-Q>nc})2zRy@rPvHKSODvq6$IL zmDsP$_0zqoad7$^Ck@}3T4A@-3`SaiI$W)L6IGo#sk|eY5l>y26VL&R$*+Pc}MG)$Ydx5P^n(_>IL& zy4nzboNc(1<*J5iO)ofFBVwSl&5tN2>b2)16hqthcjh1c^~O)>WNQ{>t>klhm_d`o z8erjXzk2xGhB+}dBw#aauahn$@veyv`$Y*SQcPjNr83q9-yFxY&dc^4-7#u4xnH8I zt5awawqqF_=l`kGnY7KR#V`}>t>TRJj8rt`=Z4Si5rywep=y+5u()Ot8{b18AvYXj zP;gHEt^+Ia+qOwy~VTq``xL!Fs#gyMzmK~PaDOVyRY^Hcf-5L^Ar9usz_3V z^D9jS0{&W-tI78w z_LtwMv4@`JCoB7cBO`v7u9WKxW@CY~aqgmgmoArSV@Dq6T4qLCII%a*ROEPV=RF;Q zS~-+>PS<(7by%1J^-3-v(XtsqkoeA{5L^9vT$-0<=W@D?jSV~^pH%U*Q#ANj@q6V+ z32a6XT7*x)`{6zEt0VGn^}e`&`0xFw+R|t8znStz*dm`C7(ak|fvnYZxPPA&SzBagYw`}aNi zo)%jnoIK~e6}_-?>a#cVFgQ;MI(XfW9 zRq}7wAObVxyveQF6!^Qw=zmVagOWx?zuPn%25~$Y6S10Wd}h`d5^#C(LCy!=&i%>h z@`4E$I1jAFDGPeD*fv==_`)1L8Q}de&%EZ#K4I-%CAob+L?x^Zt<~xKO_ZpU!>2K6 z${w*50k^hfCE9_a8Ewsc#3{0R3?1xc^YT}@&DbrK4~X+0A3i)owKWenpwJ8ONIar2 ztijH!9N~osUtgHbIJv*a&RR*C|6}K4Xxz7-2)y>GXHt*-bx%~sPVazajAnZf42AZU z1EjjQKw;Q^(4XDOjWhOGY9+Dryjb526sB*y>`5(CdDkNM4G-O64zL*gony;U>~Z^6 zTZ1*|9;^t@=!w5-{->WhQ6y@PFJq@?aBKnl&+@V9CQOc`gKxr@(P~DmzVKswQhKKe zj_))s2>bjSs~kTUe-OSPR#*3jyuUYA(av(sR7C#$)_mv8PoJ6YVVT8rqpIjJ$5u8- z_<8D`5iP6J+#8?I>8Pt^XLZUA?=U&ErZWd&D1f~X3!|r|t|4DWs_IJ87846fkc;1U z{Np?8@Z`3W)|%$J2|q)fu)~OUwSw;p%_4+kOuqPq<%;*izX{e~^J$wkK*E&Huo4-F z2vbhc4ae4`>Jn?`CC>`#9dumoFftHW6n_ovvv+(l-mjeEPZhO3d(rPi4n2YQ+NsTW zq5Thg->)a;q@&)b6_VYgT-Eh<;|n7^QME+lP8wbBpW9WC+5gPfQ*Nm|iH(Uo`KETe zAh@b6+Y5AQ^E}?HDfl2x!s&OzTn!?~bFO2%ahbDQMMddkQwx+~4;Y(Wd2HHVk#DE< zFGgT1I3AaWUu0Wjjopvq6zj+c&b1N~tm#Yr#H*L#E|A*iu+eJSna`i6B$R8KefwkK zPMs}h?D}yh2}er%A8|f4^~Ch*M)Jl0E29?hkKM_Y)TiXwXfxL#Ib%xS=e+J>B$NK5 zoY>kXhP`xi@RZp@K@GN8?&!VEiN2Yf93Fv!!aO03O6| z$~aur6YG{)vQ6b`iO9(OHeFumhG~W0P$|{}?`<=ruB)vp2wx8!C{QHJY`1GlSLkWd z##vF;`xAylSmlm>|AdoSn@l>CQ%fsGhE@cA`O9%{2n2ek`jyT#Jp1&(GY`~cKg`<9 zvL@|2cJMAp>=>B0BF-w~cy%JS-gjLhPhrPK^Y>zI+!sEtHD#q8kWse2$ml_#2Ao^t zpP!Lu)Lqh3NmTm5d8fyZ3tIznJI?wCUGQ`9@wb&uEZ4Bukjf2+S2J7Q@zQx)6bTsO z#c=iMlFTTJn}4lu$63D;X$xYBOm4rk|8{(IoHEoW->m66{vkKTuLf?$wYXMPF-^$A&I<9{(nQJ>pO2L&A*w zy&o@2#Q6U0vQjHCu^3_Gi00Cm(ANhBhEQWjK(0&{Y8?d3@ZSYKJLRb=;7~J!2{a(S z^YdgAu+95)PJnmxvGjh72)~`oCM+PmrLE9>JddY|{bhpM2si$x|7MBwiVJwEHm2+gd(NW|NjVJ)op zLm46KO_A9)KN6VF{>l!e(0CD{wu#j{V-e?NV#3BOw_1ty*BFdwacIE@#h|~}RyZq> z+v{Oof+CEOBJ%vkvm4&`UWKF{`>i9|q@%#mJlhkb-?_E&?u|T#Ht<~GI}z4q)()4* zK-SsS<1P*1;&+y;{=4C$q3p%-L~!=swUT zb(iuY{I`yWCo!F;5l}1!tDKTP1Zk!CoX1Jnm-hn8IM)vJ=iBb?W#WgLB1aT0Ys`)F zkfTjx3vN@JMd|DehAIfXC`Js_%+)Plh}lJ2HBN8%XFdZ*V3ctQpN0G&DvKVkC6}!= zoMPB2U;Zig&?3SN3Ex=dwOj+9kpH?#an+&Pn&}2+sMEzSj!--7C-vshJpSHVota3D zxsMAHB)=nJj5otiuQcI4!o2W(HWAX+ZF-Kw3?pG#>FsV#=#2MtX+!$5R$!%zj9sYWAKPyf>Wvot%xex?fy+NSV_VPyAbEUwU=y!;`PKi3o) zvZ<9l`&?6l8TiLWAHPD)yb)0?DJJcHQ+ek|lY7=?uQABjuW63^H79YF`b2>O1w4t52L37{QDQT!RgoU$scI9v1Kp@_RL>ANdC>p9?$Bw+;sS zl^+K6KZEs&FVB`!Q&DRn*%!(SXWf-T_McSxMk-^NQ}iz)BE%-7bn=u4L$EP&v$L({ z95+X=nuHT5cC}}rQGnYzFpnS0s4eq%UOdXrvccDeo&&c^7mX*6jKbG5vcCHI7KEQ? zG+BqVs9{Bn_c8^Gj08N^AykHs3Y8|gKTT`>S@zIWYHue=LxzK;RGmP91#hxOYY)>>@k8uhaQ) z53?fK;0Y!o&N_qx$a8Tarlz{7rIv5wiAuZ{_*y>~q;!#{_P^f4xU)O61@k>HXwr|hXubJa~4@y8rg%G)GJ<=mSAEP?A9GQ+by;^+i5k z$3kBplI&y&b!=)neHHt;mmzVk>qSPE=?;{&PXkNw%R=>V2W<9RkB7&eTgXrci^>M* zYfhGRzdRYEUie9me)JdFlKQ{07*zZb9gT=U>WWSE?)Z3L}%4+z9NNS%N?97o6QDKeUqjI$8^|!BE~`spV3{T@|-SO9wN9| zNPB#la*3jdO1`HIHh7CLKU9<&ZKM)57s@IZ=z{T?hq6YU9+Gyjm#@;X?;jmqY(^#9 zgpkNT@|5we9*1?yk56fjJ=XTiASTS(WkGj8yibZ)%O3R7B^Rxtx5*nRtuX6+F)^tT zanC{9JNdcDiTqPs(!=`#Rl*@Cjb<;J$%t|tSw$cvnW`$X=ip*aU z*E%)`7+$MSk*5pFrkC~pX9wbswhpk69vd8j?j%wEsl0xqr$WR@XHXx~eIFe=P&YK@ z;FDaPE{JkmQFag7=E17-XAJG{@S5-GD~Bm*RT@Fj%@@NhepN*_$Q4($s?6H4JNff0 z2N&&;L{FpBuC6_nCMzMweU@FW%=}Aijsnth`QYRdm!`oGZkudCs95xyawM;>0)E=P zz|ggWypKVpP>x_kQtSCQk^(w=Gk}IO!^q4&@L{?@h8234#>*Gf&tJgO+Wtyjd8^fR z;4AU9LCz|G_-p<1#0L1!MGG1uX0VTFOfk<5(coP9JDieZnt3!QeR^}}vNr`_-xp+M zhw0a%OoK!{MMBtXM@rKnit#C_7?9*`(aYwhHrO}RwU)E|&U0X}x7aoV3y(m(+=;*-n4uuoBmw1Y& zU)7^;R@{=#Map+!9M^8uSCtWGoVd#GQfXrJEB5d52U}v*W%IjVz@%xY=u!Rz0q9#3 z5^_*N&5zuE$BcsPG7?5%%#G{jE=PV@A$b^21_#dy%~VsP0-oRHZ?g$^6SDRt6Mk`Fa!XK68eRZ?>lWR%=Y0Ihre-c}JZL-a!AlUwc4AtBBn8Vx$ ztaYWns~g`;PM-daWNAA@cSKZA6CZ$-?Ol3*Qcfar@#fN%fgG=*p|X4}6Bi`NIjZ&; zFPQzqFdhtkHfTN2dt=76S2)*vj3o_Vx_ML+8|F`*e0ugF-KnC%`U>22=_~TjMf%l_ zudM2&=X#0fye;V#=4sq%wGQzTMIZx1Y+f2m{!kCr%Sf6|8mTsV?1TNyhghqU5qaWb zzO5f+`?kE3^Dn;J%Pb$?10miW7Q4*>*?d|^pZVhAiS8un)zz3-d!F)AleKo`yOlWJ zG4*_5Avr5Of32R=!15_ifRAHLYUyaHasu{8c)=#^KKp+Td~H!?OO)T$i{C+Qc=_&+ z=vlgp<<6p^;zj})s^wFpS8Jt?mIoperim%7AxLq9RFyrWgZ^_jRf|MbP!eboGav&` zO`u7HqurhwP?3Tu!~v{B{#T_;x} z$G|`{Rb?_{157JVRTD>pA*ltXJvlK0hGWx2qmL$`YVFNv{hM-SL!M$`9W0fE)B$+c*g*9YI zY)_;C!x%m{Vv;cEE+p_{Y($y`LjEkLx~WP2krKbRw?WUu$WBkcQwF&8;Zm-N2G1As zs~r1G+}`x1x{2F}-%Vb_dbOnc)HgS`%3oe+1B3%mt9s^nl>J98_n-9t36jAQdA`Q( zPyOokql+2XPh)!RRd8{heQ+GaZBP$<{T@_)x}E@Q{}=bc-5;cYs?ewJ;INZt|NGa{ aF2yZ})Lj>x3ItcVr14be2~_39+y4h#*g7x( literal 0 HcmV?d00001 diff --git a/app/artifacts/ui_acceptance/08_shell_compact_1024x640.png b/app/artifacts/ui_acceptance/08_shell_compact_1024x640.png new file mode 100644 index 0000000000000000000000000000000000000000..e28feed69699fb38edff56fb85ecc931b318c705 GIT binary patch literal 98340 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 TuZnf~)oV>Py$2O4&qDtPW3>MV literal 0 HcmV?d00001 diff --git a/app/artifacts/ui_acceptance/09_consultations_video_success_1280x800.png b/app/artifacts/ui_acceptance/09_consultations_video_success_1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..698757d9569e3fabfa9594a8432f53059f5af3dd GIT binary patch literal 75077 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 fOUj1YqKY5&<=;=OK=Df+}+*XUjO9Yx_^H4 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