From fa3003407c99819283a378a1091710d4cd49af34 Mon Sep 17 00:00:00 2001 From: neizbejnoezlo <137374284+neizbejnoezlo@users.noreply.github.com> Date: Wed, 15 Jul 2026 10:57:43 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D0=BE=20=D0=B1?= =?UTF-8?q?=D1=8D=D0=BA=D0=B5=D0=BD=D0=B4=D0=B0=20=D0=B8=20=D1=81=D1=8B?= =?UTF-8?q?=D1=80=D0=BE=D0=B9=20=D1=84=D1=80=D0=BE=D0=BD=D1=82=D0=B5=D0=BD?= =?UTF-8?q?=D0=B4=20=D0=BD=D0=B0=20=D0=BC=D0=BE=D0=BA=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/.env.example | 6 + .../.gradle/9.6.1/checksums/checksums.lock | Bin 0 -> 17 bytes .../.gradle/9.6.1/checksums/md5-checksums.bin | Bin 0 -> 40347 bytes .../9.6.1/checksums/sha1-checksums.bin | Bin 0 -> 124973 bytes .../executionHistory/executionHistory.bin | Bin 0 -> 194466 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .../.gradle/9.6.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/9.6.1/fileHashes/fileHashes.bin | Bin 0 -> 30747 bytes .../.gradle/9.6.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../9.6.1/fileHashes/resourceHashesCache.bin | Bin 0 -> 20265 bytes backend/.gradle/9.6.1/gc.properties | 0 .../kotlin-dsl-plugin-entries.lock | Bin 0 -> 17 bytes .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .../buildOutputCleanup/cache.properties | 2 + .../buildOutputCleanup/outputFiles.bin | Bin 0 -> 18893 bytes backend/.gradle/file-system.probe | Bin 0 -> 8 bytes backend/.gradle/vcs-1/gc.properties | 0 backend/.idea/.gitignore | 10 + backend/.idea/.name | 1 + backend/.idea/compiler.xml | 9 + backend/.idea/gradle.xml | 17 + backend/.idea/kotlinNotebook.xml | 6 + backend/.idea/kotlinc.xml | 7 + backend/.idea/misc.xml | 9 + backend/.idea/vcs.xml | 6 + .../.kotlin/errors/errors-1784081388339.log | 3 + backend/README.md | 161 + backend/build.gradle.kts | 47 + ...ma_fleet-ble-monitor-backend.kotlin_module | Bin 0 -> 80 bytes .../monitor/FleetBleMonitorApplication.class | Bin 0 -> 672 bytes .../FleetBleMonitorApplicationKt.class | Bin 0 -> 2156 bytes .../fleet/monitor/config/DataSeeder.class | Bin 0 -> 12790 bytes .../fleet/monitor/config/GraphQlConfig.class | Bin 0 -> 3052 bytes .../monitor/data/entity/BaseEntity.class | Bin 0 -> 2275 bytes .../monitor/data/entity/BeaconEntity.class | Bin 0 -> 5252 bytes .../monitor/data/entity/BeaconStatus.class | Bin 0 -> 1940 bytes .../entity/BeaconTelemetryPacketEntity.class | Bin 0 -> 6176 bytes .../data/entity/DepartmentEntity.class | Bin 0 -> 2993 bytes .../entity/MachineCalibrationRuleEntity.class | Bin 0 -> 5199 bytes .../monitor/data/entity/MachineEntity.class | Bin 0 -> 7599 bytes .../data/entity/MachineSortField.class | Bin 0 -> 2019 bytes .../data/entity/MachineStateCode.class | Bin 0 -> 2085 bytes .../entity/MachineStateDefinitionEntity.class | Bin 0 -> 4240 bytes .../entity/MachineStateIntervalEntity.class | Bin 0 -> 8612 bytes .../data/entity/MachineTypeEntity.class | Bin 0 -> 2998 bytes .../data/entity/ReportDeliveryStatus.class | Bin 0 -> 2114 bytes .../monitor/data/entity/ReportFormat.class | Bin 0 -> 1938 bytes .../monitor/data/entity/ReportPeriod.class | Bin 0 -> 1893 bytes .../monitor/data/entity/SortDirection.class | Bin 0 -> 1945 bytes .../monitor/data/entity/UserEntity.class | Bin 0 -> 5912 bytes .../fleet/monitor/data/entity/UserRole.class | Bin 0 -> 1912 bytes .../monitor/data/entity/UserSortField.class | Bin 0 -> 1998 bytes .../data/repository/BeaconRepository.class | Bin 0 -> 1518 bytes .../BeaconTelemetryPacketRepository.class | Bin 0 -> 1611 bytes .../repository/DepartmentRepository.class | Bin 0 -> 1161 bytes .../MachineCalibrationRuleRepository.class | Bin 0 -> 1187 bytes .../data/repository/MachineRepository.class | Bin 0 -> 1675 bytes .../MachineStateDefinitionRepository.class | Bin 0 -> 1233 bytes .../MachineStateIntervalRepository.class | Bin 0 -> 2109 bytes .../repository/MachineTypeRepository.class | Bin 0 -> 1167 bytes .../data/repository/UserRepository.class | Bin 0 -> 2373 bytes .../monitor/domain/service/AuthService.class | Bin 0 -> 5432 bytes .../domain/service/FleetReportService.class | Bin 0 -> 17754 bytes .../service/MachineAnalyticsService.class | Bin 0 -> 12422 bytes .../service/MachineService$WhenMappings.class | Bin 0 -> 908 bytes .../domain/service/MachineService.class | Bin 0 -> 13763 bytes .../domain/service/MachineStateService.class | Bin 0 -> 12537 bytes .../domain/service/ReferenceService.class | Bin 0 -> 6215 bytes .../domain/service/TelemetryService.class | Bin 0 -> 7457 bytes .../service/UserService$WhenMappings.class | Bin 0 -> 890 bytes .../monitor/domain/service/UserService.class | Bin 0 -> 12616 bytes .../graphql/AuthGraphQlController.class | Bin 0 -> 5708 bytes .../FleetReportGraphQlController.class | Bin 0 -> 2391 bytes .../graphql/MachineGraphQlController.class | Bin 0 -> 4319 bytes .../MachineStateGraphQlController.class | Bin 0 -> 7699 bytes .../graphql/ReferenceGraphQlController.class | Bin 0 -> 4182 bytes .../graphql/TelemetryGraphQlController.class | Bin 0 -> 2809 bytes .../graphql/UserGraphQlController.class | Bin 0 -> 4190 bytes .../presentation/model/AuthPayload.class | Bin 0 -> 4526 bytes .../model/BeaconTelemetryPayload.class | Bin 0 -> 3874 bytes .../CreateMachineCalibrationRulePayload.class | Bin 0 -> 3583 bytes .../model/CreateMachinePayload.class | Bin 0 -> 4377 bytes .../CreateMachineStateDefinitionPayload.class | Bin 0 -> 4161 bytes .../model/CreateUserPayload.class | Bin 0 -> 5724 bytes .../presentation/model/FleetDailyReport.class | Bin 0 -> 6460 bytes .../model/FleetDailyReportHistoryRow.class | Bin 0 -> 6219 bytes .../model/FleetDailyReportMachineRow.class | Bin 0 -> 5118 bytes .../model/FleetDailyReportSummary.class | Bin 0 -> 5527 bytes .../GenerateFleetDailyReportPayload.class | Bin 0 -> 3531 bytes .../presentation/model/LoginPayload.class | Bin 0 -> 3094 bytes .../model/MachineDailyUsageStat.class | Bin 0 -> 5231 bytes .../model/MachineStateHistoryPage.class | Bin 0 -> 4034 bytes .../model/MachineUsageSummary.class | Bin 0 -> 6192 bytes .../presentation/model/MachinesPage.class | Bin 0 -> 3892 bytes .../model/RefreshSessionPayload.class | Bin 0 -> 2665 bytes .../presentation/model/ReportFile.class | Bin 0 -> 4187 bytes .../UpdateMachineCalibrationRulePayload.class | Bin 0 -> 3813 bytes .../model/UpdateMachinePayload.class | Bin 0 -> 4631 bytes .../UpdateMachineStateDefinitionPayload.class | Bin 0 -> 4130 bytes .../model/UpdateUserPayload.class | Bin 0 -> 6296 bytes .../presentation/model/UsersPage.class | Bin 0 -> 3856 bytes .../security/AuthTokenStore$AuthSession.class | Bin 0 -> 3615 bytes .../security/AuthTokenStore$TokenRecord.class | Bin 0 -> 3220 bytes .../monitor/security/AuthTokenStore.class | Bin 0 -> 5572 bytes .../security/DemoTokenAuthFilter.class | Bin 0 -> 5054 bytes .../monitor/security/SecurityConfig.class | Bin 0 -> 5117 bytes .../outputs-generated-for-plugins.tab | Bin 0 -> 4096 bytes ...utputs-generated-for-plugins.tab.keystream | Bin 0 -> 4096 bytes ...ts-generated-for-plugins.tab.keystream.len | Bin 0 -> 8 bytes .../outputs-generated-for-plugins.tab.len | Bin 0 -> 8 bytes ...utputs-generated-for-plugins.tab.values.at | Bin 0 -> 55 bytes .../outputs-generated-for-plugins.tab_i.len | Bin 0 -> 8 bytes .../sources-referenced-by-plugins.tab | Bin 0 -> 4096 bytes ...ources-referenced-by-plugins.tab.keystream | Bin 0 -> 4096 bytes ...es-referenced-by-plugins.tab.keystream.len | Bin 0 -> 8 bytes .../sources-referenced-by-plugins.tab.len | Bin 0 -> 8 bytes ...ources-referenced-by-plugins.tab.values.at | Bin 0 -> 55 bytes .../sources-referenced-by-plugins.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/inputs/source-to-output.tab | Bin 0 -> 4096 bytes .../inputs/source-to-output.tab.keystream | Bin 0 -> 12288 bytes .../inputs/source-to-output.tab.keystream.len | Bin 0 -> 8 bytes .../inputs/source-to-output.tab.len | Bin 0 -> 8 bytes .../inputs/source-to-output.tab.values.at | Bin 0 -> 20413 bytes .../caches-jvm/inputs/source-to-output.tab_i | Bin 0 -> 32768 bytes .../inputs/source-to-output.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/class-attributes.tab | Bin 0 -> 4096 bytes .../jvm/kotlin/class-attributes.tab.keystream | Bin 0 -> 12288 bytes .../kotlin/class-attributes.tab.keystream.len | Bin 0 -> 8 bytes .../jvm/kotlin/class-attributes.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/class-attributes.tab.values.at | Bin 0 -> 271 bytes .../jvm/kotlin/class-attributes.tab_i | Bin 0 -> 32768 bytes .../jvm/kotlin/class-attributes.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/class-fq-name-to-source.tab | Bin 0 -> 4096 bytes .../class-fq-name-to-source.tab.keystream | Bin 0 -> 12288 bytes .../class-fq-name-to-source.tab.keystream.len | Bin 0 -> 8 bytes .../kotlin/class-fq-name-to-source.tab.len | Bin 0 -> 8 bytes .../class-fq-name-to-source.tab.values.at | Bin 0 -> 11279 bytes .../jvm/kotlin/class-fq-name-to-source.tab_i | Bin 0 -> 32768 bytes .../kotlin/class-fq-name-to-source.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/internal-name-to-source.tab | Bin 0 -> 4096 bytes .../internal-name-to-source.tab.keystream | Bin 0 -> 12288 bytes .../internal-name-to-source.tab.keystream.len | Bin 0 -> 8 bytes .../kotlin/internal-name-to-source.tab.len | Bin 0 -> 8 bytes .../internal-name-to-source.tab.values.at | Bin 0 -> 11711 bytes .../jvm/kotlin/internal-name-to-source.tab_i | Bin 0 -> 32768 bytes .../kotlin/internal-name-to-source.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/package-parts.tab | Bin 0 -> 4096 bytes .../jvm/kotlin/package-parts.tab.keystream | Bin 0 -> 4096 bytes .../kotlin/package-parts.tab.keystream.len | Bin 0 -> 8 bytes .../jvm/kotlin/package-parts.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/package-parts.tab.values.at | Bin 0 -> 52 bytes .../caches-jvm/jvm/kotlin/package-parts.tab_i | Bin 0 -> 32768 bytes .../jvm/kotlin/package-parts.tab_i.len | Bin 0 -> 8 bytes .../cacheable/caches-jvm/jvm/kotlin/proto.tab | Bin 0 -> 4096 bytes .../caches-jvm/jvm/kotlin/proto.tab.keystream | Bin 0 -> 12288 bytes .../jvm/kotlin/proto.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/proto.tab.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/proto.tab.values | Bin 0 -> 18953 bytes .../caches-jvm/jvm/kotlin/proto.tab.values.at | Bin 0 -> 9417 bytes .../caches-jvm/jvm/kotlin/proto.tab.values.s | 1 + .../caches-jvm/jvm/kotlin/proto.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/jvm/kotlin/proto.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/source-to-classes.tab | Bin 0 -> 4096 bytes .../kotlin/source-to-classes.tab.keystream | Bin 0 -> 12288 bytes .../source-to-classes.tab.keystream.len | Bin 0 -> 8 bytes .../jvm/kotlin/source-to-classes.tab.len | Bin 0 -> 8 bytes .../kotlin/source-to-classes.tab.values.at | Bin 0 -> 10829 bytes .../jvm/kotlin/source-to-classes.tab_i | Bin 0 -> 32768 bytes .../jvm/kotlin/source-to-classes.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/subtypes.tab | Bin 0 -> 4096 bytes .../jvm/kotlin/subtypes.tab.keystream | Bin 0 -> 4096 bytes .../jvm/kotlin/subtypes.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/subtypes.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/subtypes.tab.values.at | Bin 0 -> 1612 bytes .../caches-jvm/jvm/kotlin/subtypes.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/jvm/kotlin/subtypes.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/supertypes.tab | Bin 0 -> 4096 bytes .../jvm/kotlin/supertypes.tab.keystream | Bin 0 -> 4096 bytes .../jvm/kotlin/supertypes.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/supertypes.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/supertypes.tab.values.at | Bin 0 -> 1162 bytes .../caches-jvm/jvm/kotlin/supertypes.tab_i | Bin 0 -> 32768 bytes .../jvm/kotlin/supertypes.tab_i.len | Bin 0 -> 8 bytes .../cacheable/caches-jvm/lookups/counters.tab | 2 + .../caches-jvm/lookups/file-to-id.tab | Bin 0 -> 4096 bytes .../lookups/file-to-id.tab.keystream | Bin 0 -> 12288 bytes .../lookups/file-to-id.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/file-to-id.tab.len | Bin 0 -> 8 bytes .../lookups/file-to-id.tab.values.at | Bin 0 -> 313 bytes .../caches-jvm/lookups/file-to-id.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/lookups/file-to-id.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/id-to-file.tab | Bin 0 -> 4096 bytes .../lookups/id-to-file.tab.keystream | Bin 0 -> 4096 bytes .../lookups/id-to-file.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/id-to-file.tab.len | Bin 0 -> 8 bytes .../lookups/id-to-file.tab.values.at | Bin 0 -> 3509 bytes .../caches-jvm/lookups/id-to-file.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/lookups/id-to-file.tab_i.len | Bin 0 -> 8 bytes .../cacheable/caches-jvm/lookups/lookups.tab | Bin 0 -> 16384 bytes .../caches-jvm/lookups/lookups.tab.keystream | Bin 0 -> 61440 bytes .../lookups/lookups.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/lookups.tab.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/lookups.tab.values.at | Bin 0 -> 9433 bytes .../caches-jvm/lookups/lookups.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/lookups/lookups.tab_i.len | Bin 0 -> 8 bytes .../compileKotlin/cacheable/last-build.bin | Bin 0 -> 18 bytes .../shrunk-classpath-snapshot.bin | Bin 0 -> 56496 bytes backend/build/resolvedMainClassName | 1 + backend/build/resources/main/application.yml | 43 + .../resources/main/graphql/schema.graphqls | 431 + backend/docker/docker-compose.yml | 16 + backend/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43453 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + backend/gradlew | 249 + backend/gradlew.bat | 92 + backend/settings.gradle.kts | 15 + .../monitor/FleetBleMonitorApplication.kt | 11 + .../arma/fleet/monitor/config/DataSeeder.kt | 153 + .../fleet/monitor/config/GraphQlConfig.kt | 27 + .../fleet/monitor/data/entity/BaseEntity.kt | 28 + .../fleet/monitor/data/entity/BeaconEntity.kt | 37 + .../entity/BeaconTelemetryPacketEntity.kt | 43 + .../monitor/data/entity/DepartmentEntity.kt | 22 + .../arma/fleet/monitor/data/entity/Enums.kt | 19 + .../entity/MachineCalibrationRuleEntity.kt | 33 + .../monitor/data/entity/MachineEntity.kt | 51 + .../entity/MachineStateDefinitionEntity.kt | 31 + .../data/entity/MachineStateIntervalEntity.kt | 58 + .../monitor/data/entity/MachineTypeEntity.kt | 22 + .../fleet/monitor/data/entity/UserEntity.kt | 43 + .../data/repository/BeaconRepository.kt | 10 + .../BeaconTelemetryPacketRepository.kt | 10 + .../data/repository/DepartmentRepository.kt | 8 + .../MachineCalibrationRuleRepository.kt | 8 + .../data/repository/MachineRepository.kt | 15 + .../MachineStateDefinitionRepository.kt | 8 + .../MachineStateIntervalRepository.kt | 22 + .../data/repository/MachineTypeRepository.kt | 8 + .../monitor/data/repository/UserRepository.kt | 58 + .../monitor/domain/service/AuthService.kt | 65 + .../domain/service/FleetReportService.kt | 87 + .../domain/service/MachineAnalyticsService.kt | 92 + .../monitor/domain/service/MachineService.kt | 134 + .../domain/service/MachineStateService.kt | 95 + .../domain/service/ReferenceService.kt | 46 + .../domain/service/TelemetryService.kt | 51 + .../monitor/domain/service/UserService.kt | 121 + .../graphql/AuthGraphQlController.kt | 42 + .../graphql/FleetReportGraphQlController.kt | 22 + .../graphql/MachineGraphQlController.kt | 45 + .../graphql/MachineStateGraphQlController.kt | 86 + .../graphql/ReferenceGraphQlController.kt | 45 + .../graphql/TelemetryGraphQlController.kt | 27 + .../graphql/UserGraphQlController.kt | 41 + .../monitor/presentation/model/AuthModels.kt | 41 + .../presentation/model/MachineModels.kt | 96 + .../presentation/model/ReportModels.kt | 60 + .../fleet/monitor/security/AuthTokenStore.kt | 95 + .../monitor/security/DemoTokenAuthFilter.kt | 36 + .../fleet/monitor/security/SecurityConfig.kt | 28 + backend/src/main/resources/application.yml | 43 + .../main/resources/graphql/schema.graphqls | 431 + frontend/.env | 4 + frontend/.gitignore | 24 + frontend/README.md | 73 + frontend/codegen.ts | 24 + frontend/docs/backend-domain-model.md | 930 ++ frontend/eslint.config.js | 26 + frontend/index.html | 13 + frontend/package-lock.json | 7662 +++++++++++++++++ frontend/package.json | 62 + frontend/public/devices/армафон3.3+.webp | Bin 0 -> 30714 bytes frontend/public/favicon.svg | 17 + frontend/public/photo_2025-03-29_20-05-51.jpg | Bin 0 -> 115439 bytes frontend/src/App.scss | 186 + frontend/src/App.tsx | 21 + frontend/src/app/layouts/AppLayout.scss | 288 + frontend/src/app/layouts/AppLayout.tsx | 99 + frontend/src/app/router/router.tsx | 68 + frontend/src/assets/Logo.svg | 26 + frontend/src/assets/LogoIcon.svg | 17 + frontend/src/assets/LogoIconWhite.svg | 22 + frontend/src/assets/LogoWhite.svg | 26 + frontend/src/assets/empty_state.svg | 13 + .../fonts/Montserrat-VariableFont_wght.ttf | Bin 0 -> 688600 bytes frontend/src/assets/icons/Apps.tsx | 21 + frontend/src/assets/icons/Block.tsx | 11 + frontend/src/assets/icons/Bluetooth.tsx | 11 + frontend/src/assets/icons/Camera.tsx | 11 + frontend/src/assets/icons/Gps.tsx | 13 + frontend/src/assets/icons/Kiosk.tsx | 11 + .../src/assets/icons/LoadingTwotoneLoop.tsx | 32 + frontend/src/assets/icons/Message.tsx | 11 + frontend/src/assets/icons/Reboot.tsx | 11 + frontend/src/assets/icons/Sim.tsx | 12 + frontend/src/assets/icons/Volume.tsx | 18 + frontend/src/assets/icons/Wifi.tsx | 11 + frontend/src/assets/no_items.svg | 13 + .../src/entities/beacon/api/beaconsService.ts | 58 + .../beacon/mock/mockBeaconVibrationSamples.ts | 141 + .../src/entities/beacon/mock/mockBeacons.ts | 108 + frontend/src/entities/beacon/model/types.ts | 18 + .../src/entities/device/api/device.graphql.ts | 390 + .../src/entities/device/lib/phonePolicy.ts | 85 + frontend/src/entities/device/model/types.ts | 268 + .../entities/employee/api/employee.graphql.ts | 325 + .../src/entities/employee/api/usersService.ts | 322 + .../src/entities/employee/mock/mockUsers.ts | 79 + frontend/src/entities/employee/model/types.ts | 241 + .../machine/api/machineAnalyticsService.ts | 257 + .../machine/api/machineCalibrationService.ts | 701 ++ .../machine/api/machineDictionariesService.ts | 19 + .../entities/machine/api/machinesService.ts | 362 + .../entities/machine/lib/machineFormatters.ts | 49 + .../mock/mockMachineCalibrationRules.ts | 70 + .../mock/mockMachineDailyUsageStats.ts | 65 + .../machine/mock/mockMachineDictionaries.ts | 102 + .../mock/mockMachineStateDefinitions.ts | 54 + .../machine/mock/mockMachineStateHistory.ts | 76 + .../machine/mock/mockMachineStates.ts | 28 + .../mock/mockMachineTelemetryIntervals.ts | 115 + .../src/entities/machine/mock/mockMachines.ts | 160 + frontend/src/entities/machine/model/types.ts | 126 + .../report/api/fleetReportSchedulesService.ts | 178 + .../entities/report/api/fleetReportService.ts | 449 + .../report/mock/mockFleetReportSchedules.ts | 4 + frontend/src/entities/report/model/types.ts | 70 + .../src/features/auth/api/auth.graphql.ts | 45 + frontend/src/features/auth/api/authService.ts | 181 + frontend/src/features/auth/ui/AuthGate.tsx | 67 + frontend/src/index.scss | 116 + frontend/src/main.tsx | 34 + frontend/src/pages/DevicePage/DevicePage.scss | 871 ++ frontend/src/pages/DevicePage/DevicePage.tsx | 438 + .../BatteryCircle/BatteryCircle.scss | 44 + .../BatteryCircle/BatteryCircle.tsx | 57 + .../DeviceActionsCard/DeviceActionsCard.scss | 235 + .../DeviceActionsCard/DeviceActionsCard.tsx | 272 + .../DeviceAppsAccordion.scss | 269 + .../DeviceAppsAccordion.tsx | 535 ++ .../DeviceAppsView/DeviceAppsView.scss | 720 ++ .../DeviceAppsView/DeviceAppsView.tsx | 526 ++ .../DeviceHistoryChart.scss | 428 + .../DeviceHistoryChart/DeviceHistoryChart.tsx | 2083 +++++ .../DeviceHistoryModal.scss | 645 ++ .../DeviceHistoryModal/DeviceHistoryModal.tsx | 275 + .../DeviceHistoryPeriodControl.scss | 313 + .../DeviceHistoryPeriodControl.tsx | 215 + .../DeviceMainCard/DeviceMainCard.tsx | 225 + .../DeviceMapCard/DeviceMapCard.scss | 319 + .../DeviceMapCard/DeviceMapCard.tsx | 536 ++ .../DevicePageSkeleton.scss | 243 + .../DevicePageSkeleton/DevicePageSkeleton.tsx | 184 + .../DevicePermissionsCard.scss | 608 ++ .../DevicePermissionsCard.tsx | 659 ++ .../DeviceStatsCards/DeviceStatsCards.tsx | 143 + .../components/TimelineZoom/TimelineZoom.scss | 107 + .../components/TimelineZoom/TimelineZoom.tsx | 406 + frontend/src/pages/DevicePage/types.ts | 83 + .../src/pages/DevicesPage/DevicesPage.scss | 627 ++ .../src/pages/DevicesPage/DevicesPage.tsx | 920 ++ .../AddDeviceModal/AddDeviceModal.scss | 212 + .../AddDeviceModal/AddDeviceModal.tsx | 214 + .../DeviceMapModal/DeviceMapModal.scss | 120 + .../DeviceMapModal/DeviceMapModal.tsx | 53 + .../DevicesDateRangePicker.scss | 246 + .../DevicesDateRangePicker.tsx | 234 + .../DevicesFiltersPanel/Datepicker.scss | 45 + .../DevicesFiltersPanel.scss | 293 + .../DevicesFiltersPanel.tsx | 284 + .../DevicesOrganisationFilter.scss | 57 + .../DevicesOrganisationFilter.tsx | 332 + .../components/DevicesTabs/DevicesTabs.tsx | 174 + .../DevicesToolbar/DevicesToolbar.scss | 276 + .../DevicesToolbar/DevicesToolbar.tsx | 156 + .../src/pages/DevicesPage/devices.mock.json | 76 + .../pages/EmployeesPage/EmployeesPage.scss | 599 ++ .../src/pages/EmployeesPage/EmployeesPage.tsx | 13 + .../AddEmployeeModal/AddEmployeeModal.scss | 512 ++ .../AddEmployeeModal/AddEmployeeModal.tsx | 736 ++ .../AddOrganisationModal.scss | 237 + .../AddOrganisationModal.tsx | 442 + .../AvatarCameraModal/AvatarCameraModal.scss | 152 + .../AvatarCameraModal/AvatarCameraModal.tsx | 194 + .../AvatarCropModal/AvatarCropModal.scss | 156 + .../AvatarCropModal/AvatarCropModal.tsx | 186 + .../components/AvatarUpload/AvatarUpload.scss | 168 + .../components/AvatarUpload/AvatarUpload.tsx | 229 + .../EmployeesPagination.scss | 138 + .../EmployeesPagination.tsx | 183 + .../EmployeesTabs/EmployeesTabs.tsx | 37 + .../EmployeesToolbar/EmployeesToolbar.scss | 436 + .../EmployeesToolbar/EmployeesToolbar.tsx | 335 + .../FleetReportScheduleModal.scss | 644 ++ .../FleetReportScheduleModal.tsx | 551 ++ .../OrganisationSelect.scss | 208 + .../OrganisationSelect/OrganisationSelect.tsx | 236 + .../OrganisationsSection.tsx | 518 ++ .../OrganisationsTable/OrganisationsTable.tsx | 138 + .../components/UsersSection/UsersSection.tsx | 550 ++ .../components/UsersTable/UsersTable.tsx | 161 + .../EmployeesPage/lib/employeeFormatters.ts | 14 + .../EmployeesPage/lib/getPaginationItems.ts | 58 + .../EmployeesPage/lib/uploadMultipartFile.ts | 35 + frontend/src/pages/LoginPage/LoginPage.scss | 332 + frontend/src/pages/LoginPage/LoginPage.tsx | 129 + .../src/pages/MachinePage/MachinePage.scss | 747 ++ .../src/pages/MachinePage/MachinePage.tsx | 878 ++ .../MachineCalibrationRuleModal.tsx | 271 + .../MachineCalibrationTab.scss | 803 ++ .../MachineCalibrationTab.tsx | 1220 +++ .../MachineCalibrationTimelineChart.tsx | 327 + .../MachineStateDefinitionModal.tsx | 227 + .../MachineVibrationChart.tsx | 425 + .../MachineVibrationHistogramChart.tsx | 279 + .../MachineCalibrationTab/utils.tsx | 264 + .../MachineChartsTab/MachineChartsTab.scss | 289 + .../MachineChartsTab/MachineChartsTab.tsx | 201 + .../MachineStateTimelineChart.tsx | 292 + .../MachineUsageDistributionChart.tsx | 135 + .../MachineChartsTab/MachineUsageKpiCards.tsx | 77 + .../MachineUsageTrendChart.tsx | 223 + .../components/MachineChartsTab/utils.ts | 107 + .../src/pages/MachinesPage/MachinesPage.scss | 206 + .../src/pages/MachinesPage/MachinesPage.tsx | 718 ++ .../AddMachineModal/AddMachineModal.scss | 28 + .../AddMachineModal/AddMachineModal.tsx | 285 + .../BeaconBindingModal/BeaconBindingModal.tsx | 161 + .../MachineSelect/MachineSelect.scss | 62 + .../MachineSelect/MachineSelect.tsx | 166 + frontend/src/pages/MapPage/MapPage.scss | 630 ++ frontend/src/pages/MapPage/MapPage.tsx | 721 ++ .../MapTrackPeriodControl.scss | 308 + .../MapTrackPeriodControl.tsx | 208 + .../OrganisationPage/OrganisationPage.scss | 1072 +++ .../OrganisationPage/OrganisationPage.tsx | 1176 +++ .../DurationPicker/DurationPicker.scss | 173 + .../DurationPicker/DurationPicker.tsx | 183 + .../OrganisationPolicyCard.scss | 1186 +++ .../OrganisationPolicyCard.tsx | 927 ++ frontend/src/shared/api/apolloClient.ts | 190 + frontend/src/shared/api/authStorage.ts | 34 + .../src/shared/api/graphql/generated/gql.ts | 100 + .../shared/api/graphql/generated/graphql.ts | 126 + .../src/shared/api/graphql/generated/index.ts | 1 + .../src/shared/api/graphql/operations/auth.ts | 68 + .../shared/api/graphql/operations/users.ts | 72 + frontend/src/shared/lib/lazyMount.ts | 93 + frontend/src/shared/lib/motion.ts | 68 + .../src/shared/styles/_table-surfaces.scss | 12 + frontend/src/shared/styles/_themes.scss | 311 + frontend/src/shared/styles/_variables.scss | 240 + frontend/src/shared/theme/theme.ts | 38 + frontend/src/shared/theme/themeTransition.ts | 112 + frontend/src/shared/theme/useTheme.ts | 59 + .../src/shared/ui/EmptyState/EmptyState.scss | 88 + .../src/shared/ui/EmptyState/EmptyState.tsx | 49 + .../shared/ui/ListSkeleton/ListSkeleton.scss | 95 + .../shared/ui/ListSkeleton/ListSkeleton.tsx | 30 + .../shared/ui/MotionDialog/MotionDialog.tsx | 133 + frontend/src/shared/ui/PageTabs/PageTabs.scss | 141 + frontend/src/shared/ui/PageTabs/PageTabs.tsx | 75 + .../ui/RevealContent/RevealContent.scss | 32 + .../shared/ui/RevealContent/RevealContent.tsx | 53 + .../ui/TableSkeleton/TableSkeleton.scss | 138 + .../shared/ui/TableSkeleton/TableSkeleton.tsx | 142 + .../ConfirmDangerDialog.scss | 137 + .../ConfirmDangerDialog.tsx | 77 + .../FullscreenControl.scss | 103 + .../FullscreenControl.tsx | 63 + frontend/src/widgets/Navbar/Navbar.scss | 394 + frontend/src/widgets/Navbar/Navbar.tsx | 218 + .../widgets/Notification/Notification.scss | 154 + .../src/widgets/Notification/Notification.tsx | 129 + frontend/src/widgets/Sidebar/Sidebar.scss | 257 + frontend/src/widgets/Sidebar/Sidebar.tsx | 113 + frontend/tsconfig.app.json | 25 + frontend/tsconfig.json | 7 + frontend/tsconfig.node.json | 24 + frontend/vite.config.ts | 39 + 480 files changed, 62145 insertions(+) create mode 100644 backend/.env.example create mode 100644 backend/.gradle/9.6.1/checksums/checksums.lock create mode 100644 backend/.gradle/9.6.1/checksums/md5-checksums.bin create mode 100644 backend/.gradle/9.6.1/checksums/sha1-checksums.bin create mode 100644 backend/.gradle/9.6.1/executionHistory/executionHistory.bin create mode 100644 backend/.gradle/9.6.1/executionHistory/executionHistory.lock create mode 100644 backend/.gradle/9.6.1/fileChanges/last-build.bin create mode 100644 backend/.gradle/9.6.1/fileHashes/fileHashes.bin create mode 100644 backend/.gradle/9.6.1/fileHashes/fileHashes.lock create mode 100644 backend/.gradle/9.6.1/fileHashes/resourceHashesCache.bin create mode 100644 backend/.gradle/9.6.1/gc.properties create mode 100644 backend/.gradle/9.6.1/kotlin-dsl-plugin-entries/kotlin-dsl-plugin-entries.lock create mode 100644 backend/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 backend/.gradle/buildOutputCleanup/cache.properties create mode 100644 backend/.gradle/buildOutputCleanup/outputFiles.bin create mode 100644 backend/.gradle/file-system.probe create mode 100644 backend/.gradle/vcs-1/gc.properties create mode 100644 backend/.idea/.gitignore create mode 100644 backend/.idea/.name create mode 100644 backend/.idea/compiler.xml create mode 100644 backend/.idea/gradle.xml create mode 100644 backend/.idea/kotlinNotebook.xml create mode 100644 backend/.idea/kotlinc.xml create mode 100644 backend/.idea/misc.xml create mode 100644 backend/.idea/vcs.xml create mode 100644 backend/.kotlin/errors/errors-1784081388339.log create mode 100644 backend/README.md create mode 100644 backend/build.gradle.kts create mode 100644 backend/build/classes/kotlin/main/META-INF/llc.arma_fleet-ble-monitor-backend.kotlin_module create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/FleetBleMonitorApplication.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/FleetBleMonitorApplicationKt.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/config/DataSeeder.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/config/GraphQlConfig.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/BaseEntity.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/BeaconEntity.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/BeaconStatus.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/BeaconTelemetryPacketEntity.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/DepartmentEntity.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineCalibrationRuleEntity.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineEntity.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineSortField.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineStateCode.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineStateDefinitionEntity.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineStateIntervalEntity.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineTypeEntity.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/ReportDeliveryStatus.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/ReportFormat.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/ReportPeriod.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/SortDirection.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/UserEntity.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/UserRole.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/UserSortField.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/BeaconRepository.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/BeaconTelemetryPacketRepository.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/DepartmentRepository.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/MachineCalibrationRuleRepository.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/MachineRepository.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/MachineStateDefinitionRepository.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/MachineStateIntervalRepository.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/MachineTypeRepository.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/UserRepository.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/AuthService.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/FleetReportService.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/MachineAnalyticsService.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/MachineService$WhenMappings.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/MachineService.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/MachineStateService.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/ReferenceService.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/TelemetryService.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/UserService$WhenMappings.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/UserService.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/AuthGraphQlController.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/FleetReportGraphQlController.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/MachineGraphQlController.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/MachineStateGraphQlController.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/ReferenceGraphQlController.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/TelemetryGraphQlController.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/UserGraphQlController.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/AuthPayload.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/BeaconTelemetryPayload.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/CreateMachineCalibrationRulePayload.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/CreateMachinePayload.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/CreateMachineStateDefinitionPayload.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/CreateUserPayload.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/FleetDailyReport.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/FleetDailyReportHistoryRow.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/FleetDailyReportMachineRow.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/FleetDailyReportSummary.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/GenerateFleetDailyReportPayload.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/LoginPayload.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/MachineDailyUsageStat.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/MachineStateHistoryPage.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/MachineUsageSummary.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/MachinesPage.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/RefreshSessionPayload.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/ReportFile.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/UpdateMachineCalibrationRulePayload.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/UpdateMachinePayload.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/UpdateMachineStateDefinitionPayload.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/UpdateUserPayload.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/UsersPage.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/security/AuthTokenStore$AuthSession.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/security/AuthTokenStore$TokenRecord.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/security/AuthTokenStore.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/security/DemoTokenAuthFilter.class create mode 100644 backend/build/classes/kotlin/main/llc/arma/fleet/monitor/security/SecurityConfig.class create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab.keystream create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab.keystream.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab.values.at create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab_i.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab.keystream create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab.keystream.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab.values.at create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab_i.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.s create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i create mode 100644 backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len create mode 100644 backend/build/kotlin/compileKotlin/cacheable/last-build.bin create mode 100644 backend/build/kotlin/compileKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin create mode 100644 backend/build/resolvedMainClassName create mode 100644 backend/build/resources/main/application.yml create mode 100644 backend/build/resources/main/graphql/schema.graphqls create mode 100644 backend/docker/docker-compose.yml create mode 100644 backend/gradle/wrapper/gradle-wrapper.jar create mode 100644 backend/gradle/wrapper/gradle-wrapper.properties create mode 100644 backend/gradlew create mode 100644 backend/gradlew.bat create mode 100644 backend/settings.gradle.kts create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/FleetBleMonitorApplication.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/config/DataSeeder.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/config/GraphQlConfig.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/BaseEntity.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/BeaconEntity.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/BeaconTelemetryPacketEntity.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/DepartmentEntity.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/Enums.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineCalibrationRuleEntity.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineEntity.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineStateDefinitionEntity.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineStateIntervalEntity.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineTypeEntity.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/UserEntity.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/BeaconRepository.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/BeaconTelemetryPacketRepository.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/DepartmentRepository.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineCalibrationRuleRepository.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineRepository.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineStateDefinitionRepository.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineStateIntervalRepository.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineTypeRepository.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/UserRepository.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/AuthService.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/FleetReportService.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/MachineAnalyticsService.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/MachineService.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/MachineStateService.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/ReferenceService.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/TelemetryService.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/UserService.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/AuthGraphQlController.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/FleetReportGraphQlController.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/MachineGraphQlController.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/MachineStateGraphQlController.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/ReferenceGraphQlController.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/TelemetryGraphQlController.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/UserGraphQlController.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/model/AuthModels.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/model/MachineModels.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/model/ReportModels.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/security/AuthTokenStore.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/security/DemoTokenAuthFilter.kt create mode 100644 backend/src/main/kotlin/llc/arma/fleet/monitor/security/SecurityConfig.kt create mode 100644 backend/src/main/resources/application.yml create mode 100644 backend/src/main/resources/graphql/schema.graphqls create mode 100644 frontend/.env create mode 100644 frontend/.gitignore create mode 100644 frontend/README.md create mode 100644 frontend/codegen.ts create mode 100644 frontend/docs/backend-domain-model.md create mode 100644 frontend/eslint.config.js create mode 100644 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/public/devices/армафон3.3+.webp create mode 100644 frontend/public/favicon.svg create mode 100644 frontend/public/photo_2025-03-29_20-05-51.jpg create mode 100644 frontend/src/App.scss create mode 100644 frontend/src/App.tsx create mode 100644 frontend/src/app/layouts/AppLayout.scss create mode 100644 frontend/src/app/layouts/AppLayout.tsx create mode 100644 frontend/src/app/router/router.tsx create mode 100644 frontend/src/assets/Logo.svg create mode 100644 frontend/src/assets/LogoIcon.svg create mode 100644 frontend/src/assets/LogoIconWhite.svg create mode 100644 frontend/src/assets/LogoWhite.svg create mode 100644 frontend/src/assets/empty_state.svg create mode 100644 frontend/src/assets/fonts/Montserrat-VariableFont_wght.ttf create mode 100644 frontend/src/assets/icons/Apps.tsx create mode 100644 frontend/src/assets/icons/Block.tsx create mode 100644 frontend/src/assets/icons/Bluetooth.tsx create mode 100644 frontend/src/assets/icons/Camera.tsx create mode 100644 frontend/src/assets/icons/Gps.tsx create mode 100644 frontend/src/assets/icons/Kiosk.tsx create mode 100644 frontend/src/assets/icons/LoadingTwotoneLoop.tsx create mode 100644 frontend/src/assets/icons/Message.tsx create mode 100644 frontend/src/assets/icons/Reboot.tsx create mode 100644 frontend/src/assets/icons/Sim.tsx create mode 100644 frontend/src/assets/icons/Volume.tsx create mode 100644 frontend/src/assets/icons/Wifi.tsx create mode 100644 frontend/src/assets/no_items.svg create mode 100644 frontend/src/entities/beacon/api/beaconsService.ts create mode 100644 frontend/src/entities/beacon/mock/mockBeaconVibrationSamples.ts create mode 100644 frontend/src/entities/beacon/mock/mockBeacons.ts create mode 100644 frontend/src/entities/beacon/model/types.ts create mode 100644 frontend/src/entities/device/api/device.graphql.ts create mode 100644 frontend/src/entities/device/lib/phonePolicy.ts create mode 100644 frontend/src/entities/device/model/types.ts create mode 100644 frontend/src/entities/employee/api/employee.graphql.ts create mode 100644 frontend/src/entities/employee/api/usersService.ts create mode 100644 frontend/src/entities/employee/mock/mockUsers.ts create mode 100644 frontend/src/entities/employee/model/types.ts create mode 100644 frontend/src/entities/machine/api/machineAnalyticsService.ts create mode 100644 frontend/src/entities/machine/api/machineCalibrationService.ts create mode 100644 frontend/src/entities/machine/api/machineDictionariesService.ts create mode 100644 frontend/src/entities/machine/api/machinesService.ts create mode 100644 frontend/src/entities/machine/lib/machineFormatters.ts create mode 100644 frontend/src/entities/machine/mock/mockMachineCalibrationRules.ts create mode 100644 frontend/src/entities/machine/mock/mockMachineDailyUsageStats.ts create mode 100644 frontend/src/entities/machine/mock/mockMachineDictionaries.ts create mode 100644 frontend/src/entities/machine/mock/mockMachineStateDefinitions.ts create mode 100644 frontend/src/entities/machine/mock/mockMachineStateHistory.ts create mode 100644 frontend/src/entities/machine/mock/mockMachineStates.ts create mode 100644 frontend/src/entities/machine/mock/mockMachineTelemetryIntervals.ts create mode 100644 frontend/src/entities/machine/mock/mockMachines.ts create mode 100644 frontend/src/entities/machine/model/types.ts create mode 100644 frontend/src/entities/report/api/fleetReportSchedulesService.ts create mode 100644 frontend/src/entities/report/api/fleetReportService.ts create mode 100644 frontend/src/entities/report/mock/mockFleetReportSchedules.ts create mode 100644 frontend/src/entities/report/model/types.ts create mode 100644 frontend/src/features/auth/api/auth.graphql.ts create mode 100644 frontend/src/features/auth/api/authService.ts create mode 100644 frontend/src/features/auth/ui/AuthGate.tsx create mode 100644 frontend/src/index.scss create mode 100644 frontend/src/main.tsx create mode 100644 frontend/src/pages/DevicePage/DevicePage.scss create mode 100644 frontend/src/pages/DevicePage/DevicePage.tsx create mode 100644 frontend/src/pages/DevicePage/components/BatteryCircle/BatteryCircle.scss create mode 100644 frontend/src/pages/DevicePage/components/BatteryCircle/BatteryCircle.tsx create mode 100644 frontend/src/pages/DevicePage/components/DeviceActionsCard/DeviceActionsCard.scss create mode 100644 frontend/src/pages/DevicePage/components/DeviceActionsCard/DeviceActionsCard.tsx create mode 100644 frontend/src/pages/DevicePage/components/DeviceAppsAccordion/DeviceAppsAccordion.scss create mode 100644 frontend/src/pages/DevicePage/components/DeviceAppsAccordion/DeviceAppsAccordion.tsx create mode 100644 frontend/src/pages/DevicePage/components/DeviceAppsView/DeviceAppsView.scss create mode 100644 frontend/src/pages/DevicePage/components/DeviceAppsView/DeviceAppsView.tsx create mode 100644 frontend/src/pages/DevicePage/components/DeviceHistoryChart/DeviceHistoryChart.scss create mode 100644 frontend/src/pages/DevicePage/components/DeviceHistoryChart/DeviceHistoryChart.tsx create mode 100644 frontend/src/pages/DevicePage/components/DeviceHistoryModal/DeviceHistoryModal.scss create mode 100644 frontend/src/pages/DevicePage/components/DeviceHistoryModal/DeviceHistoryModal.tsx create mode 100644 frontend/src/pages/DevicePage/components/DeviceHistoryPeriodControl/DeviceHistoryPeriodControl.scss create mode 100644 frontend/src/pages/DevicePage/components/DeviceHistoryPeriodControl/DeviceHistoryPeriodControl.tsx create mode 100644 frontend/src/pages/DevicePage/components/DeviceMainCard/DeviceMainCard.tsx create mode 100644 frontend/src/pages/DevicePage/components/DeviceMapCard/DeviceMapCard.scss create mode 100644 frontend/src/pages/DevicePage/components/DeviceMapCard/DeviceMapCard.tsx create mode 100644 frontend/src/pages/DevicePage/components/DevicePageSkeleton/DevicePageSkeleton.scss create mode 100644 frontend/src/pages/DevicePage/components/DevicePageSkeleton/DevicePageSkeleton.tsx create mode 100644 frontend/src/pages/DevicePage/components/DevicePermissionsCard/DevicePermissionsCard.scss create mode 100644 frontend/src/pages/DevicePage/components/DevicePermissionsCard/DevicePermissionsCard.tsx create mode 100644 frontend/src/pages/DevicePage/components/DeviceStatsCards/DeviceStatsCards.tsx create mode 100644 frontend/src/pages/DevicePage/components/TimelineZoom/TimelineZoom.scss create mode 100644 frontend/src/pages/DevicePage/components/TimelineZoom/TimelineZoom.tsx create mode 100644 frontend/src/pages/DevicePage/types.ts create mode 100644 frontend/src/pages/DevicesPage/DevicesPage.scss create mode 100644 frontend/src/pages/DevicesPage/DevicesPage.tsx create mode 100644 frontend/src/pages/DevicesPage/components/AddDeviceModal/AddDeviceModal.scss create mode 100644 frontend/src/pages/DevicesPage/components/AddDeviceModal/AddDeviceModal.tsx create mode 100644 frontend/src/pages/DevicesPage/components/DeviceMapModal/DeviceMapModal.scss create mode 100644 frontend/src/pages/DevicesPage/components/DeviceMapModal/DeviceMapModal.tsx create mode 100644 frontend/src/pages/DevicesPage/components/DevicesDateRangePicker/DevicesDateRangePicker.scss create mode 100644 frontend/src/pages/DevicesPage/components/DevicesDateRangePicker/DevicesDateRangePicker.tsx create mode 100644 frontend/src/pages/DevicesPage/components/DevicesFiltersPanel/Datepicker.scss create mode 100644 frontend/src/pages/DevicesPage/components/DevicesFiltersPanel/DevicesFiltersPanel.scss create mode 100644 frontend/src/pages/DevicesPage/components/DevicesFiltersPanel/DevicesFiltersPanel.tsx create mode 100644 frontend/src/pages/DevicesPage/components/DevicesOrganisationFilter/DevicesOrganisationFilter.scss create mode 100644 frontend/src/pages/DevicesPage/components/DevicesOrganisationFilter/DevicesOrganisationFilter.tsx create mode 100644 frontend/src/pages/DevicesPage/components/DevicesTabs/DevicesTabs.tsx create mode 100644 frontend/src/pages/DevicesPage/components/DevicesToolbar/DevicesToolbar.scss create mode 100644 frontend/src/pages/DevicesPage/components/DevicesToolbar/DevicesToolbar.tsx create mode 100644 frontend/src/pages/DevicesPage/devices.mock.json create mode 100644 frontend/src/pages/EmployeesPage/EmployeesPage.scss create mode 100644 frontend/src/pages/EmployeesPage/EmployeesPage.tsx create mode 100644 frontend/src/pages/EmployeesPage/components/AddEmployeeModal/AddEmployeeModal.scss create mode 100644 frontend/src/pages/EmployeesPage/components/AddEmployeeModal/AddEmployeeModal.tsx create mode 100644 frontend/src/pages/EmployeesPage/components/AddOrganisationModal/AddOrganisationModal.scss create mode 100644 frontend/src/pages/EmployeesPage/components/AddOrganisationModal/AddOrganisationModal.tsx create mode 100644 frontend/src/pages/EmployeesPage/components/AvatarCameraModal/AvatarCameraModal.scss create mode 100644 frontend/src/pages/EmployeesPage/components/AvatarCameraModal/AvatarCameraModal.tsx create mode 100644 frontend/src/pages/EmployeesPage/components/AvatarCropModal/AvatarCropModal.scss create mode 100644 frontend/src/pages/EmployeesPage/components/AvatarCropModal/AvatarCropModal.tsx create mode 100644 frontend/src/pages/EmployeesPage/components/AvatarUpload/AvatarUpload.scss create mode 100644 frontend/src/pages/EmployeesPage/components/AvatarUpload/AvatarUpload.tsx create mode 100644 frontend/src/pages/EmployeesPage/components/EmployeesPagination/EmployeesPagination.scss create mode 100644 frontend/src/pages/EmployeesPage/components/EmployeesPagination/EmployeesPagination.tsx create mode 100644 frontend/src/pages/EmployeesPage/components/EmployeesTabs/EmployeesTabs.tsx create mode 100644 frontend/src/pages/EmployeesPage/components/EmployeesToolbar/EmployeesToolbar.scss create mode 100644 frontend/src/pages/EmployeesPage/components/EmployeesToolbar/EmployeesToolbar.tsx create mode 100644 frontend/src/pages/EmployeesPage/components/FleetReportScheduleModal/FleetReportScheduleModal.scss create mode 100644 frontend/src/pages/EmployeesPage/components/FleetReportScheduleModal/FleetReportScheduleModal.tsx create mode 100644 frontend/src/pages/EmployeesPage/components/OrganisationSelect/OrganisationSelect.scss create mode 100644 frontend/src/pages/EmployeesPage/components/OrganisationSelect/OrganisationSelect.tsx create mode 100644 frontend/src/pages/EmployeesPage/components/OrganisationsSection/OrganisationsSection.tsx create mode 100644 frontend/src/pages/EmployeesPage/components/OrganisationsTable/OrganisationsTable.tsx create mode 100644 frontend/src/pages/EmployeesPage/components/UsersSection/UsersSection.tsx create mode 100644 frontend/src/pages/EmployeesPage/components/UsersTable/UsersTable.tsx create mode 100644 frontend/src/pages/EmployeesPage/lib/employeeFormatters.ts create mode 100644 frontend/src/pages/EmployeesPage/lib/getPaginationItems.ts create mode 100644 frontend/src/pages/EmployeesPage/lib/uploadMultipartFile.ts create mode 100644 frontend/src/pages/LoginPage/LoginPage.scss create mode 100644 frontend/src/pages/LoginPage/LoginPage.tsx create mode 100644 frontend/src/pages/MachinePage/MachinePage.scss create mode 100644 frontend/src/pages/MachinePage/MachinePage.tsx create mode 100644 frontend/src/pages/MachinePage/components/MachineCalibrationTab/MachineCalibrationRuleModal.tsx create mode 100644 frontend/src/pages/MachinePage/components/MachineCalibrationTab/MachineCalibrationTab.scss create mode 100644 frontend/src/pages/MachinePage/components/MachineCalibrationTab/MachineCalibrationTab.tsx create mode 100644 frontend/src/pages/MachinePage/components/MachineCalibrationTab/MachineCalibrationTimelineChart.tsx create mode 100644 frontend/src/pages/MachinePage/components/MachineCalibrationTab/MachineStateDefinitionModal.tsx create mode 100644 frontend/src/pages/MachinePage/components/MachineCalibrationTab/MachineVibrationChart.tsx create mode 100644 frontend/src/pages/MachinePage/components/MachineCalibrationTab/MachineVibrationHistogramChart.tsx create mode 100644 frontend/src/pages/MachinePage/components/MachineCalibrationTab/utils.tsx create mode 100644 frontend/src/pages/MachinePage/components/MachineChartsTab/MachineChartsTab.scss create mode 100644 frontend/src/pages/MachinePage/components/MachineChartsTab/MachineChartsTab.tsx create mode 100644 frontend/src/pages/MachinePage/components/MachineChartsTab/MachineStateTimelineChart.tsx create mode 100644 frontend/src/pages/MachinePage/components/MachineChartsTab/MachineUsageDistributionChart.tsx create mode 100644 frontend/src/pages/MachinePage/components/MachineChartsTab/MachineUsageKpiCards.tsx create mode 100644 frontend/src/pages/MachinePage/components/MachineChartsTab/MachineUsageTrendChart.tsx create mode 100644 frontend/src/pages/MachinePage/components/MachineChartsTab/utils.ts create mode 100644 frontend/src/pages/MachinesPage/MachinesPage.scss create mode 100644 frontend/src/pages/MachinesPage/MachinesPage.tsx create mode 100644 frontend/src/pages/MachinesPage/components/AddMachineModal/AddMachineModal.scss create mode 100644 frontend/src/pages/MachinesPage/components/AddMachineModal/AddMachineModal.tsx create mode 100644 frontend/src/pages/MachinesPage/components/BeaconBindingModal/BeaconBindingModal.tsx create mode 100644 frontend/src/pages/MachinesPage/components/MachineSelect/MachineSelect.scss create mode 100644 frontend/src/pages/MachinesPage/components/MachineSelect/MachineSelect.tsx create mode 100644 frontend/src/pages/MapPage/MapPage.scss create mode 100644 frontend/src/pages/MapPage/MapPage.tsx create mode 100644 frontend/src/pages/MapPage/components/MapTrackPeriodControl/MapTrackPeriodControl.scss create mode 100644 frontend/src/pages/MapPage/components/MapTrackPeriodControl/MapTrackPeriodControl.tsx create mode 100644 frontend/src/pages/OrganisationPage/OrganisationPage.scss create mode 100644 frontend/src/pages/OrganisationPage/OrganisationPage.tsx create mode 100644 frontend/src/pages/OrganisationPage/components/DurationPicker/DurationPicker.scss create mode 100644 frontend/src/pages/OrganisationPage/components/DurationPicker/DurationPicker.tsx create mode 100644 frontend/src/pages/OrganisationPage/components/OrganisationPolicyCard/OrganisationPolicyCard.scss create mode 100644 frontend/src/pages/OrganisationPage/components/OrganisationPolicyCard/OrganisationPolicyCard.tsx create mode 100644 frontend/src/shared/api/apolloClient.ts create mode 100644 frontend/src/shared/api/authStorage.ts create mode 100644 frontend/src/shared/api/graphql/generated/gql.ts create mode 100644 frontend/src/shared/api/graphql/generated/graphql.ts create mode 100644 frontend/src/shared/api/graphql/generated/index.ts create mode 100644 frontend/src/shared/api/graphql/operations/auth.ts create mode 100644 frontend/src/shared/api/graphql/operations/users.ts create mode 100644 frontend/src/shared/lib/lazyMount.ts create mode 100644 frontend/src/shared/lib/motion.ts create mode 100644 frontend/src/shared/styles/_table-surfaces.scss create mode 100644 frontend/src/shared/styles/_themes.scss create mode 100644 frontend/src/shared/styles/_variables.scss create mode 100644 frontend/src/shared/theme/theme.ts create mode 100644 frontend/src/shared/theme/themeTransition.ts create mode 100644 frontend/src/shared/theme/useTheme.ts create mode 100644 frontend/src/shared/ui/EmptyState/EmptyState.scss create mode 100644 frontend/src/shared/ui/EmptyState/EmptyState.tsx create mode 100644 frontend/src/shared/ui/ListSkeleton/ListSkeleton.scss create mode 100644 frontend/src/shared/ui/ListSkeleton/ListSkeleton.tsx create mode 100644 frontend/src/shared/ui/MotionDialog/MotionDialog.tsx create mode 100644 frontend/src/shared/ui/PageTabs/PageTabs.scss create mode 100644 frontend/src/shared/ui/PageTabs/PageTabs.tsx create mode 100644 frontend/src/shared/ui/RevealContent/RevealContent.scss create mode 100644 frontend/src/shared/ui/RevealContent/RevealContent.tsx create mode 100644 frontend/src/shared/ui/TableSkeleton/TableSkeleton.scss create mode 100644 frontend/src/shared/ui/TableSkeleton/TableSkeleton.tsx create mode 100644 frontend/src/widgets/ConfirmDangerDialog/ConfirmDangerDialog.scss create mode 100644 frontend/src/widgets/ConfirmDangerDialog/ConfirmDangerDialog.tsx create mode 100644 frontend/src/widgets/FullscreenControlLeaflet/FullscreenControl.scss create mode 100644 frontend/src/widgets/FullscreenControlLeaflet/FullscreenControl.tsx create mode 100644 frontend/src/widgets/Navbar/Navbar.scss create mode 100644 frontend/src/widgets/Navbar/Navbar.tsx create mode 100644 frontend/src/widgets/Notification/Notification.scss create mode 100644 frontend/src/widgets/Notification/Notification.tsx create mode 100644 frontend/src/widgets/Sidebar/Sidebar.scss create mode 100644 frontend/src/widgets/Sidebar/Sidebar.tsx create mode 100644 frontend/tsconfig.app.json create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.node.json create mode 100644 frontend/vite.config.ts diff --git a/backend/.env.example b/backend/.env.example new file mode 100644 index 0000000..6181c8d --- /dev/null +++ b/backend/.env.example @@ -0,0 +1,6 @@ +DB_HOST=localhost:55432 +DB_NAME=fleet_ble_monitor +DB_USER=fleet_user +DB_PASSWORD=fleet_password +SERVER_PORT=8080 +SEED_ENABLED=true diff --git a/backend/.gradle/9.6.1/checksums/checksums.lock b/backend/.gradle/9.6.1/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..237bd1cddbcef5a31ce107e31405eabd709e9119 GIT binary patch literal 17 VcmZR6=washvBETx0Ss7Q001w}1dsp# literal 0 HcmV?d00001 diff --git a/backend/.gradle/9.6.1/checksums/md5-checksums.bin b/backend/.gradle/9.6.1/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..9eeb3cf6551f3114990a7c0684070fefb0c31b04 GIT binary patch literal 40347 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 xCa|7#Y~uY)0rvzjxmSJ~-|nf&~`PH)vt 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�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
w;f+ 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 literal 0 HcmV?d00001 diff --git a/backend/.gradle/9.6.1/fileHashes/resourceHashesCache.bin b/backend/.gradle/9.6.1/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000000000000000000000000000000000000..df5958388dbf6e2d309ad9b37823fd32c38279ec GIT binary patch literal 20265 zcmeI3`BxLy0)X=r%mWER*(3s@Vq`6ifCPlHhbIXOsi>nCtJ`DI-w-fA5%$f@*zXf=|F8(*9%F!C z-2C8-SkrtT!o73>zruPyzb^maa@5}g__dn*H*i)L(D8jj0Iz)MkS?!JDMkHLfZzIO zvBvMM0YZe+qXDnx2->5TJq|-S?Ihqe?go1zpZI@+aGyHBYyEI#w8e1&>Nf!Xh!@10 zId}ge!o3-Qw_RT)77V%IZvAHuwek_}!vdVjG@q0+ zkf)=*0^qdj-18aBC|eQkNdTPQ;L~rjwmBQ&G<(2(>w;V)Whu_6-vjv0b+sER{jI2| z9}0Nz>(Kw+%-m&+a1STI!*4OBsrM>2BHZf=;QLtue`~FDSA_d)1^nB7`T5bUJ*QFr z2Jk52a6u?}E)*Td0r2Q(b-T?bW2Oja-~m6<7V|stB^x{+*nr19$eFcBuO32t&sf00 zFAgU+g&c$5umCIo3%~-f04x9tzyh!UEC36@0*`(#z9qD=k8Dqm6=No%ITij&#vo4`e{h0JEdKu$T z4*pj;aYE8%W(1>rVSO{!;L4wh|7o+vKw@%jL~~EUHmq^4+U4!-Z9BqD*Xy+y|9n^a z?!C-eRQgXSPA+@uc)-1Tpuq9&3#?Hn2{OGL$F(8#@v78V-N&#--Wrj7P;S0Me?TF3 z>^MaiYwRX8rdko6X5APS1qfzp^a8zjfvPVh$P;UfzTV!DKs{KP!C0`IqBz=M4Yv@Hjbd#6^3{c} zofgy;G_gjJ#9F^~kvJAN%zdvH8T1$PP%Jc@TrEg_p60U0bim=b^wyB6&NDE?>kM+z z$TUlWuajyq)>uFL)=fg({+ioJu?jjM(PSy&^1=KO%KBVHe= zu+nEgEx>N%M%Rx$aYq_Fu*Ot_>k#`D{~@o{tiL=$iJ{YCGTd-{hBt0RAPVGW(R)3aGb?+=mN zgqL+HI!3X^(EajG6TwuTO2a0Lx|H_6cn0a?qs;bYguhQ4n5>l?TIY)$BSfh<)vaUd z*UnzIYaN<;(v?UuGj%H?LQ82AAfks2GQ=7N9mI-;p@BPyhoQ)e3jS?@(r6SU zF$z>ngd}fD;W|VFnZbk(!!XE$=s_aPKS|W9dmbdbNl3)^g?Ib$-Lv1j_p{?$W*C{r zf5~C&9_hPFRtO+~00IagfB*srAbn3y)*_?3y!^*?)3F@?*fXln4|?X_&gE^s&XHcL{Z4UWXQ*=4FTG!T=uygIq-pt$ z^efuO&(8b%gYUcI{gSDDGGM+KuP?eL^G(_#v$4D3!Ko#gU(o(;=415y&BqU9KA=5X zc45QUy4WG}ue5*i+NLsW538kDYG1k6Q9FF5y-xaf?OV4U;ov~dG1=d({m98LX=9@e z%`zX>e!}eXUR`qAWd5c0tU-Ip<+fG3%=c=~_EfLM%&!eHe@=V;vkw=)g>IC{d{n#p zlrJ~Y(>EmZN!lx%TaFr+?Wy!E?cV!OMp{M+e#$;|+WmoBpIxaFF6pJ(8>bIHkF2hr zmOiFk-wh){{`>d@uLvN300IagfB*srAbE_O2;l + + + + + + + \ No newline at end of file diff --git a/backend/.idea/gradle.xml b/backend/.idea/gradle.xml new file mode 100644 index 0000000..f2c1963 --- /dev/null +++ b/backend/.idea/gradle.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/backend/.idea/kotlinNotebook.xml b/backend/.idea/kotlinNotebook.xml new file mode 100644 index 0000000..dfd5d96 --- /dev/null +++ b/backend/.idea/kotlinNotebook.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/backend/.idea/kotlinc.xml b/backend/.idea/kotlinc.xml new file mode 100644 index 0000000..7ca2a83 --- /dev/null +++ b/backend/.idea/kotlinc.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/backend/.idea/misc.xml b/backend/.idea/misc.xml new file mode 100644 index 0000000..58e94fc --- /dev/null +++ b/backend/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + {} + + + \ No newline at end of file diff --git a/backend/.idea/vcs.xml b/backend/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/backend/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/backend/.kotlin/errors/errors-1784081388339.log b/backend/.kotlin/errors/errors-1784081388339.log new file mode 100644 index 0000000..afc4f91 --- /dev/null +++ b/backend/.kotlin/errors/errors-1784081388339.log @@ -0,0 +1,3 @@ +kotlin version: 2.4.0 +error message: Daemon compilation failed + diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..064531f --- /dev/null +++ b/backend/README.md @@ -0,0 +1,161 @@ +# Fleet BLE Monitor Backend + +Backend starter для системы Fleet BLE Monitor. + +Стек: + +- Kotlin +- Spring Boot +- Spring GraphQL +- Spring Data JPA +- PostgreSQL +- Docker Compose для локальной базы + +## Быстрый локальный запуск + +Из папки `backend`: + +```powershell +cd docker +docker compose up -d +cd .. +.\gradlew.bat clean bootRun +``` + +После запуска приложение доступно по адресу: + +```text +http://localhost:8080/api +``` + +GraphiQL: + +```text +http://localhost:8080/api/graphiql +``` + +GraphQL endpoint: + +```text +http://localhost:8080/api/graphql +``` + +## Локальная PostgreSQL + +Docker Compose поднимает контейнер: + +```text +fleet-ble-monitor-postgres +``` + +Внутри контейнера PostgreSQL слушает порт `5432`, но на хост проброшен порт `55432`. + +Это сделано специально, чтобы локальный запуск не конфликтовал с установленным на машине PostgreSQL, который часто уже занимает `localhost:5432`. + +Параметры подключения по умолчанию: + +```text +DB_HOST=localhost:55432 +DB_NAME=fleet_ble_monitor +DB_USER=fleet_user +DB_PASSWORD=fleet_password +SERVER_PORT=8080 +SEED_ENABLED=true +``` + +Эти же значения указаны в `.env.example`. + +Spring использует переменные: + +- `DB_HOST` +- `DB_NAME` +- `DB_USER` +- `DB_PASSWORD` + +Если переменные не заданы, используются дефолты из `src/main/resources/application.yml`. + +## Полный сброс локальной базы + +Если контейнер уже создавался раньше с другими `POSTGRES_USER` / `POSTGRES_PASSWORD`, PostgreSQL сохранит старые учетные данные в Docker volume. В таком случае изменение `docker-compose.yml` уже не поменяет пароль существующей базы. + +Для полного сброса локальной базы: + +```powershell +cd docker +docker compose down -v +docker compose up -d +cd .. +.\gradlew.bat clean bootRun +``` + +Команда `docker compose down -v` удаляет локальный volume PostgreSQL. Все локальные данные будут потеряны. + +## Тестовые пользователи + +Seed-данные создаются при первом запуске, если база пустая и `SEED_ENABLED=true`. + +```text +admin / 123456 +admin@fleet.local / 123456 + +user / 123456 +user@fleet.local / 123456 +``` + +## Пример login mutation + +```graphql +mutation { + login(payload: { loginOrEmail: "admin", password: "123456" }) { + token + user { + id + login + email + role + } + } +} +``` + +Для запросов, требующих авторизации, передавай токен в HTTP header: + +```text +Authorization: Bearer +``` + +## Пример списка АТТ + +```graphql +query { + getMachines( + page: 0 + pageSize: 20 + sortDirection: ASC + sortField: NAME + ) { + totalElements + page { + id + name + licensePlate + lastKnownState + beacon { + identifier + macAddress + status + } + } + } +} +``` + +## Что доделывать дальше + +- нормальную авторизацию через JWT/AD/LDAP; +- миграции Flyway/Liquibase вместо `ddl-auto: update`; +- полноценный алгоритм распознавания состояний из телеметрии; +- генерацию XLSX/PDF на backend; +- scheduler рассылки отчетов; +- права доступа на уровне GraphQL resolver/use-case. + diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts new file mode 100644 index 0000000..0dd7c8a --- /dev/null +++ b/backend/build.gradle.kts @@ -0,0 +1,47 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + id("org.springframework.boot") version "4.1.0" + id("io.spring.dependency-management") version "1.1.7" + + kotlin("jvm") version "2.4.0" + kotlin("plugin.spring") version "2.4.0" + kotlin("plugin.jpa") version "2.4.0" +} + +group = "llc.arma" +version = "0.1.0" + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(17)) + } +} + +kotlin { + compilerOptions { + freeCompilerArgs.addAll("-Xjsr305=strict") + jvmTarget.set(JvmTarget.JVM_17) + } +} + +dependencies { + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-graphql") + implementation("org.springframework.boot:spring-boot-starter-data-jpa") + implementation("org.springframework.boot:spring-boot-starter-security") + implementation("org.springframework.boot:spring-boot-starter-validation") + implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("com.graphql-java:graphql-java-extended-scalars:24.0") + + runtimeOnly("org.postgresql:postgresql") + + testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.graphql:spring-graphql-test") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") +} + +tasks.withType { + useJUnitPlatform() +} diff --git a/backend/build/classes/kotlin/main/META-INF/llc.arma_fleet-ble-monitor-backend.kotlin_module b/backend/build/classes/kotlin/main/META-INF/llc.arma_fleet-ble-monitor-backend.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..1ec3feb1c0d22321fe1763c4c598a5e605b49cd5 GIT binary patch literal 80 zcmZQzU|?ooU|<4b79a)#E;BB%oSbC6#G>3py|kRv)Dpei{JhMP{30P4HxSn;C)F1s W;8;+QlbM`Yl9`|9U82OG#Q*?m9Tb27 literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/FleetBleMonitorApplication.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/FleetBleMonitorApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..f50afa9f0966cdda5677269c9c07bb203fcaed0a GIT binary patch literal 672 zcmb7BJ#Q015PiFMXPZkPPWXregs&&!m{7N;#2Pqn*vg zk!Rgh9sl8-`8?H$blRFa7(??+o=cHRGZk+}XDV@Z1Prwonob`w1UruhtB6pG5u(lz zx>H>+JnjGYZO<7F`!=77VxDU=o#Zl8?`=L4BWsF-VA3fyGiKQS zx7)ijNA|t4W5ux6*G9cAvysZ*NovHf(YJ|A2Qt^5Unb)dTjq&6(q6Ikwlq#>YM={E zl8!OfRckEp5S+H-KN{UHi|`IHQE?!8@)eCQl;F5a=*u3r30JE)!WG0-{a%H)ai9Jj v(yvsS2v>&)dbrlZS`SUE_ppKMJ>0;}Ay|Q1*c_r(ATH1<5EVY&DzNe!MV_Ir literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/FleetBleMonitorApplicationKt.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/FleetBleMonitorApplicationKt.class new file mode 100644 index 0000000000000000000000000000000000000000..6cb8944553351fa45db1f212508f5732d8ce0b9b GIT binary patch literal 2156 zcmeHIOLH1W5dLO)W`kvfWhIhg2OAOtvRFXQOGL4;B2`gBvMZ#NO6fE#175N0lHFM% z-}GB@$~8At4lb3C`BAC#0FqXY3YVF+C8?#-gMs>jcm*0(sG?$nE+!*AMr6aZ0_`pC!HfhVzOnDh{lK>CNhBC<4_s+m zj&U>|8kQr4=WyF-IttLYOg{mg;imaan1k81r`+R1K?fP`6+&;AzOf#XT)ZlU6t3xb zA9Lqk1=6yOhUf9;WFgHEH{H?mCq0JZ6~AVf&0^TunJ|S6Zs?fD0>h24er7g-MTY8I z2S0%i8A>X6{zwJ2r@Z~y^#(@Ab*0gs2t&zAV3{G}1(cIcI2>Cx_x<{7-c_7r=2dXh zrPv=!W6O1VRzL7~#}*+gBv$Hr3LoK?juqTyNRrV)xm+$Lk!4s3=V<$Q})%3Jwfp00+_8Ca7cp_r4m#tieV87cOJB^q({fJNlG^f8`s`#`tFT%stt}@r(TrA!Rw6HdiEHWD z%U|Phg-~M(_bz3vtV(8MQZj24i?vzVtaZ3K5Kfoj);||ec_1l==T2NYa6xWl5I70zSc~ zbSjNS(kzli!Uy#`n!l!xx;k|ST5Qr6qr#>sif?Gt@EIP`6aS|<{pJ0qG{++f|0Bvv zfyhxjM5KvQ6RShk)ee#H5%aO`s|Ahpi~D$h2BFLm%IEZbF**I^ EUngUJH~;_u literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/config/DataSeeder.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/config/DataSeeder.class new file mode 100644 index 0000000000000000000000000000000000000000..4066ca8d3ef77a9093c176c9e4563486f614d776 GIT binary patch literal 12790 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 literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/config/GraphQlConfig.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/config/GraphQlConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..efe3f955df38a3dca29d4e7235605897469b0fcd GIT binary patch literal 3052 zcmbtW-B%Mw6#vZzvdgkSOhph|Kakb{g+*I!D=Gpa#76vpVwHYPk|8YF?BdP_@XhD` z8GY(w>x1?9(BrXhJ^h<{dS`cIq9Bzv=VW%~&fMRP`SH?)Y#!9O zz2*uL+BM&ELO-xezPIL7?D>FiuHSKIqm>TEklEl{+;+KFv2PVOL@CsfVn|+bXOf{WsC%JP6Zf3J@hY+SdLROZ>D+L^4=T3YR6A<{ zuZe9xsM-~!=|k5RJEBw%9pAI>?hQfcV|yadl|!);+T8Q}kVgW*6$!Q}8t20aWX-*U|%m)DAAJ~YAb zAa@|s9Yh5ShmbX);k}+T4l@ikUF&#TepT3oNR68!uZx$7=Dp_sJL zkE15~FhC|b#?TSx0fioecQ8-<-!QfC0gh)WPfsv(mw70bDIbOI+6~J_h58 z$$pLXRk&L?gPe(vFicVQ?}}SEjnNJ|{xKD(HSTkt9NR(Rm3bwWIvvX;j-l zCpKxc;sfY_Nh``tqNF0`^R!au^pWQ{3H(CSm|bNA&`mJe76?6ocu0FnKo@<3WZq3* zO(hf2m0t5CLP7Uthn`{N3C5n{lc%_FKl}MJTxkmGrenZix==6ab)-dDZz4=ndASR8 zIs%>D544{^j}qv>9-srNvmt$zrkuX&wx>q3*PkIj`UHiixO;Du47%Kytf)!Tx><5X z8a-s747CD>$ab-rj>JH?7Fn7gF^7AkyCnDy4c9Ut0wp#=8kKw-4mRkbi*TcFo#+~B zP!?XI+1K>FPxpARic}t}d3=+{xA-oP@9{&PG%v1#Nt94tg(YE12#Iz{brYQuYZ6@) ZI1-~0QxX+Pa9aeZ;^BR=dxmVD`3GL9L=^x4 literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/BaseEntity.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/BaseEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..5483fdd213e96e51cb91ceffd3c07f9e6ff8bb95 GIT binary patch literal 2275 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 aI}icZP}@N&z;J+v0g{277Xy?6)c*y>Sk&ME literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/BeaconTelemetryPacketEntity.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/BeaconTelemetryPacketEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..6099776d2f1aaac143ef6b890a8a8952c9d5becc GIT binary patch literal 6176 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 literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineEntity.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..e785b86b4662d18cd149478f374ae32dcf626ed0 GIT binary patch literal 7599 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 b;sc2fB|egvmncarNLUiTkoZ{Q6I$he3x1nl literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineSortField.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineSortField.class new file mode 100644 index 0000000000000000000000000000000000000000..db3159016fc99008865b742257ebc4359420c9de GIT binary patch literal 2019 zcmbVM-BTM?6#w0ukKHU=NFyRptlCBm!LTVvtw1RhLR|@=5{lONa!IzZu-Tp2-7xxw zFa9Au`KT~snL0Wd9{WdiJa?1Ybg+HM&g{MC+JPekb*cva?z$ZmKa8IJ$|a8Z@c>o=HxCzEGJhjYmx7)E1DL=l@8hRo#{7???69t)>sk>xwN$y%SrmF(_H`BACLaJxSfI^Mx> z3LNh;q+emVwRdRMLj~_KBIS%<&v!%+;wkhj6{^l5U zCl8$2M;1(UMt?bajZ0F!}a<*6}4CukAC}^ZK zprWW^R>x<^NS@-kTI&HiLRGJ_cbhImE6C? zVABeP94-_RZyv{J4sp4}IAK$>zr@EQ+=Pva@Hd}`Qh+bx=@P0MtT?Z76rl~>I}yMpGxc0_PR8l+D_3PXgSq%@>S<6ELRRD4H!iX)WbS51o7%|d779V%hNq3#Z zPchXo--+xKJSNE`-F_NDL63oG=~8M+mt)Dl!8h`;QyA4esn1mNiBrr~^BprPZc}<4 zm2JdH0hs>_{Bh=s*i+m&gAp-b#v^7XV&)SOGk1=~GmKE$Z7iK*?F>^AX7(D)u`Yx$ zd{1{ARn%x-C8-kCcfE#~i3cXWGGXFt6B{U-*hHlU7GMhxYfu9W2KXjGGJq1G5TF=f HHo*43fqUna literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineStateCode.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineStateCode.class new file mode 100644 index 0000000000000000000000000000000000000000..7d28c4652fe27510c2de2d72b0b7c91f2a99b46a GIT binary patch literal 2085 zcmbVM-%}e^6#nk!$8MG_q!AG)w%SGw!LTU^VnY!M0arp&360jMxFp-Ku-Tp2-7xxw zFa9Au`KT~s86BMrkN#1P=kBI99c&-6Gk5Pj_nz~ebH8)$`TL*W{{nCy-!jZwRzua@ zwyr+048vF3j&1smt2T9CR}I@Y{qNNsy>V#TM%CASW8G;QA{fI~=}14(RZF*9YSHer zmrDa66;=ui!!H7fh%&^NO^RcMVJy?kzPFJ-3d1A>d`+FI#RvC6PG7=(h? zFq(jX*BO$}xvU%<84X{=8w|0A<=8~fXlA!2~8{jN^ugQ3f%%QsoJQ_CM55 z4|vH~fJzzY$6U8`&nxsr)XQ&wki4`g#G81Vr}8#syk+=Bn+k!`K1CNgc6`gUsa88} zFQ~-cDOFbW6~}|u>z$J0w$vlTKX7%^_Eg=r9eNt3L+i5Rmphh4zNK`rytk|IyiUG6 zMgkg?Ed}%8)(3=9 zuIz8D?X4+T4EH{yNR}H!5WOY|IhpW=B;+N`OITF!K2m(^V}|SXzC;A9i&&%BUq{;p@El5QRefBtm^k;J+yUfnMD)Ur_%M zzBBnMPpc+zvEDsZWMN#8g=A6|BvHEj@$v^@yn8w)rJ^Yz-#yK<2MI~I{3#xlgkMpe~-*Bm@Z|ruc z@3sxiJ~2I$%+{V47}bB(>9`GJ)8z0IJ=NM3#nro%)))~KU!CBE1kg;S6UqwCz_cRt5(Eb_5e#2B3Z~j8NT<0ckkulfF(9B`w zl#so^oh}5f!-61`@PvXHp*`*>#z^1*X}r_BPO|4DdWM-0K8);Ld`+5hI(;vof*uB~ zxyu={4U=lu}ONNH~h>{tw^#_EzSRgC}!b&_4mM*Y*jxl1Qiw76@tUOufOqG4M@Ny84x8Y+0G;WO;k!8}y4S4YCbu!lz;;vPf~IS+Xc^BxvG)cyqy Cu=GIy literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineStateDefinitionEntity.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineStateDefinitionEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..dfa96874e3f4834f97212759289ab00a6f8c9519 GIT binary patch literal 4240 zcmb_f%~Ko6760`hjYdKigKPl;e*nf91hTMq*T#U2ZSaS71?vDIyLc04kj5||jU4sJ z6<<=ElUpvSz2=e}a!9H|IhCYRE^^BsmCCPYgpgPTds9)>Ouz1a@AdD!ejlTM{rj)~ z0B{fc0*mExF=y2(R_;~Vw!K`X>N;MvmMdAFm9t&X@!sZEtm3ZY+UuU>*~|7Tha67T zee7>WAOx}>q2!Sz?PHNH0ewNKxi9d|L}AZ*W97=0yOS$a-JSWC`MOtg{^ymg$xQ*x zDG7vJt73C-id9!2T&$L>HG%GuEsHhhwK7J)aOC=1>Dd*5u|l=BliRbs?V9DdGH1DN zm9~>j=2q+Fvb9~d=LN2w#a8tc=ez+!;PQUeD?4s(?@cA=xSm~et#U5!D%+$}lo6N$ zsp76(++PjEo?A5nCZoXhR`-0ly=ND_4i1{!j3bHjG4$esfvAC)K-Yv?4PzjN5Yhr> zi(h>|#}UC$6dEoHBwIEcPLIRDWwm`Jj%YxQ#1RXqt8sJ()HMOI6-OM`74HPS?Cm;I z;9=n-g5s>mqKALgYW)8Sb?3>Z?asv7%~ zn+84$wB-HZR_p;~Q1em{=>``YWP+>9t#O~=UfTlWW=kN-<>Pz^O)!;|<-R@$EV{J0rM#ic+xLdZ}9dDO2gR{=6f;vT2Lmf}r zXcT~SB`Az9rK*fCOU=^A@b5j2uNB*~R57JCt@1{J(9|o$v|;(xe(tE*45`vhq4mB$ zSdM7}n*Y2%h-qdt<`0ROW`sEH<``+?P|QX+STfGFY#IFn?+Cm7y6ZR>+Nkx20aT-2nupi}W?C7_8$mllXYqQ5%X8RuWeRcGk#L=%c%}DZ{ zFwXOo3rXFG&7@}gC}9$A?_kI{XC_8NMvrN(-3iWZk?k{vh~i>0WJJvO2P7}~q(<=s z4X1R!IY8;OIk=WJeXK3g@iyrbnajS+6<@};>LX-^eVGx;%pKd`BGun=l9r4bW67}5 zWgZ<2pBy^sE4b<(>N~AP{J#N>n%8LDxOx4bzZ9A=$#>ky&AiY*+pRd@Pj&!Kv z;YllGb~N_#?wby~p`~hxO}D4OPlwfdW!tX#d82wwwP=+$t(v3qsIfS9T353NwjF6Q zop!6G<|Z@k9KTD7`zzM#hNjqhwO%XQPn@!i5!R~^^GoN*X2W-gZl6>37|oit`=6jU>IM2r4Pw!l$^G0w1&Gme8u(Oq#|!vH2Z-eg36%5j0_FLEs43gO9$^;l>H-aw}Y= zx()7pN4TS>;if(aci}9!qo?5p`o2HhdmZ79orXK`LAdwNf;)B^ZlLe`!(HqMclIA15PA+doUviNPjKvy0=%Hyj%8`sx)wv(+qUf`P-5E4JePhMbJVoKtrkDiM?DmWcb)u!JsgQ{tAyCla4Z3`snZcq;KsA}{f|#BGT?60;I_CBBeYl_*He gODss-lejOjDDgnzxx_<>M-odCKb2UMSSQ&30DXKD1poj5 literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineStateIntervalEntity.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineStateIntervalEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..fb7804eb716a14427bed7eb9f892d840670a8bae GIT binary patch literal 8612 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 J2z<&7`!5lSQfmMJ literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineTypeEntity.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/MachineTypeEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..6f8735b112e1be5b1e5448d3df0e8a57e60b21d8 GIT binary patch literal 2998 zcma)8TT>KA6#jblHoGi1EG%+UQBh%G9lU~o5yeY30W?U6(TCKqj4-l0OQvV3_>$r| zk9kR@@|LGOCRMRaF<1f`t<(u@1K7GxQQnMS8KJZ zX?bf%W$8UJ%y5(D@?fQ=Y(poEF90+S;PFRUHQtXb}cxzKPoW@7SV-*Z~7jIIi3&bmO-wd%G&+qx~Qp0n*c4Od`z zq2X4PRN#=+FgDZZ-UxZarR zw&z+kv*Idn(y7V}+69W$O}o0a6uLdKJi?-(z=e2z57%DURlh}sqpNuwgONiAIt3CV zN=~6Gha|cMj2I;WMR{bd=dk}7}GkpkBjKH#+8IcL)K zJf6u1pHyX`6?u2<=T@`k&+|lluUTc8En41|?aiozCHm7U{dA5goE1oI*nWj)T^JdS zL##cTevi>^X6vU$KTdKD(f>z&A8*A#56cAfn`o>Yx1ZV4) zgm}2OJDbybwcvkmH>VldTrhOxG+jTWQATwr;~cd(3hv)*iH4!^*q`Cp=1AhP1Du4LqA3jqmb5f6P;59 zdKkpj-k;R7M(#{fZ!_}ClVRkTZ;yVQJN6b-^u1k9`+})P_YS5+?=GX8-bJHldD@83 z#QcxP{Ix<>A1tKwgt5On^fo|$5MaRQ`TIMe=_mQk>!-L=k~`@mL;Js^PbgY13z#3$ z4BobG9@QCkkBjP+m=0cvGFxdmdMV0lR&~pEc~iUJ=^q!je1X2@CLfKuz3NDZez)JY zWfoDStGGKYw8{C#I@|oQ1wKAY&H9?{1?8o>U!!W(RxQs_jz2}XZvHHIV@V+QKa1CM$@a>_nn%J)4bM6mSln>+b_QlDRpwZ!tpBa$u%3-F^NYM z(-dS2*!o5Pg~7p1?0hWbJ%zI?>I)KIHM3x>6VgCvl1r z;{{2w8*>)spk@kV0xMkYN<=C0^`#i5`#ERr33{r=p^(B*Scj-qSgYJ4&2hMxOn&<# zQevT)OmUJfoLMX;Gr`hQX>7dw8p9##Ra&Qz$Yyn@1kMCu)$@0Z!SgUsKo`e;6fwy0 zEK?LXhw~&wZD>+bDWpojqxV-%v>=Q+9WaE-J0BWEdB@L=k2gjlmZ#~d(K;P)`(DA2-tfQH!$_@o zJp}X}Uis6ByC_~qgPRDnm4pyRM!d#l#fFGMY>ODs@C7v*mV$fz6ZyPFd5*Ta#BJPR z9nL>PqJp~>+^g{R-mma>KB(YhRGvXde1cD(;k3jli3Q2u6KYOZezTIlQ;?Q8Cvjfl vg2aeKkHi&;s}k2Fu1icxlqAL^#wE%UQxY>0HzZ7n35lB$ixRga=7{A#_EcU( literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/ReportDeliveryStatus.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/ReportDeliveryStatus.class new file mode 100644 index 0000000000000000000000000000000000000000..2e6892d43ac2e8226df3d41892ca10d684d89561 GIT binary patch literal 2114 zcmbtUT~pge6g?|{NEQk>E~P+d(k5fT1eJq!uAf-8L1rLIkqZkz}TM zqc8m-ed=QiGY!*DJ02eUqcXWGJB>3mc>v9 z$!Rs`%V+dfSST>`zwS&#lp#KEQ9cU{Lz$jfdf-{kPC*;rVu)n;Urw78KkXPzli@-~ zaJ`1*7`B2qL>V#kF+_tWmd|kO%y}}TPUpeEG)i^fuv;d1pU;ff&JjRNZxze;OFF~c z+1)632ZIR+c$Xph3fGP8U9%pDc#k1gw_S(88qAFM+^C~aP%wf~8N;|FVvs=$ueR}+ zVf}x~Fn*59#zM~wGrfM7Y{T~pJy~_@-J2+<8>M*}AM(;(B?j!6LCGOv@DhyCrS{yw zwjAPctLcaA?4Ap=3cD)^S*9^8j!*YDpa2%K3i{;X~;s%wLZBu+HU8-zW zHD2SH9|!-xqU18Cyu77K3QAa!v5Zv;{}QBiGcb5(A`FG*euSEsz<*Kx13kk% zzM#e={Alr2o>mP4VyS(g$ilE73(2G`NTPJ|^T|)baQk3NN<~vbzI~8qcN3Cu@=H7_ z3CYN=AVq1!XvArVC%?ue?rMthC|9Y;P4bpG7q-mYwr%FRZ8NuR)b~uMLAY|1{K>t5 z%CO`%=%EdiEyt|1n%kzgX^;(XC2rlYw+zqXa(6SKTRRSQSdSEvbl)d#RMr>)6ki$# zL;?eZBVWl#l0}Wy0wjDxb3#BO3CJ`OxQG-f@<>CW0qq}R=nssw@&0eL%XKc}3K?^q z49(oFoD#CfxYmZiby%2$(mA1I25655iZK$ngET(sUMJZN5R! literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/ReportFormat.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/ReportFormat.class new file mode 100644 index 0000000000000000000000000000000000000000..9c081df260196119b336e1f9e571d4553245b498 GIT binary patch literal 1938 zcmbVMT~ixX7=F&?YqM-2O%Z`&t8LT}3>&cZqd|nyppg`iP{iSCNw#!hv+L|`7`?+A ze~4FJD$H2Mj!uS4f0W~MHmOYq+Zo7A_Ppnu=ly!#_q>1q^T%HRKEt+v;W!P$^joI! z*s-k8XnC$3dcM&#L({O_&<=kvHmvVFKV0^R3R4gQOSOIT&@>#=-7_j~yERw4pq27` zSzz#GBPqlMl5;lw&kKy?`+U?x-*)%P)yXY^SYCd$oJGGm*KAn=SGpU|Z`!Wu=tv@^ zA%Ovbc=*H)1ZFNApFsA!e*sZth=-=rwrKTEesbp$hEut%#oD7vU10X&>N>7rI1L4F z2xMOHx3;@)HCUTB1riO%b4ki@ezGrvE}*Pq4C5L`aXp1$fmD>r+GByr|Ij^oiR2QI zMS;8h_Ldwo2+DoY^y=9kpllbl-7 zJ8A7T*O%+f+cnSMGxn`;*Eel9Fih9=LNl~I%Bx@Z2iHqjv@x-%`{teyH?-UQR*Jd(D+<~`SLNSC~CwEs3__909m>DSm5eT zAEOa{DSXO6Ud7W2`-3qLNCN*OwwOO>vj4GOv$!Ln2P|tok`%xL~9L=iPcvdNOj!NQw zT2;<|PR3Ow6WdqRIRA;WUy?~_Vpd4&w>WsF<@mZ6jj!UaV-d5ErHB4vA^liEC9j5E{o@<6}pMVVWeBw3NO`kI- zw0w5u^^GOrM3P9(HpH;bU4^S8G*y_IcnbYDiVD7tV5A0VZ1DSb7lJF&Ab%;I50N)1 zX~W36!2jA_blwW8`;Cbnw=%Je8OmxJhM+$#a!vwX9M& z#qAChi4jo{diRFG4Dn1lN(gSGfgIlLrIYD7i63LCYrY%Vdw4`-lDF?iRPX^%mM(8n zQ@XsC_!G)XA$AO-UZDDHz0ftF;zK6Z1y>L!6evD}@@@7`>?!V^z=$><#iPyaDLy&D z2y^V<-YFJNFeNz^FL4^{@fE`s?-Z=z8?FmPEwYIBcMz*$sfq_xmS?$&FYsj*ReZGr Y5nu(i9i##b26z}C8A!PppcG*BU-VejAOHXW literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/ReportPeriod.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/ReportPeriod.class new file mode 100644 index 0000000000000000000000000000000000000000..fcee52b44e975d4cefb17442ba3d63204b27524d GIT binary patch literal 1893 zcmbVM-%}e^6#njRl1-KcLPP|LwYE`{U|7J`)&>wt)4Gx-F`=31+EhA zeZv?35TAThn6ZqGPKHPSD93X*X`2qVGmx3=J@?-4{QAzh=bwN7_#41Fb{TZrZtL9Z za{Z}ont|SR9V>7>y~6{pn@(T_Kj<~{JJ$=Urf0bw1&m?4w9gN@ZgXc(FFL*MTIqsT z3L6E6iPw!Nh%m&~Eb_m>Fq0YaQ4c)J*((^?27{atUo~x#-?YQKCd2q(<9Z#-;kJet z6ctg7F+_rAmd~(q;rJL*=lwGo9#fsdkoRG?K(utbS68J!2nRuFo$^+v$&#Qnn4LusXS#U{tw;ROC%Q! zEi&91wYP0^-!F_rGpy%mfTE2kysP+7lQ!lc7WCmP}2s)FxhcZnQNqi#W z19~S1LZC?@eQybAnWWAN!|nc&rb@GtDkYPu6pzHuemeV6n(ZI0##51$wA?>hX7>_t z>FnoNBrYZ8eZrjm5{nA;RVFN7r%AIU=GEPBUgcZ1nIF!qe2cdaOs7K>3TFJJgMcQ$ zw%eiCFj=x3v)t>pOmCNyj(Fd0o7)ZUSz^2LHa33V3PO}l8Pj0R7jQ( zN0ruughUch>7T$9QUny9WBH!lhlg*9IGeLPjT}EGn7ytpPypw1dD<|_8Nim zkQ^B`x|6VjI<4!3TBk~FG$9-K(!i#HE!;D(jr#^w;C}vh0dD* literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/SortDirection.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/entity/SortDirection.class new file mode 100644 index 0000000000000000000000000000000000000000..32fcb9b493f347e6624b97b8b16a01ed8092fd47 GIT binary patch literal 1945 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 F{|lqt-{AlN literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/BeaconRepository.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/BeaconRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..9e3293abf8d5c04bea364d8ef197f42c81243f28 GIT binary patch literal 1518 zcmbtU+invv5FLBd&7~K%DU>wjQrZ$)q;}IvsDc1ei;75gUv*j7Vs6dnT)VA6 z3LS*5$24<8-VT)69=ki7RRei=qKE?_@VV4rUFP~s*4=|jgI9H-6ohqGwL>B6wUD*= z#~^GDz#8pyfO~CriuSxTDh)2R(0@|cjW&fdkxPNB7hV4YJ*G>| zK>I?v`&=`_PCTTou7yOVW{Q~!2#}@`keu|BFj5{RZ-YRm-^-5nW72YJ5#BC z50`~#L5qGbQOopun^Wmnn&xRVTY0jVc4FCBhUDp{?Tlq<-hPwYn|0#Z#K10}Kz$PR zsW-XrU+nQ8J=-$DHwio)`3ED)3@^ELy^=!Djge6=t14n%@Ct52!Vp-*`dv3|f>b0-Mzf>ffr7=~JB+yE literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/BeaconTelemetryPacketRepository.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/BeaconTelemetryPacketRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..2a4ec82d6fb001e5e419e93e4bd83c3bbb344364 GIT binary patch literal 1611 zcmb_cOH&g;5boIx$tHj-_~PLM10q-j8>zCaGHMB>$Wq}^f%3v>lAVM}c4t#NlOVTT zJ$v*I_!~S}l-~SNmOYzD1OX}Zu+u%=Gv9pE`%QoU@%ak?Jcow_R(!wg&?ulz#b-=8 zK`6KiBgdnPIuUDxQcn+@Wk$=P*kL{kn2HXzXt~Z*@hG1HLf~VeMqAYJsi-=er5Y=% zd?Adgj%-9+R4Wk;*nSw*JJ_|xG5oa#?V&v@oX3g@#nl;%UdOroZ$t{AsODef3D_se zr657z@udi+AW2}V!iBeduujW+Trk&L5?+y&8E-LfNi8$A&zKJ?RN2d7=0r)B0ko0^LIPJv5>7kK}Fkp8*2x|r$U*R2WkNktHv%##AYy zTu6rs5h|*9i2g>XHk!VV`?H8w&LIu}ug3-wU>TsZ4YQLRnHFoKqeGB)&( z&;t-4b?u-QjdxsoIrO|o1U?+Lvl(O5=zVrNbJ)%p_GHGex?w9}RYnini&sVxBSy}M zM>9v(X6(ec)rsZ$7L#^z+{l?|Q)n%;X>C_$a9!ruy8hGGef^Xi_|{IEn%W|P)pNyu z@h6BCd2+euhC5%LOX31Aj_B%-pRIKK<@lx-bf* zvlZ^+A!A*bw|^XgZNPv&ym|`7W?( z{b&ZXi%KRibSVtGhXH1nfeEu1HDC(n&=!%&FtQ!l1=EGAE?jfrI^1yKCXBi;2IIRx kBuv1qT^N*bTf!X)cO^_pu;Q^_!hnQ(QfG%G*b=fo0Tyb*VgLXD literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/DepartmentRepository.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/DepartmentRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..935fe8bde75ea5814cdc9caf47cf1699a65d5b65 GIT binary patch literal 1161 zcmbVLOK;Oa5T3Q2I5AM%@MxOyYy*Nr>JX_y!W4<8a1~nANL+H-B%9#G-i_9qKyUd8 z{0x2r2Nc1LABC7TRg)G7QVu(>o&9EJXXeMxFJA#*7w!=7qp0ms8B?ztF{Zp&@K6cq zb*Q4AWJ8f?^~ig{hE%GUadmiNw1E)#RPWO<^&-l9-a)I++RCpB+4GX240*3BY0N$d zIrt6OAD#l;8`2rtpcl<{cx4 zy1U{`C%JBMI;pJ`tb$QBQfgMoUct3WR*_VVTGq{!jB57v-EW_>_V-EF)UY)Iy9>YQ zKa++fJX~(7@a4|J$p0EFqW@?UM{-+l$D?#RD%gk0@rG1dv^`+FLtyQ1yRkh`1U3#w zIHfTQ_&7{LeEf9QSOVpx z*5rn>Q1k3JECEVL5$B5N(H!!|b>`)kPLB=!M8#>4bYDL5fAV9iygP77c((dxO zYu+VL9gng}nxXTRN+idlBu#B6X`IGenenKwoQ|Yvo=&8bC#CgNBpaWe<)Z~RJj^YJ4oO?J68`TbCs+6A~&0@ zT%9+%LRrZEG*x?DgCJLBTX8c81%b`V0Qub$o*GImG3ovsWh6L)dJ;5WaXV>7gqlFI z8VtgQcqV;}-k3!npNT~>Q;1^UF^f7*MH~{~z!q8*lCX{1#oG(0Z{Ug&SVHy9!GRsL zC|rkK)CcHz5tA*~!0}+kgOmrWkoI5=E_rYn)@wjCT!Bmt;uv*a!JFr EudM`M^Z)<= literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/MachineRepository.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/data/repository/MachineRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..29c4c41a486388bbaf3f60ed59736ad4325da799 GIT binary patch literal 1675 zcmc&!NpBM|6n>sbv$aj98+2i9OK1!2gh&X~0D@MaCQ28zf&)D{iIYw;v7@mQ+FQ;@ z{13!W;D92y@uLvWlhCAFRQ1Baet!1%7Te!@zyEyy0RS)I5rOBfo42V~rFPL}Oxabz z9VI-wKozw;RufXI$MzP@A3B`vo$Q2w5crZU(+0I&%1ic6uFUc(l@(semNn1erJ_fx z?33^+ZExk;DUX>N?RtBW?Ux7R%26jdy!EwIPw1@RrPQkw0qbl!AqWt7daaZ~5F{|c zjvT4v`f=9DGcMV#OBEw9x!4nZU+K%HmOc^~a!rA;{(iYiCodRwUN zy6a-nuZs>ZtRHXVV{Hho5Q*;6B`!R+K_%PqdShRNAkerVpYs`B{xtH=q&L~M>t#2Xq zD`>p>v&+A|U-6=4vTxW6>zC+@QW8<_$+WXt_&u8&k}C)2&|YG{~4kQ8+o21S0!RiBnbg zkYlrFy__v2Jn?aNI3%=Sr{U?^8mFFauNn{5yvq= zAc|bY_5;HZfQK3lF<3+y?7+0mxY<$KmRW6mG#~;*Cx@MX`;~jxfLdl(j02c^>549c}Ga544rQ6LOZ|Q1HMO_*X zBO$w;hz0P_Cg9;5+E4bjurC5{ZXbHHu1&|)JOAAW0Y@h3i^(K=TsI>oWK5Zq3c)}SV!Aa7 zL)HvA_P9DPOlcE|QH!;{(xH%alWS(6#&6bOY$GcyBOD`u0O=b8k+t3nW0lcr-zBg; zofJGPZ_SRM^{fo~{(?81WIFljq_U86a#q<&q+KQ(Io~Nbc~Z72X+Kr4%IR0PzI;r( zUngnXq^%GL=8o$h*of`iKN<7z&-J-g{0;etncWIfc+G6qgJiQxh)-#MyGl*g>T}sf zxc;($jLYVj8$L}zI~<=bDLL)Kf6!uDK43|yZKWWk1O=%w-NDb&~TxX2wijm8Z;Da?+_ zh82_+>eWPFg(B*w7_d;2fL}-~wE10Eyues*X^{Lt~W|b}i1fB$X_~C3E+wz1cPgfDrhU+oSu`uqiJY>-jxa zkg1&GmJCsKEnX_Rw89P?x7-Z9S3MR!Tct&z)-I2NE;Kf$|O~!fH&1D`#SQ6rWT)C zfB-404YGjt-cq|H?#xF7zBKBIur{I{J&{njQ4ed8@vs(bsasO1(X&wx7DpQOg@LFq zswFjV)srL}kN9H2rY_mD;E(uYT2e)Oemh4JC7iL6E)06WnryKj>n=iX!_&Wg-^+#goGYf(E`Pe!d0HMrX$kFQ* z>{#UOgc>GKyWTmwrKQ$9+Ieu)Fx^)9-*x%#uuIzSm?sBNA4DsH@<@3 z!q4D?A^PTrGR~e&DOEAyVdvk@{$^%p=Eu)3Ujg75+$FH%`z@D+1Lk&o&Xqd|q)2` z{6i4-e5Z! z3zYUmueDk~P`;4v9#>3v5^Z!aHn8bb6H^l)K>Aw19@39OOC^-r4+$L1rg@v@==?Zo zo2F2AGWKkm>f~nAawcnLX^FJ6cje%UzJg-l+rR*6becYavI2FU9#Ct?F^_l&OU-q z;4^rzEWPRDc(?4?EFnmeLd%1P-JYKL=9})Gp6+iyKYjvm7uOkXxbB9q*dk_>6h_=jknZFc7i_d#_@h|)u7H=G>WG7k^J$Sx2zK4YeBXOvizA0Ao=_)*H zncE_~(3$?PqYFwm`u)E(?oVH;ewk@Ex?YA%efKVDx)sHRVYJ%tl}n*|Diqg+hjtmw z?HJW4L;vFX2L{&A1FAg68%K{yG^$-?`0;sXA!`(jz0b^KjWp?Ij%1wVP+QlSbS%Vu z-bvRBv@w^D=Z%sP{$nNfByYxx@d7Iu3rRCkG)l?G(=?ar%%!8bqM7N;g*d|Ru9;?* zP(xh|rgH=ewDvTY+H6uKHWShIr(-q)bMXFAf|>y~aR-LX@JEPEylKBZC;`wMMf;BrW<azF zgA#oSVyAaO74=ZqT!#F*6`aHQH86=OTv)@n#I(dkiAxeQ5^0HSI2e}5NsLI0hU%Eq$XSVF5(SA#iOUjK FegQ~+f}sEa literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/AuthService.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/AuthService.class new file mode 100644 index 0000000000000000000000000000000000000000..0d1a6d41be7b1d0d22c2c312385c361e79816c6b GIT binary patch literal 5432 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 RZ)FdOJR7?ndA;H{^1n5@H)H?+ literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/MachineAnalyticsService.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/MachineAnalyticsService.class new file mode 100644 index 0000000000000000000000000000000000000000..10ad45317fca08c183a6430e03dc7699d2763dc1 GIT binary patch literal 12422 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 literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/MachineService$WhenMappings.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/MachineService$WhenMappings.class new file mode 100644 index 0000000000000000000000000000000000000000..58ae009dc9021b5c42f335a2de3669fba31e0382 GIT binary patch literal 908 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 literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/MachineStateService.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/MachineStateService.class new file mode 100644 index 0000000000000000000000000000000000000000..748f3b2598a707a5fa0f0cef1e265ea75d5c5542 GIT binary patch literal 12537 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 literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/ReferenceService.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/ReferenceService.class new file mode 100644 index 0000000000000000000000000000000000000000..2b0f6a0999a034b4a1ab529e71eccd0bf555112b GIT binary patch literal 6215 zcmb_g`&$&(8Gg?$u*6ob+GpVE+JFSkZhMG>Q!;T;T zArQHs%qTHUNl(O1j$TlcRsep1ngc1Cct&8hW2lmG#ZqF1n$b-;*X7u8B{`W&t7k4} z)YA*n_)@ixs2Rnurq#5y4COvmN$P2jV&{m!>gjTT1XhienTkA&78w!PJfs^Fu?wm- zYLG@VrlixlrC2GQ?TB)QNK$vin zlWKCxRXe2^%CyRX0^2)=iaikbNQR}6iFoHo7!7C)p&pSSf@_&cPu8mmI6!fJtM zmdbT`PlXY{+FJOqPT=5DO_g<97(p~kODzKXmTIZQhhfxWy|l7Hpvsy|nF3E&G`4u4 z#|0WERLiq&8jE&xIy`5slolIGnHGl)mIx12oKwa><27X!#D2dmi9bVQ2mY7L31F*0 zU_6x`JEUo0Y{%w0Y(s}Y*p+qk^z?KF(IwF04Xyr58ACNq2I+{RWz{ftI$_f-&_E9I z4kHDL<*hbv!?W1<5*M3S&gW|YyXvr8E-plfP9zXs|MK8D`W|R|mk6ym1Os@g4tpgm z$=raUsteF!i{$YbB^ClW zDlqN^G^DdWmI5r5B!!$ct{79QVVB%$42F=vF~T;L8C77L zcV=h5oafWCh0FUb?qy*}?70(L<{_S0xt4EDVee9@` z9@A8F%aE>5WiyM%T!ErI6M2U({i8GG;<{dXT+4?QO&d;GDp{F=7QzKgla(~j3@l^< zZS$1c&Kl3AlhR$W;cOrji7{xZ)(Msco|3%ed(J*z$2Vjmep4O=NG6ZG%S{9^$aEW1HJ-ja z#f5em{pYv=sh4;XFr6?jKr^51=fe07UXn5WGKV{s78%YX+V}8^9R7VCGM(z0-vi|y zyv!`m8(FBWPb{IL7OMsDgAlIanB0I_ts+h;=10l$zuZEUx8g#Slduvr6;HB|?qU4I z$>N_fUVj#afFaS*?__%Zh9L0dQoLU>J6GqpEB{3TdRac`98bBZRAmBqM__C2dhTxS z%5m#uxPS zYkS2n4Iy7p>et$Okvev(^7Jr?b4ZOsk3XOv+4A@lgJz%gT6IA7jOB9OCW%M0R>qHO?p;BabqAQqe{fBPIK; za7(eRg}ZKn(TKC9E_~#1zjin^k>+99py_&^ZC<(KCpjhKOkiRo&jeKrbw8r=hD&zuvRA`4#5OALswFbsJd0%Y>{nCEk2z{R@7mn9 zBU*PCD|SYse0E1y^4T?uHC;Pyqp54>ZM1fE-$vW})bQa$KG)Dj6k)avXh9>|5y4j8 z>F@DdmyL28WgFQ8Hw*`@e3KY`woD@P<0HPW^t(%N7UDeb^FzI#nxGDNgO<^>37cKq z``I$U5b3&wra5#9oQ>|di=La5IS3^$k`;+4?2L60$zPj%*iyirK&-6o);T;;$@a>M zwtI_g?HI4yyLYl$= zhKbf2!7>*38&ux^)q-_PLlE|jbEdo^Y8?gc1qck#tJd{uhg1n%H6LF}(;s_MRj zZ%L?4Rh0lX&{z$c2&$Q(*o=>?=JygD@n@3XLp1G zX9+Lj+oV9UInG(-jL4JH}KSk6|JBb+Bz_4!PU%Q9e zjSDz8x;SM9kwFPT;3{6L=*-r8xHj+1AI{-Nd1qcLcIIZ!j9V9G{B+KI9dA^0W~;-; zkEJtz;X3o0>&#!0omT10@&FxYN>JPQx4pobZ{n^0t25s&>r5B?uky}xCBI(GnO$_| z4mxwEhuTG**(~pebg7J`O?Es0p?i4uZ1nmpekVO9>{xLMU=w4TC(*Lw|4?T9R$6>W z8$Qh9pKM>_+aKA!$F%#?dH56fa{_-!;0FGhz~Auq1S`z@=OIjdfPb7v8@DMFw@luI zu+~J-M6<~s4zS)twTT)No9wSIn24Ep%fucNw@vIbam2)c{ppN}5&Pvu`+3#G>n7ed YamOT%M?@k^iB6QGn82j__H#`B7n3SslmGw# literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/TelemetryService.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/TelemetryService.class new file mode 100644 index 0000000000000000000000000000000000000000..c9c83237503aefb57052e9334d92dc6e71220e73 GIT binary patch literal 7457 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 F`fm?IV!Z$W literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/UserService$WhenMappings.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/UserService$WhenMappings.class new file mode 100644 index 0000000000000000000000000000000000000000..96bccdaaddac6017bb52443e6052610c29d7e003 GIT binary patch literal 890 zcmbVKU2hUW6g{(07LZm@s)9Jc7WAVV_)@xS?ZF#@gp6%jN3G+B-ZJjy4fvNIrF3Nn)D} zu}bxTq4<}!>vu=aU`GnK-wFahFkv#(XSKpLw}jGCznk{q2YT|J{5}7!gYpxxur&4_l?xf;Lm`|b!w|eIyX^D!N8J<5<{*%^fe9F>IlvIG@cD& zdE*!@)rdko3SeNvD4|^#Z)KE`SYy_NX71a>eTK~Wr86v?`wweFO645@x2d-w5K2r??K5tDq}L{L z$RmkGEMb|>6|AC8C;dXwEh6!Yu9=D3QAnbF7U*q*7-?b}cz{*vaGkJ$H9VxVMD=Cj Vtn?7GQMPf%#$DXAQ9;#4?KifG)Eoc+ literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/UserService.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/domain/service/UserService.class new file mode 100644 index 0000000000000000000000000000000000000000..63102db76490835fa7aef82d3826ac8abeaf5442 GIT binary patch literal 12616 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 literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/AuthGraphQlController.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/AuthGraphQlController.class new file mode 100644 index 0000000000000000000000000000000000000000..f71a4b8df8779cf2d810fd044eed48bf5cf9d759 GIT binary patch literal 5708 zcmeHLSyLR>75;8BGd(mTG#asM!(t+_H#5T623a;j3y4KXXmgZAZiWV04AaovgN3qK zNgO9}c4u|=_(gfhLsAvXQXX6?rAiO^0r@R?NLl%A&oB#Oh_EYfDUJGW=bU@)cb0n( z|M>WC9|3q7e-Ic>r&GG&EF1cK+B7|V+0Iy=?dU6x>6#hO@GLu{FF3}^;%ZtS&U%Yy zW&c8Y#Ljq*olcvM3Ly}^X{;G~+Q=;E=Vx!4DNjX}KwWE~kQsX$WAiz_Cha-v+J- zRMb~PL4!bFCH_j-MG!`lWNsD+c#D=RFj7gzv%AKSKrn4DSQ&xUiXKoVZrPqQ)B1$u znKstbwlO!<@l1N;7^Q=5@Cm3ZIS~SUghG*zB;G#WO;uZR2 zHs>Cb#>$Gcn!wASM9i?WkX>dd(YX!@Bz7DJD%v7AfP)(1_>91dJAk7MM}b<$oM%`w zK3tb!EpU4$M!8tVyn*s3wN3=>=#WS1WDeTFk+#-?sfK=LXFY*#8G%cNLzBv+l4ed@ z^t=^)lpmQGIC0Tj&6=(^)bUyRh?5(Hp$kOJTb^U2JU^+>+&d8UbdX1oKvH8!9TVuS zVD$>&sN#8^$T8QLzL;xDb4p1Dc>ynK7{E&c9nXAZW=JMahwgZp=m?z4%PuG~%@9dh zD@M9<-1*@`2{HvsDX0A|!=qZpm(MJ1DzohlBkn@hbk>XE7T+#oGhG|AX_MPF`Wg4> z6Q~%beHTn`iUBWB*Dhh&xTW$qMlga?H8_dW#5te$J$iwjTX)BKk)5Suc=m*ySvc>= zTS6edl|@Q~OWL6b#&AxQ+y3<)#wA`{&lof+c*|DvIHRU9Cq3v$=}9)cvjmF*(AV%<4X#4Q z+)2}LOs6%B&j~aX^&43EMErFAhx|^nY`&*+dHn4e2b)!BcUnhU`plZ1@>)2sA5rrC4DI}oJujv_V^Ew zFqQqrFOP)W1B%%xf@NgnBf%y+6~1Dmvt|UVI3;%>_5*P%Zp3@$Eywk8 zzS*QvX;J#B*ap}JAH5$6ghNsFTuU^}adk2h z7Ez78nn5KT8Eu?Z!n?RuTeh~lWUVe5<=UQPC>mqCH_y=&t!oK1iN5+|INIR%8vT`~ zbFpZ%KW-^-#4gt6bh`HF-2nBG2yn_*uVm`)?+7Kl|Ir^q`y_ZtA#r_S2bX;LGfuC> zSs^nD9OiY~D~p;zzo_ZqJ<*ddYKvKX*4bfVyz3`-$ipP3w<)+!0r#{Hr~>zrxb=$+BJS`)1m87e#(%AU*H7G@Nm zY`rn;IL5lmV`+K+Psyq+CF?p@&n=F7H*VzV#yzcbLQAwIy8Dj}CbUF8zjPw=5vE(>E8Q(0cP{oxAjWS)ZE+{PWx@gXGUfDv2!{uuQwlbN! zW;{9}-#K|zw47(1v81wfTe%sY<2y3IY@{G2%RI)@&o~OPt!5jO)!U{yxfUcv6@E?% zlbkY}?dytZ_Yv)m?culcL)3M4eSpT!?hnxN7cMLKg)c6^ODD>IF>bXNE!cziINzER zfqmG|5rySdkv*w^f?slWmy*{ir`xYMRjrT`q>+h$r3}@QN{x_1VY|C4c37(OS2T9r z!;wF8DyN7%LkJE2<_$U0!sfei2uHd8Yf?+PR<@;>{Dxx|^McU9*UKMBw4_EsL3XJP ztB`HA>DsJKb46{sKfN|R=%tw@HWS2JVpG=@>&s!&(%JPP`tM;d@F&ja0FvcJh=|5` z8fl>%NOc8}>Y!t2lUmY7o3YS2Cvcp95(@ge-^uTO(6`BJj}d!-GXm^X-^avV1h0yF zn3m8~;kW#@LwO<{K$X9f@)K7PctV-wQ!~DQNpk^hB^nG)>qjt zXfFqOOP*j?k<}Kz#7<1Jt>N5iSM2fwTvssJ{TTJ#vClumjr&MV^*n~!a~GGo9$>*g z)aYQKY9LrO5NZy5G@#ap>ectr(Hy7`B?rUJ;lb*v0j;_E9&X0c_p$OGICmG?TOo1x z$v=g}E{?i*&PA(>b{E|)dVG4_#gL2RE`I3Zgo_I< aUU8A|mwx0@0~v_549*|(|4;n=e)=DLe-&E* literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/FleetReportGraphQlController.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/FleetReportGraphQlController.class new file mode 100644 index 0000000000000000000000000000000000000000..c3cdf433057e2b39f6c629262df938ab1ecfa77f GIT binary patch literal 2391 zcmbtV-BTM?6#w1L*OCSjf(Q+@EngOhuoM+5X=^FiHZ{c-lyQcqo8&eu+3d!>n^fMI z@y$p71fP6UXZ#u;90uR~qdK0uyM-i$QE(>N^KtJz=XXBtxqrX><4*v0@G-+9%c>aM zZE)kcC4^@*9NY99*J!#z3ftqJ>DWfi<;~qME#raOvMHL5>pfJeXV#iyd#+ote@Z?y63Mo3Zd(2-!cT6a8)ob0t5hG~1kwYg;!2|t}O zD>8v3!*FF+RO;cer`+WYK^qxv%#?aVD|BeKl#v=?Od*B-BraiqAu^-n7&1vjG03oT z@!(TPV5koo-e8D&yQXA#e3rFySFXS?R1=7IZoD39#G*}9+>=WT})e@xB8tn)TFHL=->H`K=R}9S`?JHApi^NrL zGW>9Ou$)U*?s%u&WH$e2>Ao z*WQ7Jy2miK*|ODDDB5jPnq*}4WGK@FSfkm%kS>|F*l0D%!u^cX9-8m|klE(0spL>O z)obf`EO!~rP>;~GI9{X?c{x0}eF}z&?zQ7%T{e?jPRp$bbwMyr(>LmOTUHHYRU?w( zM0KJOqA`*p^r`|S+N%-G00dGp>9N!q61!*jT)uP82kid)zrXwg zzzu8(+^yFuhUqp;<7wTpJfq<>ZO?IymTO6?>6xDGG>w{Twzj^j8>?nz%Whitl=!f| zPi=jCTs#Y&88DzmByOmt+ng*#T1ePQ`?SLr}Jk! z4a07FmfJMzMv=H_WmjYp8G+%-mQ~pf%^sMp*|4Z6@NQw{a7v3^E9=Thjrg+2;$#LV zFeorkP;wl41~HrxxOTjxvq<7}8XDdbh#T=D<@XQ zs#$K2H2X!bnx1KpD7Lq2tUIoE*LK-@l4kKuEJ7U0aM`x%)y0ebtPW(^aH>|sM)|<3 zS7-EV%ZTpap`Xuu961df`=x>@6>(p)$f2U6ELg@%jzvwppKMIw_B0f<`-8foOJ>xSeelPe@ zkD4DNufERW7H+E;clb7x?Pm3kWmcT#V<%F(Rwx~hf9XbWU=^$UAeDW$MKba(K2!1T z3yidzorue>(+Fc`Q3_c5D}mXb1d%+OEXUhzSw`moCgo49gh$<~<(Z0s>NRNW4Dg`W z)FY-I;JdJ`COogT-`i@&*F&qmC&YhVJb#+eMzxHlzj&VE&!49T{85Q|DqK=3gZmnx z;;Vz6&S)vBDv$hkDd;D-6IZLLk zl+aV0rLSwL%={pw6XUT_(Isbn`J}(Ev0i@xrAhrQ-)h+R z|2B0-Iy$9seUvM~-WX@&(cVOyigtg=m_s`NW=Xz^^Ly# zp-uGhJx>_pg+5JiX?^Yvo+otZZ9Nz7-Rp)hl<&E88A-AGP@@Z&=0VjxB9E zxZSzn@uXkk`7bcE!n^2NyHU2>$LfewrrYJAR&uy_{;;p;ig&=N&i97Le6-2C z(O78tqz8tx2lpbg13okBPTQ?m%XZzu8Q$h%{u`K6mpk_5TS^IzDUK^jhrJmX zMq%?@FL0mEFoBCcs5~ZdiICM=9GaXQL14FmIZ z)GG&tN9Ev`euk5<^aiIwo!QKKlk+83NHu$CHuqsz^4UFnd=Nl_RpOjZ9RH43>R%&=U7JJ5n_iTbTYbhkN`Bbus8e)|JC> zF84`4fb+VRL|h5Us={li`On|_&HOXvRmy7w^Z5n_ig-}O!y+DGy@<#7qKGH>^#+8* zm-uP}7bHd`zLrQzoR)}7BqT;9HYCRV^%;o?iAjH+mzb59lDI4}CNV8BC-IGh;qSgL eu^@3>;+n*w#HSLs{PnvM%M$k_N)o@3Sp6TE+2nfw literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/MachineStateGraphQlController.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/MachineStateGraphQlController.class new file mode 100644 index 0000000000000000000000000000000000000000..b1d666df9b0efc74fb9f78c4e7e6b96cf3ea56dd GIT binary patch literal 7699 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 UmN`D+_?V;2p>eEpe8Hjr4^kc@8UO$Q literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/ReferenceGraphQlController.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/ReferenceGraphQlController.class new file mode 100644 index 0000000000000000000000000000000000000000..2911f96f43eb994081f2b76ed314f7005c532cba GIT binary patch literal 4182 zcmcguOH&(15dLNnLJ|TkvN2frfgiC2SS%(salkkMY;0kHZE%QV^6(-Ju&~-yc2*?5 z`I;Q_6H+ySmvhUHN~LFatrrsIs8Xp?X{LL6zV7L-cc%aP`}aQp%wmgS z(KPd#?i6)x%jDeEine9Awxg9CF1Y3Du3=l+wxgGJJ~y>hzQrAG<@sHycw{cvmh0H2 z$(=4R26b28*ELhOwzUVFyFBl9p@SiO(;&!O3^VCm3ugtps2i3hxU+BMdDYFDub3HG zCvfMr^FYgRA!j?=+AeoD9ojB5-Lh;yVxg_r?n>D-XCmlgIJ0NFCOO#MFKUM6a>vq5 zElaV}E+a3x5M$`i@9_LyuC zEoTUq%$5!*Z?=k|pu4(8Wn;L{wHo9*o@VA2fz5fGiIU9PmQ3;&wzF3$FmFF4e#b7< zu&F&NbLaW8UMk5{GfcHtMqM}+#~@C|a2jVAdg=7Hc}aKNB1KGx&$f5YDn{j)aSZ!z z&NIZw%{{j{FoZnd|vszl`OsAr{i$COA&E=2|gU%r@BCfIx;8CI2)GSTts+i)ln zQahKDYB&{1hLXxeWTNZdz@`$3k}ekLx@&atK-W{F>pi4PsR_c5OvWQjRcY2YtwfR@ z?y;q`dc3mMPqPzpt*K>79ia6=Z>?e(prq83wAS5pUs_F7)++m&TBg*YRvuP+{Tw}c z^-YNKBy;}f*G!3=e)WC$l;moXNgAix{raxI$;N6y21Uzo^-cEG-N6j!=?xl}ebcnp zH)S?Wo(X!V%%+~-<5q#;bnAv`e9vVVS}oJdSmar2-w*~t%vC!Wx?UIT0$s0(9KFvg z<>DrH9_wTyFE=}{o9nt`NI6hmY{aVcFm<3ReM9uRRu<_|imn;kmhP4vf<76btT&10 zeEnJlq7FZ{W|y5jUo=dPbJVzmye~5;`xv73W0Jx&MriD&v6G|@d_q!=Y!w>Sv1If& zBu0Nla&+t$^#4RU1)tJ?FIk4E$%@e|fgXHDx)c5$8V5+C-GQHHG^f7Lcchch$!J9u z7rp-!lk_-A64e_bqd%kn0B3)sx$j9v2=sX#;=WDbVbiloAy1>U8ltiGObqn!H^;xw zh=05#{<$OY>E&;Zf4LEVpe6oWN8nTY&>VlX5kJ)yK0VQtIhp?j%C=-YF_xT=j1voE z2bipP6Q;+cN_3(^bOIT?O$59qV!VNf0?A$hXf%2DT99QIR6~ZQOg_~?G%Iv!S*vQM z63yAn0d6#gGwg*kOtmPhty*_ec-N~G)eEfS$iR9OGL?b(|IcU^m6@oPD~VI2@Pni_ zA)sWI+)Bq$nXI!1nEio-+M2ykldNbZx+sCk=xUQym!Kdg(j}A4!jTNkHKycJjnn^} zA!;a&X6R01I3xc*L)6%`VCY^WLsx2&)gD6%xX1d2$LCkXf0pDWx=ZhGpd*W17Ry_6AS^KGX+9Jf5*QYEB5+aQBZ0KQm_Wu` Z)da=`t_e(e;HLK literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/TelemetryGraphQlController.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/TelemetryGraphQlController.class new file mode 100644 index 0000000000000000000000000000000000000000..b339146a6cbd7b53e70c71f9f66d3ebe21338795 GIT binary patch literal 2809 zcmcgu+fy4=82_D3NR|{xNK1jVPf70=HHX&RJPUXRw%zn4?UC(#EFMt01+wTBwVo~6p>sBl~ zsN2?xD`jZaea{K~z-k0iNiVcR$M>vSU^iC3aII(3m30{goA)*2i97FmVc@&243ZE6 znKgUEwp`n*S&x?2WF<@@CXl${(Bv(F;&}NGXH~y$JD#Ovu;EnXj+>_^!s0;)yj+ghRRoul{(ne~Gum?TpP2m{&1Y+Zw?m{MoIQj*y z9X0VDByqeO22KdX!&OHKJUGnOf4s4xK(;2sIcZmXuXC{iE4%Y8`^;@uw!7%isY~n8 z%8HWV9XpiINVZQNB$;R#X@-t#l^qq*`>X%O(T&5(RkcIgVuw57rnRpKkL}934DUv= z;w^@1E=N@=RRy~1c4gJ^WQ42G4x;P@lG3Z{Ita{0U8x$nFIIFLed!15ohKBzWoxba z)m{B+J!#5dbJ1=zbTbLuJc^Ckpw_H2BkEuHx0k_ZVK2LqPh-TysKC{uy~-pm^k4|X zDZGdG`9Alzi9oK!I;bB6Mgm!5Bgo*u;tSk8bXx3b^txY_?%Nl*>H2oHIPp0zreQ~f zz@4KMb+Or+DBE{qV!8*Dn9^BW0&|D8*SiNPFm+&Hx;D}eHyhI0nX|mx{&IVoEy~c= z?L?kY--vOd8~PL19|(wbjc_a*UpX2p5UXAm_-pIsLdqC2QbuO$Ws1KDH)Ev7B3!dF z-EB6H>7!-~MxtXKB}!WQ=HSrQ%Ne5}=F-_j#>g3k*qiSXaWkIjT3E^?a%MK3H40`S zIn!r~Om{9mBnqkPhIuTadv?)1l=o7wFe7w*ZXb4a?>ZR-&hh13(#!LDv^?{C zRr&S;%`fXA;&Eb(bcX9&Tl3O-C~)d&lar<{OWuZ~9GaNjS!0~~^K5W|beS{fVY9w0 zgJ=5ja(I{hitRqP14q+s=7s&XI*V+N(F|LM1E?e9TIpVLYMvc71DYOgTX}v!Jm>bx zIwtnmPc8Y)pd#-%uEbexuXxmuS-s3y_<2$ZLX$8?*hMOaJEY1yYY=9pvfaNTJ^2f= zlT$xq;79Td+~v2ACllPXDPn2#;vRV?TRMb;q^RBYbDubuf6LJW5?!1I1VT?OV%noi z?_GqseD)kY4#%_Swd0>KFg2YYj=#pmA1H14)-m_ei}rb?rPcA7!zqkYPD?mVOlOh9 z2qqY>#zu+7Q6g@TS|HTc&Jgad#;2r*;}nb$dHbsqio|ClaqFwAxRYXkoPmHLfX+d; zTF7z5aCN%#bgx58Ph~G{=lL3i@5$Q9F~JCT>YDE4n8q|N)7*CSd1~p1qZ*G9IjG>% za7=3ZqJ^oKcvJMAHhF74izR3N!xz%|6=E literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/UserGraphQlController.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/graphql/UserGraphQlController.class new file mode 100644 index 0000000000000000000000000000000000000000..af866b19f59c691ee711ee13ff779354aa054afd GIT binary patch literal 4190 zcmc&%O>+~;8Gd>!>kDBI0@judmTe#_@R~8+EbGNU0%id@#tV2Mn-;B<&ab*B$Y#oBDdV~hf;ao(dDBSS8nq>zK+xp6LoX~3cO*ixds}(rfX@+*_`c11I*sZ6}J?oKnf;%#Q;H~-1 zFz`Lk2{KR$<}-WGwmiF8w?5l`=G4LrMikOlU240oaJjNE#LkZ2u-&Fb#d~hei7ae& z=Bwu)D;#NaCtgrEv*8DI>zNa72Ncql-E8_Dh}zop!_Btmt!9x?nA!D1k7}RoH7vIo zIziL+tSS*x%B|@P@(L$wPo3IsEOy@x?1n=|h4(8P`<+?sS=kaLb%HCPfTMXF!I;8G zMd(qOd8BYm;lo3?TR;ZKb1-m1Ar(G#wZhskH3!emszSEzgpxTb{7N6^(=u$izv6WCdD{tIaAcD@ z%=}T^n;wOn&{5!d21IS8TT<9xNgw>e4|bELkHW#;cnR^ z{r#Y@e30ttFNXsP^>>9rCT?GfSJsC%$^N4KG-^r))^K+USi&Xo{6l)au8^+I zhOue4h&+ysUs)fP<^k#+C6b2?P65~PJ#pmw(ohF?#R z{;9&kz|d=6fQ}!&XgOB*erHgRZN&HKJtwp!u~Ju!y%9bl4Edzw0~Xh=O!yoye(B0= ziL;$cO8w#W%Vyq~H1dY|`emMf(L6g6jY68)cu82sA`Wvl*`;7C^Y&oo@WR;oaEO*7o=9kAv9hpi^ zsvf!!(MO~G6Wkx0$`?~bW631fc(f`yj!{Q3p^lR}A=KT8Z6o_0ts3UZ^;70Vq-!#= zS|ZO>muG#-oaRbr?-XaJlf9Ysidjzf61hl=aL)E{PMLFDnIB+b=HXZ;24B4SZAuU^ zO8@$eGO}mi{62j~61J=)mmhtb`r}CwU&mM+Cb$1Uh^|!y>!AF}i8jy1xF}E7E76m6 zkvGF){A^v^wrjgilkeI|Dg3wIsuy=dh3SWF9*zyC+T3%sOX(ZkXC$9qYkXlSjBmJ2 zXS3bdc7o64?vb0pui4&XJ8*@L7tik3l{_T-l$vZD-k-@PFXY^oTW{K7JD}=PtmW|l zJoEi~iHbh``7OU4)STO{=U|Rc$W+vhMR`#&m0yxdbIiu$D5()VA+5nX z7ygFgg@wQ3p+8d_d5$HiN||6lKmY@_8<6v#{vU&p9_R1)HN-nB&+Rrft&aWMiI_ zcYnp}xpc&K=B=-Uyc>^Fnt(y5AV?6N00JQi6Ypq3lo(wjd~qNrQ7ON|cl)CuLftgv zl4#_xjE|^jkWYe4e2UT|KE>%-=9E9r@G+wxrq>u1gX8!@@k*SQg;%)R4|Fq#P|^ONCIAK%%SwcXcVLWWli8C}HWw2#<;7RHu^-O42+nL2G&6x?#_^B> zUBON6eiNBNz>XS3-p#ha%Sj}<*&`|8>VV``N@#een$=?T{GYzd}q{wD$I z$&i6sr1M9S2VYbB9nyDMF4ZR(sbal~A5_`Q_o~>$XI0$CgC|fL53%(G=QJiXKG(=- z9M>4tNNY@LJkpqs*5@@&X`GJcGtu|4Mp@&c#;k^=QPP;xSkm~R#&X1PSz|@xn#Ly@ P*EMcxtVQczXx#Z91?dc& literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/AuthPayload.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/AuthPayload.class new file mode 100644 index 0000000000000000000000000000000000000000..ff3cf2b7df3520ff6b60037e8e72e96a75915d7e GIT binary patch literal 4526 zcmcgv-BTOa76093B`rc&i})}f389!`5a0#uG^w$Z+Kyez0pbF|b?8SHX^j?EyJYW* zDKD)%oyi~2hoj$_qKPfa*#oXK>CVJ2yY2gr96BTFwH&e$^*st^P_?DN8?Chd|IAnt_~g4e_|kH-1A51LVAh@B zhUdz_ua_y6S4@A;@|U8RrnBVuq(ElJ3OMxy7N(|KdDO!l)e2!fj@sY5pEfnwkeQfJ0~j9SqOa7 z(%v>mFL^Sj&)`KQrNpARR==(1IV|ELr`Qh!w7`ohPGBj~I;Xf-T@|xqiDt!YvRg49 zwyUdRTEhibO^RU$yoZQMBAx0)>9N~~`L^ppoTOvhQb18XTqH_=;J zT*2Gkk%<|+o5eCurRkEQjwK+Nu|BGs4xLti^0bbE_<=ym3##0<=&)K}V|0g^ z+m1!)pqajPlOfyQNevx2Y~X#qljveiULWxSfu5trOW9-ck&qsxcF;j_Q~0Cu2jtHl z6ZB9}eq}Q?PgG?=h|Q-Dr?SeRl2!Dl53}^2X&&@5Sw+)n?4psUH6FERA8Uh8A1*5M z;`($Utt-RId(LFpD(}e`x+n^Wp zKB7qxLxoC0DpV6vp`wrq6%m-Y)2H{-rh!FGKRc`rig|JS>pwjEoq8v$50ZR{x!*E3 z9I0V$ttUb!Lp5@HSk!JoxHF|**CIQr)OBrD!B)?v}wz=k zb+7K1ty?zh8j4{zn;58H_q;#`zPTTPN-R(tRw?aN6!<|zaj6oQrm>600>6Sz$>=?F zN=7fE6S6$tHInwIgapC>JqAJhptEz|r{(P2b)tE`zdxmGzy1{I z*~@BiW_E5!{Q~DB^Ie+mfanVSD1;%;6J9SV&7+V0^-IdnA_Er?xBo>>oym}vqudJ?FoEzoRJps|xcg|3GQ4O(O;`F>JzMdc*Kk)nem8uM4O_p4-kMx3A>8- zLc&G1lejPbp4Mua}94YnD%)g-g38{`pGf$zcupb>5=Ds_iCKv`i3<{j#5`S45{nXd!!2tPH$&o0i3j+IjL^u4YxKMP EKZ+dy9RL6T literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/BeaconTelemetryPayload.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/BeaconTelemetryPayload.class new file mode 100644 index 0000000000000000000000000000000000000000..dc53213730576eb02ba016b1e4def0c8c995e86f GIT binary patch literal 3874 zcmbtX+fN+V8ULMOc4u~2U?95~gM&>V@$Ld%aNHyfwwqw=dMP+AP*U4zn_(Hl!0Zg! znWdqZ#8suVFMW%mq%W2FQ1!vRNp*r!sdAmS{!LZY-88PR(obz4JcfND> zpa1^y?*OjgfxsKCTP<7lnpM8<+ICp3`JNN{_3~cb4s0*9LdW;W+_c^Dylqu|Z_Re? znjO{;Zd(VgZ*6K20_KjjZ<4b;htGr`}TUmO& zSr|AgsdEBqxGe*pUwYO(n&Vz<+2OKGb*@l6>7PKB^XsimU`z`F-DEB_cZ0l&Ko5Cq zZQDZbqJUBLYkR)OikWREF18adw-c8bUe(__5V+Hx^0wl5_Ne8iqz&ehZe*pgiB0>y z)o??BKNg-{{mC@4rYmjSq<)IeZYqlz%*se!;rR&tI7jD$4^XYi|{;pk)ZCvxcsukX_s_Y2|8dylDYSykDv)^{YZDK)ac_Hic z)Ao%_v@F}U3D`W|DHCC4Whv?3tQ~993N8Ae)b_i$ z3yK_6Ie@)#S0cQ8l=mHp%@Et172@vW2UCVJq!^0%_<_NH#q5niItF?SGKQj?oa`o4 z^(PV%mmzfG&UVRkQO%$!_z^Q(`#i09?n z1Rs>^6a18viSSu-h&avYx)Pg+u*gV+MP?!_GDIPXRow zR~HTQOl;(nCqI+a^Q7pCq*nT4?Q~QIJFMzivxm&cP>b1X_K_LcY%xuUH09P zm4+v~PsQ7J0*6v>wr+72b$q<~mMC@QrT;C+t66i#D^kA>5Gi3}r$5sqhYj=TfTU!r;{#0wZFlvwPX#H33~ z#FI`*=f~uugAzX?-lHbI6X)NL`Sq)jdpgk!KSQ!GffuPox?iRMivp?AUorG&BC(4y z2cRkGPBvbUxYM4Ye!PV9oQ)MJO+_PrdP>o72SxoTpx6{{c`^F%DdCZh!X->Lg%k6XE#zw;@%Rpp zw>)pNQrqXKTplscZcD9)xb^N4F?xvACNXx1?~;&J94C8_3Un&G!*oi=W)qWwn{_Yg zBEMpych!@K>0ONT@NQ8Ls^!#r}!PhikQ+qY5HJ)CKr(&B|Z9^gcu_+ z_Hi_&#-~Xps|RUK{}*x^ls@K69&PCwjW+9G1@GWKos_%FA7cXFBO<#n2AOs8dCw% z0VV>x7~rJ<=K~Z16a$n3Oa_<=Fdg7RfO3GD0CyvicLH1w@LGTnAJQA0-n_~0_5T2B CJ3~VN literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/CreateMachineCalibrationRulePayload.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/CreateMachineCalibrationRulePayload.class new file mode 100644 index 0000000000000000000000000000000000000000..3d76fa089d2a74dc359f7a1f93e5332f9ecb7f6a GIT binary patch literal 3583 zcmb_e-EZ6075`mY5-C}hY1Oh7JFWBKt+EnZcABkAon&p|WszbhX`H%Ey|ulT7@HAA zx*}yHFGJb_ecaP9w0-PD(T5c6fMqE`iymn=~ZTXfP$iVho5*wCNx!AU3V6DjdmhD;> zrDJcj!_PN5j&)t$b3ED5Aq31jaz|Di>26l8ZQQZyfsO%z)LEOF&kN|KT5V}*W=$a7 zigZ;Q0wX?cSxeS!#YLNnmfhJkv0}UXPR%U ze!2=bQ}v-N?fMnzx?a>V ze&wncTvaRPxyrRVIC>Z|JV!R}j}dCq3Cn8vSENGAl0 zz*`O4w!6s+mu7lwM^tu$^$W(P)E$I#;^dKMCP5K})Ugu*I?VQ1%Jlyti%jVPEgzkM0Rp>X`_5&p4}gV6l;2!RZW6;Wxu6{8peCH}#%G z?1p0eU7q*b8J1^D`i!n&g=1J1$nCK&d+w%=bDWY=ZKj&VB7UF2dAz>w0$cJr8;+&p zf?`{W*p@Q5h(GW~;}sb;vY_IW^GLTfFwRQ%W2u-~b>IGhhO$G3p z*6!L0nkUp)5MurD{ke=*)H0g+_V zg_rXwQ=8D{2Y4ppGs!bWTvz9lFH;G_Fw?cPX{zs+pME+(c%%o;E54ZiLKj{zM+wu6 zVQ7(w5DJZiP-rHELPJy_YNKX>LSv^4b9^FE6!YTp)4xCYBvH$lMbZx`>?4Iu5Sxs! z8zYf+I;vuvNEjJ&ki^i?9x)pdLz{cVAu~tL-8f_MVKevS>(pVDVqVnD{xL3_Ikj$I z3)k%|i#;2!+}RCTZ(1%lh8b^<6}5K#xhC(*MAXE?%Ur!zJFN|?eN#1x>IJVZoi*9E z6&@4KXkxF+wrp8})n;2x-srf2-Lk6gj_uoIePi#k78v4csyA2UcC29fAa_^QKC#TI z*J;az-0LmhRRb9VU~|RM7~^1K188h)E{E}AN;IggYOB70kbqRN1+N;&100N zCrGRF%V{d6Dim>ur-GC#EEFN-jGB*0_2(hxQx559kUEke05T!;CZkAHJ4s>XWrYqX zHOcZnVSYm(@+TD%=R(`rh#|H;g2R1<^9O}1eT84dOMNUCzCB=hzOV39U*YkC!V7(c zk96HWelTXySKw%0fiTYg0>`@U^;!sH>o0J;uRs`2e*vy@mRi;ACjTF*?#lfe+O4Uh z#bi-`gwl7UM3Pa%o!cT+c3Fq!{pSzO>$V2SEc_o&;HG0rZIzZT*5Uf7$ocY zLOSu6&ta$@dcBZN#&G^ZA*~ZmlU_KJETl~%#>UU+<;dxO;bi3W?a*{0JD44!_F2wB zG)AZCu4>RRrJPS*DdRK#16~960*<W7a5O`2Na4jJ4OWtlki7e4jo&FO$t;|i>vcj4ze1_)$)n2kW4%{@e{N! zkQ{h$;xV)pW&0$bzkRMq$~v)p7b_5>3)gqQjuWRB5uQ+vXi(W2LP|IOi@XkPXm~hm zVdWdGcB{UMD|nM$Zj!2VqhgtWDr{2l3+Uq(-x@xE>b2+~5VWx{iS=ZdUPD6>E6A zig$3Uig&TT4&mcZ`13km^l`|?dp`8=ZTLusK*mSXN6N>9k4YbgeZ~2bk0~EVd>r+0 f%*Syb(>|&p{}msLAut=h-^U&Lp$h&gpZWg-eZBxR literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/CreateMachinePayload.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/CreateMachinePayload.class new file mode 100644 index 0000000000000000000000000000000000000000..62d9de286ffcbe16326b27968ce27267522395f1 GIT binary patch literal 4377 zcmbtX-ESOM760AYkD2|jJ-e|T+gm4&vo!YF&N@z^B~C)~(cm>}H^iw!F&`c8PVBLF zXSO?Ii|~MgkSZP#LWuGL;sJOF5=gj>iiAS?fP}<_t!=d=Y=QGt zr@d9)F}=;UVcBlkux%%B$t|xs-s)bXu_#ddJT0min+v80|G;}ZL_u;TEAqBEAVFZ2Ulq_iCy27ZJH5Kdl&tYd`%Vy#1?zMW9ZX||BHp(pTp}rB(@5KCs2e*tyW6ko+#Vp>$jWoW7n*&MQ z5~xOje!&#(o)T`9#^1{GlW>Q3wQabJNS#fVby+#m-2-(MY%NQur11?@1^T<@s*b&- zVwH6^wLD#sN_W$E8{cHV=I6vuazTqp^Zh-e!DtUfoj44_w*?Z8w=H|7X0*+>r0xsb zXJ>O3-@?1HebP*{SB44#xoX(Nd96m>@C^1ZrMVxY_lo?9%O9|R?n;7RH{}PGq~=N0 zFA4FpXOBy1Wkg9U`m@Jr{waEYTG1q*;+p5033*Mf+Vc;zk!Oz=lzDOUQa-6GW6FGt zYdl;NT$AKgf7NttEIuOUW6yt=jB6=9y`0kXQgi9k4`QTGMd(4fBa{zy=!`xbSn%Im z(@*makJmIMINGQD!+pv>-lu#33u)?w5NJRw59%W{FuI`WW4>9j^yx33|0KSg)(e!s zBDo(+Zk!xJO731RIEgN34A59y%jj7O{X@ILK40jc-xc=j1Jv}PbcH&Frw&nd#W_9u z{Ex{q@?Q7_;FV4CLv~TlGFSXrW{%(Oxp1DD+cavsrp*aK4+oePIn%fociDIg_x5bh zYMK>$-*PSPy3w5zn9D&i3{*MwtnM{8&Gvmc5yut{AP*QhLqVYuC&>mON`TG`rpdpnlVFJlAU*t-z>@OKiJw=4=9aIU6uE z4RT4YS+03GC7h6PR`B0(Qt(&K2@#z>%5?Jlcp-)+x!-ctxX#Yx`=4TPHb2DQ(#IGn z%^aXmnmxdH>D&P(O2df*OqNE~0~G&4eFZju&k&cKR&>rNL!3^=IG3EIqsrxT&mf$Nlzm(IM;XDC4}_+F&A zruk&}Hxk|K2lB<6=R5wN=lva?><6#c<{aziFksOQe!zNfSm+7Q4^poUM+3t-iPb8z zZI>w}YpM{fslP#acV_n7aAH*b7+;Zb4@?H-QRtLMp;I1(PI(mMzW{!D6guTm2+QLT zgbZ+t&;L;>dJ3=O4dRjDO`a-Cs5+#@fAk?VSuvy&Aw9k_q^Ti2adU_tIx;CLO}?HW zr-xkeidqW2{RmeAZ`-u0B9YBx`ucd-Vkg*dP%N)=OrFJOoX>urOY+-u?XI;GN!g8VdznY7bPo!OBTqIm1U0iT6CIF1jeYnCI8f#e$2=F5dAsK5((*6N@f(utzi+(cI>9?SIYMmdF4A literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/CreateMachineStateDefinitionPayload.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/CreateMachineStateDefinitionPayload.class new file mode 100644 index 0000000000000000000000000000000000000000..c4804b11f6ca777dd9c7ef012013c2ec2fae24de GIT binary patch literal 4161 zcmb_f-BTOa760AUN?H~Hiwu~L5*b5ckc5Sa(+`8w#yGA;0K3M)O-S1;(i$xiyHvX{ z<)!0Jr}+c=&}sVEhb9kxXlLpqlgwmX=b(&To)5{AEbTQd&vJazw_S(Cs?{hhH7(P(R?SMy zcC2-NvaVbAZL*W)wt3ia&1xD#z}PVl%u>U2woA9RcC3n@MnWL9C|O?@cx!s4&9Lq_ zZD)Jo`6x3R0;*%~THNf4>j)$(Zo_Q~bXP5}(zN%aYXXxiZgab|WBFT6({{X)={Rl} znO9nK{k8o@V?ki*SzKf>w;I-hhP1#-b=Pm$PHE?0w`4oM)pX28sqDy5JiFqh(JL@m zsachJr2V$pq?cqAxDby%OizdCXEri0(66HpSq++oE`h|fq$V+>L&aHv?8&5Mkj6+C z6pUt|h0ymh=nA2iGSEZl9P{PZY)|0U$_qVyW-+~O`D?+E3{20Q^e|*72ZyDRbtycr zUV_)-N2XWY-96V~1zr+pBlB_O)i`pQF;(2XLxB(D8UAkd^@6h_PcNnOcuE2p>FiY1 zx^M0`e1UJKU$Cu{see97IVKjB>&y#wHG^4Plxg9CYQ7sD8T-Wl(Ql^Z?Y}CD=j8R5 zdvO0H5NiNe#f*mU^MbeAj_n+{b*mJbT5_F=>EAFb?0bi4{7~TRu35K2@;%$H5%PS~ z@p)nX951d&%c|wq-0Dr!sWvQ+UBs>L?{&D-u|ysdynDE3bzt9&@wXCxB7!Be(O9>A zYaxRxSkUn!EcT^vRp7n2qu=osw5>*pq_H1oIYNHI6RVjXGgM_0W``;tYyTm88rL(p zh9w_tX~J63$>1YdTx# zt>euyVi4$Gi5fXi(5#xi$^ND69wZo;A{SLI5D;|9~PF$PGrVM3NnM-h2qdghynvoh+hs9jt z$zM~dmNvBIE~8g|x%t%x3Br9b*l5AsMt>+3aJ_0|`Gux5O$p5eP+%y40#oxkzedI= zCYA?`GZY(`*NnkHnYj7YpPu|)UDk~u($7llcM=;8%}VS}f2g0%Y7Bi;)w&Fw#K2UW z*c}i9t8HS2#4|?@w8=e&{^aA-h)gc~JoA2@!|9@Yn_LOrCbJyCv(fuxcFU~PEvL$I ziykDa@{QtMth1Sp-Pw11d)F#E2exNZ>W%im=a>kKwQq&5n6>@gEvtD~j&@liZpCbD zm`z*a5pn8iU9DMuOsNqzf!0S>bPu0MmHMi=7irSh-Th|8x?xLOBazyT4h|aET-W#f zrnwg?^>B&JQDxz&$jS-N)R@Fl+`GAF<*YwJ27fI8)3HaGlK#a?O8=;e6o{#`48S7|+i>LM}g|KElL5$giNnb(DIt$YBWQFop@P z=kYQoQ6R0#@0UZ}q)rl}l_(Yo$q1ByCjFL|tSDbAjMySPqS8$n>hV2tGlbWu`}#!jM$W-#C9cso`_H0kpFb-kG5e zcSgu*ANl(S-Zpu$7p1mO@YBUHBUh7J3BP}Y9ldchYKF2JdnkA)dYJXF9EhxVxE27f RdH5A}XkMfF*ZKRw{{W=*iIe~U literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/CreateUserPayload.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/CreateUserPayload.class new file mode 100644 index 0000000000000000000000000000000000000000..9aef390d31bb938724fc8de394702e0d7600f12d GIT binary patch literal 5724 zcmd5=ZBHE66@KopyE8j1W>|yGg5QC_?gDG$w}ds0v1`Zc0&#$lrnG5>-7$=rogsS% z68e%jZIu3lDv2sps??VcuGC7!iBhR@oe!1z3;F~48~UkgdhVTJcMNN=RapvR=AP%w zz2}~{d+vdM{P)Yh0+_&08H$cmE||5dS-9g^mS3oPuI+oZ!dlJZmg}3o?YYFPSWe+u z%`$!Kb#B#eo12bjR#Y$s^GjR|vp&32cI z&yn*4YbvI17RVgi-z*3NW(wd@u^I_t=$rCt%Z0m^zf?1AmlsUe^#a%N!i?w7tUFGTp?|MgG{syZ zr8KAv$5uVxvE9PmjcUPmeXHi0PNC!q?{T}#Rdg_Pl~=6tYAF4-StA>0BEw+R;Xy>2 zI6S+M!a;QENTW-Gra{-xsv)JJjiF^oe2(LYju?(Iq<04_1r^7WP;epzEuc=NkPN8) z6!d_4A%)g}8cHD*P&tN?sb`5(3T+q`dySC8{S})tOgu@z)1)nhqIKEwr|OaK9Lnyt zkRe5rZZvYDjo@@7Ei}T{gUk@*RFE7(^6h$lsDwnWF%)QzXEB;VFMHKB&!wzA69r>Y za5f6gMZx(fxDW*w$%|!gZIj`j(Ny_{oy{jX>!|`Pk~g7K#$2N)3S0Xt)*W-*@fjN$ z`oARa&XecJd6s-BMf3H6kTeS+o?$%G;2jF7(v1tqpokt!q8G2=2wf6KF-PBjL~~~YeNez@ zLZn&fJ3$GLDUv7rBudV_=)k3y=S2rjmI$!Q;nXPo z6T(MTS_!F5l181LR(ewOw9(T+mW+`$!ixo3Oo@+p?$0>+ML)U$^m;nEI@bTc1icM9s=SJ1_# zg7P~B9objVi+HI?)JAs-I=Zi*@w!HRJHyZRU0iIsScZK6#h02cmSNs&aS+;xri*20 z_gWl;^K#S0GMxJ_e!1yl8N&S+U#W*J>TMae{TEY*Pc=fE)L&6067{b5wDs;UP~OZB zk7Qz*cqWliKgYL3rUY9CrK(sjRmFO#D%ML?QT($&ma1aCR2A!`s#q^oMJg(yR7ESp zb0}Lz64!Bq^cT+fIcX`%n$xAl-v1Pus9sZDT0Ertrn@vXqz7iYG(#hhq)CJ0F+xU& zvg2_=Cqk4TPY}8iqS0|R7xCT$+zh<;KJA)>nrdxrqaRYIRL_ko7!>r zY)Vg-o;*FHU*dJ35s09;o@!EDnP|&HbMMo+7q>^5B%FMJ#Y?@$@fD)`h<qjDliI+$L{C<2IVuvTkhu{LYWrk4Ab)kmL*e|M7S@4 z2M7;D@F3yA2+k7DMsS{RK7vOHkN!sN7;BhjAgOBqK_{8kE`CyVdq~szq4)@8tdM0Q zndx7C45AE)`!&w!3&^ey=&j&g+@tX`nqbo{es>WqC9Iaj&%-IzBP^{htAQ;k>Y6M80Ls`B&ZSN7~?q0agO6W#|4gy94~Ub#4*lM{-fM2TYqACi6=={HNyxBmy7mcV)d literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/FleetDailyReport.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/FleetDailyReport.class new file mode 100644 index 0000000000000000000000000000000000000000..71071aab020d5f048600f7614395d8293c41a4db GIT binary patch literal 6460 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 literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/FleetDailyReportSummary.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/FleetDailyReportSummary.class new file mode 100644 index 0000000000000000000000000000000000000000..8c1dab9e522eb3eb6beeee682cfac75fa21942fd GIT binary patch literal 5527 zcmb_g-A^0Y6+bihV>~u6dR;tvGhe&Ou(yg{?m1f`i+^7B}eW^ z&bjy8a}WIWUtj&1h?eMw65XuT%0;75H;RvIrs)*xwpDfPMsdGkGShMlr)pa;R?J%Q zHlOgOQLP=`H}~y^v(c>AjmBY=B#E>q#(`0+8P-nm-u4r->_n+YqR90sp0+GeZ@$$2 znc4()Y{#gr8RgxoWisGxyJ=NAxW8$2S%&N0+nvZA-~yf!ac{p>i#@03+--(f~Z`zx| z--!+L?+1VMTisjI2V=>byVVlbK{-H$o{E7Zrwrpb6ZtN7Fn9g>?s9LOOSQa*rA4^tTx1IH7 zt+vSXGNK|AS0qYsM{*VOvC*s{ZGWDB4PLa*ZmG1|eb5)DUc(C#bc1g40KOrS;@BHb z1L-2saDK}7KG%vY{@Z`3MEPS?Wl1`hIaWltp{uTNlfQzr3QM=$OJ-sAr!qHm)fR5@ z6&DVVRTpk}rMxUjQwn`kqFiTntJZ5N;3-XnnWk+#-8b#`8kA! zhguFQ#gFs8HS?abW;(le<&I(De6ifBZSOVr7k$&brS(~k5g#1xn*r0eeDmF^k7Rfy zf)%4y+o(Dwvh*Ikte%f={=R+r7he&xWL2-h?pNVjT#n4_b*J#-}fX6+s>}pz~cY6lZInv zY}ZU=-=HrIpoTD zN&fi7(~K&Q%Brlrc&g&RtSPFjWFg~_J&=7cD=$A&MqfOgm*=Eg4+kTfoRa5yAVZ!E zdotq5s3#Rq#yqKdGVaL)moI-72`Rl=-`$v&;`q+jpY=c=^XcP0{iIJ%`}9*jJ>%0) z`}C|&pJ?lKEe9RpDT?fdCNvS8&_sAb69EcMgeWu-q|ii|LKA@sO@t~m5iEj}?hb2b z@WRP?MLU}cjY@OUov%NC`J>QXRm;0heg5)Oj;4SL{JT#>_Xk|huviKmB2eFp4NT#$jO;0dhI z_OGJNT5s03&Bg9jTTNGQL3Paj%d7~hmR;-&?85bDd^E7$`*9xh;juzc0`i}T|J`w zZ}9|~7(VCGViKj{`zf@d88nxtX^66vqzPDZbO!&XX%g|BrOTAZF9B(Cz}R=apeZT< z!5vG3LZ4E_ zG(LfUrDE{K;34#4^kMX4Xcz-<`y7^zFItgTQpj-OcQo=GiW_@G7*C0K67B>qo&lN( zB#(BJGlAsUKys>^d^(U^3?z?tle2;3xj=Hdn>-OnJ|9TVbdz&|#X9LNX0?GMqaz2o}&?ZlGXP6X7xEx3jSrtsU5=ao46im1pND$c* zOt=glOvJ+3JLF-#g?2mxsxN-u2b=p3U0Bb!lFd@77$j8sN(MhQl}jQSY$GtwA^8ATXPGftUdG|Q;SXbv4B zqj^Rb7+qv^iO~Y1%Z#oty2|JpqeVv787(ndX7mQ58;sr;FM7o2A)}Je_vr_4T7lCW H7_0vVDZM{* literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/GenerateFleetDailyReportPayload.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/GenerateFleetDailyReportPayload.class new file mode 100644 index 0000000000000000000000000000000000000000..6fe3ac1b8175f07085a6181e4a5c73d7b02f18aa GIT binary patch literal 3531 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 a=HX&Z;IfCaHDbuaZG1w;6f!nO|MY)^Yq+!k literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/MachineDailyUsageStat.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/MachineDailyUsageStat.class new file mode 100644 index 0000000000000000000000000000000000000000..fe8a62ae691b4437c4d7e8e4c80a50bd39c6f873 GIT binary patch literal 5231 zcmb_gTW=J}75;iWm-cv!+s4DiT!uA+cRaQkW5BSO`z;KyfnZ=+yuh}{joo;r+dI{E z@Fv-17isg7=T#CZij;>a4?HAN%%Y7H5%wj@ugDL`Pl%#?Rox!9?H&P2Ms%M`*Qq+U zI_H>w{O7yB0yu?d8qQR!m6BPnnWaZn%koM!*RegfURtPI!g4&*vt5VG8LL{FFe`Jm zV_h`u>hf)2&RUcFoPwsocx*12rK;)7mab1fwkqVdXh@#4xz}k8iFa zx4gRjB}I*muWdQ$)oo{XtSo>1cQmAGz9Jgpl(#gr*W4wpn6xUcGb1!~Sk5dJz3wzP zZT3vnYEbQtdyxk>=&nW2uG*g|TW?tP3Ki0@f84FlmL6N)bltQaQ8FFJ_1z&#*Ie(~ zVzoM^Bc);Qyz5nMr}TKKRsyk-2RCc7&!mfxE3=P@JoK=|*#BP{%vu1IjhW860 zJAKzhSl)jpgDz}MqZ8dabPX*9$x2{*8gcBZJNLsv+Nz}Xq-*dssh z)u5F#XvIEBy_Z4S$M$E?=3@sk$oSa%8MOOYKV##~*^I@xW~#kyf{kfN&stuPd>W1v z`kQUpJe!y_+=D@9wsdoYP07U^mWQm*Bf7av@9@K=jS01d%yKxVr1-VX)Cf9+`_(-m!l+)$^@)Z>C=JT-Y3ZRawd*esB|;CfZwTm%(YAk+xsdpnI-=xiowg zSxO5*T|1=>?xXsagzGAsWNavHk`=0Ll3Z8ZBx7@RJEisO_<@G}+C8wHC3oH``5Inu zor>vQHY@A|%PH^@Y_FN~me2ms_U4EQ&vZOq@Lz^YSg^~4<;}S>S4@XDMC8X^cYbjp zqOOHJzE1Gg@`4qyd@8iQ5ur^MTrjKEN!zo=GWa3J)3}O>jwG&WxZgC{-Z@ty3Wz-I zMi;y4j~MAWQ_w{-EH=aM+W1nqmBA!N(zp%wx=?5JLzBYYG(M7_I@e5Rx3OledJ0o4 z0fllu3-%=Lr|~f!unn`5tJ{{eK3z1c3|TfDvQU~2%=0c?}-_3x5#J!7Etpk6ahv zyF&Qx5WXjb?``1MjT~{RsOvFbJ%uR+6{b{Fm{L+?_)a$>B{_sxe)A>o^%&E zghC;9Cpr34Wgw?n!YK)XA-cX+CXyGJM+kbYchxd9w6MiQ8y|iQ=EJ`;SC?6Q%n>^P~wG ze?eeEI5?dYACA~4w{fF;Z`|k*MtICdje4JN&}b@RqfQ)-6wYrH{y0+jNThJzM&bLB z!bc;83mb(WL<)~a3KusDKa3PU)(GK#I&NJEwFrUrVLRRkTUc0y?ajg;G}I0Yt58J= zcj82(fC^8vz*wY!3Q4rU$w&behG>CPkpjx~(E=Qbc`s#tKI83|btD(ABY#2cqk+La z*?2aQO=eTy;+(t!{#Jeo$Tdnpu2BMVjS`TPf3B($kZY8HT%!c!8YLjd3oJ`OIGq1u zIWSsr9v6bk_j76_%SAP-$3OoSbXgU~vw9-Ha}!xT72v(6v$~;^Xyu~(Xq=Q0P<^8b zQu_j`Fq$NFHlT{5sba`eFL25C)E7Lp6{$>HTRVSL=W-)Q&(dI-;Js2CJ~=)T&-3Zy zQ{Yqlj-?iBPWOveZ$#13RFgo&b0$gAup!8V?w;|4xq_@pg&1I;v;m<~GB3$Bq};7M`d_ejK_5Bv?WUn9}- zeBc#g6H>)NJ})t+m{LvBxe(n;y7#wIf*TpYrx5GN$e*ex(gteRNaQD|z@{}a0r|g58fJ*d{*%!71+?WU-!V#jN%$Ksc+8GA zKZTYus%6y5aNw4)fKSV)Lrg&v@US?AK7m1jC4rPckASZ5R`pH`vVeLxPg|yE!(aXjAq>^JhDyGFVtPf^4(^k(KJ2N@eSW{9Wtw?U063NyOv{a zl4-759;F`NGj_}*gn+(h>>CB!aCQoJxA)A7pF~U`v1rlSO@Wb_(potXY5A62C{uf3 z_JP2|ll;ZG@+pw2hHn&z$?_i`!BTR3v$=2BE5Xvj&A@WXcYVW__&kAufLO83I@L+5 z4e|x1%5HO~uxI+)O~Z1$g5fw+k{)}7JFb7HW!noHQUVh-*S9UFu(w|?SaLVVunXL_ zNiD15B{4u3E4yZ;7OCAcnnvBEpuk%*q2pb#S?JCJ6b6wIh|Nekj^Pwk zoDmSEG&G#;gMxFU*3#(1n54!T`Qvd-BZc#F@f&p1-?ixP@@XM`^;2G86n9Mjepgh9 zvc&xlxt;KGVND>(1sQ*V?9A+OkOG@0n2V>OeC2}|NLAc=!*zJfSG$R8-Nf6BOT}$G z?wNiIv!|i>pJMg&|C89S0h`RLM2hKgMIbH1FkLkt87C}lE;_~E?LLnKlQrr-;8onhk-6?XG zv+vf-LTG;3bt;B`+o;Hrn8bGk&ee^Y8L}T*{w`;pZv>_1x83C+va)XayKZ&WaH_WH zO_yD_)@t;q5nW+CqImyt!|Wlx)g|8!`w0)04cp$dd~+d<>sUzPyI34b;D*4ZlNroo z>*z<3m1^&1`I>x>r?6{y^tH+>pXmt7^1Ndq*mMvi=h416Gz+gwN>^eJ1 ztV*G^P-rcM5`G}XFUUf;&Ig6BQjn?%^W&Cbv$TzL$Mew54+Y|`zbnfx!+Cm*XMs1i zZIiW4Gn(d#H2Gf(c6*OB?&F8DVDlZzb_FI95O_aiwqLy0QQtD<=qX~(7_u%ByHeke z@cs#k?re)*)BQbv`OqQ88S;!n}FaOew%$#7L0;7Wf= z(PA72xuhL@s*S#Ua!o0UrHk2wu8b?i7)O<3Je$@N<62hDDn+fBJorOG)%x_*TA!Yg zQmbEo8sj`GC4>2pKHQNGIP>}$uF|}wDWU0L78t)aNM4tDDu}f+`Un-yUeok*L{ej<#^u^4>P9BCOnB1eaaHTr(_{vlbeIGB;KsS`{W?oS zx_T z=QoW;Xw<`17Il?L8$(vMJ)C7_!xN0`ZMeF}xq=T++5DFn$>*M9G(Y(qx%`;=920-xx`H~tXDOS+ZQ6McI#w~l!jmKIa4jETIgd9m zNs1N&Ogw+iBq}ACNnC1#D+!mp{@^M`;2LBM#Hb1CfE^l;!JD|iWr?=HQCf`W|BBIP zoP@BXYak>EL%K(S2u21|m?kGwR@%zB&yOju_Ef%zON`I)ohSZ$Ou5uUISl<Gwcu1`x#FYw-CPJd%pT6}@>M~B437q~;>8Rfzd zo~4e)0Nv#slQ^cMT?Fpo{U`^2L5%XUEam6^h`9P}?jKNohj{GS+)F6ya=Xj?|6X$B zek5|gc^Xj@q$XbAVIZ%{eHF-1u+2?s|3W4SWnd`CK#7EVv=4I$8~711$wNxYoZaN4 z!GBzEMOL3CzX~jP9DhZD4;kRCEyPOraS1;u;ivdn2_L~IVH=e#2oF`5TR87w(!(PU zTJY@)zNz55<00-L;o(gW7d%XPnD%hd!zB+h9%en{JvJ1d75}ZQ$4ZuMS&dTXojPu9Nmdl+;XIr)ZJeZ$@gs?olr})SkvI0n(ypt! zHcf$&Qd-{SQ#;Tv418c<2s6Oowo_)9kbdJk{|cWN;CJt?rM0{w=?viU?mfS=_nbZF z+;h)8tH1v9(?0_^gCA=+Q>#_WMx$<&Z`VxIE!Q2}a-BwbrC|!wb`95ZY%&+jT6xB( zE?KsDT^Nhz{A#^!H0~y#X~^6$){Jt^uoug7x9*r#H-Rn<@zWMHJ*&YPneOn81;aJU ze2L}W-B5l(p^0gw(zWVldG7XYVY=rH*StpfAD&dyU;c)MMBTGgL-&f=u$+Z?*J!vJ zk{-HXFKFngJ8PD`IB!-RdqHUEGwnq>H)l6F-PS_QY@#09p$$e8_Y20xoLr*UrkHeA zZR*dix>n74L&fZ}*{ISr4F{&3#$x%7>E3D>mMzMLZ986AMS0e7XIE>r2^|RydzT%z zX4&OCYxS~ayJo{SYUPUUHYjCPMFLq3x$2TxUG~K;8x5mwa-xRe5ieqaMerk~IP+4; z;za&N8rzUd;R$Tlq3cL$=o*pS7!>>b5l@Y&wpV3D52MTx#a<@pZ zsf0^LTMd`2KoOU4Qx%ttEoEFXx7P79T3*MzhN0G3XW47cvRU^0n{@1|;a)VVJUe+R zUf1ws-B>m~_KTLgM2fGnUDm3f1dFw=WyW-uoP|q<%?&MvrX6Q_btR;N2Ucs7;I+Fe z8%JX>yf*{$y`y=;uSaT@uVT`u)#feNoJiwEd@+R^c&RUrmo?n$n92W(R18|?A6U|$ zFJ;-Pe3_}VWC%ua!PIc*^Y#-7yqd-~h#9sa+p8Ut2Y5T-{u7bvJ^}V8$GGNgmZ)+|K;~n*rli&E#>U z8x8Y->QwBKSd+YGscd{3ml*2Mrvibxj=g-WKYUjocyRA< z8H^v9GxcKc)6AA98Z@E7r@-ka&0N@jKwcU}7I z-7eC5NXLA7Z-Cw>Wqkhr0R2>e9t_Y20`yRmu4bMlO;>b1;<=$H<%pt`D~eLiC`!4b zDCLl%luL?IPAN*cMH98DZJB5In&HEGW@Kk{Ks%&e`s{;;Z%3z6nY?Gp2M^zps6bSd z&)$k&?f2|qSagPbXH?H*`pHzLwV2t=6J#nYTg+{WsSIv0bD8a&scdgCpHxicMvFP1 zn98FTbBAIo=UU92in+0TzMZ==+aLZaJ}NVeZ3dHXkemCU{2)1{K1fR34kiDiq;$)u zE}OD@&-katjQlVW2bX#5?z+kzoL>kPd(9FSrJip!+T6Ha<>;Gck3YLwzhySA$&DsA zic>XeH;jfQvCkZ8*VSybH!00{RlE6+`>u!GR&{yCSn)Nb=ABi32wb$}yLR|$Z-f|_ zIp;X8a2v*or&M5!M`)D0FNv&duo;?nh~gYG9J8{U-oj&Fy@ki_TFqx~twwg%YGhxn zMt0R|WKYd;fbwi@(1mx2{!SZG9H)xe{!j4aXm)`2Qg#RLg^#hjP+Z5p!st2%3#D}o z6>`ya3>R{-b>s`V_&SP(Tw)!iLQY>txsXe)W9;|T7QuITKge!Bi)n1f40d6bme0|G z%P8UseZPw1nCBR< z=$GV4|Kp015lARX#z0q;j6xFMBfT%_huRCccPGF3_kB|QaFH6MY?7CZRX49RuO42# zy!v?c<0y{NIvLY4)oL7Lg+F57??`yzkP8cjLb{puCirf?L(ays_hX!a*{W!;UD50# z6`crGG}NwW?vaX4;uP&|cWwB7n`@Ut6!l{wR5;%*d?i%)bf|E#UHEFK@R?BIQoHbc zsPMC)!sT}1YoWqtLxsoMg|CMSKi5p81C08nMAAY8HYd;X%{31StK@mK@VQW7l`xMM zo^1LYe6vcDFyVfj4;4^}5iW2cR6r#|xWL6w0hIvZ0xyILs6`JKxD+a&7CKyjUrwx7 zax49ubwpN^{MO3*Cq!NE1os{Do)rs>^#xm5Jc zpF)>)b2^ub`SjpSE|u`kTi@} zo>!4qiC3A|*r)gk&{{$ zAQ=7x%grbGASebwDG16zFy;YSth{vFP78G0L5)cvy>0k5YpBEa`-s1Bjy#dyFBE@? zSoD7JFNl1ISl9jH14L$|@uR#xfvcF(0ph^`9wHtJ;9=t7pGggzoF~X{fFeP01C$6# z8=y>3-T-3+V+usQx+_;Qi|&N}4{S>y($|+(f2yQP7ioNRN4*aRt8`XoJ%72?utGw% z12O*G&7liFR$kEpe68@ZP$uMvu+e0*{10i>#k$@ZnM~Enx5(ShHtqJnH#2ETsCT3mScMN zjZHHNA)s#?yGGGAoXz6B^=-4}ClM1!%v&^ZQ($niT&V^kE#I<>Rm=0|rXC7Zj`HWH zt0&;tFnps(AeR4lAHY&T&D{))rG3{oYzfH|=naS^+pJTAwAvtFV7%%!H;db*zuq(~ z$156+LnY~%SG?=`cU!hSry(scy5st`qX1)&8B16#j@i!sb$r?BzoypZOg3f zL~8eqrcpO3DDcK)=xbLv=DIkm(#R$uXV4EljXq=rVv~}NV;~I`X9Pq!0}W?WP;ib^ zC4&@(B{jle9}Z;(X`Gjf-=U-amPLQxJ}HW?IL$eRZqxK1bcK@8%G`9H+leU`DgsF^ z$e;`4CZ`S~6S#eZIe!wg|8>9u>6%+_xDJo=YBw?4OBE-6G%icXJR{9_ z!@L(bv!4+`eMHqDaIL$kOm=GdhPXU-pqM2?R`U%prQt1siB9jaoLzUvEQU50U8iRF zw~ZQ`*yAML7C2WocFd6dp52J9kcMNC4Hob|e>+ZA~$JB9G zzz!%rc-%0L5nt<)ZwL5@2aASnuUfu2m%(++rSW~t_a|^e;L_1VyDXk1CX+?keB+Z|qYvGUzhp})~>*Y#MTG3)0`?#d-eXI?= zd@`$)#KOf~LRUtVQjDX@F`moli4iTQ=9H3FO78tBp=v2TT}kO#DRt-Tk7JzYq+~Gf z*9SV%0cS=(!&REsG$k}0%mU-HedKkSr-G=Q(Fdt;c2?8Rji^JSB<_6u$=>hON?IQZ zxBO)9sicNUjmWj9>Pj}WOnB1e5moEaGh_yvbeO$*-^#h}{W?qiy1w_9L|%rHy@gSp zJ*fkpe5VLp;6vkzeDGWk9y~M5xtZwEGqY~gc1&l3_g>VNmgU38yRyT6n_9It9m8)m zSyB0w7T+Lsv+V3zo<$3{Ixh;=OjvgPRX&#Pw(9F<^MTB4nVD|Qupb&tOVSZ@;;^mu zo8o{`J#0+vMV4Fds!zPjMkBJ6UUgf|nt9ujdksfsA07ixUvORD^P5H^H0t3h`?bnE zjUgu=Ae`mo(<2!9%HZlY=L+7(4#xyz-@`G(k@pidZBjn9;~dWqtGUbzk8`po~3LO@6gUI=lbaT3Cku7Qvw4Cx*P zA{beWV}hJeS!pZh|9VJy;aKI1xWxDz-g)$Ihm;qOQ4T}@#(~ghG1+!yoLCOHB91YV z#Z(*qIGx>B2;d*DP-sK$-XVZ|oWk)i`50gbrQi3MDKb9>qWt(Ll=t&v!|InP$|!^; z!=oQ)AN@f4=m*+IKOi5z?W3PL5SRZW4fGUBO!)95mx43|t_;T2-+T^DX2bkoJRZ&S zw+7=$&Qs)%URMhe?-#fh;{AxIlwxq=usD8LljDCT;B%V<&4B=VoXbjLj)|kXG z5$z&yA3u(A@YlpBi)EoO{b$70XVd?N@(09Y&!%5OS(e*f=Kqh9Bljbb|NZ9?HA-sq z1>OtfRk^PM84A8tliIh)CZY892N@`laF6z3E?@;eB_?@DNtv^&oHY243$DoS)8toy z1&`xzDewUUytal|89yuI=Vkl?zbxZJ7-g)Zwg%y01Lhjedl>WZ$b%MqQ^7YKd^bJB yJtRE5?%{%maSsz7E_%4+Vba5thk}P`5BCG%6%Pv@-VEkjY-nI01#a^Hz5fEn{DMUQ literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/RefreshSessionPayload.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/RefreshSessionPayload.class new file mode 100644 index 0000000000000000000000000000000000000000..cff7f96f69d9e2c0731a1d7267b768fb0fcc065e GIT binary patch literal 2665 zcmbtVTW=dh6#iy?+iaY8ou)KROMxbBoVe+x0ZM6lAuTO&aMF^bDG&)Xv8VCI>s_-u zj>rotLh4UIz+)c}NPPgQv{jK%NZJ?Yr4wZ2iaY*z~3<&ITwmE*uJ1t}O5vs4kK zYGihk`@AMdkzu4AO9*zV6S_3g=rPcZUWQn1bUBR#OapOb8T$4bq>;jbE@SaA~tHI;gL->9Tz$a6s%k=wQTy6fvk97&>0&nZBUztZQoDE^|+as?J{+>o_TgJHhaMAqB*JRx)!RDn9cT^ z28p{Tbu&E}A7B$~=Gph#-^FJQvxnrpYW1yJWkN@4wUBLv(FxjMTu+**?O&3n!am7V zTF0rOomOwf`Q}?OPDGDK@5T5kFHsXOGxSV1WMxi07{Tc(HH9M!4OiMVQE)fxz$TOF zowiP`DlCyq(RRgrqqZviC3Sv^f3L)yW$xQ*9SMhD^wnzYyPTTgC2DO_QS~fJ0yxL( zktbu(YxpH`-Bz&!H&CXQ*w&o5$Rznm+L|Ppc%2I*mGw)F2VV z4O$gRSEJF)_jNr%X6!Ng#`1sQ;O`{UaFf2hq?x3WGw8j^(D(_-UJGq#JVYz9j^ZrP zoSwfh&>}4ojCO!525^{cR78um>9CL(dx(R-(IgC`;DJIY_vug}a^DUbfEGj>6%@518pjnRP{rg~K?YDjW3-XpyG zpp{o>uSfO_XPZG&4o5HwqsX^g4 z5KHO*qCZ9Jo$45AQ8$8fxJ1BObiGeTQFWZ7X$-fTzUHt@;}@iPnJV;y6~qddF5pT5 zSMgy1*Koank1(?W7NCIH6=VY(3h;4&RP&n%kPI*o;BbJ!07n9xZOYFDm}pLh0;>1h M6hqyCQ}jRaKRkDPJpcdz literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/ReportFile.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/ReportFile.class new file mode 100644 index 0000000000000000000000000000000000000000..e3977be975c5e72c9f04e49944645dadf1ed7fde GIT binary patch literal 4187 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 literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/UpdateMachineStateDefinitionPayload.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/UpdateMachineStateDefinitionPayload.class new file mode 100644 index 0000000000000000000000000000000000000000..1a19fe097449be425c5baa6dbc89dff935fd7500 GIT binary patch literal 4130 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 literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/UsersPage.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/presentation/model/UsersPage.class new file mode 100644 index 0000000000000000000000000000000000000000..88edfb3339745db1646246e989b6f1c42eead30c GIT binary patch literal 3856 zcmbVO-ESMm5&!M+NS-K4I#QM`iLRnpvLjKJkG7M3Sdv>ym1C-u?MjZ*ME%H#I*TVA z?-<@usL`TzP$2IGilFIBfj$&{aDf)66C(u*S9$B-R22Q~-HD{WnnD11yE8j8`3{7mH( z5L;$o8bo0SPs81p!|B}Z&{8Jw0@IOre1X1@Saz&B#Yw9T@&zU;UUS>nv4YK}X}i8* zx-ONZPrh;A3+}fZXHG*#U~Jb59NRT^_UeZ123FHG9i!|9O={UyKaD=RRIORn-B|6R z*);1G1qI%iiX82V#atI>T^iXYSbXMc}-Iy)8Q;MexskfF7s3nE9dkfDxANe=@&-TVNnwIzWikWSL#YeAC9*C zWd9>cjgT6ZYagj=xyUl%NtZ`etyj;I8E(>H_UZj=7rOWBEDh-T{-06>8A^5)M%g&6 z>z#6U2wdVj;+lNS+zKBvv&^>H_(3zfX;ybFcZ-+Xs#&esuC*#3HU70-HrSqZd)qaG zR+F_QMbzOp6%PTaHsQTV6{XAH&CI0`>pz>)qEs#TIQrzHJ!(1)0TA1oIGl) z{c1R5RF7Ixdy$3Kw;mAhs@aGwW!Ak`vufS7ZHU&Ni(w zNfXG+CkAJE`M3y2z9YE0!?}X@u*)&U!1r>@a^!_XO@~xK?Ig#GBWgbT68Yli7%CQC zV7NH`0)^s;`T}Er<+_48zvn5NW~b`K9CXZMh)>M|X_sro5X(iphH+A~7-Hgib0$$K z;Y{LEV_a!?`>#E&dBq_Y2$sI&Ma( zm5<%*t|=k!))-uc86$IjQd)Y6x91D`Yc*-{B`O~r5M!U=K8fd)i$ZvwIvNA?fHfv@ zOvbwiJjD0o9Q-*k%3@h8&ioNc_4&*{q5KZX#PgX~P*&x3SNZ?F{Lc~$PKK!$>k)3o+)u?1@b7k!NTc;Z6~zdhkM6MnaS zBz>fOyzb+Yj|m@>J}&#X;$zCkw2z{X86OWr;WZzNKHd!HH8wObkOH^)|Hgj-`1y3{ literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/security/AuthTokenStore$AuthSession.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/security/AuthTokenStore$AuthSession.class new file mode 100644 index 0000000000000000000000000000000000000000..f48b75ea3aa95b341014d347de9efa6c33e03157 GIT binary patch literal 3615 zcmbtWTW=f375-*V~bG{*L3Va@(mWcGZ#6 z^}QT~fU#}uS!Ubvw#>ITwjDdnAtjK#;8M*S0@Z4xc_6VG2Clbt{>h#BHQwn;C#Y`< z3|Y2K3z1QQV&L2k92sK}IMMWjEpyumHv-G`q-lAcA6g;dNOQ#xSGw)?c^$gIOFMqp zc0F@@uVcDi=mehCHtU{3AYEJLP!t%qTaLYxTzkg~td2uLfs@rfh_PD(K^JiZBLxh@ z(2*BNRp-}=$l!$n(ijsEjUsZG$V0=VK&ek>5{M#nl-2RkBJwfyqCh%qxl-Ul^Z$RE z^8)!TC%lzJl)xGSN4RsTKeS`j`6n?6j8N{zp`aIRzq9Lmju)O0IAG59Gv6a{+uyw- zU_axVKaYPZ%-I4XS7U}Kvz1Nfw$*Ki0)MSOkK$)a*Lq*rlJuB=9-~E6F|WK?6wpII z&JKZB`--g^SI0$h`dD9iD7L>oE{b^_e51-i&AHwltJjQmUhzHK3a?r=YxzzNe6z`p zwd2Iw@3~=%lngB|Wd8l3zX%d7*PXECZ(g&!&9);eP2b{GvI)9^pWn5)bW9y2tQcz>o`9;@i zGqmIVq22fRLxGGRwp9ONWWT$~vBOy#ZAU@20%uvNd}_z)*(hQKZ>x^=&f$iX2ndWe zlfKEPwl=NMq8+WXmtv4K^+~G_*xPm#!2zKC(pA(Fsm(J&9DjJXTF|Dnf@VCtTi~B& zODV2tt{JXbwLbbho7QuN-pCtA z)cLhpr^J%D_U-Q< z{Vv@o7~|ZZP~2}7HyJBe+>Oy#Cn4!{>u6ff8wGAg>JK)Dj3PJp!6%Z#M)A>~vQsKh z?3|3@92@+in!V?u*}K43T}bBd!iHsY=5iV?{%=zt2a6N5uW|5650CK09X8478(lAS zJ5Jr(bEQkemk#DA(>$(&k*4c8E8Wh96WmlOr&7kZt@fG~xQb6UE062yP0~Y3jktOA z4p|4ot0CRIZtW(TignL(f-7xHN{7dVRlgh9&Q({LE+)b+V=mAE{=~9VH?Q4wJ zX76LFws0TQwQ~ACX8uAc4O{$9@WwF4Fp6=~6PU&%j+1ZktQMh~!%LVYN4*g`W&`{|cCxA{^kc(<4{DpSgbGUe~kKA2r7r@zK26^B@1oCM`w z5|n#MQ0^r`IZ1+ktk0MbMjofJKwApdGC`?iSsc%#fBhMBl^1W0XEF&ry)vH3kVOpZc>QPEc7k|_0?l-sq9Jm-KSt)U`-wC0nV*;+p z=hdjGqBK3gl?&6xY)fhU3P1jMpP7l7dz6dAH^DnPUc@!jBOH~)ia-NDN$U1D#HdPV zxpwLcWYYIe{S(?BkxAV<^$^;1W$rY8pMIvcltFUS5AbdzLVkw)%s!u1rZuQ&@ZZjy z{%@3W&_+h0R8(M8l=lmI8BN?EEcI47RZiDQsG`jXo^XDm&2NDR8a80F&^zQcY{KKZ z$Ng2t{N_4Rb=<0Bt&aEbejOj+!#dXS(K>|0Pw}&LlqF^*elC%VzIyb{OJpRn62~Nt nOUy}}kf=z!Eb)rONr|dNBa&=NT#Se%iI3sawocox^LO^YKcFDu literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/security/AuthTokenStore$TokenRecord.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/security/AuthTokenStore$TokenRecord.class new file mode 100644 index 0000000000000000000000000000000000000000..24c4557f6c6eb4572182b631a193496753dce295 GIT binary patch literal 3220 zcmbtVTXPge6#jblHrXu6>`KTD2tw2(Buqr{LV^kivM~fD5yg0+v)jo|vO5!JW>fNF zp;q||EK7a#!SVsCv`UcDDhu(=-{YfY`Sr|Xv%!F+RP9cm?mp*yr@uaZ&hLNy^b3F! zSQ9v2uUBm8H>AB>S1Pm{p6i63ZwIQ<^qugkeX<$W7Q8j(&U0A}N8&|Q@%(BILcm&; z8`7>zcg4Q2w5lp$4k>}`v_m(~3G5%4nT<3;r=jc%%gccZUzDL*;B;#A5;dEF^2=3$ z4)y-J^#0Kn}Y*V4z1};NC|qz(lWB>k~+aH75|5p8fySPm!+`6~2~m$FODu z3S2p}MdIF((R;@ukgs@+bsJLX-}mYsBzVnWHcv8!8MFo)uBv6( ztn=o-8F>)L_sO+#+ttR2IyL$rPz4;sA$^7s0W3%HMTTc(g>Ud`4o3uf8*)v>%db0OjZzRwH)LLY z-k#Tqm-8yDdDU~$t=3gAJnMOD&Gj9Uy^W)7h6`8M)eh>5ZTc-v|8auTvR#5*oGru@Vc{Q>45m10K4nqBmI<=-N`B_1u*ljx&)*W=6{e zJcH>xrf@=_FH+i}6y@-|)_XRO7jTkAiFGJSM?ue7^%FTMOO{-!D?VIP`s$2!`L89Yg;78mGr9!5EKvF<=>o;sq!99=WmSffI7VY5MY0V2 zN$U?-uhz7{vTeNYXlasCmGA$L+t)-nc+$rQ&l$IP9tvS~AG(#o32jCvb*5~4uMZ@^*Uy7oZ{WHj;rRHjV0wT=q%D%;8kS( zlJp%tPZo#o_SNck+nic)HE3-zwRg>jJmz`1o_H#hU03<1>oN!wxAXH})32zrj)v|} zP%iBduXW1v!XWhJdW;e9$r@~xOhc4(r=(QUt&pT&p`7K|!7mNYOgnv#Z2 zp-Q>K;3q~`@ifQ55d%mR*L+iLfSPfT*6%x22_G5@zu`yp< zV%-1TUB<;7jIU5yv7w2Z7>xs2ra>A;p_9gAIGk`k&g<1D@6xvX_y2^afvwQv+v-X}Zx2)G29N~u zJiY1s=+$0s;koHSYpABZ-NdOY(}UN!6*IAiY9{mUG+vBgdlSb3XKgR}lyn2l7@8p?n^YbVk<^G}p=FycJd z*qXD=JU@n)aGp_UzH|Ei&r#61oe|v8WUcV4pPGTU@eb{3oEv;@4##z_&++CjEFx9L zD`mV|#zoARv4GdgxP;diAp*RC%Zum@Fc{#?0J-RE26`nEARAzBfPDe>2N())Ai%=` b4hA?Asl627nMfFmzKd8Ts!7x*`Jeb30`BN( literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/security/AuthTokenStore.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/security/AuthTokenStore.class new file mode 100644 index 0000000000000000000000000000000000000000..c84160ac684f3c2006463a3e6fb7ee661e4d3ef7 GIT binary patch literal 5572 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 literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/security/DemoTokenAuthFilter.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/security/DemoTokenAuthFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..b1f52ce63fea69169776469d5ee424b3f4937cc4 GIT binary patch literal 5054 zcmeHLYjYFV8GeprY2}q{gus9>5QA0l6=9Q@UZeou-*dYj##kPnf#yrn6Sga4kFS=$X82xEIp<^{h2wP3yVtygPNk zFkRhNAV_H0lWAwhHgb~_wwBe;S@v}LoIaMG@b;vS#CH4L25X0^1b zDssq;MU>*E`)1o1Y=0y6H(M-tAMgk*KFOci=aVZ&0_eeradgJAi5Pa5i|v0 zx%zoG?elgHxe8hYVm4D}Rv)tU3FExL-ZEMgDN)S1tFh=qLE#v-BdwwpJD3ABuE(;b z4V|#4YiK-KK1lwSt{B>}Q`+^UKy6tc`WqE=&~UOIB=QATH9gLmdCgolX$oo7cp`?qcvdFOb0nwiQO(TjG3@iD^ayN!yc(gPm*641 zEOS;rMsW9!3#7`pzSy_{iwPXV^XOA?0Q~~bmMd=eOJat#D4nsGO)}<%LfPZb`z(`~ zQ*dY@O5QGkJ@n>(&6K(w#-NG;91%G3NH!YNM$frM#><`hGdvedTUY|vgocgmjHy3wYxJgPgSV{Ulq?j-M*4aONBVoZM|$^1 zph@9N)5kBz85O5NK-3koHe;D4%emJtdKTYh0@H}FX*jO5rUX9=(Dh~HUBgTda35nd z1w+Lo&M?zi5X)`HVd4S$)F(Kqs9EHV}vb+OJqpjeq!0zR#9)fHI zEH*10-7V$HzSQtBkX=gTnUcqB6fVxOJ3m;JN_&uk3j$9(bdTRj6ueTVycM+|1)pJw zS?GlV`(-3bTU)8vr48-=_d>^$pn44#qxdX7#{!=+Qd+8Y!mx=NTb?~y%QWQFf(8rS zIOWyPRGWZcx|~mnV#`xb z!}4+$fbwl3?$Iq%!PSx)=lfN`_oUKgGl(ZE-EuF?=;Mpc;q=)WWpf z5Lvr!{$hJzhuF6w5snAe2X+K+Ukg`6D&nDob@4FgN_#jS;aJI0qzh3Y=6w>?{NFv|0`W0?C53(It9gGcQ*aUiKyAU5n8CEoWhl z5sm?lAU$jFNn^HruR^jthj-L zzTnn541Iv3$CIHOcySJ&79ZgB@x<6o=yRB!NA@OW=3(E$`2bp*=kapOJYKzp&j%sR z58}^!T8R9ccL@b2?$Jq61px*13cjPTp>mPG?+O-0e1xqEcJWXA3!&#Y-a{qAOSTII z-|zOAb(MbQn!IREpK<+!9O;s$+rir##a<6Df_4^AT3 zk018qNB#IQe$tPh;_ZH1!_Q7aIQTh!aT0L{YaRU3f#P75gOG!;gLMwBJ6P}FvV&R& bZ#dZC;EIEH9I}=rshZJ!m%m?ojDGVU9kR+H literal 0 HcmV?d00001 diff --git a/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/security/SecurityConfig.class b/backend/build/classes/kotlin/main/llc/arma/fleet/monitor/security/SecurityConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..857d3ffa22e41ff6f7cd26d58c531a60fb0cbc39 GIT binary patch literal 5117 zcmcgw+jARN9sZ6iOR}uQiWHgXbd$8AU{97$_??bWWj zyK>@Ez?5rSQc7>!-gx2>X29))8O9Ud82%=P@9eIkwX0Ze5|~MJE_;60^ZhQz|N76J ze*kz6e-Ico&5|aaiqw`(UH7z#Z5f{JXs%wWIfl2XErgT2Z7mxsNeF@Ln%t0@DXkUl zN^wmuc}cVhB+eNmJufgZP-w;UdA(vU+UvS?vF5G5V3?lnOb#vyJXZen2Z5&wwzHzG z>0Z&1hUIF~vTRR!hRyk9+q+yd&B+v!0#B^lo@rRx+D1h)EHbsEsm)lPLn@=>CXp8C zF0JaN^^okUbYw;6L4nf)g}r7?Ms^kylNBnNK?aA?=)_@xwgI(nM>dT(jtHE2Aj30A z;;|0Ia8w}fts1VtSW8B`uVqr8t14ahrtOq3StYxyEV?i-=sV7>D%F>jrTo6$xZ0Al zS@mqKPN-eo&4ElunldQa^zAJ#au3>+E-jwFpf0MFyrM5xo60Nkdt@eYB8`*Em*)<` z>VB#x@dUwC$8Z3!{3^jC@Wwz>o9bsZ8b_Q*ZM&%#wPMXM=~P#n_PlD{_meIBs|f37 zBRbGe@l~=(p^tEE0=vPbEcyjb)^&=|_M5U&EX)2ef%ykABrvb$C|mNbvmAuATKm}k zB2K4?#DT5^2D3OV(ANkG!`fiTY6V||Io*@Xvcy!enZ(lqoeZP;hQPn0R)ut=ShdU3 z(kh#}+h4Hl^;)$_ghgU*7vbV&RgWG&_{Tux{CQ#sWCy>m&}@eHqW>n19a*Oz#i!gF`WiuMkxwUZ}w92Lnb#r4~5; zEFqD>S8+Ct2@vJ`0hoS#1OT=jcMpJ{!+8bZukorbWN|(RW@Y6Wp3LC+K($Nzt2Qq1 z&cR&RC`6iy^=NFV!e%?fh)Njq`l~hF^&-0V*T4H^Y))EoMR&qubJAmt;%dckJ!jL8 z%dcZvnKeVRX0w>iaZagcY^)?-PU zH9dpx1kJ#A1)gc?&L*`WiK4*lqpL^)F~bv>+gF$7E{vjgcV$R|StVIETv;@Em$L`V zd3&NGS~;hJa!S9i!boEUYXVmu#0&RVn)&D9IquFc0x2hqWPvvy(#7=z@bC#D37e>u z)@GPLGI&*ixeE4x=Ko1cy?o6vlOXgus=8A#yo;tOaQnfK61~(%=O%(}12@yC;g-PL z4-2+OsF%RAO|_vL_O{u1zaywQem*9`j}*cek7~!t(v#eaRW{n#UBuK+T>Y>Figh*N z(=B$(P&2lVu`)~WyE|J?r(?%s=~#AWE6soYJk=JA+z+>Q4XK{vJ6q$iF)`JZOJrlc zv9Y$he@w(v@of8SCY#_oIo(r?rBbs;vmIQe#}nC3j+tP0{%}C^(%tvsq*F5f`Id;K z4&VJ#;*ipd^_ME2Z|akJORTkiyEJ#|JqGu0&inX!9aT@_v;LEKgh_8Cd=`%sWr?rW zvcN0<+rUcVmjXj|khN|S1P;{?`=Ll^)T>Q^nbCE|=85?lt9eDAu{I3Xpj{UmFKISO zdA=K2ybFe3!sY5v* za?U?E1cE-|qMa3zgTQe-9!fkzT0$9}f5*w|ALDa7c=FF&2Evq*ik%XY366zAe#0I0 zwU=Ym9D!3bxZO8qiz1XU6T`WuXw2{(JPT~&+#TfA_`)5`sqyO2U(vmT`P||*UfRaX z*K@CY0=a`yLyum{O5iA!@21hp%pN>R*~2&yalphq2TY(3WomanEt@%}kDB&^PfO~o zu40Vz%KF66Hr8KkTtMKH?ubtk&|&gq=waPw#1=nfG|aVPB=+(+7U3btqq3I=`{|I! z*-)7bm2r1a+s0-@CDn9;ciPEYZCq6b7G7(xv^b69xBOLoc@?+u4vw(S+{UlS{CC`s z;a%TjFLU-iu3zUpe*XsAX7Ga<{BQjC}6a4fBgo~fy=Qq&hqQ}KATqIro zH3RJ~5-yIrc+*9%i&HM%a?$6a?BZ>ge1A{Qr-+Pk{{I4oc!$C4BBsLGH&FO52ZtgJ literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab new file mode 100644 index 0000000000000000000000000000000000000000..8aad32b3b84c79ee82814f17430d858dce49687b GIT binary patch literal 4096 zcmbR3vzw0r2pB;G3OmjFH#6dEh^3|E=kQR@klJr@J%cTOUx-v4KB$qN=#2> HVE_RD6bTXt literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab_i.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..1b1cb4d44c57c2d7a5122870fa6ac3e62ff7e94e GIT binary patch literal 8 KcmZQzfB*mh2mk>9 literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab new file mode 100644 index 0000000000000000000000000000000000000000..8aad32b3b84c79ee82814f17430d858dce49687b GIT binary patch literal 4096 zcmbR3vzw0r2pB;G3OmjFH#6dEh^3|E=kQR@klJr@J%cTOUx-v4KB$qN=#2> HVE_RD6bTXt literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab_i.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..1b1cb4d44c57c2d7a5122870fa6ac3e62ff7e94e GIT binary patch literal 8 KcmZQzfB*mh2mk>9 literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab new file mode 100644 index 0000000000000000000000000000000000000000..72b696480bf9187f8df8719e0d9ea05038670d05 GIT binary patch literal 4096 zcmeH^&r4KM7>3_|IMz6tIg_cl5nP0{t3``wVcAL$BoN%`DqOS@B#0Oa+~}&M8qum~ zRe}+=UN1@7h zCfNg0(o|QVQ_u{0_?|0z$HblJn?O*6M@BV@4L8)sC?wDsb z;oKo9vjHjd-a0fMmWEbg*=$;Y?jk9cgW8BR@&jI(o!_CgSgKowk7n*0TstB?Sc3Ya zQsW}LHh;~-ji}T=2bCq##jh}Frn7J>CSCvHe5rIQ1JBHbG+eU1N3)PIJ3c#iOe*^X z2|J9>z+*Et4VRBgx2GU&Uibi4E2Nh9&c&s*cfQB$vxsCuYM6lYC#09-@Y8G`gNK#& zlY%QJrGYoFXx<-%n^n@;=RT*}-#Y>W=F?$lsF8Y}?EJUA+=pH;5DWwZ!9Xw&3C!OXnRAJ96p3;Of)XqhxR{Q6Q{o9dc8*05*ZmtLo88zMM^fU# z^vDfH^9ni)aK=9J!;CHKBxA5~KS~M>l5k2SX%xFg?|y)7}GC1ISvA<83h7R$>&qUEfOq{^F~o z=f*Nw_zcEJw(pBQWG|efZcUDrBZg$g@EJ^ZMw#ec@OXa=kCBj5MF?!@1p2(imuy0eE~&2*3HLtpwIs1JRsJ9Rq$u)fxvHS~;r zJT8`SuNl0n?Q^{2-jumLy3qRp-H7%*LE;KMn|I@C=Zz9oFR&-^ER`dJuFReZ@0Zwo zdV;> literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..57e1942906b752b26a3e00fb5b2057b3b8a2849b GIT binary patch literal 8 McmZQz00F5D008U&%K!iX literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..41d6c24bc9eb9b1197879ee930112381b748c394 GIT binary patch literal 8 McmZQz00G7a008O$;s5{u literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..c28750e555e7f1e1685dc34e37a37090a2d676d6 GIT binary patch literal 20413 zcmeHPU27v%7(N$@;EfmFc-f2fvYX$~@7A@oCh4vpV4Y5;Y1y`kleA0z-6A3)A|fJQ ziHIyBi-^dw7a~5-dwM!^GLz}FdS>Q?ZRjRBNw!a(^L{+%J@1*8+Khr;6fd-+a1i$v z)(7#zZWND>N8{*hycvv+wu9mQ;N(2&j0bVhkG_9J;pd(T)rkt!2)78oE%i_h)EHyO z>I~0L@tS^gg0T=Ifr@3cr4BI?;Wn1{4ehfk;HXki-q_V2Lf3{Px_XzE)Di<{NEoXLENmI$3{7h=do$_{Wq%1} zTa{B5fi&%?UefmM%Zy;})ks?x7RTgvir+C@ccONMQik8LpSJk7*rKbfI?H`mLD&$~ z#h{I3(uuva$;WTdCS4_qS@i8m?2A%O7iUgl;E@M zD~*bQgA0TUK{vUww(N|)RWZuWw8J*KjPv$wNl!}B5nv9^^(APYA;4n zcuCo3;>PYJEF~ZX{z&2;#f>goB{di$Yt!$rg?4#KR=Mc;S!n#&x$9m}V{uK!Ym&bb zlJ{yNIj=_JHJ!f*oh*U6*xE`~ulY7>E6ZZR?lsMy3(f6D(CjslO|sWSdFBavuW9~C z>~+5p_L|TBHKOaGd?no@a6iwOMCS>(PgzB}px0#XDspkc5NkD;rd*(hyrP2vkl zik(JKYxcm4jG)0(ekxS%)rN<#eB0E+XSagKe8 z!WSfComS?|Re6%LqH&H$Zi=!n(ru2YefAog;9ad2XWK8AL_LTw3bwcLxGyye9?6(s zY=HaeCRbNon&mL+Af_d#F8=a-rIw&Ys9n|h%b_;K>LP@$dKAhbTtOUUUkwi(824%} z+C9|PbhAJ?v<)s3{q`mu-_;WM=96zL-XasI7jxPK%47bZa>1Jpu*>3N`uJd0C=_ws zuN8MXIM`e#f<3RNp}F5^w)Ob>jb_hLai5frb9DP}R6Y^h>|9^DIBOE?NY1?W5e@A9 z>U!m$?b)+1R$o_4M^GDM;;WmGfFp<(-6Tw#&a&(3+(Egyw~^BlG{z447*3_nf$hz< zJ=80;ZN#gheBTdCT?huTyMQU-e3x@CMwThkW%ZvnX{vmxN-j za?H`zq5!>9t1L*PwAlKC`yj)*INa!&($3sxOnL?fE+7b{OGt`$tn@ zuG#qQ)RKq4!2$2fR~hg&9l0TQ0Yl_3o^jXLlre>lE~Z&uP>DI3S$SIPxC#w7!*mB1 zkTOUa&bT&U$s(vp1%U+$4f;HEXo3nG&p-FPpVRhxp6C1heqM9WHYXap zjI~A)TbGV)*)egoh*LNe0R&tY=v`wNQ^TpFE{{Qb1S}C4P?dXkVzZVMD=3oI^Q3d= z!OnsuZX$pH0tg_000IagfB*sr*eGyGpTok}e>B?I!qL+0$}>8Bd&beGG(!LZ1eOrE zsq0ZiBJgmDUA|aKD`n;GmIhyhB_ski3uIM){L!|6&21=;00IagfB*srAb)aKmY**5GYw-yWa1##$y|oD{w{o1Jw<0mfP>Q^_&9l%|~9k zmAhY!UvxBma;ty2_KoQ0JRh#FDz|)f$`!3R+gxtB+{%+w_YuHRoGXVw*a9>pnrWq3l6rk?AFS+L=@|A|FHj}-iwnPASzmc^#U9-ac1K4Suex{doN}i! zvu*B8@UQb}%@GP3wQkQre*_TlpTL-|KQ*oUGX6{MkHjfGz7tbzgZ@ZMN(2x!L0&#sF zI@O)cmw38mr)|(2Tj~xRx2&K`h5D4Eers&rsrF{0Cr#@^PW7V?0)7zaRmg9-+?+|HvFRE z=2fV`|G}MfBz=lv$fUZcfe@*3WW>^B=R}C$8fUbU0)iM=*m~{Du$s zrcK!C~y>76$Pb4q)Q4 z)Q=hL#VB|32;X5hddsCwe2EV+QXzHV2fUAMmC`-TVjTM%sT~in4ZE&Lt+sbu^eyJ zN`73#QgrGhuUW@pY^;|&xQ1@tbt|q*Ih?^G^hBgX9KyfI?_HUXP} QO~58#6R-)`1WrldA0Wvs-~a#s literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..d2180227a9e3f9a25dbfe9bc6a6011a376d293a5 GIT binary patch literal 12288 zcmeHNX-^w56nsCYQq^s%-gg7xl8QtL`~bRH4wZy-6R7g2s3TT}0Lz56|x;Bk)6 zml$b=SAJXM39iMUlAl9>!Wc*3dMZCL&bosq@+@-X z;WfVk%*M*;bJ-8Dt2AcZqz;wSoS{Ty>?8<~OsWReO;Lad53z zA4oNjN+@RXVk!*dzXod)2(*pL|X2NvmDBE|feS%;5tmVQA!TT}Ms5?7nKHI<$| z13%~FvC>3rg=$x!0yAH*>S|B%8GOm2vt_WOGA*O;N@?$-zs`bwfQm9%n9o#|*u;l# z$=!1bIxm^^XblW8RiqJ*kR^QlS<(|fNHWuMnZNsUbjgueCZMf__5Eomg z+OVRwF{`@vzOxvOkIQEA%Au3g}j zeRpi1*bYy7gw8#>zE4#b!hO~zgV+^JI|gQL(L{^wCEB5_t30ds%*<>*4Dum5Jl%g) zvJ5$Pr#0SYKSwq#&x7w;z8e2~vdrhk)EZ*T>})S)oTdi5Sva_U=WAeVL#V5I7(0U!Jc=h# zdM~|l&T}mrt})CxPctTC`{{PG;v(|wLZ88X%#zt{Clt0=uzQkfJ?|=i8*bAB)Ae03 zEPM~;dFWq6!{c!AGlSt$M9$6>-drNOd6uZp<;@EA0M_yRdW<~|oqw2ZW4$hJ{6Z`$ zy`Jaywdxmg;~J~E^I?02`18ROmjFH#6dEh^3|E=kQR@klJr@J%cTOUx-v4KB$qN=#2> JWMCM^2mole5>5aB literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..cac20469255b5a36a134707ca806ee0123bcb79e GIT binary patch literal 32768 zcmeI5T}TvR6oxl5F*Fm53boo&%YGC~2*VU3Oi2n!`Y({mkOXL9kbKF2w?nEEl-dCb&dxv37Ehw z`q`%#mw^oMD+2u(x1r|ImwshR1vB}$uX#06^iTz9MI=IN7w8SnqGoukv8-FM@7 zzUjk7=drK%Z73L-8@PB&8(dEu#SNk%=7hK%6+f^K2Cjk;50TLhq5ee8~ zIwC9ahlt+knFQ1(5Rd1pe3N-VZ6DMp0XYd+G0zW9Ik#3$4PVqA#B*C{%v4{La;ruM z^k&3nesL?4eKb1}H+nj?V!Or!8q$M9dFGa?yWj?2Rs|){2pTwIQHJYCiKw zfCT*>DyI*w>q20Z+PP(7LND?3c5>S?a19D9pRwXE_N;SC%`hBOwc!4~F7gNe&P7Xu%3dTB*oNz2dqUqPsRi1w z?p5{{x&1v4<8+Y!Fgnxc_m8ttw<7MI>d*1x`sE2(2?S$4msBUl%PPX+BtQZr;01ve zFz7~4XV-LZ&pRmWQxNO9}wkCOv9vMjKxgSaWH&>2* zEG5)di0k$3ji18#778-Wl7JutQm`Hj-wz2?%WgRIj|Lq}R7;<_Bp?TYHq7h05ohs} J8wq$%;1@j6vnl`p literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab new file mode 100644 index 0000000000000000000000000000000000000000..170d07d219b90921482d7caa67a86b6ee021e12b GIT binary patch literal 4096 zcmeIw%}Z2K9LDjdscf3wCYx-U-d(t86+=Y0h>(bo!BwkPAu&XVi&hd5AuU3pg|(Un z7vdsXv=CP&F2rRF5@v5^X7*-fX>V53JbecnkQV&~=fJ(6d+s^sp2PFIH!^qDi`H1a zRa$)UVI(45(Jx<>Rvx?dx3lzpW&D2@_5O>^vny`Sv(TF&{A_1J)^ zbyC-?eHo)Ti|0Pr%~WCHy*-HsF|$GHd1nt{6{e|4>x|uvV{h%~M(G${#oQaawwm>? z?c2B)k8F}!UXdI2y|hmyIQO(YgH3p1v(*2>9>+RttdTmW>|rcDw-0TR&fp-9OwvzE z2XF}U&+L<1r3jYr^n{&HNrk6&{WfVo_F!(DI&P;fn8WN7>a|0<`j9@urerF!he?lHT1kCeg=?7VMBYNZ&qVB6^8f69)bg#2s3TT}0Lz56|x;Bk)6 zml$b=SAJXM39iMUlAl9>!Wc*3dMZCL&bosq@+@-X z;WfVk%*M*;bJ-8Dt2AcZqz;wSoS{Ty>?8<~OsWReO;Lad53z zA4oNjN+@RXVk!*dzXod)2(*pL|X2NvmDBE|feS%;5tmVQA!TT}Ms5?7nKHI<$| z13%~FvC>3rg=$x!0yAH*>S|B%8GOm2vt_WOGA*O;N@?$-zs`bwfQm9%n9o#|*u;l# z$=!1bIxm^^XblW8RiqJ*kR^QlS<(|fNHWuMnZNsUbjgueCZMf__5Eomg z+OVRwF{`@vzOxvOkIQEA%Au3g}j zeRpi1*bYy7gw8#>zE4#b!hO~zgV+^JI|gQL(L{^wCEB5_t30ds%*<>*4Dum5Jl%g) zvJ5$Pr#0SYKSwq#&x7w;z8e2~vdrhk)EZ*T>})S)oTdi5Sva_U=WAeVL#V5I7(0U!Jc=h# zdM~|l&T}mrt})CxPctTC`{{PG;v(|wLZ88X%#zt{Clt0=uzQkfJ?|=i8*bAB)Ae03 zEPM~;dFWq6!{c!AGlSt$M9$6>-drNOd6uZp<;@EA0M_yRdW<~|oqw2ZW4$hJ{6Z`$ zy`Jaywdxmg;~J~E^I?02`18R@IcL@I&POJ`K(vr`WvFDZj>1_wZ&x~RX-vOE4|lSu=mE$C5da&J9*^fPdowYz`73m5F@eBvawhuM;uGeiQv8dw z_ngs|Yh6wDZ)CsajD1!MYcl^P^ZhfzT;w%1>8(8V)Q@dbrTz_WQ^jg>JJu4day4nK z%=FdKaR4prL&>I9k8kJlwn+uwGa>KQHYsKYZzppmtz{=G6{&hLK0DtS9`t00bH44L z_M^91u~s2Kt+OhN^fs$n|KV-MF?G5%Gu~$2W;*AX&kpxgXfsFhn4kr hreF95jyYf97wxGId^ZHsNrkW>53!Ou9XrN~(m%BZZa@G4 literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..cac20469255b5a36a134707ca806ee0123bcb79e GIT binary patch literal 32768 zcmeI5T}TvR6oxl5F*Fm53boo&%YGC~2*VU3Oi2n!`Y({mkOXL9kbKF2w?nEEl-dCb&dxv37Ehw z`q`%#mw^oMD+2u(x1r|ImwshR1vB}$uX#06^iTz9MI=IN7w8SnqGoukv8-FM@7 zzUjk7=drK%Z73L-8@PB&8(dEu#SNk%=7hK%6+f^K2Cjk;50TLhq5ee8~ zIwC9ahlt+knFQ1(5Rd1pe3N-VZ6DMp0XYd+G0zW9Ik#3$4PVqA#B*C{%v4{La;ruM z^k&3nesL?4eKb1}H+nj?V!Or!8q$M9dFGa?yWj?2Rs|){2pTwIQHJYCiKw zfCT*>DyI*w>q20Z+PP(7LND?3c5>S?a19D9pRwXE_N;SC%`hBOwc!4~F7gNe&P7Xu%3dTB*oNz2dqUqPsRi1w z?p5{{x&1v4<8+Y!Fgnxc_m8ttw<7MI>d*1x`sE2(2?S$4msBUl%PPX+BtQZr;01ve zFz7~4XV-LZ&pRmWQxNO9}wkCOv9vMjKxgSaWH&>2* zEG5)di0k$3ji18#778-Wl7JutQm`Hj-wz2?%WgRIj|Lq}R7;<_Bp?TYHq7h05ohs} J8wq$%;1@j6vnl`p literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab new file mode 100644 index 0000000000000000000000000000000000000000..a08bf8396ecb9963a6b276ec14ff26a29315433e GIT binary patch literal 4096 zcmeIwO>9h27{>7jRW+)rs=mgk(TG(SB4Qz8VI`w!tfXrZ>7t89L}no}nMl*6g%FKc zSas1zGihXqSc-@UgTeS3#TcU)RaG^Q|4l>DrAf4X!O!p3 zJl84Bmrl?%Ex7adJM;J-TtN#Ao}J}l$e;Uk|Eb+({zJUE8}Hy~&F)~*?RXqBKkWi` z;w~1rIBQ?S*&p_n1yV1jaAL-;U_W-%NmJkLOPIu#g;H(WPGbs7SdWQ%Y4DpphE2F* zk#um%9>V-rJJ!IuID`X}cEe(6@(cB1ALcPvwGT(6C>AmK**>yFy8elEumh8g)cKL| zOWDr^bzn1AG5Nthz$sKJ_ATtjz00KG_tb@LxRWzUmF-a+e`m*+O9?!MnUXz?oAFqS zbmpyH!}1%Rub_U6wX)7@JA+rp?L8}{I?Q3>mEF@OoiExqF@lLz($SZ87K<P+^kL&@A zVq^pR%-a{R{E+eO%!g^rKH&LADUPRc@IE=jrD~4z$6lPl;yt^6lhlI+ym5E#`{mOL eTbMwYK$t+7K$t+7K$t+7K$t+7K$yUPo4_wRXF1sb literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..137983ac3df3981f08e2cbf896262f4067e4cde4 GIT binary patch literal 12288 zcmeHN+fExX5S@?Vp;FautKRPogqvC`L(BfgwGie_F)Id-w5Ax z_-;YF3jMeG-N%>4Rh5NZ%sm0h6o`z=zV(r$F;Incpw?+hdx!(JQl1-CGw&!b9V3#* zn70QDI0H)+aU98c;=$mY!>)7)d*C~Phj=|U)H5p+=Xa`@b`f@gHdR_R0K%I@G3_F7 ze6cECD5S;p>S(V$ON7|F@>my0Qy}%>F{8k#FiiX!tPLQrZS1*J*%(H$i35xDC6UK` zq&37CuhK7g&sMKJI>%_Jt*QL!Gw?MhkCi54OH{iOwVw5Y>${E=pTVarezpv@mC|zd zT`1rC=r6ON@1vqjmew;>B{uotTXK6%;XGy~oT)Y9Owje-R%D|y?q87Fr%85PwyNBW zSYM&zd_LTIE#rJ*6+4c+nHbs6*m})~GkTkqQ5-X`7i>nyG$qbxJ*yWiqflewY(8dX zV>Bm@{VFlG(V#e*^u#xS`i!8?TqlaF-RlK@>qD6e>YzH#akk+T6RWr$Cz8i_9g015 z8k=}$7-Gt+RUM|E=N(wjyMu+QlzsRiM3+~q=I9|-M;tM?#af}CSltrVvp@KB&v7tR zyZv`rS(x)nX#4A=s2op6Dt6gMj_JI3%e6DaOPilY3qln6$-ORu;wW{oBaPq*)TLDF z!)J55J1-E6roZwBkzo}n)_3840-w8iKhK?=EnzG*XAxJdCY-w2IQfd!gv<6lak169 z2`l!kWN+Ji)t1%ZVfiepMH4>xa?9j-6BbgPu3jbXK@X6zoZa8?dZ=m;cLf(1JHs<~ zAEc+{W_UUxwD#y-&I~G~&&nYK={~L*1GB>l(WED;W@u|lXLaY$toHpNA7F2xPoX7M zAxo>4+-6@RL(B8vyO!7Ee@&)*ZceQtw@iP3S#d%i>}28K#+~m2TN`3$%llzhy+Z#2 zyK3LncPAd&cQSU;?sBu-H%c>8w@gE10#TmI_i_40 zp>*!gEgRlrnA@%}C#7A5W~<^N@(qr@iF}_$+3iUvZZV;Ulxjckdj2NdFapz^yCf|9 z2<2PhOJu{taPgJFaCs_Rof)FJkL>0fRsHD%vxD7-b$p9IMvq17538*->SXh;kVWOF z=T9+A)p;Q|uCbasFZRqJza?F^m-j&&W7aZ*rE__X_qn@q_myMr?ppevUI9e=)q0@y ZKi_@% literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..47d42d53c45a3d5c5c256a2b0b2f34594a4944d4 GIT binary patch literal 11711 zcmeI2&2G~`6ouze`ULm^kPvB0+5&|(4gYM6GyPGMIM{BbvSNV{LR}z)5JD^vLWl(` zgb+eJ9Oukr>V&Z?SBgC;nnrCM+lfD)xpU_F&IDprhCP`qbYv7Ky@ht1ENsXm-Agk$ z%vQs6cRd{44*LgkD~pqGM;;6OEQ?emA`*cZh*0c_A-48KEHcp_zw2X*$3vXQa{{rA zJrb`>eJaLh_OKn}cp%y*#}?JrI`-$sTVjM4zd6D;W%$pd7jVUFzG$9Mn~O8nCQ^61 zjl14~Qp-w#P;4nJd-$7ZC7$xymukKC3a%BRC3eLoT4QN~OSQ!_5?r1!L2rD&0q%6D z+CCFU&|wk#Q|!Aku~$*NAjM*16cQY|g)EXUB-wO8(uFSUYXkgdXtN`+p(yv&dyDfG zIol0!E`wnNngnFzW1Ct;we+L1NaEEGz>?~IiN#s5fStPY& zf6`f?Mf#blZ8%XaCtXwH8gsKl)#euEYf`Q_q3ptmMn&<~X#RE!_fCB*W!_PltF>q@yllKV!(+(mg_Dd8^?-fx)jEZ$s7 z{+{I5oRXKa&4H@9BNlmgDfthode^C{Ir+a{UP}Fm)Hj_{8*eXVd_%_7h8d05mr~VI z#p%K2^XilyZ4Tl35&S(6Eo5C8DjBS!aFo{jmCx7Ir%$8F>t9AAJ|7pb)s)?w#y0Jf zEo3&#Vvke?79o-fC~L}Ys#Bg5rVs3m*Js`v&!UsbtqT-;OS-j2=@|Xnsz*x18GGt{ zaM_tx0ha?8GtN5qG~XCY-5JNy2+l3>os1P7$NHHtK&9MNsvpCvaJ+h9xW;|{~`0kIbqH-zl!v=JQr4vZQC=?2e<916}cUI ziSgWuw6)|y<$#d zWQcRF&X{aRuUWpfBtSK|EQ|D-m95wDnz2uvZH<%H%xh+Hj&UAVONFIcobjoF^I)tq zTBD}tvc^oWmszX%AIH~o)*)Imu0yas6=Aj^Q8Uh*Z8mccUGzV$$s3}|snwNw4Vvee n)}xjcigvqjj*>ZF-Y%x4+Gx8zm`*B$4Yd&Kx|6YEt-1XR_%FZo literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..a5294eb22a3997f114d3a2b168de215132dcc023 GIT binary patch literal 32768 zcmeI5Sx8i27=}-arr9zQrJ|8VnWdrKq$ZU~izF_jpdpf3mSL1wN(+<~ZmrXzn3idT z40K~fAfz^ipopfnDM2AcWeZ_+k(E%d7u`$_&6zWE=A1e2xsmh#-|~LXzm5tc#0irG z86Mq4K?rV~{aJ=oOhE!9KmwW~5QF_S{^|QFO%;t|2T*tQ!q7Ce*KI%nCk%bp)m{hn zlYp8C#7q!`;q&z^|I<7OJD0lH)#mI5u@7DI?g=y3&vtPH62Y_1W5z3SUdpw0Lp^(T zl~meVVL0M`FX)f9bzHm0!+HumIrPl#c}x=2;(cc2{(O^WzLJ1b5NO1@n*OG$$=1aT zBVc`G)_YsWWjqof0p}%P!2KjD_(7Lxg<}_?$7k}+nYQzt1V}(V1iZ1nw{|scSC3*U zl|rBt&Vx5=e5Ayn@4p1Rac}?ScDCf-9)-7H{U`Z$hbvsAV&zq0+<&{SE3#BzBMkLZ zPPJQVPdmpDFkoC?yml#eOm=3qmOvE7?QZN*KWqKzM*<{30wh2JmJn#b{W+r5E!q-W zHQEH?Jau1Ha9@qusaX*GF+U5dds57?D8%@Vb{70F*Uxqmu!evU^DbywNm&D&vpS!A zuqK8WA2-b7=Bj7?Vti;TAAw$s&zxgBbL7j&Oll9H4gpd zArOvn&z$zMT%K&qA~%6vB)o8W!q~6B`H+BU0(#shzukKNShOP@NPq-Lz`+C>v43^V z_gUaz84gcBgnQnBkVSzG7osr%rI>%C?VBPrRyNBe0TLhq5+H$b2}I#sG`2O(9=DT? zB%m<@wYZ<}n7mu_pHt)>_Ch4|D#~${JFmU+1!7;lj-4vJ~8i3e}#44mU|tL$?X5jTONs)B%mAurI^?2E*@WC zPSF7RrzX5!YlOko#Z6bt*|D7jNPq-LfCNZ@1WXAO;-0=f-zUMeo$t0GFoG}@dp9WN z^S5oPvVW9p+;6*E%8mBV#0**{kd6IMuUirCtPFBdU$jSZjI-9Kmbx;qpQRPFaU4Vr zSOd64{@xuY(v9X866k>4<{*RF?{f+T|FSJ!E*6GUo!KzzYYlY&s5;>a6PyczkNx;|<7N-N#zMgoc?(1CSzL0B_(jH%)| z2)%hLn`=zPrlP&;@a?3(?WtI=&0*e;{=RGNrw;Xp_@-~vTHR9X9YTQePnmU6eSnEDq8~2%LkOPe|RU{AdV_hQMeD jjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kgRc_9D*#r_JH literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..bc736b40f924d4bfaf097a89d5cd1e183084e437 GIT binary patch literal 4096 zcmeIuI|_g>5QO2mQ3_9>g^hR!2?|0UBDp_~7J?_R`LmD=*-eU1Qm5pK3R-k3dk@-t zv$~pdR#nmNT-^^E-`?<~`P1)pxRU3ie`-GO*OLOmjFH#6dEh^3|E=kQR@klJr@J%cTOUx-v4KB$qN=#2> HWMBjU-P#fc literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..22c5e20e91885d1c969a3b3eb7b131bc18f81edd GIT binary patch literal 32768 zcmeIuQ566X6a~TSNTIDHz62A6Zx!BbgPpYWhyVcs1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+0D+PM^If04M#*{81PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs b0RjXF5FkK+009C72oNAZfB*pk1U`Wa4eSEI literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab new file mode 100644 index 0000000000000000000000000000000000000000..13dc384c232362e480199b57a2b61e4c9a827e56 GIT binary patch literal 4096 zcmeIwOGp(_9LMpWdNVCEQ@d%ImPs!pqDXp>8zmyFjRq1@5K$4e5i1Ij3W*583c*T~ zq6aQ4Ttu59C|ZQ1xXG>$LWaSz>bJCJPf@yYO|+FJ7dsn550o8y)y(= zsh;-|9@uode!3LvhfbUP6bjR%iAV0+#$HHEm+tnsUc2Eo#O%47aBzmlZ@?Q{ejOTS zN+Vr&1+TDuYM+jtqQnkO}^fo@w->YVeW+!gNI;S$%AFD)&GK3h}d@1O5n3m|oY)RPal zY%~g)1=6t`@1q^eg2+NCJJb7RFQvI(C@qV?ReK`I>x-n_K|qsT`8^=A$n{PIT(JEU z0R@Yt5AOpSZQZ+oDZB1%z~N$#j|U9dy4L|^OQegV!O#EJzf{=51i}Qu1i}Qu1i}Qu R1i}Qu1i}Qu1pfO3egK&T7-Rqd literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..b13dcd58f576578183d58fc87a8b25b61137e0ab GIT binary patch literal 12288 zcmeHN+fExX5S=gRSM;G$)o!ca?+t{TS|m!~xuVH(5hSFWK$XAm89T<8c*73Zz{55w zgbnpMb37N%xJ2}l&hY9}K?hXP5MK*A#FG-QDc%q1oJMql_viS$p!KWIR@A#~@AD3g z@jAor_p#Cx-}zq?y~4BHC_jKl^hAi%R}2rq^a$2<73%})Df&3Q_AE>pdJ^%CoArF?|184&hh2m9X; zf2YuHMmq}qRQ>GZOZ}?O!YLot(qQ(+kYHCXFFVB1)^RM8lEvhf3p^evHM zKGG_DjCbh|)U(xVmoD%$%&n>P^cna$Cy$jTVoOxJ61AT51=n}&DL#WQS#-7xwp6C& z=(|+f`{=K;pzoogj2HGZRV6m@;ahU^oWgO;nQ)@^h$BJQds~rBo^gMJ)HzLZ;<8oc zdc@@wI?m_QjrTInCswiJ$Qy}~{fJ$jGvbWiXJr(}%&UTp=vYpPGg`~4f@Kuum^hoy zS=pGJ6UTm&7~ABaIGVKM8zB1(k)63t6!X*TC4TB7GZoZ9b)2HN;f{&3xPDF~_wi*Y zw(B%D@yRg6lvk@|n0}mhU_GA>W~x&5p+kr+uU5^`L#z*CkC9-R&LKp7n-rCI@=$qA z32oV%^5QL4tq?D5WSA%nQ942u$B3&^#T|F0_FP(EVqqo=f3c>G#n{AwJ8AAX`6SCT zjm>N<;<4IGlWhUE; z87I_WI|~Qb?|cnxZHRSMcf+oJhaLjEdhM3?<@c?fjGc6@+AQ`>rkSX0euPLM%2T;~ zuXgd$)oVAZeLU-@o2Z@>oT2p;jeS5{E$thd>Fcv#wKZN39rI9i)I7_}RlR-mF0fCK zy=JPu7#_NtAWC=Eb$4L{9>q6NdX`=~H^-I@pE1lmPZ*QZe!AJNxQKjrq3_^6X36Zf z6N+0*n4Y9M&%4TBhZ}ley1q-o!uL?V5B-N|xF0TlW-wfy3wLJ%Z|)k(!gI{$FCm3p0Q{l{cc+3WfKzEb@{Zd_wEPd;qVAip16w3p98>|@q4gQa76 ziqCnvar>QP?(Sat|8L_F5Kh5k3J>AA=x@bpFuy4Tf%Z?UK&wEjK&wEjK&wEjK&wEj MK&wEjz{67DKbxAk00000 literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..08251e3dc7f5fb41cbdf85a66f1b9b00ffb7e84c GIT binary patch literal 8 McmZQz00HGN005)_dH?_b literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..ed45ee1e0c4fe5e8e1393101cc3f92e2fc4d1845 GIT binary patch literal 8 McmZQz00E{4008U&;{X5v literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values new file mode 100644 index 0000000000000000000000000000000000000000..a8f2e22d7fd0a2d155f3667197cc1e57894fd17b GIT binary patch literal 18953 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 Wo{a|NF27sVNhSS8qicpi^#1|sVdl&L literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..c2b5bc3f7c9822d4dfe5522a41f66177f0b36199 GIT binary patch literal 9417 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 We;RYY)oRqMoPvDeUlKQX{Qm*D(c23E literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.s b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.s new file mode 100644 index 0000000..a323663 --- /dev/null +++ b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.s @@ -0,0 +1 @@ +ё \ No newline at end of file diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..6befb344c8dbf345fbfd102a5ea6d86becd1b3e5 GIT binary patch literal 32768 zcmeI5TSyd99LCqe((JMlwMs=LT{bkdm(--P$das-3{*tAVHrk6rF4O^!dqEw7sa%T zM#MrdRs=$7YY0kcUdoi9kfJh+FnZ`F*yn=;Q-d=*yR$R9-@NEK=YRSBzjNly*$b>; zonf>=jcb&_5K=wmvl^+Gg9J!`1U!jA1oqbr&p(uTQq4oPHlgnFIbo@KuiJ_OPFmY< z=)Df=CjmVXi1jiU`p@648%c8;?7S=EmWkQ5VIR5{&>Ai_&VG3WqQSG$Z{lltUfQ+( zf%UU{XMU-p6`H~6dv@1KN5^$~Jn#rR)!XUxJc0xjXiq9VkR|A5lLXv?Ko#z*32)14 z99>L50^W{F|KRAjj7I__;JyS(aXyI-dDJYdaOfb^QMCV@u%B%bAOZal@WK7Pxw&S$ zeiT!w5&{Kq?zwe6P)Q8>{!1VL=l0(|XY>CZ(RNQibSF-0iO{x6?W!vUzriu9a-}M) zhM{Hb=|-vcv~vxC3e4-vH{N-!$J{S2#^q8 z`%Y;b`l~}A0`tCY{HtPhvN4O=1lo}B!ey_ax4(IjfNTOeI8T1N^P)qxBOOS91W3Te z1gzMLIMB1x24kzc2sSlK+u_eh3s`U9Y-$B1lYe6UN8Izgb~} z!PWUSSH$etPXZ)B0wh2JBtQZ}0{d`IkI4#*7xuI57y>^Krex1*&Ak40OjXX0l7aJW zOI@)|EK@hu?Ld3$cd>EylYkTg$yi4g;}$* z%t^I^Th!pL^)lUPE|EYJ>^25lMSssJ4EzgIOx_a1>CUVN_0^kw`*bHd0@b*$E*O>%J;ro# zWkB!#CAHUuVq?+YeB^H8aDOuH*V^!ar^9Ve`)fq~q0`dVcv{^`>+MB=;!oQumBx|l j-wlVn_DI!#Ureq}cd@r&zj!eH*Isw2hjoyEClL4pvq-kt literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab new file mode 100644 index 0000000000000000000000000000000000000000..f434c23621ba3c3af49cac9c565fc847f5e133a2 GIT binary patch literal 4096 zcmeIuyGuf09LDjdo0XZ}%q}!GM6}i5P)kWuQv@v$6a}?NLt}(AG=x)A)IT5%(N++I zLqkK@CV>(KX=&KS%CBJHKXyj+*@PtsEc49R1;_dyPp z1GZN(C8uA=#R?#nBRgz>M~39aGdWrb*kwenWl3KZkb5FKs{yY(lEDnQWCya3q`L-~ zlwrC3K(07|_j}FP0uypyp4^dM)$_`8xs%ph9pIEMHGI1zcjc5EZU9bGWK0goxkjKb zsktT~aHH?Y$TjJA0bR1c8CXb=8F?5dgKoef$6A1yD>5O|m*jFQ;EU>C!OXnRAJ96p3;Of)XqhxR{Q6Q{o9dc8*05*ZmtLo88zMM^fU# z^vDfH^9ni)aK=9J!;CHKBxA5~KS~M>l5k2SX%xFg?|y)7}GC1ISvA<83h7R$>&qUEfOq{^F~o z=f*Nw_zcEJw(pBQWG|efZcUDrBZg$g@EJ^ZMw#ec@OXa=kCBj5MF?!@1p2(imuy0eE~&2*3HLtpwIs1JRsJ9Rq$u)fxvHS~;r zJT8`SuNl0n?Q^{2-jumLy3qRp-H7%*LE;KMn|I@C=Zz9oFR&-^ER`dJuFReZ@0Zwo zdV;> literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..57e1942906b752b26a3e00fb5b2057b3b8a2849b GIT binary patch literal 8 McmZQz00F5D008U&%K!iX literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..41d6c24bc9eb9b1197879ee930112381b748c394 GIT binary patch literal 8 McmZQz00G7a008O$;s5{u literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..cbfdff4ccec9c71ead4c4e3c9b1b562ea8013d83 GIT binary patch literal 10829 zcmd6t&ub(_6vqqHgCKkNmct$daa&n`|4uTSWYIv(Wc4WHOlJ}{^TX~=mhm7W;z2}2 z#Dj>42Tvj*;-BCj;2$D;@ZiCN-)~iFtGj2WyI)ULvO8>M(leR&saNlP>(#4{)K1(R z#L3!z+@BBY^RqV?e?Z`_fAgZZZ=7J!}#t43jdx`CwTN#qEuTHFXNc$O;MpVf7QSaQM^rQ74{7@eq3yx>7$b~stY@BD<2yziP)0SrUX2*E#NlzBL=N{|8QUXhTc+4(1 zzHHd|wYIikfn%fRd?jo-l5HF~OO=b-k3dncdGcwIWfM`zd3+E4b<6p_SxhCO@(CGz z%}J3_AZ-CXWpyD&fe@pBqAIayGVv&2{GOhACCF?##+!OkpbDJn85Zz;PQIsu@Eu?Q zox*zp8n5Mz&2@qOujq~T3QELn!S);3wmq{I6|7oiTQGl3=I4Vlx1hQJPdbHLq{1zjf1xLD1ofn2 zE~|12-tWl!a!_8Y(k8xtE;Q5q1(gw%?dOgCb$rV02-`$+yw?4EyQtPOV zGHlb?9^mR~uGc7b%Y3ckaBUjv7w#=YR4pr!DypLHt;2(?FK4<=>cf{JzP}#i^vO$+ z=743Kb#dsnwRKg!gCL6GAi9h_HHOgJq_HGF02pGn;bMqSkSm1+MV?ad3Kb+y>a z+^u$D&0}L;{O)(+d2w8sIIvDwRa=?!pNAR5($#NyFz`%n0D+>Iy@}UDT^;c3VTNlH zJhMG1Z3#BBX9CYittoR;h^}dKl?kM!elr4FVwbH+8wky;ZR%yk94**@xERZ~Q1zL% zOstk!uB^HKdz4`(UFqd+DJp*1IbrPQol|Z9b#H4&KJ7M;e)cGGUfIe%*bTyv56z+v z+&Z?X4{|Yd%V+3*pj+;{>TcX+`%XqDJ)vrr`&NunecU}nCWKnticy`n=WlnA&+4K* z7pFT|;8N@=OoyH^U`8!Hr)lQjA_cu|>~+yw8tL8>&j~^;@I~t#*gl4O&GZsvIn4g5 zrmOYuBV2y`mG1e8+D6dv*xwvW#<{za955>td#GMcTWQy**~H~7@}St<@bF>~@pqfU z#Uu8)fzErr&TctK{cSWQ6vZIs%_nydi?ABdoU= csBY|*#t1@&_iOt~ANiSmjz1p{g4+iF2ZwVFTmS$7 literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..6a8b5aa5af1631e7e80da10253fb5c7242b921f6 GIT binary patch literal 32768 zcmeI)Pe_w-9LMn|GPa8m(aI4-mtU$s(vp1%U+$4f;HEXo3nG&p-FPpVRhxp6C1heqM9WHYXap zjI~A)TbGV)*)egoh*LNe0R&tY=v`wNQ^TpFE{{Qb1S}C4P?dXkVzZVMD=3oI^Q3d= z!OnsuZX$pH0tg_000IagfB*sr*eGyGpTok}e>B?I!qL+0$}>8Bd&beGG(!LZ1eOrE zsq0ZiBJgmDUA|aKD`n;GmIhyhB_ski3uIM){L!|6&21=;00IagfB*srAb)aKmY**5GYw-yWa1##$y|oD{w{o1Jw<0mfP>Q^_&9l%|~9k zmAhY!UvxBma;ty2_KoQ0JRh#FDz|)f$`!3R+gxtB+{%+w_YuHRoGXVw*a9>pnrWq3l6rk?AFS+L=@|A|FHj}-iwnPASzmc^#U9-ac1K4Suex{doN}i! zvu*B8@UQb}%@GP3wQkQre*_TlpTL-|KQ*oUGX6{MkHjfGz7tbzgZ@ZMN(2x!L0&#sF zI@O)cmw38mr)|(2Tj~xRx2&K`h5D4Eers&rsrF{0Cr#@^PW7V?0)7zaRmg9-DPA@&2AqhK@yMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU Q1V%$(Gz3ONfQ%3T04|Oi*8l(j literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..61b5b5c615069d7156724cfa58d68d5c97cac92a GIT binary patch literal 4096 zcmeIuK?=e^3(EHdvV8gcCY_}wQac>%TTgV<%GCg)X zzc+vO%?^SID1+`NNR`g|vC{n+bR{Z-!c3@IPpNz-Sz~ULrWMYDQz_GsbWY(?0w&B= zA?&{}RmD=Q!iWsb0jv4h3kLthW;Q6a353~&&mfDAn~y6-e1wv;$t~S7j|^r?=~@&R zkrW@Aj8H{VOSJqYpYNP-Zpa|QQrHpMq%HrzPuTFUg@N9ZZ0RANUhK+!j~5K+t%7b- zeD{KLCXgrz&ZX@ypy_9%GVqPzkhB3usL3m)z@&yA{yr9G2ay+;>xPOYh-pChRQdsbTP+ Z>nfzRcCU7XTrJcF#Zzt8v5@wO`T+%TYXblP literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..5b418955b5cacf3b7c46615229829eef020a5738 GIT binary patch literal 32768 zcmeIup$&sj6o%24kO~B*vS9}#2GMTPQ7VztwNg7Cr|Cf9xol=oJ z0t5&UAV7cs0RjXF5FkK+009CU1^T$J-rs5C%sBx91PBlyK!5-N0t5&UAV7csfn5Tx zSUuZj-8D8MK!5-N0t5&UAV7cs0RjXF5FkL{kiZ!0>s;1{J~1XhfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0+|UsqUUnIoiodlLx2DQ k0t5&U$W~y8vSsQ%*#-(DK!5-N0t5&UAV7csfxim;0Q|WNJ^%m! literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab new file mode 100644 index 0000000000000000000000000000000000000000..9d444b811901ea7ee6699f3227040c189ef747d1 GIT binary patch literal 4096 zcmeIuA&bIb7{KvIr@rFUdVDNp!^%tv&z0 zB)`Y&_x$GkCpOHnjeQ(r4VUQS87o-ga2Fex!vTgj)h|5b2@mL|MSif30giBjYkb2C z`dD>D9PHudsyf9F++r8K4EwN!;YD?Z0q$^w<*Y~(J6Oa|Jcg=!Tp+(~V+E{$6|e$U VzzSFaD_{kzfEBO;R^Z_UegSy2cTxZV literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..7efa756844a30777ebbf7f26339180f59ec454f7 GIT binary patch literal 4096 zcmeH{UrWO<6vh2Gf>;F=1r^bC6(5AL%?}XUGZ&U7BfTB;+nY3-!9N?fuadsC+~2u3 zC+GH9sWKC`7TH1pl+{K{GBzuXUdWFu7bIpt1$(xquyPd{G)d~RCkV%l`cqSQ|@)aTXH4egZ2^bfH&4dg@mexxVvK>7*lO;WF(Y)x5AG$Z56`pbB5gV0T|G* zk3f!vbm?|Y1AosSxaVIq!ES^K^d+C3ckAsLPZ^NEh|uC-KCBB~<9BtpcRnfMLvg6f zFK!Nn8f3ePC|95;bIX*8YaH2UCi{0FqR!1Qod^yb;735B&Un}W-+~fV?uM!Oz(n|p z3HQIouMq58;Ra=E{oguAZRTbL{n*m7kjjPoC_Tx6A!bd!Ba0D6bjz*Lh?fL z!n+I$a0{zyG-_=%SF2uNB^HPHg3H?z4@*uXUR{lQoQE^Dp2}cR`p!6Gqqe4%s?)vZ z%+fwaK|PAVC|sn}5L;&I65y0o;zUF(JJU2F`j+mvVD=UMu>LfhtkqK#n#q{|8vXWm z$IgEnZVtW5Ui$Ze$uMZyeZ!U>2Cl!+f8TN6 zs}2^o+BLOAuG1`zhTH7wPhSKOKmY**OcFSkuob=D50f&J6#)bgKmY**vJ*Iza@R`3 zWOiMsMgRc>5I_I{1Q0;L41sNl8B3*)%}AR+DVM%iojB>tpN-iR0R#|000I33P9@TH z$E2Ty^)L)bB~ zSFP8*&LciG?&codbCM4M1Q0;L9)Yy9Z5|vOvZs6IU1M@+;<0i*^9qhc009J?6-daq zgZ_>dXQwg^0R#|0009ILKtNTXU9NkMv^)){)>DUoP696yW^&Ez(J2#I5I_Kd-vX=h z#C>yL|NAu_>npG)(aHkPA$=2)3;_fXK)?xsa{1jnKC=;VViq$H$hAPDyno+9x4vBW zr5^$aAbRpU(IJO0tg_WyTBLs1VFq1 literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab new file mode 100644 index 0000000..672070d --- /dev/null +++ b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab @@ -0,0 +1,2 @@ +44 +0 \ No newline at end of file diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab new file mode 100644 index 0000000000000000000000000000000000000000..0e6a69cb6c8c0ca08e7af27ba8781bbdde97060f GIT binary patch literal 4096 zcmeIuuS)}A9LMpGQ|FvIe?3ke2E#DOl4(H{R4gU$Z2UAiL-L&+CNBDsADd`?Nb+C!OXnRAJ96p3;Of)XqhxR{Q6Q{o9dc8*05*ZmtLo88zMM^fU# z^vDfH^9ni)aK=9J!;CHKBxA5~KS~M>l5k2SX%xFg?|y)7}GC1ISvA<83h7R$>&qUEfOq{^F~o z=f*Nw_zcEJw(pBQWG|efZcUDrBZg$g@EJ^ZMw#ec@OXa=kCBj5MF?!@1p2(imuy0eE~&2*3HLtpwIs1JRsJ9Rq$u)fxvHS~;r zJT8`SuNl0n?Q^{2-jumLy3qRp-H7%*LE;KMn|I@C=Zz9oFR&-^ER`dJuFReZ@0Zwo zdV;> literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..57e1942906b752b26a3e00fb5b2057b3b8a2849b GIT binary patch literal 8 McmZQz00F5D008U&%K!iX literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..41d6c24bc9eb9b1197879ee930112381b748c394 GIT binary patch literal 8 McmZQz00G7a008O$;s5{u literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..d3fcc7e49bd2be17062482c79f42e831a1941ecc GIT binary patch literal 313 zcmW;6#|i>56hP5Y$KHF_*xSOtkl6^L;66AH6~ss;{=az7;_SUZbSPGx1<%RTP%fQLNdF)N<%lxIBW1uuEUYu@mdcR$ns7G?kd literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..6a8b5aa5af1631e7e80da10253fb5c7242b921f6 GIT binary patch literal 32768 zcmeI)Pe_w-9LMn|GPa8m(aI4-mtU$s(vp1%U+$4f;HEXo3nG&p-FPpVRhxp6C1heqM9WHYXap zjI~A)TbGV)*)egoh*LNe0R&tY=v`wNQ^TpFE{{Qb1S}C4P?dXkVzZVMD=3oI^Q3d= z!OnsuZX$pH0tg_000IagfB*sr*eGyGpTok}e>B?I!qL+0$}>8Bd&beGG(!LZ1eOrE zsq0ZiBJgmDUA|aKD`n;GmIhyhB_ski3uIM){L!|6&21=;00IagfB*srAb)aKmY**5GYw-yWa1##$y|oD{w{o1Jw<0mfP>Q^_&9l%|~9k zmAhY!UvxBma;ty2_KoQ0JRh#FDz|)f$`!3R+gxtB+{%+w_YuHRoGXVw*a9>pnrWq3l6rk?AFS+L=@|A|FHj}-iwnPASzmc^#U9-ac1K4Suex{doN}i! zvu*B8@UQb}%@GP3wQkQre*_TlpTL-|KQ*oUGX6{MkHjfGz7tbzgZ@ZMN(2x!L0&#sF zI@O)cmw38mr)|(2Tj~xRx2&K`h5D4Eers&rsrF{0Cr#@^PW7V?0)7zaRmg9-z=Xt1r8*o`~bgCXq2N>l2?0Q=F$0etwDLU@6Ln8h%LaR^Ia(lG901mox~ zd;2Mk;3>MR`Z$L54{02aaRRq+5^vt6DLley%wP=bZ&Do3aR#?>78|cp0xxk6_i!Gg zxPavsX%X|dglSyH>a&!@Lrh@=(|GkHtzZr_*lb9vSj06vz;#UE2HrhN?th#iSXly= ZfF)oFSOS)SC143y0+xU!U=LeyT;v~)TqO9ts?fPMy=4IXX dma4ZvRk2E=&{JCN=Cu4p`2jO672Vp#qZ2A_L_xlQ!E9M5SFDXW0DJwe< zn8&8heCob1;dp|_PS}U+d-fgtjI^6)zyqJ*DH3c?vxncpO*h=rI+yw(-5&l358X=j zQtr_Uxa&sSw0q(Vrjepey+?&Fd23m(iw1aOIgeL?wAv%G4^3#OY^vXSO+8`}JK$RF2xNh6!~XZZpvxuiVlX2Si{`I zDsXtE!U~0Hj#+rf*6wNk@;YVB{zfawdA&(`f#)vlyVSMm5AeH-eokSV{0Ck>L9XYT zHa>jmY3;U))PJyD#M6{0Lg+KBw*lDhG y)&Tl}fvPY+D7(|QGxtjFQP{U0G=mG@R68TVLe_@G#*CZIoq-~X$<9@|x0ip?UN6@G literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..1601c02ee19c126e7883ce20d998c18487a2bf45 GIT binary patch literal 32768 zcmeIuD^nCu0EXek8z^276i`qWR0JtTBauiX5{X74k+_jaBoc|ljT?zZBGJf8^CuXd zGxN=R!kIZU&tPZpc<|3T?LO5;?NK{x4-d}UlXlUbw#)XcUA5_U-DcXjJ#UltqTRIF z_NTpUx9wHCYp>hi_NG02I#*`u+d5b0>vCPF!}_jn)%W#hU97+AQr)e~b+3M?`}Jcz zs4MlbuGXXass65?>v3JHCv{j)>v|p4je1tU)bskaUes^(vToL^`n_J)tvasTby9!S zo4QjS0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk v1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBoLzXk3AE)^RM literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab new file mode 100644 index 0000000000000000000000000000000000000000..df0fc4f112c9d733e8855b4573641785a511ae5d GIT binary patch literal 16384 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 F{sr~t7|H+u literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..dcacb6635d435a4d0368f7d8621c07472d6ee81f GIT binary patch literal 61440 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 literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..4b56f8edbdb2c28e6b451c4808ee2c0e3487747d GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len b/backend/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/cacheable/last-build.bin b/backend/build/kotlin/compileKotlin/cacheable/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..e643f3b224a887167ab2730651e6b8b7f916150c GIT binary patch literal 18 YcmZ4UmVvdLhk=1{e)5GGw;6x{06CBaXaE2J literal 0 HcmV?d00001 diff --git a/backend/build/kotlin/compileKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin b/backend/build/kotlin/compileKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin new file mode 100644 index 0000000000000000000000000000000000000000..a0eda8bde6e8fdd793173292274e57c7e464b43a GIT binary patch literal 56496 zcmeI534EPJwZK25NwYL*n>KWzbfJ`;q-ZI!h@>Tjbf+ncB9^uZZJ|vqsckAfl~peOKj+S!Z@c$?H@Qs%=GWg%?>95w z%-QCgGiT1s^*rwiZ!6F9ioN5#Rls|;kB90lx(q7E(yQ| zU5~nR<0rrTmzy?8FJ6WDES6E4rK3*yJ5ByyCZnu0Wl*qFCX25@-jyCCCC5sCa0$xvlc!es-X!0*7Ni#n z+MZXQ`W78ow1oP|DLA(Y4Nf-gk%$g~nD!zO zhDyZ-g5%|>LFfhjfr#hB1TIX1<|Cu|U@0&6NIlADLPt-&>@#T_9#Q@eLXEyuk)b;819gIjBd8mixXl6q#ru(b$_yW%Ec!=fanB6ppUhDH zsSM?lGL-KnU!y)g1%YgM`0KcDw!tF7XI>3ox`)A%mB0zSeB>1 zHyFyezRS`zL5R`OYE3ZmXfpqExNV1lVu_h^wDms++x8Q_V9Qa;CF$=D>WWC&5yql3 zo6+F*ZGUO8p*xmZZEZ#1*YY|EVqp5`9_4r{3%3T=3V68%^ zl4dd17FwecZ)>y+je^gswyezed=By)pFwOGGl8Qyv>7NJ~Ye%uloa()&`; z*2l^}mC#}-X_a?6Q~G^S;5i=3%5T}8zITT?@5Z-57L{7GapM*Td;{z$e5@Bu)Fzb0!m1RhPw6wo)3+uH~#!(t$!~G@Nj+Lh^#TQwUYVFpJWg^Q!8-{IgYYY|z+11XdF9W1l-qm5c_ zbgs5W?=aU`wJc1PsZ<4J!pcCAv~H39nNN7-te#jK@U6w@iz4X-zA=`rAMAP_TdLn3 z4rn7})z-|DzL&_Hdx86X{Y7d$8mxSNQw35&mgRU#)NRQ4>v?~tv z5p6r3g6Ð`SN4^AsNg9tTS^z2_e_y0WQA^{GBE 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 z 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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
NnX)EH+Nua)3Y(c z&{(nX_ht=QbJ%DzAya}!&uNu!4V0xI)QE$SY__m)SAKcN0P(&JcoK*Lxr@P zY&P=}&B3*UWNlc|&$Oh{BEqwK2+N2U$4WB7Fd|aIal`FGANUa9E-O)!gV`((ZGCc$ zBJA|FFrlg~9OBp#f7aHodCe{6= zay$6vN~zj1ddMZ9gQ4p32(7wD?(dE>KA2;SOzXRmPBiBc6g`eOsy+pVcHu=;Yd8@{ zSGgXf@%sKKQz~;!J;|2fC@emm#^_rnO0esEn^QxXgJYd`#FPWOUU5b;9eMAF zZhfiZb|gk8aJIw*YLp4!*(=3l8Cp{(%p?ho22*vN9+5NLV0TTazNY$B5L6UKUrd$n zjbX%#m7&F#U?QNOBXkiiWB*_tk+H?N3`vg;1F-I+83{M2!8<^nydGr5XX}tC!10&e z7D36bLaB56WrjL&HiiMVtpff|K%|*{t*ltt^5ood{FOG0<>k&1h95qPio)2`eL${YAGIx(b4VN*~nKn6E~SIQUuRH zQ+5zP6jfnP$S0iJ@~t!Ai3o`X7biohli;E zT#yXyl{bojG@-TGZzpdVDXhbmF%F9+-^YSIv|MT1l3j zrxOFq>gd2%U}?6}8mIj?M zc077Zc9fq(-)4+gXv?Az26IO6eV`RAJz8e3)SC7~>%rlzDwySVx*q$ygTR5kW2ds- z!HBgcq0KON9*8Ff$X0wOq$`T7ml(@TF)VeoF}x1OttjuVHn3~sHrMB++}f7f9H%@f z=|kP_?#+fve@{0MlbkC9tyvQ_R?lRdRJ@$qcB(8*jyMyeME5ns6ypVI1Xm*Zr{DuS zZ!1)rQfa89c~;l~VkCiHI|PCBd`S*2RLNQM8!g9L6?n`^evQNEwfO@&JJRme+uopQX0%Jo zgd5G&#&{nX{o?TQwQvF1<^Cg3?2co;_06=~Hcb6~4XWpNFL!WU{+CK;>gH%|BLOh7@!hsa(>pNDAmpcuVO-?;Bic17R}^|6@8DahH)G z!EmhsfunLL|3b=M0MeK2vqZ|OqUqS8npxwge$w-4pFVXFq$_EKrZY?BuP@Az@(k`L z`ViQBSk`y+YwRT;&W| z2e3UfkCo^uTA4}Qmmtqs+nk#gNr2W4 zTH%hhErhB)pkXR{B!q5P3-OM+M;qu~f>}IjtF%>w{~K-0*jPVLl?Chz&zIdxp}bjx zStp&Iufr58FTQ36AHU)0+CmvaOpKF;W@sMTFpJ`j;3d)J_$tNQI^c<^1o<49Z(~K> z;EZTBaVT%14(bFw2ob@?JLQ2@(1pCdg3S%E4*dJ}dA*v}_a4_P(a`cHnBFJxNobAv zf&Zl-Yt*lhn-wjZsq<9v-IsXxAxMZ58C@e0!rzhJ+D@9^3~?~yllY^s$?&oNwyH!#~6x4gUrfxplCvK#!f z$viuszW>MFEcFL?>ux*((!L$;R?xc*myjRIjgnQX79@UPD$6Dz0jutM@7h_pq z0Zr)#O<^y_K6jfY^X%A-ip>P%3saX{!v;fxT-*0C_j4=UMH+Xth(XVkVGiiKE#f)q z%Jp=JT)uy{&}Iq2E*xr4YsJ5>w^=#-mRZ4vPXpI6q~1aFwi+lQcimO45V-JXP;>(Q zo={U`{=_JF`EQj87Wf}{Qy35s8r1*9Mxg({CvOt}?Vh9d&(}iI-quvs-rm~P;eRA@ zG5?1HO}puruc@S{YNAF3vmUc2B4!k*yi))<5BQmvd3tr}cIs#9)*AX>t`=~{f#Uz0 z0&Nk!7sSZwJe}=)-R^$0{yeS!V`Dh7w{w5rZ9ir!Z7Cd7dwZcK;BT#V0bzTt>;@Cl z#|#A!-IL6CZ@eHH!CG>OO8!%G8&8t4)Ro@}USB*k>oEUo0LsljsJ-%5Mo^MJF2I8- z#v7a5VdJ-Cd%(a+y6QwTmi+?f8Nxtm{g-+WGL>t;s#epv7ug>inqimZCVm!uT5Pf6 ziEgQt7^%xJf#!aPWbuC_3Nxfb&CFbQy!(8ANpkWLI4oSnH?Q3f?0k1t$3d+lkQs{~(>06l&v|MpcFsyAv zin6N!-;pggosR*vV=DO(#+}4ps|5$`udE%Kdmp?G7B#y%H`R|i8skKOd9Xzx8xgR$>Zo2R2Ytktq^w#ul4uicxW#{ zFjG_RNlBroV_n;a7U(KIpcp*{M~e~@>Q#Av90Jc5v%0c>egEdY4v3%|K1XvB{O_8G zkTWLC>OZKf;XguMH2-Pw{BKbFzaY;4v2seZV0>^7Q~d4O=AwaPhP3h|!hw5aqOtT@ z!SNz}$of**Bl3TK209@F=Tn1+mgZa8yh(Png%Zd6Mt}^NSjy)etQrF zme*llAW=N_8R*O~d2!apJnF%(JcN??=`$qs3Y+~xs>L9x`0^NIn!8mMRFA_tg`etw z3k{9JAjnl@ygIiJcNHTy02GMAvBVqEss&t2<2mnw!; zU`J)0>lWiqVqo|ex7!+@0i>B~BSU1A_0w#Ee+2pJx0BFiZ7RDHEvE*ptc9md(B{&+ zKE>TM)+Pd>HEmdJao7U@S>nL(qq*A)#eLOuIfAS@j`_sK0UEY6OAJJ-kOrHG zjHx`g!9j*_jRcJ%>CE9K2MVf?BUZKFHY?EpV6ai7sET-tqk=nDFh-(65rhjtlKEY% z@G&cQ<5BKatfdA1FKuB=i>CCC5(|9TMW%K~GbA4}80I5%B}(gck#Wlq@$nO3%@QP_ z8nvPkJFa|znk>V92cA!K1rKtr)skHEJD;k8P|R8RkCq1Rh^&}Evwa4BUJz2f!2=MH zo4j8Y$YL2313}H~F7@J7mh>u%556Hw0VUOz-Un@ZASCL)y8}4XXS`t1AC*^>PLwIc zUQok5PFS=*#)Z!3JZN&eZ6ZDP^-c@StY*t20JhCnbMxXf=LK#;`4KHEqMZ-Ly9KsS zI2VUJGY&PmdbM+iT)zek)#Qc#_i4uH43 z@T5SZBrhNCiK~~esjsO9!qBpaWK<`>!-`b71Y5ReXQ4AJU~T2Njri1CEp5oKw;Lnm)-Y@Z3sEY}XIgSy%xo=uek(kAAH5MsV$V3uTUsoTzxp_rF=tx zV07vlJNKtJhCu`b}*#m&5LV4TAE&%KtHViDAdv#c^x`J7bg z&N;#I2GkF@SIGht6p-V}`!F_~lCXjl1BdTLIjD2hH$J^YFN`7f{Q?OHPFEM$65^!u zNwkelo*5+$ZT|oQ%o%;rBX$+?xhvjb)SHgNHE_yP%wYkkvXHS{Bf$OiKJ5d1gI0j< zF6N}Aq=(WDo(J{e-uOecxPD>XZ@|u-tgTR<972`q8;&ZD!cep^@B5CaqFz|oU!iFj zU0;6fQX&~15E53EW&w1s9gQQ~Zk16X%6 zjG`j0yq}4deX2?Tr(03kg>C(!7a|b9qFI?jcE^Y>-VhudI@&LI6Qa}WQ>4H_!UVyF z((cm&!3gmq@;BD#5P~0;_2qgZhtJS|>WdtjY=q zLnHH~Fm!cxw|Z?Vw8*~?I$g#9j&uvgm7vPr#&iZgPP~v~BI4jOv;*OQ?jYJtzO<^y z7-#C={r7CO810!^s(MT!@@Vz_SVU)7VBi(e1%1rvS!?PTa}Uv`J!EP3s6Y!xUgM^8 z4f!fq<3Wer_#;u!5ECZ|^c1{|q_lh3m^9|nsMR1#Qm|?4Yp5~|er2?W^7~cl;_r4WSme_o68J9p03~Hc%X#VcX!xAu%1`R!dfGJCp zV*&m47>s^%Ib0~-2f$6oSgn3jg8m%UA;ArcdcRyM5;}|r;)?a^D*lel5C`V5G=c~k zy*w_&BfySOxE!(~PI$*dwG><+-%KT5p?whOUMA*k<9*gi#T{h3DAxzAPxN&Xws8o9Cp*`PA5>d9*Z-ynV# z9yY*1WR^D8|C%I@vo+d8r^pjJ$>eo|j>XiLWvTWLl(^;JHCsoPgem6PvegHb-OTf| zvTgsHSa;BkbG=(NgPO|CZu9gUCGr$8*EoH2_Z#^BnxF0yM~t`|9ws_xZ8X8iZYqh! zAh;HXJ)3P&)Q0(&F>!LN0g#bdbis-cQxyGn9Qgh`q+~49Fqd2epikEUw9caM%V6WgP)532RMRW}8gNS%V%Hx7apSz}tn@bQy!<=lbhmAH=FsMD?leawbnP5BWM0 z5{)@EEIYMu5;u)!+HQWhQ;D3_Cm_NADNeb-f56}<{41aYq8p4=93d=-=q0Yx#knGYfXVt z+kMxlus}t2T5FEyCN~!}90O_X@@PQpuy;kuGz@bWft%diBTx?d)_xWd_-(!LmVrh**oKg!1CNF&LX4{*j|) zIvjCR0I2UUuuEXh<9}oT_zT#jOrJAHNLFT~Ilh9hGJPI1<5`C-WA{tUYlyMeoy!+U zhA#=p!u1R7DNg9u4|QfED-2TuKI}>p#2P9--z;Bbf4Op*;Q9LCbO&aL2i<0O$ByoI z!9;Ght733FC>Pz>$_mw(F`zU?`m@>gE`9_p*=7o=7av`-&ifU(^)UU`Kg3Kw`h9-1 z6`e6+im=|m2v`pN(2dE%%n8YyQz;#3Q-|x`91z?gj68cMrHl}C25|6(_dIGk*8cA3 zRHB|Nwv{@sP4W+YZM)VKI>RlB`n=Oj~Rzx~M+Khz$N$45rLn6k1nvvD^&HtsMA4`s=MmuOJID@$s8Ph4E zAmSV^+s-z8cfv~Yd(40Sh4JG#F~aB>WFoX7ykaOr3JaJ&Lb49=B8Vk-SQT9%7TYhv z?-Pprt{|=Y5ZQ1?od|A<_IJU93|l4oAfBm?3-wk{O<8ea+`}u%(kub(LFo2zFtd?4 zwpN|2mBNywv+d^y_8#<$r>*5+$wRTCygFLcrwT(qc^n&@9r+}Kd_u@Ithz(6Qb4}A zWo_HdBj#V$VE#l6pD0a=NfB0l^6W^g`vm^sta>Tly?$E&{F?TTX~DsKF~poFfmN%2 z4x`Dc{u{Lkqz&y!33;X}weD}&;7p>xiI&ZUb1H9iD25a(gI|`|;G^NwJPv=1S5e)j z;U;`?n}jnY6rA{V^ zxTd{bK)Gi^odL3l989DQlN+Zs39Xe&otGeY(b5>rlIqfc7Ap4}EC?j<{M=hlH{1+d zw|c}}yx88_xQr`{98Z!d^FNH77=u(p-L{W6RvIn40f-BldeF-YD>p6#)(Qzf)lfZj z?3wAMtPPp>vMehkT`3gToPd%|D8~4`5WK{`#+}{L{jRUMt zrFz+O$C7y8$M&E4@+p+oV5c%uYzbqd2Y%SSgYy#xh4G3hQv>V*BnuKQhBa#=oZB~w{azUB+q%bRe_R^ z>fHBilnRTUfaJ201czL8^~Ix#+qOHSO)A|xWLqOxB$dT2W~)e-r9;bm=;p;RjYahB z*1hegN(VKK+ztr~h1}YP@6cfj{e#|sS`;3tJhIJK=tVJ-*h-5y9n*&cYCSdg#EHE# zSIx=r#qOaLJoVVf6v;(okg6?*L_55atl^W(gm^yjR?$GplNP>BZsBYEf_>wM0Lc;T zhf&gpzOWNxS>m+mN92N0{;4uw`P+9^*|-1~$uXpggj4- z^SFc4`uzj2OwdEVT@}Q`(^EcQ_5(ZtXTql*yGzdS&vrS_w>~~ra|Nb5abwf}Y!uq6R5f&6g2ge~2p(%c< z@O)cz%%rr4*cRJ5f`n@lvHNk@lE1a*96Kw6lJ~B-XfJW%?&-y?;E&?1AacU@`N`!O z6}V>8^%RZ7SQnZ-z$(jsX`amu*5Fj8g!3RTRwK^`2_QHe;_2y_n|6gSaGyPmI#kA0sYV<_qOZc#-2BO%hX)f$s-Z3xlI!ub z^;3ru11DA`4heAu%}HIXo&ctujzE2!6DIGE{?Zs>2}J+p&C$rc7gJC35gxhflorvsb%sGOxpuWhF)dL_&7&Z99=5M0b~Qa;Mo!j&Ti_kXW!86N%n= zSC@6Lw>UQ__F&+&Rzv?gscwAz8IP!n63>SP)^62(HK98nGjLY2*e^OwOq`3O|C92? z;TVhZ2SK%9AGW4ZavTB9?)mUbOoF`V7S=XM;#3EUpR+^oHtdV!GK^nXzCu>tpR|89 zdD{fnvCaN^^LL%amZ^}-E+214g&^56rpdc@yv0b<3}Ys?)f|fXN4oHf$six)-@<;W&&_kj z-B}M5U*1sb4)77aR=@%I?|Wkn-QJVuA96an25;~!gq(g1@O-5VGo7y&E_srxL6ZfS z*R%$gR}dyONgju*D&?geiSj7SZ@ftyA|}(*Y4KbvU!YLsi1EDQQCnb+-cM=K1io78o!v*);o<XwjaQH%)uIP&Zm?)Nfbfn;jIr z)d#!$gOe3QHp}2NBak@yYv3m(CPKkwI|{;d=gi552u?xj9ObCU^DJFQp4t4e1tPzM zvsRIGZ6VF+{6PvqsplMZWhz10YwS={?`~O0Ec$`-!klNUYtzWA^f9m7tkEzCy<_nS z=&<(awFeZvt51>@o_~>PLs05CY)$;}Oo$VDO)?l-{CS1Co=nxjqben*O1BR>#9`0^ zkwk^k-wcLCLGh|XLjdWv0_Hg54B&OzCE^3NCP}~OajK-LuRW53CkV~Su0U>zN%yQP zH8UH#W5P3-!ToO-2k&)}nFe`t+mdqCxxAHgcifup^gKpMObbox9LFK;LP3}0dP-UW z?Zo*^nrQ6*$FtZ(>kLCc2LY*|{!dUn$^RW~m9leoF|@Jy|M5p-G~j%+P0_#orRKf8 zvuu5<*XO!B?1E}-*SY~MOa$6c%2cM+xa8}_8x*aVn~57v&W(0mqN1W`5a7*VN{SUH zXz98DDyCnX2EPl-`Lesf`=AQT%YSDb`$%;(jUTrNen$NPJrlpPDP}prI>Ml!r6bCT;mjsg@X^#&<}CGf0JtR{Ecwd&)2zuhr#nqdgHj+g2n}GK9CHuwO zk>oZxy{vcOL)$8-}L^iVfJHAGfwN$prHjYV0ju}8%jWquw>}_W6j~m<}Jf!G?~r5&Rx)!9JNX!ts#SGe2HzobV5); zpj@&`cNcO&q+%*<%D7za|?m5qlmFK$=MJ_iv{aRs+BGVrs)98BlN^nMr{V_fcl_;jkzRju+c-y?gqBC_@J0dFLq-D9@VN&-`R9U;nv$Hg?>$oe4N&Ht$V_(JR3TG^! zzJsbQbi zFE6-{#9{G{+Z}ww!ycl*7rRdmU#_&|DqPfX3CR1I{Kk;bHwF6jh0opI`UV2W{*|nn zf_Y@%wW6APb&9RrbEN=PQRBEpM(N1w`81s=(xQj6 z-eO0k9=Al|>Ej|Mw&G`%q8e$2xVz1v4DXAi8G};R$y)ww638Y=9y$ZYFDM$}vzusg zUf+~BPX>(SjA|tgaFZr_e0{)+z9i6G#lgt=F_n$d=beAt0Sa0a7>z-?vcjl3e+W}+ z1&9=|vC=$co}-Zh*%3588G?v&U7%N1Qf-wNWJ)(v`iO5KHSkC5&g7CrKu8V}uQGcfcz zmBz#Lbqwqy#Z~UzHgOQ;Q-rPxrRNvl(&u6ts4~0=KkeS;zqURz%!-ERppmd%0v>iRlEf+H$yl{_8TMJzo0 z>n)`On|7=WQdsqhXI?#V{>+~}qt-cQbokEbgwV3QvSP7&hK4R{Z{aGHVS3;+h{|Hz z6$Js}_AJr383c_+6sNR|$qu6dqHXQTc6?(XWPCVZv=)D#6_;D_8P-=zOGEN5&?~8S zl5jQ?NL$c%O)*bOohdNwGIKM#jSAC?BVY={@A#c9GmX0=T(0G}xs`-%f3r=m6-cpK z!%waekyAvm9C3%>sixdZj+I(wQlbB4wv9xKI*T13DYG^T%}zZYJ|0$Oj^YtY+d$V$ zAVudSc-)FMl|54n=N{BnZTM|!>=bhaja?o7s+v1*U$!v!qQ%`T-6fBvmdPbVmro&d zk07TOp*KuxRUSTLRrBj{mjsnF8`d}rMViY8j`jo~Hp$fkv9F_g(jUo#Arp;Xw0M$~ zRIN!B22~$kx;QYmOkos@%|5k)!QypDMVe}1M9tZfkpXKGOxvKXB!=lo`p?|R1l=tA zp(1}c6T3Fwj_CPJwVsYtgeRKg?9?}%oRq0F+r+kdB=bFUdVDRPa;E~~>2$w}>O>v=?|e>#(-Lyx?nbg=ckJ#5U6;RT zNvHhXk$P}m9wSvFyU3}=7!y?Y z=fg$PbV8d7g25&-jOcs{%}wTDKm>!Vk);&rr;O1nvO0VrU&Q?TtYVU=ir`te8SLlS zKSNmV=+vF|ATGg`4$N1uS|n??f}C_4Sz!f|4Ly8#yTW-FBfvS48Tef|-46C(wEO_%pPhUC5$-~Y?!0vFZ^Gu`x=m7X99_?C-`|h zfmMM&Y@zdfitA@KPw4Mc(YHcY1)3*1xvW9V-r4n-9ZuBpFcf{yz+SR{ zo$ZSU_|fgwF~aakGr(9Be`~A|3)B=9`$M-TWKipq-NqRDRQc}ABo*s_5kV%doIX7LRLRau_gd@Rd_aLFXGSU+U?uAqh z8qusWWcvgQ&wu{|sRXmv?sl=xc<$6AR$+cl& zFNh5q1~kffG{3lDUdvEZu5c(aAG~+64FxdlfwY^*;JSS|m~CJusvi-!$XR`6@XtY2 znDHSz7}_Bx7zGq-^5{stTRy|I@N=>*y$zz>m^}^{d&~h;0kYiq8<^Wq7Dz0w31ShO^~LUfW6rfitR0(=3;Uue`Y%y@ex#eKPOW zO~V?)M#AeHB2kovn1v=n^D?2{2jhIQd9t|_Q+c|ZFaWt+r&#yrOu-!4pXAJuxM+Cx z*H&>eZ0v8Y`t}8{TV6smOj=__gFC=eah)mZt9gwz>>W$!>b3O;Rm^Ig*POZP8Rl0f zT~o=Nu1J|lO>}xX&#P58%Yl z83`HRs5#32Qm9mdCrMlV|NKNC+Z~ z9OB8xk5HJ>gBLi+m@(pvpw)1(OaVJKs*$Ou#@Knd#bk+V@y;YXT?)4eP9E5{J%KGtYinNYJUH9PU3A}66c>Xn zZ{Bn0<;8$WCOAL$^NqTjwM?5d=RHgw3!72WRo0c;+houoUA@HWLZM;^U$&sycWrFd zE7ekt9;kb0`lps{>R(}YnXlyGY}5pPd9zBpgXeJTY_jwaJGSJQC#-KJqmh-;ad&F- z-Y)E>!&`Rz!HtCz>%yOJ|v(u7P*I$jqEY3}(Z-orn4 zlI?CYKNl`6I){#2P1h)y(6?i;^z`N3bxTV%wNvQW+eu|x=kbj~s8rhCR*0H=iGkSj zk23lr9kr|p7#qKL=UjgO`@UnvzU)`&fI>1Qs7ubq{@+lK{hH* zvl6eSb9%yngRn^T<;jG1SVa)eA>T^XX=yUS@NCKpk?ovCW1D@!=@kn;l_BrG;hOTC z6K&H{<8K#dI(A+zw-MWxS+~{g$tI7|SfP$EYKxA}LlVO^sT#Oby^grkdZ^^lA}uEF zBSj$weBJG{+Bh@Yffzsw=HyChS(dtLE3i*}Zj@~!_T-Ay7z=B)+*~3|?w`Zd)Co2t zC&4DyB!o&YgSw+fJn6`sn$e)29`kUwAc+1MND7YjV%lO;H2}fNy>hD#=gT ze+-aFNpyKIoXY~Vq-}OWPBe?Rfu^{ps8>Xy%42r@RV#*QV~P83jdlFNgkPN=T|Kt7 zV*M`Rh*30&AWlb$;ae130e@}Tqi3zx2^JQHpM>j$6x`#{mu%tZlwx9Gj@Hc92IuY* zarmT|*d0E~vt6<+r?W^UW0&#U&)8B6+1+;k^2|FWBRP9?C4Rk)HAh&=AS8FS|NQaZ z2j!iZ)nbEyg4ZTp-zHwVlfLC~tXIrv(xrP8PAtR{*c;T24ycA-;auWsya-!kF~CWZ zw_uZ|%urXgUbc@x=L=_g@QJ@m#5beS@6W195Hn7>_}z@Xt{DIEA`A&V82bc^#!q8$ zFh?z_Vn|ozJ;NPd^5uu(9tspo8t%&-U9Ckay-s@DnM*R5rtu|4)~e)`z0P-sy?)kc zs_k&J@0&0!q4~%cKL)2l;N*T&0;mqX5T{Qy60%JtKTQZ-xb%KOcgqwJmb%MOOKk7N zgq})R_6**{8A|6H?fO+2`#QU)p$Ei2&nbj6TpLSIT^D$|`TcSeh+)}VMb}LmvZ{O| ze*1IdCt3+yhdYVxcM)Q_V0bIXLgr6~%JS<<&dxIgfL=Vnx4YHuU@I34JXA|+$_S3~ zy~X#gO_X!cSs^XM{yzDGNM>?v(+sF#<0;AH^YrE8smx<36bUsHbN#y57K8WEu(`qHvQ6cAZPo=J5C(lSmUCZ57Rj6cx!e^rfaI5%w}unz}4 zoX=nt)FVNV%QDJH`o!u9olLD4O5fl)xp+#RloZlaA92o3x4->?rB4`gS$;WO{R;Z3>cG3IgFX2EA?PK^M}@%1%A;?f6}s&CV$cIyEr#q5;yHdNZ9h{| z-=dX+a5elJoDo?Eq&Og!nN6A)5yYpnGEp}?=!C-V)(*~z-+?kY1Q7qs#Rsy%hu_60rdbB+QQNr?S1 z?;xtjUv|*E3}HmuNyB9aFL5H~3Ho0UsmuMZELp1a#CA1g`P{-mT?BchuLEtK}!QZ=3AWakRu~?f9V~3F;TV`5%9Pcs_$gq&CcU}r8gOO zC2&SWPsSG{&o-LIGTBqp6SLQZPvYKp$$7L4WRRZ0BR$Kf0I0SCFkqveCp@f)o8W)! z$%7D1R`&j7W9Q9CGus_)b%+B#J2G;l*FLz#s$hw{BHS~WNLODV#(!u_2Pe&tMsq={ zdm7>_WecWF#D=?eMjLj=-_z`aHMZ=3_-&E8;ibPmM}61i6J3is*=dKf%HC>=xbj4$ zS|Q-hWQ8T5mWde6h@;mS+?k=89?1FU<%qH9B(l&O>k|u_aD|DY*@~(`_pb|B#rJ&g zR0(~(68fpUPz6TdS@4JT5MOPrqDh5_H(eX1$P2SQrkvN8sTxwV>l0)Qq z0pzTuvtEAKRDkKGhhv^jk%|HQ1DdF%5oKq5BS>szk-CIke{%js?~%@$uaN3^Uz6Wf z_iyx{bZ(;9y4X&>LPV=L=d+A}7I4GkK0c1Xts{rrW1Q7apHf-))`BgC^0^F(>At1* za@e7{lq%yAkn*NH8Q1{@{lKhRg*^TfGvv!Sn*ed*x@6>M%aaqySxR|oNadYt1mpUZ z6H(rupHYf&Z z29$5g#|0MX#aR6TZ$@eGxxABRKakDYtD%5BmKp;HbG_ZbT+=81E&=XRk6m_3t9PvD zr5Cqy(v?gHcYvYvXkNH@S#Po~q(_7MOuCAB8G$a9BC##gw^5mW16cML=T=ERL7wsk zzNEayTG?mtB=x*wc@ifBCJ|irFVMOvH)AFRW8WE~U()QT=HBCe@s$dA9O!@`zAAT) zaOZ7l6vyR+Nk_OOF!ZlZmjoImKh)dxFbbR~z(cMhfeX1l7S_`;h|v3gI}n9$sSQ>+3@AFAy9=B_y$)q;Wdl|C-X|VV3w8 z2S#>|5dGA8^9%Bu&fhmVRrTX>Z7{~3V&0UpJNEl0=N32euvDGCJ>#6dUSi&PxFW*s zS`}TB>?}H(T2lxBJ!V#2taV;q%zd6fOr=SGHpoSG*4PDaiG0pdb5`jelVipkEk%FV zThLc@Hc_AL1#D&T4D=w@UezYNJ%0=f3iVRuVL5H?eeZM}4W*bomebEU@e2d`M<~uW zf#Bugwf`VezG|^Qbt6R_=U0}|=k;mIIakz99*>FrsQR{0aQRP6ko?5<7bkDN8evZ& zB@_KqQG?ErKL=1*ZM9_5?Pq%lcS4uLSzN(Mr5=t6xHLS~Ym`UgM@D&VNu8e?_=nSFtF$u@hpPSmI4Vo_t&v?>$~K4y(O~Rb*(MFy_igM7 z*~yYUyR6yQgzWnWMUgDov!!g=lInM+=lOmOk4L`O?{i&qxy&D*_qorRbDwj6?)!ef z#JLd7F6Z2I$S0iYI={rZNk*<{HtIl^mx=h>Cim*04K4+Z4IJtd*-)%6XV2(MCscPiw_a+y*?BKbTS@BZ3AUao^%Zi#PhoY9Vib4N>SE%4>=Jco0v zH_Miey{E;FkdlZSq)e<{`+S3W=*ttvD#hB8w=|2aV*D=yOV}(&p%0LbEWH$&@$X3x~CiF-?ejQ*N+-M zc8zT@3iwkdRT2t(XS`d7`tJQAjRmKAhiw{WOqpuvFp`i@Q@!KMhwKgsA}%@sw8Xo5Y=F zhRJZg)O4uqNWj?V&&vth*H#je6T}}p_<>!Dr#89q@uSjWv~JuW(>FqoJ5^ho0%K?E z9?x_Q;kmcsQ@5=}z@tdljMSt9-Z3xn$k)kEjK|qXS>EfuDmu(Z8|(W?gY6-l z@R_#M8=vxKMAoi&PwnaIYw2COJM@atcgfr=zK1bvjW?9B`-+Voe$Q+H$j!1$Tjn+* z&LY<%)L@;zhnJlB^Og6I&BOR-m?{IW;tyYC%FZ!&Z>kGjHJ6cqM-F z&19n+e1=9AH1VrVeHrIzqlC`w9=*zfmrerF?JMzO&|Mmv;!4DKc(sp+jy^Dx?(8>1 zH&yS_4yL7m&GWX~mdfgH*AB4{CKo;+egw=PrvkTaoBU+P-4u?E|&!c z)DKc;>$$B6u*Zr1SjUh2)FeuWLWHl5TH(UHWkf zLs>7px!c5n;rbe^lO@qlYLzlDVp(z?6rPZel=YB)Uv&n!2{+Mb$-vQl=xKw( zve&>xYx+jW_NJh!FV||r?;hdP*jOXYcLCp>DOtJ?2S^)DkM{{Eb zS$!L$e_o0(^}n3tA1R3-$SNvgBq;DOEo}fNc|tB%%#g4RA3{|euq)p+xd3I8^4E&m zFrD%}nvG^HUAIKe9_{tXB;tl|G<%>yk6R;8L2)KUJw4yHJXUOPM>(-+jxq4R;z8H#>rnJy*)8N+$wA$^F zN+H*3t)eFEgxLw+Nw3};4WV$qj&_D`%ADV2%r zJCPCo%{=z7;`F98(us5JnT(G@sKTZ^;2FVitXyLe-S5(hV&Ium+1pIUB(CZ#h|g)u zSLJJ<@HgrDiA-}V_6B^x1>c9B6%~847JkQ!^KLZ2skm;q*edo;UA)~?SghG8;QbHh z_6M;ouo_1rq9=x$<`Y@EA{C%6-pEV}B(1#sDoe_e1s3^Y>n#1Sw;N|}8D|s|VPd+g z-_$QhCz`vLxxrVMx3ape1xu3*wjx=yKSlM~nFgkNWb4?DDr*!?U)L_VeffF<+!j|b zZ$Wn2$TDv3C3V@BHpSgv3JUif8%hk%OsGZ=OxH@8&4`bbf$`aAMchl^qN>Eyu3JH} z9-S!x8-s4fE=lad%Pkp8hAs~u?|uRnL48O|;*DEU! zuS0{cpk%1E0nc__2%;apFsTm0bKtd&A0~S3Cj^?72-*Owk3V!ZG*PswDfS~}2<8le z5+W^`Y(&R)yVF*tU_s!XMcJS`;(Tr`J0%>p=Z&InR%D3@KEzzI+-2)HK zuoNZ&o=wUC&+*?ofPb0a(E6(<2Amd6%uSu_^-<1?hsxs~0K5^f(LsGqgEF^+0_H=uNk9S0bb!|O8d?m5gQjUKevPaO+*VfSn^2892K~%crWM8+6 z25@V?Y@J<9w%@NXh-2!}SK_(X)O4AM1-WTg>sj1{lj5@=q&dxE^9xng1_z9w9DK>| z6Iybcd0e zyi;Ew!KBRIfGPGytQ6}z}MeXCfLY0?9%RiyagSp_D1?N&c{ zyo>VbJ4Gy`@Fv+5cKgUgs~na$>BV{*em7PU3%lloy_aEovR+J7TfQKh8BJXyL6|P8un-Jnq(ghd!_HEOh$zlv2$~y3krgeH;9zC}V3f`uDtW(%mT#944DQa~^8ZI+zAUu4U(j0YcDfKR$bK#gvn_{JZ>|gZ5+)u?T$w7Q%F^;!Wk?G z(le7r!ufT*cxS}PR6hIVtXa)i`d$-_1KkyBU>qmgz-=T};uxx&sKgv48akIWQ89F{ z0XiY?WM^~;|T8zBOr zs#zuOONzH?svv*jokd5SK8wG>+yMC)LYL|vLqm^PMHcT=`}V$=nIRHe2?h)8WQa6O zPAU}d`1y(>kZiP~Gr=mtJLMu`i<2CspL|q2DqAgAD^7*$xzM`PU4^ga`ilE134XBQ z99P(LhHU@7qvl9Yzg$M`+dlS=x^(m-_3t|h>S}E0bcFMn=C|KamQ)=w2^e)35p`zY zRV8X?d;s^>Cof2SPR&nP3E+-LCkS0J$H!eh8~k0qo$}00b=7!H_I2O+Ro@3O$nPdm ztmbOO^B+IHzQ5w>@@@J4cKw5&^_w6s!s=H%&byAbUtczPQ7}wfTqxxtQNfn*u73Qw zGuWsrky_ajPx-5`R<)6xHf>C(oqGf_Fw|-U*GfS?xLML$kv;h_pZ@Kk$y0X(S+K80 z6^|z)*`5VUkawg}=z`S;VhZhxyDfrE0$(PMurAxl~<>lfZa>JZ288ULK7D` zl9|#L^JL}Y$j*j`0-K6kH#?bRmg#5L3iB4Z)%iF@SqT+Lp|{i`m%R-|ZE94Np7Pa5 zCqC^V3}B(FR340pmF*qaa}M}+h6}mqE~7Sh!9bDv9YRT|>vBNAqv09zXHMlcuhKD| zcjjA(b*XCIwJ33?CB!+;{)vX@9xns_b-VO{i0y?}{!sdXj1GM8+$#v>W7nw;+O_9B z_{4L;C6ol?(?W0<6taGEn1^uG=?Q3i29sE`RfYCaV$3DKc_;?HsL?D_fSYg}SuO5U zOB_f4^vZ_x%o`5|C@9C5+o=mFy@au{s)sKw!UgC&L35aH(sgDxRE2De%(%OT=VUdN ziVLEmdOvJ&5*tCMKRyXctCwQu_RH%;m*$YK&m;jtbdH#Ak~13T1^f89tn`A%QEHWs~jnY~E}p_Z$XC z=?YXLCkzVSK+Id`xZYTegb@W8_baLt-Fq`Tv|=)JPbFsKRm)4UW;yT+J`<)%#ue9DPOkje)YF2fsCilK9MIIK>p*`fkoD5nGfmLwt)!KOT+> zOFq*VZktDDyM3P5UOg`~XL#cbzC}eL%qMB=Q5$d89MKuN#$6|4gx_Jt0Gfn8w&q}%lq4QU%6#jT*MRT% zrLz~C8FYKHawn-EQWN1B75O&quS+Z81(zN)G>~vN8VwC+e+y(`>HcxC{MrJ;H1Z4k zZWuv$w_F0-Ub%MVcpIc){4PGL^I7M{>;hS?;eH!;gmcOE66z3;Z1Phqo(t zVP(Hg6q#0gIKgsg7L7WE!{Y#1nI(45tx2{$34dDd#!Z0NIyrm)HOn5W#7;f4pQci# zDW!FI(g4e668kI9{2+mLwB+=#9bfqgX%!B34V-$wwSN(_cm*^{y0jQtv*4}eO^sOV z*9xoNvX)c9isB}Tgx&ZRjp3kwhTVK?r9;n!x>^XYT z@Q^7zp{rkIs{2mUSE^2!Gf6$6;j~&4=-0cSJJDizZp6LTe8b45;{AKM%v99}{{FfC zz709%u0mC=1KXTo(=TqmZQ;c?$M3z(!xah>aywrj40sc2y3rKFw4jCq+Y+u=CH@_V zxz|qeTwa>+<|H%8Dz5u>ZI5MmjTFwXS-Fv!TDd*`>3{krWoNVx$<133`(ftS?ZPyY z&4@ah^3^i`vL$BZa>O|Nt?ucewzsF)0zX3qmM^|waXr=T0pfIb0*$AwU=?Ipl|1Y; z*Pk6{C-p4MY;j@IJ|DW>QHZQJcp;Z~?8(Q+Kk3^0qJ}SCk^*n4W zu9ZFwLHUx-$6xvaQ)SUQcYd6fF8&x)V`1bIuX@>{mE$b|Yd(qomn3;bPwnDUc0F=; zh*6_((%bqAYQWQ~odER?h>1mkL4kpb3s7`0m@rDKGU*oyF)$j~Ffd4fXV$?`f~rHf zB%Y)@5SXZvfwm10RY5X?TEo)PK_`L6qgBp=#>fO49$D zDq8Ozj0q6213tV5Qq=;fZ0$|KroY{Dz=l@lU^J)?Ko@ti20TRplXzphBi>XGx4bou zEWrkNjz0t5j!_ke{g5I#PUlEU$Km8g8TE|XK=MkU@PT4T><2OVamoK;wJ}3X0L$vX zgd7gNa359*nc)R-0!`2X@FOTB`+oETOPc=ubp5R)VQgY+5BTZZJ2?9QwnO=dnulIUF3gFn;BODC2)65)HeVd%t86sL7Rv^Y+nbn+&l z6BAJY(ETvwI)Ts$aiE8rht4KD*qNyE{8{x6R|%akbTBzw;2+6Echkt+W+`u^XX z_z&x%n '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/backend/gradlew.bat b/backend/gradlew.bat new file mode 100644 index 0000000..25da30d --- /dev/null +++ b/backend/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/backend/settings.gradle.kts b/backend/settings.gradle.kts new file mode 100644 index 0000000..e31b678 --- /dev/null +++ b/backend/settings.gradle.kts @@ -0,0 +1,15 @@ +pluginManagement { + repositories { + gradlePluginPortal() + mavenCentral() + } +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + mavenCentral() + } +} + +rootProject.name = "fleet-ble-monitor-backend" diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/FleetBleMonitorApplication.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/FleetBleMonitorApplication.kt new file mode 100644 index 0000000..c83f7fe --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/FleetBleMonitorApplication.kt @@ -0,0 +1,11 @@ +package llc.arma.fleet.monitor + +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication + +@SpringBootApplication +class FleetBleMonitorApplication + +fun main(args: Array) { + runApplication(*args) +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/config/DataSeeder.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/config/DataSeeder.kt new file mode 100644 index 0000000..678c618 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/config/DataSeeder.kt @@ -0,0 +1,153 @@ +package llc.arma.fleet.monitor.config + +import llc.arma.fleet.monitor.data.entity.BeaconEntity +import llc.arma.fleet.monitor.data.entity.BeaconStatus +import llc.arma.fleet.monitor.data.entity.DepartmentEntity +import llc.arma.fleet.monitor.data.entity.MachineEntity +import llc.arma.fleet.monitor.data.entity.MachineStateCode +import llc.arma.fleet.monitor.data.entity.MachineStateDefinitionEntity +import llc.arma.fleet.monitor.data.entity.MachineStateIntervalEntity +import llc.arma.fleet.monitor.data.entity.MachineTypeEntity +import llc.arma.fleet.monitor.data.entity.UserEntity +import llc.arma.fleet.monitor.data.entity.UserRole +import llc.arma.fleet.monitor.data.repository.BeaconRepository +import llc.arma.fleet.monitor.data.repository.DepartmentRepository +import llc.arma.fleet.monitor.data.repository.MachineRepository +import llc.arma.fleet.monitor.data.repository.MachineStateDefinitionRepository +import llc.arma.fleet.monitor.data.repository.MachineStateIntervalRepository +import llc.arma.fleet.monitor.data.repository.MachineTypeRepository +import llc.arma.fleet.monitor.data.repository.UserRepository +import org.springframework.beans.factory.annotation.Value +import org.springframework.boot.CommandLineRunner +import org.springframework.security.crypto.password.PasswordEncoder +import org.springframework.stereotype.Component +import java.time.OffsetDateTime + +@Component +class DataSeeder( + @Value("\${app.seed.enabled:true}") private val enabled: Boolean, + private val userRepository: UserRepository, + private val machineTypeRepository: MachineTypeRepository, + private val departmentRepository: DepartmentRepository, + private val beaconRepository: BeaconRepository, + private val machineRepository: MachineRepository, + private val stateDefinitionRepository: MachineStateDefinitionRepository, + private val stateIntervalRepository: MachineStateIntervalRepository, + private val passwordEncoder: PasswordEncoder, +) : CommandLineRunner { + override fun run(vararg args: String) { + if (!enabled || userRepository.count() > 0) return + + userRepository.saveAll( + listOf( + UserEntity( + lastName = "Админов", + firstName = "Алексей", + middleName = "Сергеевич", + email = "admin@fleet.local", + login = "admin", + passwordHash = encodePassword("123456"), + role = UserRole.ADMIN, + ), + UserEntity( + lastName = "Пользователев", + firstName = "Иван", + middleName = "Петрович", + email = "user@fleet.local", + login = "user", + passwordHash = encodePassword("123456"), + role = UserRole.USER, + ), + ), + ) + + val roller = machineTypeRepository.save(MachineTypeEntity(name = "Каток", description = "Дорожная техника")) + val dumpTruck = machineTypeRepository.save(MachineTypeEntity(name = "Самосвал", description = "Грузовая техника")) + val loader = machineTypeRepository.save(MachineTypeEntity(name = "Погрузчик", description = "Погрузочная техника")) + val road = departmentRepository.save(DepartmentEntity(name = "Дорожный участок")) + val mine = departmentRepository.save(DepartmentEntity(name = "Рудничный участок")) + + val beacon1 = beaconRepository.save(BeaconEntity(identifier = "BLE-TRK-0001", macAddress = "E4:5F:01:AA:10:01", status = BeaconStatus.BOUND, lastSeenAt = OffsetDateTime.now().minusMinutes(5))) + val beacon2 = beaconRepository.save(BeaconEntity(identifier = "BLE-TRK-0002", macAddress = "E4:5F:01:AA:10:02", status = BeaconStatus.BOUND, lastSeenAt = OffsetDateTime.now().minusMinutes(18))) + beaconRepository.save(BeaconEntity(identifier = "BLE-TRK-0003", macAddress = "E4:5F:01:AA:10:03", status = BeaconStatus.FREE)) + + val machine1 = machineRepository.save( + MachineEntity( + name = "Каток Hamm 3412", + licensePlate = "E402PB 154", + type = roller, + department = road, + description = "Уплотнение технологических дорог после отсыпки.", + beacon = beacon1, + lastKnownState = MachineStateCode.ENGINE_ON, + lastDataReceivedAt = beacon1.lastSeenAt, + ), + ) + machineRepository.save( + MachineEntity( + name = "КамАЗ 6520", + licensePlate = "A123BC 42", + type = dumpTruck, + department = mine, + beacon = beacon2, + lastKnownState = MachineStateCode.MOVING, + lastDataReceivedAt = beacon2.lastSeenAt, + ), + ) + machineRepository.save( + MachineEntity( + name = "Погрузчик Cat 950", + licensePlate = "T777TO 42", + type = loader, + department = mine, + lastKnownState = MachineStateCode.NO_DATA, + ), + ) + + val idle = stateDefinitionRepository.save(MachineStateDefinitionEntity(name = "Стоит", icon = "pause", color = "gray", isSystem = true)) + val engineOn = stateDefinitionRepository.save(MachineStateDefinitionEntity(name = "Заведена", icon = "engine", color = "orange", isSystem = true)) + val moving = stateDefinitionRepository.save(MachineStateDefinitionEntity(name = "В движении", icon = "route", color = "green", isSystem = true)) + val noData = stateDefinitionRepository.save(MachineStateDefinitionEntity(name = "Нет данных", icon = "signal-off", color = "red", isSystem = true)) + + val base = OffsetDateTime.now().withHour(8).withMinute(0).withSecond(0).withNano(0) + stateIntervalRepository.saveAll( + listOf( + interval(machine1, engineOn, MachineStateCode.ENGINE_ON, base, 15 * 60), + interval(machine1, moving, MachineStateCode.MOVING, base.plusMinutes(15), 75 * 60), + interval(machine1, idle, MachineStateCode.IDLE, base.plusMinutes(90), 40 * 60), + interval(machine1, moving, MachineStateCode.MOVING, base.plusMinutes(130), 95 * 60), + interval(machine1, engineOn, MachineStateCode.ENGINE_ON, base.plusMinutes(225), 30 * 60), + interval(machine1, idle, MachineStateCode.IDLE, base.plusMinutes(255), 45 * 60), + interval(machine1, moving, MachineStateCode.MOVING, base.plusMinutes(300), 140 * 60), + interval(machine1, noData, MachineStateCode.NO_DATA, base.plusMinutes(440), 20 * 60, true), + interval(machine1, idle, MachineStateCode.IDLE, base.plusMinutes(460), 80 * 60), + ), + ) + } + + private fun encodePassword(password: String): String { + return passwordEncoder.encode(password) + ?: error("Password encoder returned null") + } + + private fun interval( + machine: MachineEntity, + definition: MachineStateDefinitionEntity, + code: MachineStateCode, + start: OffsetDateTime, + durationSeconds: Int, + noData: Boolean = false, + ): MachineStateIntervalEntity = MachineStateIntervalEntity( + machine = machine, + stateDefinition = definition, + stateCode = code, + startedAt = start, + endedAt = start.plusSeconds(durationSeconds.toLong()), + durationSeconds = durationSeconds, + vibrationMin = if (noData) null else 10.0, + vibrationMax = if (noData) null else 150.0, + vibrationAvg = if (noData) null else 60.0, + sampleCount = if (noData) 0 else durationSeconds / 10, + isNoData = noData, + ) +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/config/GraphQlConfig.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/config/GraphQlConfig.kt new file mode 100644 index 0000000..4b9d074 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/config/GraphQlConfig.kt @@ -0,0 +1,27 @@ +package llc.arma.fleet.monitor.config + +import graphql.scalars.ExtendedScalars +import graphql.schema.GraphQLScalarType +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.graphql.execution.RuntimeWiringConfigurer +import java.time.LocalDate +import java.time.OffsetDateTime + +@Configuration +class GraphQlConfig { + @Bean + fun runtimeWiringConfigurer(): RuntimeWiringConfigurer = RuntimeWiringConfigurer { wiringBuilder -> + wiringBuilder.scalar(ExtendedScalars.GraphQLLong) + wiringBuilder.scalar(dateTimeScalar()) + wiringBuilder.scalar(dateScalar()) + } + + private fun dateTimeScalar(): GraphQLScalarType = ExtendedScalars.newAliasedScalar("DateTime") + .aliasedScalar(ExtendedScalars.DateTime) + .build() + + private fun dateScalar(): GraphQLScalarType = ExtendedScalars.newAliasedScalar("Date") + .aliasedScalar(ExtendedScalars.Date) + .build() +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/BaseEntity.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/BaseEntity.kt new file mode 100644 index 0000000..0df1287 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/BaseEntity.kt @@ -0,0 +1,28 @@ +package llc.arma.fleet.monitor.data.entity + +import jakarta.persistence.Column +import jakarta.persistence.MappedSuperclass +import jakarta.persistence.PrePersist +import jakarta.persistence.PreUpdate +import java.time.OffsetDateTime + +@MappedSuperclass +abstract class BaseEntity { + @Column(nullable = false, updatable = false) + var createdAt: OffsetDateTime = OffsetDateTime.now() + + @Column(nullable = false) + var updatedAt: OffsetDateTime = OffsetDateTime.now() + + @PrePersist + fun onCreate() { + val now = OffsetDateTime.now() + createdAt = now + updatedAt = now + } + + @PreUpdate + fun onUpdate() { + updatedAt = OffsetDateTime.now() + } +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/BeaconEntity.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/BeaconEntity.kt new file mode 100644 index 0000000..661c72a --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/BeaconEntity.kt @@ -0,0 +1,37 @@ +package llc.arma.fleet.monitor.data.entity + +import jakarta.persistence.Column +import jakarta.persistence.Entity +import jakarta.persistence.EnumType +import jakarta.persistence.Enumerated +import jakarta.persistence.FetchType +import jakarta.persistence.GeneratedValue +import jakarta.persistence.GenerationType +import jakarta.persistence.Id +import jakarta.persistence.OneToOne +import jakarta.persistence.Table +import java.time.OffsetDateTime + +@Entity +@Table(name = "beacons") +class BeaconEntity( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + + @Column(nullable = false, unique = true) + var identifier: String = "", + + @Column(nullable = false, unique = true) + var macAddress: String = "", + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + var status: BeaconStatus = BeaconStatus.FREE, + + @OneToOne(mappedBy = "beacon", fetch = FetchType.LAZY) + var boundMachine: MachineEntity? = null, + + @Column(nullable = true) + var lastSeenAt: OffsetDateTime? = null, +) : BaseEntity() diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/BeaconTelemetryPacketEntity.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/BeaconTelemetryPacketEntity.kt new file mode 100644 index 0000000..141152a --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/BeaconTelemetryPacketEntity.kt @@ -0,0 +1,43 @@ +package llc.arma.fleet.monitor.data.entity + +import jakarta.persistence.Column +import jakarta.persistence.Entity +import jakarta.persistence.FetchType +import jakarta.persistence.GeneratedValue +import jakarta.persistence.GenerationType +import jakarta.persistence.Id +import jakarta.persistence.JoinColumn +import jakarta.persistence.ManyToOne +import jakarta.persistence.Table +import java.time.OffsetDateTime + +@Entity +@Table(name = "beacon_telemetry_packets") +class BeaconTelemetryPacketEntity( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "beacon_id", nullable = false) + var beacon: BeaconEntity = BeaconEntity(), + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "machine_id", nullable = true) + var machine: MachineEntity? = null, + + @Column(nullable = false) + var mac: String = "", + + @Column(nullable = false) + var vibration: Double = 0.0, + + @Column(nullable = false) + var duration: Int = 0, + + @Column(nullable = false) + var timeMillis: Long = 0, + + @Column(nullable = false) + var receivedAt: OffsetDateTime = OffsetDateTime.now(), +) diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/DepartmentEntity.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/DepartmentEntity.kt new file mode 100644 index 0000000..dd8a629 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/DepartmentEntity.kt @@ -0,0 +1,22 @@ +package llc.arma.fleet.monitor.data.entity + +import jakarta.persistence.Column +import jakarta.persistence.Entity +import jakarta.persistence.GeneratedValue +import jakarta.persistence.GenerationType +import jakarta.persistence.Id +import jakarta.persistence.Table + +@Entity +@Table(name = "departments") +class DepartmentEntity( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + + @Column(nullable = false, unique = true) + var name: String = "", + + @Column(nullable = true, length = 2048) + var description: String? = null, +) : BaseEntity() diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/Enums.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/Enums.kt new file mode 100644 index 0000000..85234e3 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/Enums.kt @@ -0,0 +1,19 @@ +package llc.arma.fleet.monitor.data.entity + +enum class UserRole { ADMIN, USER } + +enum class MachineStateCode { IDLE, ENGINE_ON, MOVING, NO_DATA } + +enum class BeaconStatus { FREE, BOUND } + +enum class ReportFormat { PDF, XLSX } + +enum class ReportPeriod { PREVIOUS_DAY } + +enum class ReportDeliveryStatus { CREATED, GENERATING, SENT, FAILED } + +enum class SortDirection { ASC, DESC } + +enum class UserSortField { ID, NAME, DATE } + +enum class MachineSortField { ID, NAME, DATE } diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineCalibrationRuleEntity.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineCalibrationRuleEntity.kt new file mode 100644 index 0000000..966cedc --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineCalibrationRuleEntity.kt @@ -0,0 +1,33 @@ +package llc.arma.fleet.monitor.data.entity + +import jakarta.persistence.Column +import jakarta.persistence.Entity +import jakarta.persistence.FetchType +import jakarta.persistence.GeneratedValue +import jakarta.persistence.GenerationType +import jakarta.persistence.Id +import jakarta.persistence.JoinColumn +import jakarta.persistence.ManyToOne +import jakarta.persistence.Table + +@Entity +@Table(name = "machine_calibration_rules") +class MachineCalibrationRuleEntity( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "machine_id", nullable = false) + var machine: MachineEntity = MachineEntity(), + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "state_definition_id", nullable = false) + var stateDefinition: MachineStateDefinitionEntity = MachineStateDefinitionEntity(), + + @Column(nullable = false) + var vibrationMin: Double = 0.0, + + @Column(nullable = false) + var vibrationMax: Double = 0.0, +) : BaseEntity() diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineEntity.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineEntity.kt new file mode 100644 index 0000000..2209466 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineEntity.kt @@ -0,0 +1,51 @@ +package llc.arma.fleet.monitor.data.entity + +import jakarta.persistence.Column +import jakarta.persistence.Entity +import jakarta.persistence.EnumType +import jakarta.persistence.Enumerated +import jakarta.persistence.FetchType +import jakarta.persistence.GeneratedValue +import jakarta.persistence.GenerationType +import jakarta.persistence.Id +import jakarta.persistence.JoinColumn +import jakarta.persistence.ManyToOne +import jakarta.persistence.OneToOne +import jakarta.persistence.Table +import java.time.OffsetDateTime + +@Entity +@Table(name = "machines") +class MachineEntity( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + + @Column(nullable = false) + var name: String = "", + + @Column(nullable = false, unique = true) + var licensePlate: String = "", + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "type_id", nullable = false) + var type: MachineTypeEntity = MachineTypeEntity(), + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "department_id", nullable = false) + var department: DepartmentEntity = DepartmentEntity(), + + @Column(nullable = true, length = 4096) + var description: String? = null, + + @OneToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "beacon_id", nullable = true) + var beacon: BeaconEntity? = null, + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + var lastKnownState: MachineStateCode = MachineStateCode.NO_DATA, + + @Column(nullable = true) + var lastDataReceivedAt: OffsetDateTime? = null, +) : BaseEntity() diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineStateDefinitionEntity.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineStateDefinitionEntity.kt new file mode 100644 index 0000000..6b8e186 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineStateDefinitionEntity.kt @@ -0,0 +1,31 @@ +package llc.arma.fleet.monitor.data.entity + +import jakarta.persistence.Column +import jakarta.persistence.Entity +import jakarta.persistence.GeneratedValue +import jakarta.persistence.GenerationType +import jakarta.persistence.Id +import jakarta.persistence.Table + +@Entity +@Table(name = "machine_state_definitions") +class MachineStateDefinitionEntity( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + + @Column(nullable = false, unique = true) + var name: String = "", + + @Column(nullable = false) + var icon: String = "", + + @Column(nullable = false) + var color: String = "", + + @Column(nullable = true, length = 2048) + var description: String? = null, + + @Column(nullable = false) + var isSystem: Boolean = false, +) : BaseEntity() diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineStateIntervalEntity.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineStateIntervalEntity.kt new file mode 100644 index 0000000..db92fcd --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineStateIntervalEntity.kt @@ -0,0 +1,58 @@ +package llc.arma.fleet.monitor.data.entity + +import jakarta.persistence.Column +import jakarta.persistence.Entity +import jakarta.persistence.EnumType +import jakarta.persistence.Enumerated +import jakarta.persistence.FetchType +import jakarta.persistence.GeneratedValue +import jakarta.persistence.GenerationType +import jakarta.persistence.Id +import jakarta.persistence.JoinColumn +import jakarta.persistence.ManyToOne +import jakarta.persistence.Table +import java.time.OffsetDateTime + +@Entity +@Table(name = "machine_state_intervals") +class MachineStateIntervalEntity( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "machine_id", nullable = false) + var machine: MachineEntity = MachineEntity(), + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "state_definition_id", nullable = true) + var stateDefinition: MachineStateDefinitionEntity? = null, + + @Enumerated(EnumType.STRING) + @Column(nullable = true) + var stateCode: MachineStateCode? = null, + + @Column(nullable = false) + var startedAt: OffsetDateTime = OffsetDateTime.now(), + + @Column(nullable = true) + var endedAt: OffsetDateTime? = null, + + @Column(nullable = false) + var durationSeconds: Int = 0, + + @Column(nullable = true) + var vibrationMin: Double? = null, + + @Column(nullable = true) + var vibrationMax: Double? = null, + + @Column(nullable = true) + var vibrationAvg: Double? = null, + + @Column(nullable = false) + var sampleCount: Int = 0, + + @Column(nullable = false) + var isNoData: Boolean = false, +) : BaseEntity() diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineTypeEntity.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineTypeEntity.kt new file mode 100644 index 0000000..abe28e8 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/MachineTypeEntity.kt @@ -0,0 +1,22 @@ +package llc.arma.fleet.monitor.data.entity + +import jakarta.persistence.Column +import jakarta.persistence.Entity +import jakarta.persistence.GeneratedValue +import jakarta.persistence.GenerationType +import jakarta.persistence.Id +import jakarta.persistence.Table + +@Entity +@Table(name = "machine_types") +class MachineTypeEntity( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + + @Column(nullable = false, unique = true) + var name: String = "", + + @Column(nullable = true, length = 2048) + var description: String? = null, +) : BaseEntity() diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/UserEntity.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/UserEntity.kt new file mode 100644 index 0000000..32f9224 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/entity/UserEntity.kt @@ -0,0 +1,43 @@ +package llc.arma.fleet.monitor.data.entity + +import jakarta.persistence.Column +import jakarta.persistence.Entity +import jakarta.persistence.EnumType +import jakarta.persistence.Enumerated +import jakarta.persistence.GeneratedValue +import jakarta.persistence.GenerationType +import jakarta.persistence.Id +import jakarta.persistence.Table + +@Entity +@Table(name = "users") +class UserEntity( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + + @Column(nullable = false) + var lastName: String = "", + + @Column(nullable = false) + var firstName: String = "", + + @Column(nullable = true) + var middleName: String? = null, + + @Column(nullable = false, unique = true) + var email: String = "", + + @Column(nullable = false, unique = true) + var login: String = "", + + @Column(nullable = false) + var passwordHash: String = "", + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + var role: UserRole = UserRole.USER, + + @Column(nullable = false) + var active: Boolean = true, +) : BaseEntity() diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/BeaconRepository.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/BeaconRepository.kt new file mode 100644 index 0000000..9703b7a --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/BeaconRepository.kt @@ -0,0 +1,10 @@ +package llc.arma.fleet.monitor.data.repository + +import llc.arma.fleet.monitor.data.entity.BeaconEntity +import llc.arma.fleet.monitor.data.entity.BeaconStatus +import org.springframework.data.jpa.repository.JpaRepository + +interface BeaconRepository : JpaRepository { + fun findByMacAddress(macAddress: String): BeaconEntity? + fun findByStatus(status: BeaconStatus): List +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/BeaconTelemetryPacketRepository.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/BeaconTelemetryPacketRepository.kt new file mode 100644 index 0000000..d4b4d09 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/BeaconTelemetryPacketRepository.kt @@ -0,0 +1,10 @@ +package llc.arma.fleet.monitor.data.repository + +import llc.arma.fleet.monitor.data.entity.BeaconTelemetryPacketEntity +import org.springframework.data.jpa.repository.JpaRepository +import java.time.OffsetDateTime + +interface BeaconTelemetryPacketRepository : JpaRepository { + fun findByMachineIdAndReceivedAtBetween(machineId: Long, start: OffsetDateTime, end: OffsetDateTime): List + fun findByBeaconIdAndReceivedAtBetween(beaconId: Long, start: OffsetDateTime, end: OffsetDateTime): List +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/DepartmentRepository.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/DepartmentRepository.kt new file mode 100644 index 0000000..890db46 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/DepartmentRepository.kt @@ -0,0 +1,8 @@ +package llc.arma.fleet.monitor.data.repository + +import llc.arma.fleet.monitor.data.entity.DepartmentEntity +import org.springframework.data.jpa.repository.JpaRepository + +interface DepartmentRepository : JpaRepository { + fun findByName(name: String): DepartmentEntity? +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineCalibrationRuleRepository.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineCalibrationRuleRepository.kt new file mode 100644 index 0000000..a43d9f7 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineCalibrationRuleRepository.kt @@ -0,0 +1,8 @@ +package llc.arma.fleet.monitor.data.repository + +import llc.arma.fleet.monitor.data.entity.MachineCalibrationRuleEntity +import org.springframework.data.jpa.repository.JpaRepository + +interface MachineCalibrationRuleRepository : JpaRepository { + fun findByMachineId(machineId: Long): List +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineRepository.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineRepository.kt new file mode 100644 index 0000000..1bd5432 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineRepository.kt @@ -0,0 +1,15 @@ +package llc.arma.fleet.monitor.data.repository + +import llc.arma.fleet.monitor.data.entity.MachineEntity +import org.springframework.data.domain.Page +import org.springframework.data.domain.Pageable +import org.springframework.data.jpa.repository.JpaRepository + +interface MachineRepository : JpaRepository { + fun existsByLicensePlate(licensePlate: String): Boolean + fun findByNameContainingIgnoreCaseOrLicensePlateContainingIgnoreCase( + name: String, + licensePlate: String, + pageable: Pageable, + ): Page +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineStateDefinitionRepository.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineStateDefinitionRepository.kt new file mode 100644 index 0000000..4a7314d --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineStateDefinitionRepository.kt @@ -0,0 +1,8 @@ +package llc.arma.fleet.monitor.data.repository + +import llc.arma.fleet.monitor.data.entity.MachineStateDefinitionEntity +import org.springframework.data.jpa.repository.JpaRepository + +interface MachineStateDefinitionRepository : JpaRepository { + fun findByName(name: String): MachineStateDefinitionEntity? +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineStateIntervalRepository.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineStateIntervalRepository.kt new file mode 100644 index 0000000..ca4f7cc --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineStateIntervalRepository.kt @@ -0,0 +1,22 @@ +package llc.arma.fleet.monitor.data.repository + +import llc.arma.fleet.monitor.data.entity.MachineStateIntervalEntity +import org.springframework.data.domain.Page +import org.springframework.data.domain.Pageable +import org.springframework.data.jpa.repository.JpaRepository +import java.time.OffsetDateTime + +interface MachineStateIntervalRepository : JpaRepository { + fun findByMachineIdAndStartedAtLessThanEqualAndEndedAtGreaterThanEqual( + machineId: Long, + endDate: OffsetDateTime, + startDate: OffsetDateTime, + ): List + + fun findByMachineIdAndStartedAtBetween( + machineId: Long, + startDate: OffsetDateTime, + endDate: OffsetDateTime, + pageable: Pageable, + ): Page +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineTypeRepository.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineTypeRepository.kt new file mode 100644 index 0000000..c5d6450 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/MachineTypeRepository.kt @@ -0,0 +1,8 @@ +package llc.arma.fleet.monitor.data.repository + +import llc.arma.fleet.monitor.data.entity.MachineTypeEntity +import org.springframework.data.jpa.repository.JpaRepository + +interface MachineTypeRepository : JpaRepository { + fun findByName(name: String): MachineTypeEntity? +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/UserRepository.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/UserRepository.kt new file mode 100644 index 0000000..678bee9 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/data/repository/UserRepository.kt @@ -0,0 +1,58 @@ +package llc.arma.fleet.monitor.data.repository + +import llc.arma.fleet.monitor.data.entity.UserEntity +import llc.arma.fleet.monitor.data.entity.UserRole +import org.springframework.data.domain.Page +import org.springframework.data.domain.Pageable +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.data.jpa.repository.Query +import org.springframework.data.repository.query.Param + +interface UserRepository : JpaRepository { + fun findByLogin(login: String): UserEntity? + fun findByEmail(email: String): UserEntity? + fun findByLoginOrEmail(login: String, email: String): UserEntity? + fun existsByLogin(login: String): Boolean + fun existsByEmail(email: String): Boolean + fun existsByLoginAndIdNot(login: String, id: Long): Boolean + fun existsByEmailAndIdNot(email: String, id: Long): Boolean + + @Query( + """ + select user from UserEntity user + where ( + lower(user.lastName) like lower(concat('%', :query, '%')) + or lower(user.firstName) like lower(concat('%', :query, '%')) + or lower(user.email) like lower(concat('%', :query, '%')) + or lower(user.login) like lower(concat('%', :query, '%')) + ) + """, + ) + fun findByLastNameContainingIgnoreCaseOrFirstNameContainingIgnoreCaseOrEmailContainingIgnoreCaseOrLoginContainingIgnoreCase( + @Param("query") query: String, + pageable: Pageable, + ): Page + + fun findByRoleIn( + roles: List, + pageable: Pageable, + ): Page + + @Query( + """ + select user from UserEntity user + where user.role in :roles + and ( + lower(user.lastName) like lower(concat('%', :query, '%')) + or lower(user.firstName) like lower(concat('%', :query, '%')) + or lower(user.email) like lower(concat('%', :query, '%')) + or lower(user.login) like lower(concat('%', :query, '%')) + ) + """, + ) + fun searchByQueryAndRoleIn( + @Param("query") query: String, + @Param("roles") roles: List, + pageable: Pageable, + ): Page +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/AuthService.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/AuthService.kt new file mode 100644 index 0000000..a6a0e28 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/AuthService.kt @@ -0,0 +1,65 @@ +package llc.arma.fleet.monitor.domain.service + +import llc.arma.fleet.monitor.data.entity.UserEntity +import llc.arma.fleet.monitor.data.repository.UserRepository +import llc.arma.fleet.monitor.presentation.model.AuthPayload +import llc.arma.fleet.monitor.presentation.model.LoginPayload +import llc.arma.fleet.monitor.presentation.model.RefreshSessionPayload +import llc.arma.fleet.monitor.security.AuthTokenStore +import org.springframework.security.crypto.password.PasswordEncoder +import org.springframework.stereotype.Service + +@Service +class AuthService( + private val userRepository: UserRepository, + private val passwordEncoder: PasswordEncoder, + private val tokenStore: AuthTokenStore, +) { + fun login(payload: LoginPayload): AuthPayload { + val user = userRepository.findByLoginOrEmail(payload.loginOrEmail, payload.loginOrEmail) + ?: throw IllegalArgumentException("Пользователь не найден") + + if (!user.active) { + throw IllegalArgumentException("Пользователь заблокирован") + } + + if (!passwordEncoder.matches(payload.password, user.passwordHash)) { + throw IllegalArgumentException("Неверный пароль") + } + + return createAuthPayload(user) + } + + fun refreshSession(payload: RefreshSessionPayload): AuthPayload { + val session = tokenStore.refreshSession(payload.refreshToken) + ?: throw IllegalArgumentException("Refresh token is invalid") + + val user = userRepository.findById(session.userId).orElse(null) + ?: throw IllegalArgumentException("User not found") + + if (!user.active) { + throw IllegalArgumentException("User is blocked") + } + + return AuthPayload( + user = user, + accessToken = session.accessToken, + refreshToken = session.refreshToken, + ) + } + + fun getCurrentUser(userId: Long?): UserEntity? { + if (userId == null) return null + return userRepository.findById(userId).orElse(null) + } + + private fun createAuthPayload(user: UserEntity): AuthPayload { + val session = tokenStore.createSession(user.id!!) + + return AuthPayload( + user = user, + accessToken = session.accessToken, + refreshToken = session.refreshToken, + ) + } +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/FleetReportService.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/FleetReportService.kt new file mode 100644 index 0000000..3f628a3 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/FleetReportService.kt @@ -0,0 +1,87 @@ +package llc.arma.fleet.monitor.domain.service + +import llc.arma.fleet.monitor.data.entity.BeaconStatus +import llc.arma.fleet.monitor.data.entity.MachineStateCode +import llc.arma.fleet.monitor.data.repository.MachineRepository +import llc.arma.fleet.monitor.data.repository.MachineStateIntervalRepository +import llc.arma.fleet.monitor.presentation.model.FleetDailyReport +import llc.arma.fleet.monitor.presentation.model.FleetDailyReportHistoryRow +import llc.arma.fleet.monitor.presentation.model.FleetDailyReportMachineRow +import llc.arma.fleet.monitor.presentation.model.FleetDailyReportSummary +import llc.arma.fleet.monitor.presentation.model.GenerateFleetDailyReportPayload +import llc.arma.fleet.monitor.presentation.model.ReportFile +import org.springframework.stereotype.Service +import java.time.LocalDate +import java.time.OffsetDateTime +import java.time.ZoneOffset + +@Service +class FleetReportService( + private val machineRepository: MachineRepository, + private val intervalRepository: MachineStateIntervalRepository, +) { + fun getFleetDailyReport(date: LocalDate): FleetDailyReport { + val machines = machineRepository.findAll() + val start = date.atStartOfDay().atOffset(ZoneOffset.UTC) + val end = date.plusDays(1).atStartOfDay().atOffset(ZoneOffset.UTC).minusNanos(1) + val rows = machines.map { machine -> + val intervals = intervalRepository.findByMachineIdAndStartedAtLessThanEqualAndEndedAtGreaterThanEqual(machine.id!!, end, start) + val moving = intervals.filter { it.stateCode == MachineStateCode.MOVING }.sumOf { it.durationSeconds } + val engineOn = intervals.filter { it.stateCode == MachineStateCode.ENGINE_ON }.sumOf { it.durationSeconds } + val idle = intervals.filter { it.stateCode == MachineStateCode.IDLE }.sumOf { it.durationSeconds } + val noData = intervals.filter { it.isNoData || it.stateCode == MachineStateCode.NO_DATA }.sumOf { it.durationSeconds } + val known = moving + engineOn + idle + FleetDailyReportMachineRow( + machine = machine, + movingSeconds = moving, + engineOnSeconds = engineOn, + idleSeconds = idle, + noDataSeconds = noData, + stateChangesCount = intervals.size, + utilizationPercent = if (known == 0) 0 else ((moving.toDouble() / known.toDouble()) * 100).toInt(), + ) + } + val history = machines.flatMap { machine -> + intervalRepository.findByMachineIdAndStartedAtLessThanEqualAndEndedAtGreaterThanEqual(machine.id!!, end, start) + .map { interval -> + FleetDailyReportHistoryRow( + machine = machine, + startedAt = interval.startedAt, + endedAt = interval.endedAt, + stateDefinition = interval.stateDefinition, + stateCode = interval.stateCode, + durationSeconds = interval.durationSeconds, + ) + } + } + return FleetDailyReport( + date = date, + generatedAt = OffsetDateTime.now(), + summary = FleetDailyReportSummary( + totalMachines = machines.size, + boundMachines = machines.count { it.beacon?.status == BeaconStatus.BOUND }, + unboundMachines = machines.count { it.beacon == null }, + machinesWithMovement = rows.count { it.movingSeconds > 0 }, + machinesWithoutData = rows.count { it.noDataSeconds > 0 }, + movingSeconds = rows.sumOf { it.movingSeconds }, + engineOnSeconds = rows.sumOf { it.engineOnSeconds }, + idleSeconds = rows.sumOf { it.idleSeconds }, + noDataSeconds = rows.sumOf { it.noDataSeconds }, + stateChangesCount = rows.sumOf { it.stateChangesCount }, + ), + machines = rows, + history = history, + ) + } + + fun createFleetDailyReportDownloadUrl(payload: GenerateFleetDailyReportPayload): ReportFile = + ReportFile( + fileName = "fleet-daily-report-${payload.date}.${payload.format.name.lowercase()}", + mimeType = when (payload.format.name) { + "XLSX" -> "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" + else -> "application/pdf" + }, + downloadUrl = "/api/reports/download/mock/${payload.date}.${payload.format.name.lowercase()}", + expiresAt = OffsetDateTime.now().plusHours(1), + ) +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/MachineAnalyticsService.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/MachineAnalyticsService.kt new file mode 100644 index 0000000..ffc1a5f --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/MachineAnalyticsService.kt @@ -0,0 +1,92 @@ +package llc.arma.fleet.monitor.domain.service + +import llc.arma.fleet.monitor.data.entity.MachineStateCode +import llc.arma.fleet.monitor.data.entity.MachineStateIntervalEntity +import llc.arma.fleet.monitor.data.repository.MachineRepository +import llc.arma.fleet.monitor.data.repository.MachineStateIntervalRepository +import llc.arma.fleet.monitor.presentation.model.MachineDailyUsageStat +import llc.arma.fleet.monitor.presentation.model.MachineStateHistoryPage +import llc.arma.fleet.monitor.presentation.model.MachineUsageSummary +import org.springframework.data.domain.PageRequest +import org.springframework.data.domain.Sort +import org.springframework.stereotype.Service +import java.time.LocalDate +import java.time.OffsetDateTime + +@Service +class MachineAnalyticsService( + private val machineRepository: MachineRepository, + private val stateIntervalRepository: MachineStateIntervalRepository, +) { + fun getMachineStateHistory( + machineId: Long, + startDate: OffsetDateTime, + endDate: OffsetDateTime, + page: Int?, + pageSize: Int?, + ): MachineStateHistoryPage { + val pageable = PageRequest.of( + (page ?: 0).coerceAtLeast(0), + (pageSize ?: 50).coerceIn(1, 200), + Sort.by(Sort.Direction.DESC, "startedAt"), + ) + val result = stateIntervalRepository.findByMachineIdAndStartedAtBetween(machineId, startDate, endDate, pageable) + return MachineStateHistoryPage(result.totalPages, result.totalElements, result.content) + } + + fun getMachineUsageSummary(machineId: Long, startDate: OffsetDateTime, endDate: OffsetDateTime): MachineUsageSummary { + val machine = machineRepository.findById(machineId).orElseThrow { IllegalArgumentException("Машина не найдена") } + val intervals = stateIntervalRepository.findByMachineIdAndStartedAtLessThanEqualAndEndedAtGreaterThanEqual(machineId, endDate, startDate) + val moving = intervals.durationFor(MachineStateCode.MOVING) + val engineOn = intervals.durationFor(MachineStateCode.ENGINE_ON) + val idle = intervals.durationFor(MachineStateCode.IDLE) + val noData = intervals.filter { it.isNoData || it.stateCode == MachineStateCode.NO_DATA }.sumOf { it.durationSeconds } + val known = moving + engineOn + idle + val utilization = if (known == 0) 0 else ((moving.toDouble() / known.toDouble()) * 100).toInt() + + return MachineUsageSummary( + machine = machine, + periodStart = startDate, + periodEnd = endDate, + movingSeconds = moving, + engineOnSeconds = engineOn, + idleSeconds = idle, + noDataSeconds = noData, + stateChangesCount = intervals.size, + utilizationPercent = utilization, + ) + } + + fun getMachineDailyUsageStats(machineId: Long, startDate: OffsetDateTime, endDate: OffsetDateTime): List { + val machine = machineRepository.findById(machineId).orElseThrow { IllegalArgumentException("Машина не найдена") } + val result = mutableListOf() + var date = startDate.toLocalDate() + val lastDate = endDate.toLocalDate() + while (!date.isAfter(lastDate)) { + val dayStart = date.atStartOfDay().atOffset(startDate.offset) + val dayEnd = date.plusDays(1).atStartOfDay().atOffset(startDate.offset).minusNanos(1) + val summary = getMachineUsageSummary(machineId, dayStart, dayEnd) + result.add( + MachineDailyUsageStat( + machine = machine, + date = date.toString(), + movingSeconds = summary.movingSeconds, + engineOnSeconds = summary.engineOnSeconds, + idleSeconds = summary.idleSeconds, + noDataSeconds = summary.noDataSeconds, + utilizationPercent = summary.utilizationPercent, + ), + ) + date = date.plusDays(1) + } + return result + } + + fun getUnrecognizedTelemetryIntervals(machineId: Long, startDate: OffsetDateTime, endDate: OffsetDateTime): List = + stateIntervalRepository + .findByMachineIdAndStartedAtLessThanEqualAndEndedAtGreaterThanEqual(machineId, endDate, startDate) + .filter { it.stateDefinition == null && !it.isNoData } + + private fun List.durationFor(state: MachineStateCode): Int = + filter { it.stateCode == state }.sumOf { it.durationSeconds } +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/MachineService.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/MachineService.kt new file mode 100644 index 0000000..051615e --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/MachineService.kt @@ -0,0 +1,134 @@ +package llc.arma.fleet.monitor.domain.service + +import llc.arma.fleet.monitor.data.entity.BeaconStatus +import llc.arma.fleet.monitor.data.entity.MachineEntity +import llc.arma.fleet.monitor.data.entity.MachineSortField +import llc.arma.fleet.monitor.data.entity.MachineStateCode +import llc.arma.fleet.monitor.data.entity.SortDirection +import llc.arma.fleet.monitor.data.repository.BeaconRepository +import llc.arma.fleet.monitor.data.repository.DepartmentRepository +import llc.arma.fleet.monitor.data.repository.MachineRepository +import llc.arma.fleet.monitor.data.repository.MachineTypeRepository +import llc.arma.fleet.monitor.presentation.model.CreateMachinePayload +import llc.arma.fleet.monitor.presentation.model.MachinesPage +import llc.arma.fleet.monitor.presentation.model.UpdateMachinePayload +import org.springframework.data.domain.PageRequest +import org.springframework.data.domain.Sort +import org.springframework.stereotype.Service +import java.time.OffsetDateTime + +@Service +class MachineService( + private val machineRepository: MachineRepository, + private val machineTypeRepository: MachineTypeRepository, + private val departmentRepository: DepartmentRepository, + private val beaconRepository: BeaconRepository, +) { + fun getMachines( + page: Int, + pageSize: Int?, + query: String?, + sortDirection: SortDirection, + sortField: MachineSortField, + ): MachinesPage { + val pageable = PageRequest.of( + page.coerceAtLeast(0), + (pageSize ?: 20).coerceIn(1, 100), + Sort.by( + if (sortDirection == SortDirection.ASC) Sort.Direction.ASC else Sort.Direction.DESC, + when (sortField) { + MachineSortField.ID -> "id" + MachineSortField.NAME -> "name" + MachineSortField.DATE -> "createdAt" + }, + ), + ) + + val result = if (query.isNullOrBlank()) { + machineRepository.findAll(pageable) + } else { + machineRepository.findByNameContainingIgnoreCaseOrLicensePlateContainingIgnoreCase(query, query, pageable) + } + + return MachinesPage( + totalPages = result.totalPages, + totalElements = result.totalElements, + page = result.content, + ) + } + + fun getMachine(id: Long): MachineEntity? = machineRepository.findById(id).orElse(null) + + fun createMachine(payload: CreateMachinePayload): MachineEntity { + require(!machineRepository.existsByLicensePlate(payload.licensePlate)) { "Госномер уже используется" } + + val type = machineTypeRepository.findById(payload.typeId) + .orElseThrow { IllegalArgumentException("Тип машины не найден") } + val department = departmentRepository.findById(payload.departmentId) + .orElseThrow { IllegalArgumentException("Подразделение не найдено") } + + return machineRepository.save( + MachineEntity( + name = payload.name, + licensePlate = payload.licensePlate, + type = type, + department = department, + description = payload.description, + lastKnownState = MachineStateCode.NO_DATA, + ), + ) + } + + fun updateMachine(id: Long, payload: UpdateMachinePayload): MachineEntity { + val machine = machineRepository.findById(id).orElseThrow { IllegalArgumentException("Машина не найдена") } + + payload.name?.let { machine.name = it } + payload.licensePlate?.let { machine.licensePlate = it } + payload.typeId?.let { + machine.type = machineTypeRepository.findById(it).orElseThrow { IllegalArgumentException("Тип машины не найден") } + } + payload.departmentId?.let { + machine.department = departmentRepository.findById(it).orElseThrow { IllegalArgumentException("Подразделение не найдено") } + } + if (payload.description != null) machine.description = payload.description + + return machineRepository.save(machine) + } + + fun deleteMachine(id: Long): Boolean { + if (!machineRepository.existsById(id)) return false + machineRepository.deleteById(id) + return true + } + + fun bindBeaconToMachine(machineId: Long, beaconId: Long): MachineEntity { + val machine = machineRepository.findById(machineId).orElseThrow { IllegalArgumentException("Машина не найдена") } + val beacon = beaconRepository.findById(beaconId).orElseThrow { IllegalArgumentException("Маяк не найден") } + + require(beacon.status == BeaconStatus.FREE || machine.beacon?.id == beacon.id) { "Маяк уже привязан" } + + machine.beacon?.let { previousBeacon -> + previousBeacon.status = BeaconStatus.FREE + beaconRepository.save(previousBeacon) + } + + beacon.status = BeaconStatus.BOUND + beacon.lastSeenAt = beacon.lastSeenAt ?: OffsetDateTime.now() + machine.beacon = beacon + machine.lastDataReceivedAt = beacon.lastSeenAt + + beaconRepository.save(beacon) + return machineRepository.save(machine) + } + + fun unbindBeaconFromMachine(machineId: Long): MachineEntity { + val machine = machineRepository.findById(machineId).orElseThrow { IllegalArgumentException("Машина не найдена") } + val beacon = machine.beacon ?: return machine + + beacon.status = BeaconStatus.FREE + machine.beacon = null + + beaconRepository.save(beacon) + return machineRepository.save(machine) + } +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/MachineStateService.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/MachineStateService.kt new file mode 100644 index 0000000..de70b1e --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/MachineStateService.kt @@ -0,0 +1,95 @@ +package llc.arma.fleet.monitor.domain.service + +import llc.arma.fleet.monitor.data.entity.MachineCalibrationRuleEntity +import llc.arma.fleet.monitor.data.entity.MachineStateDefinitionEntity +import llc.arma.fleet.monitor.data.repository.MachineCalibrationRuleRepository +import llc.arma.fleet.monitor.data.repository.MachineRepository +import llc.arma.fleet.monitor.data.repository.MachineStateDefinitionRepository +import llc.arma.fleet.monitor.presentation.model.CreateMachineCalibrationRulePayload +import llc.arma.fleet.monitor.presentation.model.CreateMachineStateDefinitionPayload +import llc.arma.fleet.monitor.presentation.model.UpdateMachineCalibrationRulePayload +import llc.arma.fleet.monitor.presentation.model.UpdateMachineStateDefinitionPayload +import org.springframework.stereotype.Service + +@Service +class MachineStateService( + private val stateDefinitionRepository: MachineStateDefinitionRepository, + private val calibrationRuleRepository: MachineCalibrationRuleRepository, + private val machineRepository: MachineRepository, +) { + fun getMachineStateDefinitions(): List = stateDefinitionRepository.findAll() + + fun createMachineStateDefinition(payload: CreateMachineStateDefinitionPayload): MachineStateDefinitionEntity = + stateDefinitionRepository.save( + MachineStateDefinitionEntity( + name = payload.name, + icon = payload.icon, + color = payload.color, + description = payload.description, + isSystem = false, + ), + ) + + fun updateMachineStateDefinition(id: Long, payload: UpdateMachineStateDefinitionPayload): MachineStateDefinitionEntity { + val definition = stateDefinitionRepository.findById(id).orElseThrow { IllegalArgumentException("Состояние не найдено") } + payload.name?.let { definition.name = it } + payload.icon?.let { definition.icon = it } + payload.color?.let { definition.color = it } + if (payload.description != null) definition.description = payload.description + return stateDefinitionRepository.save(definition) + } + + fun deleteMachineStateDefinition(id: Long): Boolean { + val definition = stateDefinitionRepository.findById(id).orElse(null) ?: return false + require(!definition.isSystem) { "Системное состояние нельзя удалить" } + stateDefinitionRepository.delete(definition) + return true + } + + fun getMachineCalibrationRules(machineId: Long): List = + calibrationRuleRepository.findByMachineId(machineId) + + fun createMachineCalibrationRule(payload: CreateMachineCalibrationRulePayload): MachineCalibrationRuleEntity { + validateRule(payload.machineId, payload.vibrationMin, payload.vibrationMax, null) + val machine = machineRepository.findById(payload.machineId).orElseThrow { IllegalArgumentException("Машина не найдена") } + val definition = stateDefinitionRepository.findById(payload.stateDefinitionId).orElseThrow { IllegalArgumentException("Состояние не найдено") } + + return calibrationRuleRepository.save( + MachineCalibrationRuleEntity( + machine = machine, + stateDefinition = definition, + vibrationMin = payload.vibrationMin, + vibrationMax = payload.vibrationMax, + ), + ) + } + + fun updateMachineCalibrationRule(id: Long, payload: UpdateMachineCalibrationRulePayload): MachineCalibrationRuleEntity { + val rule = calibrationRuleRepository.findById(id).orElseThrow { IllegalArgumentException("Правило не найдено") } + val nextMin = payload.vibrationMin ?: rule.vibrationMin + val nextMax = payload.vibrationMax ?: rule.vibrationMax + validateRule(rule.machine.id!!, nextMin, nextMax, id) + + payload.stateDefinitionId?.let { + rule.stateDefinition = stateDefinitionRepository.findById(it).orElseThrow { IllegalArgumentException("Состояние не найдено") } + } + payload.vibrationMin?.let { rule.vibrationMin = it } + payload.vibrationMax?.let { rule.vibrationMax = it } + return calibrationRuleRepository.save(rule) + } + + fun deleteMachineCalibrationRule(id: Long): Boolean { + if (!calibrationRuleRepository.existsById(id)) return false + calibrationRuleRepository.deleteById(id) + return true + } + + private fun validateRule(machineId: Long, min: Double, max: Double, currentRuleId: Long?) { + require(min <= max) { "Минимальное значение не может быть больше максимального" } + val rules = calibrationRuleRepository.findByMachineId(machineId) + val hasIntersection = rules.any { rule -> + rule.id != currentRuleId && min <= rule.vibrationMax && max >= rule.vibrationMin + } + require(!hasIntersection) { "Диапазон пересекается с существующим правилом" } + } +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/ReferenceService.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/ReferenceService.kt new file mode 100644 index 0000000..3c5ec70 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/ReferenceService.kt @@ -0,0 +1,46 @@ +package llc.arma.fleet.monitor.domain.service + +import llc.arma.fleet.monitor.data.entity.BeaconEntity +import llc.arma.fleet.monitor.data.entity.BeaconStatus +import llc.arma.fleet.monitor.data.entity.DepartmentEntity +import llc.arma.fleet.monitor.data.entity.MachineTypeEntity +import llc.arma.fleet.monitor.data.repository.BeaconRepository +import llc.arma.fleet.monitor.data.repository.DepartmentRepository +import llc.arma.fleet.monitor.data.repository.MachineTypeRepository +import org.springframework.stereotype.Service + +@Service +class ReferenceService( + private val machineTypeRepository: MachineTypeRepository, + private val departmentRepository: DepartmentRepository, + private val beaconRepository: BeaconRepository, +) { + fun getMachineTypes(): List = machineTypeRepository.findAll() + fun getDepartments(): List = departmentRepository.findAll() + fun getBeacons(): List = beaconRepository.findAll() + fun getFreeBeacons(): List = beaconRepository.findByStatus(BeaconStatus.FREE) + + fun createMachineType(name: String): MachineTypeEntity = machineTypeRepository.save(MachineTypeEntity(name = name)) + fun updateMachineType(id: Long, name: String): MachineTypeEntity { + val type = machineTypeRepository.findById(id).orElseThrow { IllegalArgumentException("Тип машины не найден") } + type.name = name + return machineTypeRepository.save(type) + } + fun deleteMachineType(id: Long): Boolean { + if (!machineTypeRepository.existsById(id)) return false + machineTypeRepository.deleteById(id) + return true + } + + fun createDepartment(name: String): DepartmentEntity = departmentRepository.save(DepartmentEntity(name = name)) + fun updateDepartment(id: Long, name: String): DepartmentEntity { + val department = departmentRepository.findById(id).orElseThrow { IllegalArgumentException("Подразделение не найдено") } + department.name = name + return departmentRepository.save(department) + } + fun deleteDepartment(id: Long): Boolean { + if (!departmentRepository.existsById(id)) return false + departmentRepository.deleteById(id) + return true + } +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/TelemetryService.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/TelemetryService.kt new file mode 100644 index 0000000..a352200 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/TelemetryService.kt @@ -0,0 +1,51 @@ +package llc.arma.fleet.monitor.domain.service + +import llc.arma.fleet.monitor.data.entity.BeaconTelemetryPacketEntity +import llc.arma.fleet.monitor.data.repository.BeaconRepository +import llc.arma.fleet.monitor.data.repository.BeaconTelemetryPacketRepository +import llc.arma.fleet.monitor.data.repository.MachineRepository +import llc.arma.fleet.monitor.presentation.model.BeaconTelemetryPayload +import org.springframework.stereotype.Service +import java.time.Instant +import java.time.OffsetDateTime +import java.time.ZoneOffset + +@Service +class TelemetryService( + private val beaconRepository: BeaconRepository, + private val machineRepository: MachineRepository, + private val packetRepository: BeaconTelemetryPacketRepository, +) { + fun registerBeaconTelemetryPacket(payload: BeaconTelemetryPayload): Boolean { + val beacon = beaconRepository.findByMacAddress(payload.mac) ?: return false + val machine = machineRepository.findAll().firstOrNull { it.beacon?.id == beacon.id } + val receivedAt = OffsetDateTime.ofInstant(Instant.ofEpochMilli(payload.timeMillis), ZoneOffset.UTC) + + beacon.lastSeenAt = receivedAt + machine?.lastDataReceivedAt = receivedAt + beaconRepository.save(beacon) + if (machine != null) machineRepository.save(machine) + + packetRepository.save( + BeaconTelemetryPacketEntity( + beacon = beacon, + machine = machine, + mac = payload.mac, + vibration = payload.vibration, + duration = payload.duration, + timeMillis = payload.timeMillis, + receivedAt = receivedAt, + ), + ) + + return true + } + + fun getBeaconTelemetry(beaconId: Long?, machineId: Long?, startDate: OffsetDateTime, endDate: OffsetDateTime): List { + return when { + machineId != null -> packetRepository.findByMachineIdAndReceivedAtBetween(machineId, startDate, endDate) + beaconId != null -> packetRepository.findByBeaconIdAndReceivedAtBetween(beaconId, startDate, endDate) + else -> packetRepository.findAll().filter { it.receivedAt in startDate..endDate } + } + } +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/UserService.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/UserService.kt new file mode 100644 index 0000000..01f631a --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/domain/service/UserService.kt @@ -0,0 +1,121 @@ +package llc.arma.fleet.monitor.domain.service + +import llc.arma.fleet.monitor.data.entity.SortDirection +import llc.arma.fleet.monitor.data.entity.UserEntity +import llc.arma.fleet.monitor.data.entity.UserRole +import llc.arma.fleet.monitor.data.entity.UserSortField +import llc.arma.fleet.monitor.data.repository.UserRepository +import llc.arma.fleet.monitor.presentation.model.CreateUserPayload +import llc.arma.fleet.monitor.presentation.model.UpdateUserPayload +import llc.arma.fleet.monitor.presentation.model.UsersPage +import org.springframework.data.domain.PageRequest +import org.springframework.data.domain.Sort +import org.springframework.security.crypto.password.PasswordEncoder +import org.springframework.stereotype.Service + +@Service +class UserService( + private val userRepository: UserRepository, + private val passwordEncoder: PasswordEncoder, +) { + fun getUsers( + page: Int, + pageSize: Int?, + query: String?, + roles: List?, + sortDirection: SortDirection, + sortField: UserSortField, + ): UsersPage { + val pageable = PageRequest.of( + page.coerceAtLeast(0), + (pageSize ?: 20).coerceIn(1, 100), + Sort.by( + if (sortDirection == SortDirection.ASC) Sort.Direction.ASC else Sort.Direction.DESC, + when (sortField) { + UserSortField.ID -> "id" + UserSortField.NAME -> "lastName" + UserSortField.DATE -> "createdAt" + }, + ), + ) + + val allowedRoles = roles?.takeIf { it.isNotEmpty() } + val normalizedQuery = query?.trim()?.takeIf { it.isNotBlank() } + + val result = when { + normalizedQuery != null && allowedRoles != null -> { + userRepository.searchByQueryAndRoleIn(normalizedQuery, allowedRoles, pageable) + } + + normalizedQuery != null -> { + userRepository.findByLastNameContainingIgnoreCaseOrFirstNameContainingIgnoreCaseOrEmailContainingIgnoreCaseOrLoginContainingIgnoreCase( + normalizedQuery, + pageable, + ) + } + + allowedRoles != null -> { + userRepository.findByRoleIn(allowedRoles, pageable) + } + + else -> { + userRepository.findAll(pageable) + } + } + + return UsersPage( + totalPages = result.totalPages, + totalElements = result.totalElements, + page = result.content, + ) + } + + fun getUser(id: Long): UserEntity? = userRepository.findById(id).orElse(null) + + fun createUser(payload: CreateUserPayload): UserEntity { + require(!userRepository.existsByEmail(payload.email)) { "Email уже используется" } + require(!userRepository.existsByLogin(payload.login)) { "Логин уже используется" } + + return userRepository.save( + UserEntity( + lastName = payload.lastName, + firstName = payload.firstName, + middleName = payload.middleName, + email = payload.email, + login = payload.login, + passwordHash = encodePassword(payload.password), + role = payload.role, + ), + ) + } + + private fun encodePassword(password: String): String = + passwordEncoder.encode(password) ?: error("Password encoder returned null") + + fun updateUser(id: Long, payload: UpdateUserPayload): UserEntity { + val user = userRepository.findById(id).orElseThrow { IllegalArgumentException("Пользователь не найден") } + + payload.lastName?.let { user.lastName = it } + payload.firstName?.let { user.firstName = it } + if (payload.middleName != null) user.middleName = payload.middleName + payload.email?.let { + require(!userRepository.existsByEmailAndIdNot(it, id)) { "Email уже используется" } + user.email = it + } + payload.login?.let { + require(!userRepository.existsByLoginAndIdNot(it, id)) { "Логин уже используется" } + user.login = it + } + payload.password?.let { user.passwordHash = encodePassword(it) } + payload.role?.let { user.role = it } + payload.active?.let { user.active = it } + + return userRepository.save(user) + } + + fun deleteUser(id: Long): Boolean { + if (!userRepository.existsById(id)) return false + userRepository.deleteById(id) + return true + } +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/AuthGraphQlController.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/AuthGraphQlController.kt new file mode 100644 index 0000000..5b70856 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/AuthGraphQlController.kt @@ -0,0 +1,42 @@ +package llc.arma.fleet.monitor.presentation.graphql + +import llc.arma.fleet.monitor.data.entity.UserEntity +import llc.arma.fleet.monitor.domain.service.AuthService +import llc.arma.fleet.monitor.presentation.model.AuthPayload +import llc.arma.fleet.monitor.presentation.model.LoginPayload +import llc.arma.fleet.monitor.presentation.model.RefreshSessionPayload +import llc.arma.fleet.monitor.security.AuthTokenStore +import jakarta.servlet.http.HttpServletRequest +import org.springframework.graphql.data.method.annotation.Argument +import org.springframework.graphql.data.method.annotation.MutationMapping +import org.springframework.graphql.data.method.annotation.QueryMapping +import org.springframework.stereotype.Controller +import java.security.Principal + +@Controller +class AuthGraphQlController( + private val authService: AuthService, + private val tokenStore: AuthTokenStore, +) { + @MutationMapping + fun login(@Argument payload: LoginPayload): AuthPayload = authService.login(payload) + + @MutationMapping + fun refreshSession(@Argument payload: RefreshSessionPayload): AuthPayload = authService.refreshSession(payload) + + @MutationMapping + fun logout(request: HttpServletRequest): Boolean { + tokenStore.revoke(extractToken(request)) + + return true + } + + @QueryMapping + fun currentUser(principal: Principal?): UserEntity? = authService.getCurrentUser(principal?.name?.toLongOrNull()) + + private fun extractToken(request: HttpServletRequest): String? { + return request.getHeader("Authorization") + ?.removePrefix("Bearer ") + ?: request.cookies?.firstOrNull { it.name == "Access-token" }?.value + } +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/FleetReportGraphQlController.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/FleetReportGraphQlController.kt new file mode 100644 index 0000000..0df93cd --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/FleetReportGraphQlController.kt @@ -0,0 +1,22 @@ +package llc.arma.fleet.monitor.presentation.graphql + +import llc.arma.fleet.monitor.domain.service.FleetReportService +import llc.arma.fleet.monitor.presentation.model.FleetDailyReport +import llc.arma.fleet.monitor.presentation.model.GenerateFleetDailyReportPayload +import llc.arma.fleet.monitor.presentation.model.ReportFile +import org.springframework.graphql.data.method.annotation.Argument +import org.springframework.graphql.data.method.annotation.QueryMapping +import org.springframework.stereotype.Controller +import java.time.LocalDate + +@Controller +class FleetReportGraphQlController( + private val fleetReportService: FleetReportService, +) { + @QueryMapping + fun getFleetDailyReport(@Argument date: LocalDate): FleetDailyReport = fleetReportService.getFleetDailyReport(date) + + @QueryMapping + fun createFleetDailyReportDownloadUrl(@Argument payload: GenerateFleetDailyReportPayload): ReportFile = + fleetReportService.createFleetDailyReportDownloadUrl(payload) +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/MachineGraphQlController.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/MachineGraphQlController.kt new file mode 100644 index 0000000..0e726af --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/MachineGraphQlController.kt @@ -0,0 +1,45 @@ +package llc.arma.fleet.monitor.presentation.graphql + +import llc.arma.fleet.monitor.data.entity.MachineEntity +import llc.arma.fleet.monitor.data.entity.MachineSortField +import llc.arma.fleet.monitor.data.entity.SortDirection +import llc.arma.fleet.monitor.domain.service.MachineService +import llc.arma.fleet.monitor.presentation.model.CreateMachinePayload +import llc.arma.fleet.monitor.presentation.model.MachinesPage +import llc.arma.fleet.monitor.presentation.model.UpdateMachinePayload +import org.springframework.graphql.data.method.annotation.Argument +import org.springframework.graphql.data.method.annotation.MutationMapping +import org.springframework.graphql.data.method.annotation.QueryMapping +import org.springframework.stereotype.Controller + +@Controller +class MachineGraphQlController( + private val machineService: MachineService, +) { + @QueryMapping + fun getMachines( + @Argument page: Int, + @Argument pageSize: Int?, + @Argument query: String?, + @Argument sortDirection: SortDirection, + @Argument sortField: MachineSortField, + ): MachinesPage = machineService.getMachines(page, pageSize, query, sortDirection, sortField) + + @QueryMapping + fun getMachine(@Argument id: Long): MachineEntity? = machineService.getMachine(id) + + @MutationMapping + fun createMachine(@Argument payload: CreateMachinePayload): MachineEntity = machineService.createMachine(payload) + + @MutationMapping + fun updateMachine(@Argument id: Long, @Argument payload: UpdateMachinePayload): MachineEntity = machineService.updateMachine(id, payload) + + @MutationMapping + fun deleteMachine(@Argument id: Long): Boolean = machineService.deleteMachine(id) + + @MutationMapping + fun bindBeaconToMachine(@Argument machineId: Long, @Argument beaconId: Long): MachineEntity = machineService.bindBeaconToMachine(machineId, beaconId) + + @MutationMapping + fun unbindBeaconFromMachine(@Argument machineId: Long): MachineEntity = machineService.unbindBeaconFromMachine(machineId) +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/MachineStateGraphQlController.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/MachineStateGraphQlController.kt new file mode 100644 index 0000000..01df468 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/MachineStateGraphQlController.kt @@ -0,0 +1,86 @@ +package llc.arma.fleet.monitor.presentation.graphql + +import llc.arma.fleet.monitor.data.entity.MachineCalibrationRuleEntity +import llc.arma.fleet.monitor.data.entity.MachineStateDefinitionEntity +import llc.arma.fleet.monitor.domain.service.MachineAnalyticsService +import llc.arma.fleet.monitor.domain.service.MachineStateService +import llc.arma.fleet.monitor.presentation.model.CreateMachineCalibrationRulePayload +import llc.arma.fleet.monitor.presentation.model.CreateMachineStateDefinitionPayload +import llc.arma.fleet.monitor.presentation.model.MachineStateHistoryPage +import llc.arma.fleet.monitor.presentation.model.MachineUsageSummary +import llc.arma.fleet.monitor.presentation.model.UpdateMachineCalibrationRulePayload +import llc.arma.fleet.monitor.presentation.model.UpdateMachineStateDefinitionPayload +import org.springframework.graphql.data.method.annotation.Argument +import org.springframework.graphql.data.method.annotation.MutationMapping +import org.springframework.graphql.data.method.annotation.QueryMapping +import org.springframework.stereotype.Controller +import java.time.OffsetDateTime + +@Controller +class MachineStateGraphQlController( + private val machineStateService: MachineStateService, + private val machineAnalyticsService: MachineAnalyticsService, +) { + @QueryMapping + fun getMachineStateDefinitions(): List = machineStateService.getMachineStateDefinitions() + + @QueryMapping + fun getMachineCalibrationRules(@Argument machineId: Long): List = + machineStateService.getMachineCalibrationRules(machineId) + + @QueryMapping + fun getMachineStateHistory( + @Argument machineId: Long, + @Argument startDate: OffsetDateTime, + @Argument endDate: OffsetDateTime, + @Argument page: Int?, + @Argument pageSize: Int?, + ): MachineStateHistoryPage = machineAnalyticsService.getMachineStateHistory(machineId, startDate, endDate, page, pageSize) + + @QueryMapping + fun getMachineUsageSummary( + @Argument machineId: Long, + @Argument startDate: OffsetDateTime, + @Argument endDate: OffsetDateTime, + ): MachineUsageSummary = machineAnalyticsService.getMachineUsageSummary(machineId, startDate, endDate) + + @QueryMapping + fun getUnrecognizedTelemetryIntervals( + @Argument machineId: Long, + @Argument startDate: OffsetDateTime, + @Argument endDate: OffsetDateTime, + ) = machineAnalyticsService.getUnrecognizedTelemetryIntervals(machineId, startDate, endDate) + + @QueryMapping + fun getMachineDailyUsageStats( + @Argument machineId: Long, + @Argument startDate: OffsetDateTime, + @Argument endDate: OffsetDateTime, + ) = machineAnalyticsService.getMachineDailyUsageStats(machineId, startDate, endDate) + + @MutationMapping + fun createMachineStateDefinition(@Argument payload: CreateMachineStateDefinitionPayload): MachineStateDefinitionEntity = + machineStateService.createMachineStateDefinition(payload) + + @MutationMapping + fun updateMachineStateDefinition(@Argument id: Long, @Argument payload: UpdateMachineStateDefinitionPayload): MachineStateDefinitionEntity = + machineStateService.updateMachineStateDefinition(id, payload) + + @MutationMapping + fun deleteMachineStateDefinition(@Argument id: Long): Boolean = machineStateService.deleteMachineStateDefinition(id) + + @MutationMapping + fun createMachineCalibrationRule(@Argument payload: CreateMachineCalibrationRulePayload): MachineCalibrationRuleEntity = + machineStateService.createMachineCalibrationRule(payload) + + @MutationMapping + fun updateMachineCalibrationRule(@Argument id: Long, @Argument payload: UpdateMachineCalibrationRulePayload): MachineCalibrationRuleEntity = + machineStateService.updateMachineCalibrationRule(id, payload) + + @MutationMapping + fun deleteMachineCalibrationRule(@Argument id: Long): Boolean = machineStateService.deleteMachineCalibrationRule(id) + + @MutationMapping + fun recognizeMachineStates(@Argument machineId: Long, @Argument startDate: OffsetDateTime, @Argument endDate: OffsetDateTime) = + machineAnalyticsService.getUnrecognizedTelemetryIntervals(machineId, startDate, endDate) +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/ReferenceGraphQlController.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/ReferenceGraphQlController.kt new file mode 100644 index 0000000..4d347b3 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/ReferenceGraphQlController.kt @@ -0,0 +1,45 @@ +package llc.arma.fleet.monitor.presentation.graphql + +import llc.arma.fleet.monitor.data.entity.BeaconEntity +import llc.arma.fleet.monitor.data.entity.DepartmentEntity +import llc.arma.fleet.monitor.data.entity.MachineTypeEntity +import llc.arma.fleet.monitor.domain.service.ReferenceService +import org.springframework.graphql.data.method.annotation.Argument +import org.springframework.graphql.data.method.annotation.MutationMapping +import org.springframework.graphql.data.method.annotation.QueryMapping +import org.springframework.stereotype.Controller + +@Controller +class ReferenceGraphQlController( + private val referenceService: ReferenceService, +) { + @QueryMapping + fun getMachineTypes(): List = referenceService.getMachineTypes() + + @QueryMapping + fun getDepartments(): List = referenceService.getDepartments() + + @QueryMapping + fun getBeacons(): List = referenceService.getBeacons() + + @QueryMapping + fun getFreeBeacons(): List = referenceService.getFreeBeacons() + + @MutationMapping + fun createMachineType(@Argument name: String): MachineTypeEntity = referenceService.createMachineType(name) + + @MutationMapping + fun updateMachineType(@Argument id: Long, @Argument name: String): MachineTypeEntity = referenceService.updateMachineType(id, name) + + @MutationMapping + fun deleteMachineType(@Argument id: Long): Boolean = referenceService.deleteMachineType(id) + + @MutationMapping + fun createDepartment(@Argument name: String): DepartmentEntity = referenceService.createDepartment(name) + + @MutationMapping + fun updateDepartment(@Argument id: Long, @Argument name: String): DepartmentEntity = referenceService.updateDepartment(id, name) + + @MutationMapping + fun deleteDepartment(@Argument id: Long): Boolean = referenceService.deleteDepartment(id) +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/TelemetryGraphQlController.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/TelemetryGraphQlController.kt new file mode 100644 index 0000000..08b23c2 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/TelemetryGraphQlController.kt @@ -0,0 +1,27 @@ +package llc.arma.fleet.monitor.presentation.graphql + +import llc.arma.fleet.monitor.data.entity.BeaconTelemetryPacketEntity +import llc.arma.fleet.monitor.domain.service.TelemetryService +import llc.arma.fleet.monitor.presentation.model.BeaconTelemetryPayload +import org.springframework.graphql.data.method.annotation.Argument +import org.springframework.graphql.data.method.annotation.MutationMapping +import org.springframework.graphql.data.method.annotation.QueryMapping +import org.springframework.stereotype.Controller +import java.time.OffsetDateTime + +@Controller +class TelemetryGraphQlController( + private val telemetryService: TelemetryService, +) { + @QueryMapping + fun getBeaconTelemetry( + @Argument beaconId: Long?, + @Argument machineId: Long?, + @Argument startDate: OffsetDateTime, + @Argument endDate: OffsetDateTime, + ): List = telemetryService.getBeaconTelemetry(beaconId, machineId, startDate, endDate) + + @MutationMapping + fun registerBeaconTelemetryPacket(@Argument payload: BeaconTelemetryPayload): Boolean = + telemetryService.registerBeaconTelemetryPacket(payload) +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/UserGraphQlController.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/UserGraphQlController.kt new file mode 100644 index 0000000..cbaab22 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/graphql/UserGraphQlController.kt @@ -0,0 +1,41 @@ +package llc.arma.fleet.monitor.presentation.graphql + +import llc.arma.fleet.monitor.data.entity.SortDirection +import llc.arma.fleet.monitor.data.entity.UserEntity +import llc.arma.fleet.monitor.data.entity.UserRole +import llc.arma.fleet.monitor.data.entity.UserSortField +import llc.arma.fleet.monitor.domain.service.UserService +import llc.arma.fleet.monitor.presentation.model.CreateUserPayload +import llc.arma.fleet.monitor.presentation.model.UpdateUserPayload +import llc.arma.fleet.monitor.presentation.model.UsersPage +import org.springframework.graphql.data.method.annotation.Argument +import org.springframework.graphql.data.method.annotation.MutationMapping +import org.springframework.graphql.data.method.annotation.QueryMapping +import org.springframework.stereotype.Controller + +@Controller +class UserGraphQlController( + private val userService: UserService, +) { + @QueryMapping + fun getUsers( + @Argument page: Int, + @Argument pageSize: Int?, + @Argument query: String?, + @Argument roles: List?, + @Argument sortDirection: SortDirection, + @Argument sortField: UserSortField, + ): UsersPage = userService.getUsers(page, pageSize, query, roles, sortDirection, sortField) + + @QueryMapping + fun getUser(@Argument id: Long): UserEntity? = userService.getUser(id) + + @MutationMapping + fun createUser(@Argument payload: CreateUserPayload): UserEntity = userService.createUser(payload) + + @MutationMapping + fun updateUser(@Argument id: Long, @Argument payload: UpdateUserPayload): UserEntity = userService.updateUser(id, payload) + + @MutationMapping + fun deleteUser(@Argument id: Long): Boolean = userService.deleteUser(id) +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/model/AuthModels.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/model/AuthModels.kt new file mode 100644 index 0000000..1bffea9 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/model/AuthModels.kt @@ -0,0 +1,41 @@ +package llc.arma.fleet.monitor.presentation.model + +import llc.arma.fleet.monitor.data.entity.UserEntity +import llc.arma.fleet.monitor.data.entity.UserRole + +data class LoginPayload( + val loginOrEmail: String, + val password: String, +) + +data class RefreshSessionPayload( + val refreshToken: String, +) + +data class AuthPayload( + val user: UserEntity, + val accessToken: String, + val refreshToken: String, + val token: String = accessToken, +) + +data class CreateUserPayload( + val lastName: String, + val firstName: String, + val middleName: String?, + val email: String, + val login: String, + val password: String, + val role: UserRole, +) + +data class UpdateUserPayload( + val lastName: String?, + val firstName: String?, + val middleName: String?, + val email: String?, + val login: String?, + val password: String?, + val role: UserRole?, + val active: Boolean?, +) diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/model/MachineModels.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/model/MachineModels.kt new file mode 100644 index 0000000..3d9cfa6 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/model/MachineModels.kt @@ -0,0 +1,96 @@ +package llc.arma.fleet.monitor.presentation.model + +import llc.arma.fleet.monitor.data.entity.MachineEntity +import llc.arma.fleet.monitor.data.entity.UserEntity +import llc.arma.fleet.monitor.data.entity.MachineStateIntervalEntity +import java.time.OffsetDateTime + +data class CreateMachinePayload( + val name: String, + val licensePlate: String, + val typeId: Long, + val departmentId: Long, + val description: String?, +) + +data class UpdateMachinePayload( + val name: String?, + val licensePlate: String?, + val typeId: Long?, + val departmentId: Long?, + val description: String?, +) + +data class BeaconTelemetryPayload( + val mac: String, + val vibration: Double, + val duration: Int, + val timeMillis: Long, +) + +data class CreateMachineStateDefinitionPayload( + val name: String, + val icon: String, + val color: String, + val description: String?, +) + +data class UpdateMachineStateDefinitionPayload( + val name: String?, + val icon: String?, + val color: String?, + val description: String?, +) + +data class CreateMachineCalibrationRulePayload( + val machineId: Long, + val stateDefinitionId: Long, + val vibrationMin: Double, + val vibrationMax: Double, +) + +data class UpdateMachineCalibrationRulePayload( + val stateDefinitionId: Long?, + val vibrationMin: Double?, + val vibrationMax: Double?, +) + +data class UsersPage( + val totalPages: Int, + val totalElements: Long, + val page: List, +) + +data class MachinesPage( + val totalPages: Int, + val totalElements: Long, + val page: List, +) + +data class MachineStateHistoryPage( + val totalPages: Int, + val totalElements: Long, + val page: List, +) + +data class MachineUsageSummary( + val machine: MachineEntity, + val periodStart: OffsetDateTime, + val periodEnd: OffsetDateTime, + val movingSeconds: Int, + val engineOnSeconds: Int, + val idleSeconds: Int, + val noDataSeconds: Int, + val stateChangesCount: Int, + val utilizationPercent: Int, +) + +data class MachineDailyUsageStat( + val machine: MachineEntity, + val date: String, + val movingSeconds: Int, + val engineOnSeconds: Int, + val idleSeconds: Int, + val noDataSeconds: Int, + val utilizationPercent: Int, +) diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/model/ReportModels.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/model/ReportModels.kt new file mode 100644 index 0000000..be71822 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/presentation/model/ReportModels.kt @@ -0,0 +1,60 @@ +package llc.arma.fleet.monitor.presentation.model + +import llc.arma.fleet.monitor.data.entity.MachineEntity +import llc.arma.fleet.monitor.data.entity.MachineStateCode +import llc.arma.fleet.monitor.data.entity.MachineStateDefinitionEntity +import llc.arma.fleet.monitor.data.entity.ReportFormat +import java.time.LocalDate +import java.time.OffsetDateTime + +data class GenerateFleetDailyReportPayload( + val date: LocalDate, + val format: ReportFormat, +) + +data class ReportFile( + val fileName: String, + val mimeType: String, + val downloadUrl: String, + val expiresAt: OffsetDateTime?, +) + +data class FleetDailyReport( + val date: LocalDate, + val generatedAt: OffsetDateTime, + val summary: FleetDailyReportSummary, + val machines: List, + val history: List, +) + +data class FleetDailyReportSummary( + val totalMachines: Int, + val boundMachines: Int, + val unboundMachines: Int, + val machinesWithMovement: Int, + val machinesWithoutData: Int, + val movingSeconds: Int, + val engineOnSeconds: Int, + val idleSeconds: Int, + val noDataSeconds: Int, + val stateChangesCount: Int, +) + +data class FleetDailyReportMachineRow( + val machine: MachineEntity, + val movingSeconds: Int, + val engineOnSeconds: Int, + val idleSeconds: Int, + val noDataSeconds: Int, + val stateChangesCount: Int, + val utilizationPercent: Int, +) + +data class FleetDailyReportHistoryRow( + val machine: MachineEntity, + val startedAt: OffsetDateTime, + val endedAt: OffsetDateTime?, + val stateDefinition: MachineStateDefinitionEntity?, + val stateCode: MachineStateCode?, + val durationSeconds: Int, +) diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/security/AuthTokenStore.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/security/AuthTokenStore.kt new file mode 100644 index 0000000..458bd40 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/security/AuthTokenStore.kt @@ -0,0 +1,95 @@ +package llc.arma.fleet.monitor.security + +import org.springframework.beans.factory.annotation.Value +import org.springframework.stereotype.Component +import java.time.OffsetDateTime +import java.util.UUID +import java.util.concurrent.ConcurrentHashMap + +@Component +class AuthTokenStore( + @Value("\${app.auth.access-token-ttl-minutes:720}") private val accessTokenTtlMinutes: Long, + @Value("\${app.auth.refresh-token-ttl-minutes:10080}") + private val refreshTokenTtlMinutes: Long, +) { + private data class TokenRecord( + val userId: Long, + val expiresAt: OffsetDateTime, + ) + + data class AuthSession( + val userId: Long, + val accessToken: String, + val refreshToken: String, + ) + + private val accessTokens = ConcurrentHashMap() + private val refreshTokens = ConcurrentHashMap() + + fun createToken(userId: Long): String { + val session = createSession(userId) + + return session.accessToken + } + + fun createSession(userId: Long): AuthSession { + val accessToken = generateToken() + val refreshToken = generateToken() + val now = OffsetDateTime.now() + + accessTokens[accessToken] = TokenRecord( + userId = userId, + expiresAt = now.plusMinutes(accessTokenTtlMinutes), + ) + refreshTokens[refreshToken] = TokenRecord( + userId = userId, + expiresAt = now.plusMinutes(refreshTokenTtlMinutes), + ) + + return AuthSession( + userId = userId, + accessToken = accessToken, + refreshToken = refreshToken, + ) + } + + fun refreshSession(refreshToken: String?): AuthSession? { + val record = resolveToken(refreshTokens, refreshToken) ?: return null + + if (!refreshToken.isNullOrBlank()) { + refreshTokens.remove(refreshToken) + } + + return createSession(record.userId) + } + + fun resolveUserId(token: String?): Long? { + return resolveToken(accessTokens, token)?.userId + } + + fun revoke(token: String?) { + if (!token.isNullOrBlank()) { + accessTokens.remove(token) + refreshTokens.remove(token) + } + } + + private fun resolveToken( + store: ConcurrentHashMap, + token: String?, + ): TokenRecord? { + if (token.isNullOrBlank()) return null + val record = store[token] ?: return null + + if (record.expiresAt.isBefore(OffsetDateTime.now())) { + store.remove(token) + return null + } + + return record + } + + private fun generateToken(): String { + return UUID.randomUUID().toString().replace("-", "") + } +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/security/DemoTokenAuthFilter.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/security/DemoTokenAuthFilter.kt new file mode 100644 index 0000000..9c024a2 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/security/DemoTokenAuthFilter.kt @@ -0,0 +1,36 @@ +package llc.arma.fleet.monitor.security + +import jakarta.servlet.FilterChain +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken +import org.springframework.security.core.authority.SimpleGrantedAuthority +import org.springframework.security.core.context.SecurityContextHolder +import org.springframework.stereotype.Component +import org.springframework.web.filter.OncePerRequestFilter + +@Component +class DemoTokenAuthFilter( + private val tokenStore: AuthTokenStore, +) : OncePerRequestFilter() { + override fun doFilterInternal( + request: HttpServletRequest, + response: HttpServletResponse, + filterChain: FilterChain, + ) { + val token = request.getHeader("Authorization") + ?.removePrefix("Bearer ") + ?: request.cookies?.firstOrNull { it.name == "Access-token" }?.value + + val userId = tokenStore.resolveUserId(token) + if (userId != null) { + SecurityContextHolder.getContext().authentication = UsernamePasswordAuthenticationToken( + userId.toString(), + null, + listOf(SimpleGrantedAuthority("AUTHENTICATED")), + ) + } + + filterChain.doFilter(request, response) + } +} diff --git a/backend/src/main/kotlin/llc/arma/fleet/monitor/security/SecurityConfig.kt b/backend/src/main/kotlin/llc/arma/fleet/monitor/security/SecurityConfig.kt new file mode 100644 index 0000000..61e42e5 --- /dev/null +++ b/backend/src/main/kotlin/llc/arma/fleet/monitor/security/SecurityConfig.kt @@ -0,0 +1,28 @@ +package llc.arma.fleet.monitor.security + +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.security.config.annotation.web.builders.HttpSecurity +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder +import org.springframework.security.crypto.password.PasswordEncoder +import org.springframework.security.web.SecurityFilterChain +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter + +@Configuration +class SecurityConfig( + private val demoTokenAuthFilter: DemoTokenAuthFilter, +) { + @Bean + fun passwordEncoder(): PasswordEncoder = BCryptPasswordEncoder() + + @Bean + fun securityFilterChain(http: HttpSecurity): SecurityFilterChain = + http + .csrf { it.disable() } + .cors { } + .authorizeHttpRequests { requests -> + requests.anyRequest().permitAll() + } + .addFilterBefore(demoTokenAuthFilter, UsernamePasswordAuthenticationFilter::class.java) + .build() +} diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml new file mode 100644 index 0000000..8978c50 --- /dev/null +++ b/backend/src/main/resources/application.yml @@ -0,0 +1,43 @@ +spring: + application: + name: fleet-ble-monitor-backend + + graphql: + path: /graphql + schema: + locations: classpath:graphql/ + file-extensions: .graphqls + graphiql: + enabled: true + path: /graphiql + cors: + allow-credentials: true + allowed-origin-patterns: + - "*" + + datasource: + url: jdbc:postgresql://${DB_HOST:localhost:55432}/${DB_NAME:fleet_ble_monitor} + username: ${DB_USER:fleet_user} + password: ${DB_PASSWORD:fleet_password} + driver-class-name: org.postgresql.Driver + + jpa: + open-in-view: false + hibernate: + ddl-auto: update + properties: + hibernate: + format_sql: true + +server: + port: ${SERVER_PORT:8080} + servlet: + context-path: /api + +app: + seed: + enabled: ${SEED_ENABLED:true} + auth: + demo-token-ttl-minutes: ${DEMO_TOKEN_TTL_MINUTES:720} + access-token-ttl-minutes: ${ACCESS_TOKEN_TTL_MINUTES:720} + refresh-token-ttl-minutes: ${REFRESH_TOKEN_TTL_MINUTES:10080} diff --git a/backend/src/main/resources/graphql/schema.graphqls b/backend/src/main/resources/graphql/schema.graphqls new file mode 100644 index 0000000..006775a --- /dev/null +++ b/backend/src/main/resources/graphql/schema.graphqls @@ -0,0 +1,431 @@ +scalar DateTime +scalar Date +scalar Long + +type Query { + currentUser: User + + getUsers( + page: Int! + pageSize: Int + query: String + roles: [UserRole!] + sortDirection: SortDirection! + sortField: UserSortField! + ): UsersPage! + + getUser(id: Long!): User + + getMachines( + page: Int! + pageSize: Int + query: String + sortDirection: SortDirection! + sortField: MachineSortField! + ): MachinesPage! + + getMachine(id: Long!): Machine + + getMachineTypes: [MachineType!]! + getDepartments: [Department!]! + getBeacons: [Beacon!]! + getFreeBeacons: [Beacon!]! + + getBeaconTelemetry( + beaconId: Long + machineId: Long + startDate: DateTime! + endDate: DateTime! + ): [BeaconTelemetryPacket!]! + + getMachineStateDefinitions: [MachineStateDefinition!]! + getMachineCalibrationRules(machineId: Long!): [MachineCalibrationRule!]! + + getMachineStateHistory( + machineId: Long! + startDate: DateTime! + endDate: DateTime! + page: Int + pageSize: Int + ): MachineStateHistoryPage! + + getMachineUsageSummary( + machineId: Long! + startDate: DateTime! + endDate: DateTime! + ): MachineUsageSummary! + + getUnrecognizedTelemetryIntervals( + machineId: Long! + startDate: DateTime! + endDate: DateTime! + ): [MachineStateInterval!]! + + getMachineDailyUsageStats( + machineId: Long! + startDate: DateTime! + endDate: DateTime! + ): [MachineDailyUsageStat!]! + + getFleetDailyReport(date: Date!): FleetDailyReport! + + createFleetDailyReportDownloadUrl( + payload: GenerateFleetDailyReportPayload! + ): ReportFile! +} + +type Mutation { + login(payload: LoginPayload!): AuthPayload! + refreshSession(payload: RefreshSessionPayload!): AuthPayload! + logout: Boolean! + + createUser(payload: CreateUserPayload!): User! + updateUser(id: Long!, payload: UpdateUserPayload!): User! + deleteUser(id: Long!): Boolean! + + createMachine(payload: CreateMachinePayload!): Machine! + updateMachine(id: Long!, payload: UpdateMachinePayload!): Machine! + deleteMachine(id: Long!): Boolean! + + bindBeaconToMachine(machineId: Long!, beaconId: Long!): Machine! + unbindBeaconFromMachine(machineId: Long!): Machine! + + registerBeaconTelemetryPacket(payload: BeaconTelemetryPayload!): Boolean! + + createMachineType(name: String!): MachineType! + updateMachineType(id: Long!, name: String!): MachineType! + deleteMachineType(id: Long!): Boolean! + + createDepartment(name: String!): Department! + updateDepartment(id: Long!, name: String!): Department! + deleteDepartment(id: Long!): Boolean! + + createMachineStateDefinition(payload: CreateMachineStateDefinitionPayload!): MachineStateDefinition! + updateMachineStateDefinition(id: Long!, payload: UpdateMachineStateDefinitionPayload!): MachineStateDefinition! + deleteMachineStateDefinition(id: Long!): Boolean! + + createMachineCalibrationRule(payload: CreateMachineCalibrationRulePayload!): MachineCalibrationRule! + updateMachineCalibrationRule(id: Long!, payload: UpdateMachineCalibrationRulePayload!): MachineCalibrationRule! + deleteMachineCalibrationRule(id: Long!): Boolean! + + recognizeMachineStates(machineId: Long!, startDate: DateTime!, endDate: DateTime!): [MachineStateInterval!]! +} + +type AuthPayload { + user: User! + accessToken: String! + refreshToken: String! + token: String! +} + +type User { + id: Long! + lastName: String! + firstName: String! + middleName: String + email: String! + login: String! + role: UserRole! + active: Boolean! + createdAt: DateTime! + updatedAt: DateTime! +} + +enum UserRole { + ADMIN + USER +} + +type UsersPage { + totalPages: Int! + totalElements: Long! + page: [User!]! +} + +enum UserSortField { + ID + NAME + DATE +} + +enum SortDirection { + ASC + DESC +} + +input LoginPayload { + loginOrEmail: String! + password: String! +} + +input RefreshSessionPayload { + refreshToken: String! +} + +input CreateUserPayload { + lastName: String! + firstName: String! + middleName: String + email: String! + login: String! + password: String! + role: UserRole! +} + +input UpdateUserPayload { + lastName: String + firstName: String + middleName: String + email: String + login: String + password: String + role: UserRole + active: Boolean +} + +type Machine { + id: Long! + name: String! + licensePlate: String! + type: MachineType! + department: Department! + description: String + beacon: Beacon + lastKnownState: MachineStateCode! + lastDataReceivedAt: DateTime + createdAt: DateTime! + updatedAt: DateTime! +} + +type MachineType { + id: Long! + name: String! + description: String + createdAt: DateTime! + updatedAt: DateTime! +} + +type Department { + id: Long! + name: String! + description: String + createdAt: DateTime! + updatedAt: DateTime! +} + +enum MachineStateCode { + IDLE + ENGINE_ON + MOVING + NO_DATA +} + +type MachinesPage { + totalPages: Int! + totalElements: Long! + page: [Machine!]! +} + +enum MachineSortField { + ID + NAME + DATE +} + +input CreateMachinePayload { + name: String! + licensePlate: String! + typeId: Long! + departmentId: Long! + description: String +} + +input UpdateMachinePayload { + name: String + licensePlate: String + typeId: Long + departmentId: Long + description: String +} + +type Beacon { + id: Long! + identifier: String! + macAddress: String! + status: BeaconStatus! + boundMachine: Machine + lastSeenAt: DateTime + createdAt: DateTime! + updatedAt: DateTime! +} + +enum BeaconStatus { + FREE + BOUND +} + +type BeaconTelemetryPacket { + id: Long! + beacon: Beacon! + machine: Machine + mac: String! + vibration: Float! + duration: Int! + timeMillis: Long! + receivedAt: DateTime! +} + +input BeaconTelemetryPayload { + mac: String! + vibration: Float! + duration: Int! + timeMillis: Long! +} + +type MachineStateDefinition { + id: Long! + name: String! + icon: String! + color: String! + description: String + isSystem: Boolean! + createdAt: DateTime! + updatedAt: DateTime! +} + +input CreateMachineStateDefinitionPayload { + name: String! + icon: String! + color: String! + description: String +} + +input UpdateMachineStateDefinitionPayload { + name: String + icon: String + color: String + description: String +} + +type MachineCalibrationRule { + id: Long! + machine: Machine! + stateDefinition: MachineStateDefinition! + vibrationMin: Float! + vibrationMax: Float! + createdAt: DateTime! + updatedAt: DateTime! +} + +input CreateMachineCalibrationRulePayload { + machineId: Long! + stateDefinitionId: Long! + vibrationMin: Float! + vibrationMax: Float! +} + +input UpdateMachineCalibrationRulePayload { + stateDefinitionId: Long + vibrationMin: Float + vibrationMax: Float +} + +type MachineStateInterval { + id: Long! + machine: Machine! + stateDefinition: MachineStateDefinition + stateCode: MachineStateCode + startedAt: DateTime! + endedAt: DateTime + durationSeconds: Int! + vibrationMin: Float + vibrationMax: Float + vibrationAvg: Float + sampleCount: Int! + isNoData: Boolean! +} + +type MachineStateHistoryPage { + totalPages: Int! + totalElements: Long! + page: [MachineStateInterval!]! +} + +type MachineUsageSummary { + machine: Machine! + periodStart: DateTime! + periodEnd: DateTime! + movingSeconds: Int! + engineOnSeconds: Int! + idleSeconds: Int! + noDataSeconds: Int! + stateChangesCount: Int! + utilizationPercent: Int! +} + +type MachineDailyUsageStat { + machine: Machine! + date: String! + movingSeconds: Int! + engineOnSeconds: Int! + idleSeconds: Int! + noDataSeconds: Int! + utilizationPercent: Int! +} + +type FleetDailyReport { + date: Date! + generatedAt: DateTime! + summary: FleetDailyReportSummary! + machines: [FleetDailyReportMachineRow!]! + history: [FleetDailyReportHistoryRow!]! +} + +type FleetDailyReportSummary { + totalMachines: Int! + boundMachines: Int! + unboundMachines: Int! + machinesWithMovement: Int! + machinesWithoutData: Int! + movingSeconds: Int! + engineOnSeconds: Int! + idleSeconds: Int! + noDataSeconds: Int! + stateChangesCount: Int! +} + +type FleetDailyReportMachineRow { + machine: Machine! + movingSeconds: Int! + engineOnSeconds: Int! + idleSeconds: Int! + noDataSeconds: Int! + stateChangesCount: Int! + utilizationPercent: Int! +} + +type FleetDailyReportHistoryRow { + machine: Machine! + startedAt: DateTime! + endedAt: DateTime + stateDefinition: MachineStateDefinition + stateCode: MachineStateCode + durationSeconds: Int! +} + +enum ReportFormat { + PDF + XLSX +} + +input GenerateFleetDailyReportPayload { + date: Date! + format: ReportFormat! +} + +type ReportFile { + fileName: String! + mimeType: String! + downloadUrl: String! + expiresAt: DateTime +} diff --git a/frontend/.env b/frontend/.env new file mode 100644 index 0000000..4c9df2d --- /dev/null +++ b/frontend/.env @@ -0,0 +1,4 @@ +VITE_GRAPHQL_API_URL=/api/graphql +VITE_MAPTILER_KEY=IorSzMRqcNUCYzcXZhi6 +VITE_AUTH_ENABLED=true +VITE_BACKEND_URL=http://localhost:8080/api diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..7dbf7eb --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,73 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // Remove tseslint.configs.recommended and replace with this + tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + tseslint.configs.stylisticTypeChecked, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/frontend/codegen.ts b/frontend/codegen.ts new file mode 100644 index 0000000..4615d2a --- /dev/null +++ b/frontend/codegen.ts @@ -0,0 +1,24 @@ +import type { CodegenConfig } from '@graphql-codegen/cli' + +const config: CodegenConfig = { + schema: '../backend/src/main/resources/graphql/schema.graphqls', + documents: ['src/shared/api/graphql/operations/**/*.{ts,tsx,graphql}'], + generates: { + 'src/shared/api/graphql/generated/': { + preset: 'client', + presetConfig: { + fragmentMasking: false, + }, + config: { + useTypeImports: true, + scalars: { + Date: 'string', + DateTime: 'string', + Long: 'number', + }, + }, + }, + }, +} + +export default config diff --git a/frontend/docs/backend-domain-model.md b/frontend/docs/backend-domain-model.md new file mode 100644 index 0000000..12da685 --- /dev/null +++ b/frontend/docs/backend-domain-model.md @@ -0,0 +1,930 @@ +# Fleet BLE Monitor Backend Contract Draft + +Черновик backend-модели, GraphQL-like API и use-cases для `fleet-ble-monitor`. + +Документ написан в формате, близком к GraphQL Docs: у сущности сразу перечислены поля, рядом указаны связанные enum/input/page-типы. Это не финальная схема, а база для обсуждения со старшим. + +## Общие скаляры + +```graphql +scalar DateTime +scalar Date +``` + +`DateTime` — ISO-строка даты и времени. + +`Date` — календарная дата в формате `YYYY-MM-DD`. + +## User + +Пользователь системы. Используется для авторизации, прав доступа и как получатель отчетов. + +```graphql +type User { + id: ID! + lastName: String! + firstName: String! + middleName: String + email: String! + login: String! + role: UserRole! + createdAt: DateTime! + updatedAt: DateTime +} +``` + +### UserRole + +Роль пользователя. + +```graphql +enum UserRole { + ADMIN + USER +} +``` + +`ADMIN` — администратор. + +`USER` — пользователь. + +### UsersPage + +Страница пользователей для таблицы. + +```graphql +type UsersPage { + totalPages: Int! + totalElements: Int! + page: [User!]! +} +``` + +### UserSortField + +Поле сортировки пользователей. + +```graphql +enum UserSortField { + ID + NAME + DATE +} +``` + +### SortDirection + +Общее направление сортировки. + +```graphql +enum SortDirection { + ASC + DESC +} +``` + +### LoginPayload + +```graphql +input LoginPayload { + loginOrEmail: String! + password: String! +} +``` + +### CreateUserPayload + +```graphql +input CreateUserPayload { + lastName: String! + firstName: String! + middleName: String + email: String! + login: String! + password: String! + role: UserRole! +} +``` + +### UpdateUserPayload + +```graphql +input UpdateUserPayload { + lastName: String + firstName: String + middleName: String + email: String + login: String + password: String + role: UserRole +} +``` + +## Machine + +АТТ / единица техники. Основная бизнес-сущность мониторинга. + +```graphql +type Machine { + id: ID! + name: String! + licensePlate: String! + type: MachineType! + department: Department! + description: String + beacon: Beacon + lastKnownState: MachineStateCode! + lastDataReceivedAt: DateTime + createdAt: DateTime! + updatedAt: DateTime! +} +``` + +### MachineType + +Справочник типов АТТ. + +```graphql +type MachineType { + id: ID! + name: String! + description: String + createdAt: DateTime! + updatedAt: DateTime! +} +``` + +Примеры: каток, самосвал, погрузчик, экскаватор. + +### Department + +Справочник подразделений, участков или объектов. + +```graphql +type Department { + id: ID! + name: String! + description: String + createdAt: DateTime! + updatedAt: DateTime! +} +``` + +### MachineStateCode + +Последнее известное базовое состояние АТТ. + +```graphql +enum MachineStateCode { + IDLE + ENGINE_ON + MOVING + NO_DATA +} +``` + +`IDLE` — стоит. + +`ENGINE_ON` — заведена. + +`MOVING` — в движении. + +`NO_DATA` — нет данных. + +### MachinesPage + +```graphql +type MachinesPage { + totalPages: Int! + totalElements: Int! + page: [Machine!]! +} +``` + +### MachineSortField + +```graphql +enum MachineSortField { + ID + NAME + DATE +} +``` + +### CreateMachinePayload + +```graphql +input CreateMachinePayload { + name: String! + licensePlate: String! + typeId: ID! + departmentId: ID! + description: String +} +``` + +### UpdateMachinePayload + +```graphql +input UpdateMachinePayload { + name: String + licensePlate: String + typeId: ID + departmentId: ID + description: String +} +``` + +## Beacon + +BLE-маяк. Хранит идентификатор, MAC-адрес, статус привязки, последнюю связь. + +```graphql +type Beacon { + id: ID! + identifier: String! + macAddress: String! + status: BeaconStatus! + boundMachine: Machine + lastSeenAt: DateTime + createdAt: DateTime! + updatedAt: DateTime! +} +``` + +### BeaconStatus + +```graphql +enum BeaconStatus { + FREE + BOUND +} +``` + +`FREE` — маяк свободен. + +`BOUND` — маяк привязан к АТТ. + +### BeaconTelemetryPacket + +Сырое сообщение от маяка. + +```graphql +type BeaconTelemetryPacket { + id: ID! + beacon: Beacon! + machine: Machine + mac: String! + vibration: Float! + duration: Int! + timeMillis: Long! + receivedAt: DateTime! +} +``` + +### BeaconTelemetryPayload + +Payload входящего сообщения от маяка. + +```graphql +input BeaconTelemetryPayload { + mac: String! + vibration: Float! + duration: Int! + timeMillis: Long! +} +``` + +`duration` — длительность замера/пакета в секундах. + +`timeMillis` — время события на стороне маяка или шлюза. + +## MachineStateDefinition + +Справочник состояний АТТ без привязки к конкретным значениям акселерометра. + +```graphql +type MachineStateDefinition { + id: ID! + name: String! + icon: String! + color: String! + description: String + isSystem: Boolean! + createdAt: DateTime! + updatedAt: DateTime! +} +``` + +Примеры: + +- `Стоит` +- `Заведена` +- `В движении` +- `Работа с нагрузкой` +- `Нет данных` + +`Нет данных` — системное состояние, его нельзя удалять и нельзя использовать в ручном правиле калибровки. + +### CreateMachineStateDefinitionPayload + +```graphql +input CreateMachineStateDefinitionPayload { + name: String! + icon: String! + color: String! + description: String +} +``` + +### UpdateMachineStateDefinitionPayload + +```graphql +input UpdateMachineStateDefinitionPayload { + name: String + icon: String + color: String + description: String +} +``` + +## MachineCalibrationRule + +Правило калибровки для конкретной АТТ. Связывает диапазон значений вибрации с состоянием из справочника. + +```graphql +type MachineCalibrationRule { + id: ID! + machine: Machine! + stateDefinition: MachineStateDefinition! + vibrationMin: Float! + vibrationMax: Float! + createdAt: DateTime! + updatedAt: DateTime! +} +``` + +### CreateMachineCalibrationRulePayload + +```graphql +input CreateMachineCalibrationRulePayload { + machineId: ID! + stateDefinitionId: ID! + vibrationMin: Float! + vibrationMax: Float! +} +``` + +### UpdateMachineCalibrationRulePayload + +```graphql +input UpdateMachineCalibrationRulePayload { + stateDefinitionId: ID + vibrationMin: Float + vibrationMax: Float +} +``` + +## MachineStateInterval + +Распознанный интервал состояния АТТ. + +```graphql +type MachineStateInterval { + id: ID! + machine: Machine! + stateDefinition: MachineStateDefinition + stateCode: MachineStateCode + startedAt: DateTime! + endedAt: DateTime + durationSeconds: Int! + vibrationMin: Float + vibrationMax: Float + vibrationAvg: Float + sampleCount: Int! + isNoData: Boolean! +} +``` + +Если `stateDefinition` равен `null`, участок считается нераспознанным. + +Если `isNoData = true`, участок относится к системному состоянию `Нет данных`. + +### MachineStateHistoryPage + +```graphql +type MachineStateHistoryPage { + totalPages: Int! + totalElements: Int! + page: [MachineStateInterval!]! +} +``` + +## MachineUsageSummary + +Краткая статистика по АТТ за период. + +```graphql +type MachineUsageSummary { + machine: Machine! + periodStart: DateTime! + periodEnd: DateTime! + movingSeconds: Int! + engineOnSeconds: Int! + idleSeconds: Int! + noDataSeconds: Int! + stateChangesCount: Int! + utilizationPercent: Int! +} +``` + +## FleetReportSchedule + +Настройка ежедневной рассылки отчета по парку АТТ. + +```graphql +type FleetReportSchedule { + id: ID! + name: String! + recipients: [User!]! + reportFormat: ReportFormat! + sendTime: String! + period: ReportPeriod! + timezone: String! + enabled: Boolean! + createdAt: DateTime! + updatedAt: DateTime! +} +``` + +### ReportFormat + +Формат отчета. + +```graphql +enum ReportFormat { + PDF + XLSX +} +``` + +### ReportPeriod + +Период отчета. + +```graphql +enum ReportPeriod { + PREVIOUS_DAY +} +``` + +`PREVIOUS_DAY` — предыдущий календарный день относительно timezone расписания. + +### CreateFleetReportSchedulePayload + +```graphql +input CreateFleetReportSchedulePayload { + recipientUserIds: [ID!]! + reportFormat: ReportFormat! + sendTime: String! +} +``` + +### UpdateFleetReportSchedulePayload + +```graphql +input UpdateFleetReportSchedulePayload { + recipientUserIds: [ID!] + reportFormat: ReportFormat + sendTime: String + enabled: Boolean +} +``` + +## FleetReportDelivery + +История конкретной попытки отправки отчета. + +```graphql +type FleetReportDelivery { + id: ID! + schedule: FleetReportSchedule + reportDate: Date! + reportFormat: ReportFormat! + recipients: [User!]! + status: ReportDeliveryStatus! + fileName: String + errorMessage: String + createdAt: DateTime! + sentAt: DateTime +} +``` + +### ReportDeliveryStatus + +```graphql +enum ReportDeliveryStatus { + CREATED + GENERATING + SENT + FAILED +} +``` + +`CREATED` — задача создана. + +`GENERATING` — отчет формируется. + +`SENT` — отчет отправлен. + +`FAILED` — ошибка генерации или отправки. + +## FleetDailyReport + +Доменная модель дневного отчета по парку АТТ. + +```graphql +type FleetDailyReport { + date: Date! + generatedAt: DateTime! + summary: FleetDailyReportSummary! + machines: [FleetDailyReportMachineRow!]! + history: [FleetDailyReportHistoryRow!]! +} +``` + +### FleetDailyReportSummary + +```graphql +type FleetDailyReportSummary { + totalMachines: Int! + boundMachines: Int! + unboundMachines: Int! + machinesWithMovement: Int! + machinesWithoutData: Int! + movingSeconds: Int! + engineOnSeconds: Int! + idleSeconds: Int! + noDataSeconds: Int! + stateChangesCount: Int! +} +``` + +### FleetDailyReportMachineRow + +```graphql +type FleetDailyReportMachineRow { + machine: Machine! + movingSeconds: Int! + engineOnSeconds: Int! + idleSeconds: Int! + noDataSeconds: Int! + stateChangesCount: Int! + utilizationPercent: Int! +} +``` + +### FleetDailyReportHistoryRow + +```graphql +type FleetDailyReportHistoryRow { + machine: Machine! + startedAt: DateTime! + endedAt: DateTime! + stateDefinition: MachineStateDefinition + stateCode: MachineStateCode + durationSeconds: Int! +} +``` + +### GenerateFleetDailyReportPayload + +```graphql +input GenerateFleetDailyReportPayload { + date: Date! + format: ReportFormat! +} +``` + +### ReportFile + +Ссылка на готовый файл отчета. + +```graphql +type ReportFile { + fileName: String! + mimeType: String! + downloadUrl: String! + expiresAt: DateTime +} +``` + +Физическая отдача файла может быть не через GraphQL, а через REST endpoint или object storage URL. GraphQL в таком случае возвращает `downloadUrl`. + +## Query + +```graphql +type Query { + currentUser: User + + getUsers( + page: Int! + pageSize: Int + query: String + roles: [UserRole!] + sortDirection: SortDirection! + sortField: UserSortField! + ): UsersPage! + + getUser(id: ID!): User + + getMachines( + page: Int! + pageSize: Int + query: String + sortDirection: SortDirection! + sortField: MachineSortField! + ): MachinesPage! + + getMachine(id: ID!): Machine + + getMachineTypes: [MachineType!]! + + getDepartments: [Department!]! + + getBeacons: [Beacon!]! + + getFreeBeacons: [Beacon!]! + + getBeaconTelemetry( + beaconId: ID + machineId: ID + startDate: DateTime! + endDate: DateTime! + ): [BeaconTelemetryPacket!]! + + getMachineStateDefinitions: [MachineStateDefinition!]! + + getMachineCalibrationRules(machineId: ID!): [MachineCalibrationRule!]! + + getMachineStateHistory( + machineId: ID! + startDate: DateTime! + endDate: DateTime! + page: Int + pageSize: Int + ): MachineStateHistoryPage! + + getMachineUsageSummary( + machineId: ID! + startDate: DateTime! + endDate: DateTime! + ): MachineUsageSummary! + + getUnrecognizedTelemetryIntervals( + machineId: ID! + startDate: DateTime! + endDate: DateTime! + ): [MachineStateInterval!]! + + getFleetReportSchedules: [FleetReportSchedule!]! + + getFleetReportDeliveries( + scheduleId: ID + dateFrom: Date + dateTo: Date + ): [FleetReportDelivery!]! + + getFleetDailyReport(date: Date!): FleetDailyReport! + + createFleetDailyReportDownloadUrl( + payload: GenerateFleetDailyReportPayload! + ): ReportFile! +} +``` + +## Mutation + +```graphql +type Mutation { + login(payload: LoginPayload!): User! + + logout: Boolean! + + createUser(payload: CreateUserPayload!): User! + + updateUser( + id: ID! + payload: UpdateUserPayload! + ): User! + + deleteUser(id: ID!): Boolean! + + createMachine(payload: CreateMachinePayload!): Machine! + + updateMachine( + id: ID! + payload: UpdateMachinePayload! + ): Machine! + + deleteMachine(id: ID!): Boolean! + + bindBeaconToMachine( + machineId: ID! + beaconId: ID! + ): Machine! + + unbindBeaconFromMachine(machineId: ID!): Machine! + + registerBeaconTelemetryPacket( + payload: BeaconTelemetryPayload! + ): Boolean! + + createMachineType(name: String!): MachineType! + + updateMachineType( + id: ID! + name: String! + ): MachineType! + + deleteMachineType(id: ID!): Boolean! + + createDepartment(name: String!): Department! + + updateDepartment( + id: ID! + name: String! + ): Department! + + deleteDepartment(id: ID!): Boolean! + + createMachineStateDefinition( + payload: CreateMachineStateDefinitionPayload! + ): MachineStateDefinition! + + updateMachineStateDefinition( + id: ID! + payload: UpdateMachineStateDefinitionPayload! + ): MachineStateDefinition! + + deleteMachineStateDefinition(id: ID!): Boolean! + + createMachineCalibrationRule( + payload: CreateMachineCalibrationRulePayload! + ): MachineCalibrationRule! + + updateMachineCalibrationRule( + id: ID! + payload: UpdateMachineCalibrationRulePayload! + ): MachineCalibrationRule! + + deleteMachineCalibrationRule(id: ID!): Boolean! + + recognizeMachineStates( + machineId: ID! + startDate: DateTime! + endDate: DateTime! + ): [MachineStateInterval!]! + + createFleetReportSchedule( + payload: CreateFleetReportSchedulePayload! + ): FleetReportSchedule! + + updateFleetReportSchedule( + id: ID! + payload: UpdateFleetReportSchedulePayload! + ): FleetReportSchedule! + + deleteFleetReportSchedule(id: ID!): Boolean! + + sendFleetDailyReport( + scheduleId: ID! + reportDate: Date! + ): FleetReportDelivery! +} +``` + +## Use-Cases + +### Пользователи + +`LoginUserUseCase` — авторизует пользователя по логину/email и паролю. + +`GetCurrentUserUseCase` — возвращает текущего авторизованного пользователя. + +`GetUsersUseCase` — возвращает список пользователей с поиском, сортировкой и пагинацией. + +`CreateUserUseCase` — создает пользователя. + +`UpdateUserUseCase` — редактирует данные пользователя. + +`DeleteUserUseCase` — удаляет пользователя или блокирует, если будет выбран soft-delete подход. + +### АТТ + +`GetMachinesUseCase` — возвращает список АТТ с поиском, сортировкой и пагинацией. + +`GetMachineByIdUseCase` — возвращает карточку конкретной АТТ. + +`CreateMachineUseCase` — создает новую АТТ. + +`UpdateMachineUseCase` — редактирует данные АТТ. + +`DeleteMachineUseCase` — удаляет АТТ или переводит в архив. + +`BindBeaconToMachineUseCase` — привязывает свободный маяк к АТТ. + +`UnbindBeaconFromMachineUseCase` — отвязывает маяк от АТТ. + +### Маяки и телеметрия + +`RegisterBeaconTelemetryPacketUseCase` — принимает сырое сообщение от маяка и сохраняет его. + +`ResolveBeaconByMacUseCase` — находит маяк по MAC-адресу из входящего пакета. + +`AttachTelemetryPacketToMachineUseCase` — определяет, к какой АТТ относится пакет, если маяк привязан. + +`GetBeaconTelemetryUseCase` — возвращает сырые показания маяка за период. + +`GetFreeBeaconsUseCase` — возвращает список свободных маяков. + +### Калибровка + +`GetMachineStateDefinitionsUseCase` — возвращает справочник состояний АТТ. + +`CreateMachineStateDefinitionUseCase` — создает новое состояние в справочнике. + +`UpdateMachineStateDefinitionUseCase` — редактирует состояние справочника. + +`DeleteMachineStateDefinitionUseCase` — удаляет состояние, если оно не используется правилами. + +`GetMachineCalibrationRulesUseCase` — возвращает правила калибровки конкретной АТТ. + +`CreateMachineCalibrationRuleUseCase` — создает правило калибровки для АТТ. + +`UpdateMachineCalibrationRuleUseCase` — редактирует правило калибровки. + +`DeleteMachineCalibrationRuleUseCase` — удаляет правило калибровки. + +`ValidateMachineCalibrationRuleUseCase` — проверяет правило на конфликты с уже существующими диапазонами. + +`RecognizeMachineStatesUseCase` — по сырым данным акселерометра и правилам калибровки строит интервалы состояний. + +`GetUnrecognizedTelemetryIntervalsUseCase` — возвращает участки телеметрии, которые не попали ни под одно правило. + +### История и аналитика + +`GetMachineStateHistoryUseCase` — возвращает историю состояний АТТ за период. + +`GetMachineUsageSummaryUseCase` — собирает краткую статистику по АТТ за период. + +`GetMachineDailyUsageStatsUseCase` — возвращает дневную статистику по АТТ для графиков. + +`AggregateMachineStateIntervalsUseCase` — агрегирует интервалы состояний из телеметрии. + +### Отчеты + +`GetFleetReportSchedulesUseCase` — возвращает настройки рассылок отчетов. + +`CreateFleetReportScheduleUseCase` — создает настройку ежедневной рассылки отчета. + +`UpdateFleetReportScheduleUseCase` — редактирует настройку рассылки. + +`DeleteFleetReportScheduleUseCase` — удаляет настройку рассылки. + +`GenerateFleetDailyReportUseCase` — собирает дневной отчет по парку АТТ за выбранную дату. + +`ExportFleetDailyReportToPdfUseCase` — формирует PDF-файл дневного отчета. + +`ExportFleetDailyReportToXlsxUseCase` — формирует Excel-файл дневного отчета. + +`DownloadFleetDailyReportUseCase` — отдает файл отчета пользователю по запросу из интерфейса. + +`RunScheduledFleetReportsUseCase` — периодически запускает активные расписания рассылок. + +`SendFleetDailyReportUseCase` — генерирует отчет и отправляет его выбранным пользователям. + +`CreateFleetReportDeliveryUseCase` — создает запись о попытке отправки отчета. + +`MarkFleetReportDeliveryAsSentUseCase` — помечает отправку как успешную. + +`MarkFleetReportDeliveryAsFailedUseCase` — сохраняет ошибку отправки. + +## Доменные сервисы + +`MachineStateRecognitionService` — определяет состояние АТТ по телеметрии и правилам калибровки. + +`MachineAnalyticsService` — считает агрегаты: время в движении, заведена, стояла, нет данных, смены состояний. + +`FleetDailyReportBuilder` — собирает доменную модель дневного отчета. + +`FleetReportExporter` — общий интерфейс для экспорта отчета в файл. + +`PdfFleetReportExporter` — экспортирует отчет в PDF. + +`XlsxFleetReportExporter` — экспортирует отчет в Excel. + +`MailService` — отправляет письма с вложениями. + +`ReportScheduler` — запускает ежедневные рассылки по расписанию. + diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js new file mode 100644 index 0000000..2a0aeac --- /dev/null +++ b/frontend/eslint.config.js @@ -0,0 +1,26 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + globals: globals.browser, + }, + rules: { + 'react-hooks/set-state-in-effect': 'warn', + 'react-refresh/only-export-components': 'warn', + }, + }, +]) diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..d84e34b --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,13 @@ + + + + + + + Fleet BLE Monitor + + +
+ + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..08c0ac8 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,7662 @@ +{ + "name": "fleet-ble-monitor", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "fleet-ble-monitor", + "version": "0.0.0", + "dependencies": { + "@apollo/client": "^4.1.9", + "@hookform/resolvers": "^5.2.2", + "@internationalized/date": "^3.12.1", + "@radix-ui/react-accordion": "^1.2.12", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-popover": "^1.1.15", + "@tanstack/react-table": "^8.21.3", + "date-fns": "^4.1.0", + "echarts": "^6.0.0", + "echarts-for-react": "^3.0.6", + "framer-motion": "^12.40.0", + "graphql": "^16.13.2", + "leaflet": "^1.9.4", + "lucide-react": "^1.9.0", + "qrcode.react": "^4.2.0", + "react": "^19.2.5", + "react-day-picker": "^9.14.0", + "react-dom": "^19.2.5", + "react-easy-crop": "^5.5.7", + "react-hook-form": "^7.73.1", + "react-leaflet": "^5.0.0", + "react-router-dom": "^7.14.2", + "sass": "^1.99.0", + "simplebar": "^6.3.3", + "simplebar-react": "^3.3.2", + "zod": "^4.3.6", + "zustand": "^5.0.12" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@graphql-codegen/cli": "^7.2.0", + "@graphql-codegen/client-preset": "^6.1.0", + "@graphql-typed-document-node/core": "^3.2.0", + "@types/leaflet": "^1.9.21", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-basic-ssl": "^2.3.0", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^10.2.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.5.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.2", + "vite": "^8.0.10" + } + }, + "node_modules/@apollo/client": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-4.1.9.tgz", + "integrity": "sha512-qfpkQD51tdU/7iAR6aLb4w9o/L7I475DluWHRb61U/3Q0AH29nNOxOBHjBbWDdf16ncPOoQuxne1sEs2NjqBFw==", + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@wry/caches": "^1.0.0", + "@wry/equality": "^0.5.6", + "@wry/trie": "^0.5.0", + "graphql-tag": "^2.12.6", + "optimism": "^0.18.0", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "graphql": "^16.0.0", + "graphql-ws": "^5.5.5 || ^6.0.3", + "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc", + "react-dom": "^17.0.0 || ^18.0.0 || >=19.0.0-rc", + "rxjs": "^7.3.0", + "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" + }, + "peerDependenciesMeta": { + "graphql-ws": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "subscriptions-transport-ws": { + "optional": true + } + } + }, + "node_modules/@ardatan/relay-compiler": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-13.0.1.tgz", + "integrity": "sha512-afG3YPwuSA0E5foouZusz5GlXKs74dObv4cuWyLyfKsYFj2r7oGRNB28v18HvwuLSQtQFCi+DpIe0TZkgQDYyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "immutable": "^5.1.5", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "graphql": "*" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", + "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@date-fns/tz": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@date-fns/tz/-/tz-1.4.1.tgz", + "integrity": "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==", + "license": "MIT" + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@envelop/core": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@envelop/core/-/core-5.5.1.tgz", + "integrity": "sha512-3DQg8sFskDo386TkL5j12jyRAdip/8yzK3x7YGbZBgobZ4aKXrvDU0GppU0SnmrpQnNaiTUsxBs9LKkwQ/eyvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@envelop/instrumentation": "^1.0.0", + "@envelop/types": "^5.2.1", + "@whatwg-node/promise-helpers": "^1.2.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@envelop/instrumentation": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@envelop/instrumentation/-/instrumentation-1.0.0.tgz", + "integrity": "sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@envelop/types": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@envelop/types/-/types-5.2.1.tgz", + "integrity": "sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz", + "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz", + "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@fastify/busboy": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", + "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@graphql-codegen/add": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-7.1.0.tgz", + "integrity": "sha512-bytJg1kel5zfgK3JSYbGwtpbNe6F9OPZSR6DiMDe9RVxblAgl6w4zEEPd/mM3rhNJ1VmGYLbNnf5e1eUfXQEbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^7.1.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/cli": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-7.2.0.tgz", + "integrity": "sha512-JPJw2vquEIpO3b8XJyxFVTrYi6WRn/OKu/SlzQA+IwAVT7GZPeG+AHmfRXAvpVMj31899nTpQYEQGUxx3ZqubQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/types": "^7.18.13", + "@graphql-codegen/client-preset": "^6.1.0", + "@graphql-codegen/core": "^6.2.0", + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-tools/apollo-engine-loader": "^8.0.28", + "@graphql-tools/code-file-loader": "^8.1.28", + "@graphql-tools/git-loader": "^8.0.32", + "@graphql-tools/github-loader": "^9.0.6", + "@graphql-tools/graphql-file-loader": "^8.1.11", + "@graphql-tools/json-file-loader": "^8.0.26", + "@graphql-tools/load": "^8.1.8", + "@graphql-tools/merge": "^9.0.6", + "@graphql-tools/url-loader": "^9.0.6", + "@graphql-tools/utils": "^11.2.0", + "@inquirer/prompts": "^8.3.2", + "@whatwg-node/fetch": "^0.10.0", + "chalk": "^5.6.0", + "cosmiconfig": "^9.0.0", + "debounce": "^3.0.0", + "detect-indent": "^7.0.0", + "graphql-config": "^5.1.6", + "is-glob": "^4.0.1", + "jiti": "^2.3.0", + "json-to-pretty-yaml": "^1.2.2", + "listr2": "^10.2.1", + "log-symbols": "^7.0.0", + "micromatch": "^4.0.5", + "shell-quote": "^1.7.3", + "string-env-interpolation": "^1.0.1", + "ts-log": "^3.0.0", + "tslib": "^2.4.0", + "yaml": "^2.3.1", + "yargs": "^18.0.0" + }, + "bin": { + "gql-gen": "esm/bin.js", + "graphql-code-generator": "esm/bin.js", + "graphql-codegen": "esm/bin.js", + "graphql-codegen-cjs": "cjs/bin.js", + "graphql-codegen-esm": "esm/bin.js" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@parcel/watcher": "^2.1.0", + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@parcel/watcher": { + "optional": true + } + } + }, + "node_modules/@graphql-codegen/client-preset": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-6.1.0.tgz", + "integrity": "sha512-mGmBuwrOU5oRoaWFodx8g9xu1jecYIiydqvk88QsAIsyMcZwuoybs1lyne85TovpBHjH5CC2wnZGsbDQfcgOCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7", + "@graphql-codegen/add": "^7.1.0", + "@graphql-codegen/gql-tag-operations": "^6.1.0", + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-codegen/typed-document-node": "^7.1.0", + "@graphql-codegen/typescript": "^6.1.0", + "@graphql-codegen/typescript-operations": "^6.1.0", + "@graphql-codegen/visitor-plugin-common": "^7.2.0", + "@graphql-tools/documents": "^1.0.0", + "@graphql-tools/utils": "^11.2.0", + "@graphql-typed-document-node/core": "3.2.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", + "graphql-sock": "^1.0.0" + }, + "peerDependenciesMeta": { + "graphql-sock": { + "optional": true + } + } + }, + "node_modules/@graphql-codegen/core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-6.2.0.tgz", + "integrity": "sha512-RZadhhwYhuy2ZdIGK40vYVBMzXEFGkCC+58MUC/F2af/gKznEYNzHgmNBUBCk/BTklyUsNu0mIXmyGE4tTA0PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^11.2.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/gql-tag-operations": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-6.1.0.tgz", + "integrity": "sha512-AmMcZFwonufvWJnQm7I0lBxKpAm+35BcCrOOvUlBoviohiR17aPoTGAOaNAEtpcpI86lnZ9m9AXUdiKMdm8nnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-codegen/visitor-plugin-common": "^7.2.0", + "@graphql-tools/utils": "^11.2.0", + "auto-bind": "^5.0.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/plugin-helpers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-7.1.0.tgz", + "integrity": "sha512-ieJH7kZ5oSZKBPJs7CvHMrFY/CLYLklqv74ir93qMwRna6geZsbIMoJzTDBXohxcQTITiProiYSGrEtZjIpYGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.2.0", + "change-case-all": "^2.1.0", + "common-tags": "1.8.2", + "import-from": "4.0.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/schema-ast": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-6.1.0.tgz", + "integrity": "sha512-/xuGkM5gUNFRoaQLumKbENdX7Hc8ha49z9OXsEZY8E+46mMjqzXGF0NtCJ892cmoX7EUgI5c8T+LZqS2upx2Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-tools/utils": "^11.2.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/typed-document-node": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-7.1.0.tgz", + "integrity": "sha512-V6H+ItyqXtYY+JQb76LAoN627Xfzpn29/ifwCFAv61iEepzNzh86sa+yZclflr0G8LDmhcVY5hpPJd3a1qbOfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-codegen/visitor-plugin-common": "^7.2.0", + "auto-bind": "^5.0.0", + "change-case-all": "^2.1.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/typescript": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-6.1.0.tgz", + "integrity": "sha512-2Hu3111O/AwV28Ap7tNsixlmXSAJuQbQArQklx+IC/tNswpckZnCfmlcBtTJrGU1+mJXEneJXGfb2XWvKjbhlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-codegen/schema-ast": "^6.1.0", + "@graphql-codegen/visitor-plugin-common": "^7.2.0", + "auto-bind": "^5.0.0", + "tslib": "~2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-operations": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-6.1.0.tgz", + "integrity": "sha512-zv0ohBJqLP1G/Kgiq1MhLTdNmakChtJivpaMaBmuPz9gasKWJkc9MhxuVytF6xS27PkJOh81TNM9srAkqpdejA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-codegen/schema-ast": "^6.1.0", + "@graphql-codegen/visitor-plugin-common": "^7.2.0", + "auto-bind": "^5.0.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", + "graphql-sock": "^1.0.0" + }, + "peerDependenciesMeta": { + "graphql-sock": { + "optional": true + } + } + }, + "node_modules/@graphql-codegen/visitor-plugin-common": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-7.2.0.tgz", + "integrity": "sha512-qqtTY8taONuxlR0HvD8z+zgWC3CfJ47M2rATx+geWNIN8v8Itc5TflHYxjkWAtNL6E3q7WZRY5P7se+2S3EjBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-tools/optimize": "^2.0.0", + "@graphql-tools/relay-operation-optimizer": "^7.1.1", + "@graphql-tools/utils": "^11.2.0", + "auto-bind": "^5.0.0", + "change-case-all": "^2.1.0", + "dependency-graph": "^1.0.0", + "graphql-tag": "^2.11.0", + "parse-filepath": "^1.0.2", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-hive/signal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-hive/signal/-/signal-2.0.0.tgz", + "integrity": "sha512-Pz8wB3K0iU6ae9S1fWfsmJX24CcGeTo6hE7T44ucmV/ALKRj+bxClmqrYcDT7v3f0d12Rh4FAXBb6gon+WkDpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader": { + "version": "8.0.32", + "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.32.tgz", + "integrity": "sha512-717/RCJQd0RDuv50rqGtIR7KrAR2h/fWYhBeVnSq5zYPyMOVxpSCoB1dHYws3fFENar021mgHyGNcPwJO5Fb3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.2.0", + "@whatwg-node/fetch": "^0.10.13", + "sync-fetch": "0.6.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/batch-execute": { + "version": "10.0.9", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-10.0.9.tgz", + "integrity": "sha512-khIgAPlyaWJ3dVX6SsqOkABZCH1Gii32WHn3xMzavupsxPCfb/9G3zjdswptzTFrOcZ92dWo7MXvwNFkRfNN4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/promise-helpers": "^1.3.2", + "dataloader": "^2.2.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/code-file-loader": { + "version": "8.1.34", + "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.34.tgz", + "integrity": "sha512-MOyXRh94EvBVIhlS8kh3aRhQiOdPfiCZvfd7g5/t7cW3VMa+Z0sfuNI5r7E2VxXZkZUsJ6yRj56EwAPY5fR4Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.33", + "@graphql-tools/utils": "^11.2.0", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/delegate": { + "version": "12.0.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-12.0.19.tgz", + "integrity": "sha512-TFDKalXQub5dV7FO1y+3kwwJm337jwUFkTmXHlmYAtTZTxDuSVeHc74OfnepFe+6zEDriHqhHKvxSq5TpHCTvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/batch-execute": "^10.0.9", + "@graphql-tools/executor": "^1.4.13", + "@graphql-tools/schema": "^10.0.29", + "@graphql-tools/utils": "^11.0.0", + "@repeaterjs/repeater": "^3.0.6", + "@whatwg-node/promise-helpers": "^1.3.2", + "dataloader": "^2.2.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/documents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/documents/-/documents-1.0.1.tgz", + "integrity": "sha512-aweoMH15wNJ8g7b2r4C4WRuJxZ0ca8HtNO54rkye/3duxTkW4fGBEutCx03jCIr5+a1l+4vFJNP859QnAVBVCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.5.5.tgz", + "integrity": "sha512-JAdn4G+ehthnGdJABS+wO6LxAIcoGPiSRHIz1ECYLtaQGkpFIdqH6BLUbZcToX/W/nmOG0kTFLoepCGkugbsBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.2.0", + "@graphql-typed-document-node/core": "^3.2.0", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-common": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-1.0.6.tgz", + "integrity": "sha512-23/K5C+LSlHDI0mj2SwCJ33RcELCcyDUgABm1Z8St7u/4Z5+95i925H/NAjUyggRjiaY8vYtNiMOPE49aPX1sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@envelop/core": "^5.4.0", + "@graphql-tools/utils": "^11.0.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-graphql-ws": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-3.1.5.tgz", + "integrity": "sha512-WXRsfwu9AkrORD9nShrd61OwwxeQ5+eXYcABRR3XPONFIS8pWQfDJGGqxql9/227o/s0DV5SIfkBURb5Knzv+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-common": "^1.0.6", + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/disposablestack": "^0.0.6", + "graphql-ws": "^6.0.6", + "isows": "^1.0.7", + "tslib": "^2.8.1", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-http": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-3.3.0.tgz", + "integrity": "sha512-IkKXIjSg9U8MNsQUBVJAXE4+LSxaQ0cs7p5JTALLGDABY1o17vPDRwWALsX81AXD5dY27ihi/+OhGMueW/Fopg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-hive/signal": "^2.0.0", + "@graphql-tools/executor-common": "^1.0.6", + "@graphql-tools/utils": "^11.0.0", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/fetch": "^0.10.13", + "@whatwg-node/promise-helpers": "^1.3.2", + "meros": "^1.3.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-legacy-ws": { + "version": "1.1.30", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.1.30.tgz", + "integrity": "sha512-sCY1Fn5M7/1eMbFuvEwzGqAdjdkKECUWbaTO1lo3RQVyHC8HUYe/DB/tEoQfT7TQarauX9KjXsSf2uqCyJyOOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.2.0", + "@types/ws": "^8.0.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "ws": "^8.21.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/git-loader": { + "version": "8.0.38", + "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.38.tgz", + "integrity": "sha512-uY6/Mth0nv35Jg6VSwZA0x19oALxuLnS9wU9r6L1QUDqMQib5agvbSjUGwond8vDXM0U5ZeDDnuyvpGz9yMH5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.33", + "@graphql-tools/utils": "^11.2.0", + "is-glob": "4.0.3", + "micromatch": "^4.0.8", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/github-loader": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-9.1.4.tgz", + "integrity": "sha512-+ul7Y5f7a5r9nc0KWaDt+Rf0NdRzU3L4njvVURcZM2oxn2RcHIVLZQBMjglO/Q8vgC+IUBtQ7C0llgBOBHiQKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-http": "^3.3.0", + "@graphql-tools/graphql-tag-pluck": "^8.3.33", + "@graphql-tools/utils": "^11.2.0", + "@whatwg-node/fetch": "^0.10.13", + "@whatwg-node/promise-helpers": "^1.0.0", + "sync-fetch": "0.6.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-file-loader": { + "version": "8.1.16", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.1.16.tgz", + "integrity": "sha512-1OFMnmadqwAalty2nka8EpejM1T9QCgtNApGMTvIsz141y9lfK3Xj9lNTgsJk+u2kyjsEYyo3F+tc6wEqMdqTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/import": "^7.1.16", + "@graphql-tools/utils": "^11.2.0", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-tag-pluck": { + "version": "8.3.33", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.33.tgz", + "integrity": "sha512-12nfDKx1wpe5Zd2VhUCuZKaNzd0/ZQf1X5M8jHkRloGA61k+vr7dTDdlWrWcGDr1EufuoviL+e1UqGxD8D9PWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.7", + "@babel/parser": "^7.29.3", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "@graphql-tools/utils": "^11.2.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/import": { + "version": "7.1.16", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.1.16.tgz", + "integrity": "sha512-vx2v9qqiQF15RK3O68kaqSXDQ/++xU4qkcNBCME3Y82qLGsKNPNJT8alklWlAJAvFs7LrXrCr+ZqbidO4pYaxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.2.0", + "resolve-from": "5.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/json-file-loader": { + "version": "8.0.30", + "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.30.tgz", + "integrity": "sha512-Ij97Ij+Uz3hvuetRTLX8v/d3ZyT2i17nyZN1maCTHW3tOypUevnuW7TKJcX0rOCsiP0juIcnnG91hcKsBh0Ktw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.2.0", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/load": { + "version": "8.1.13", + "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.1.13.tgz", + "integrity": "sha512-XstLIkH2gDVk3xlzbfNyR+MFGTaCop2rJSEyShXTnIy4Sh+DoNM6re8eXzZPIOs+N33kuOWm6e0EGE9tGpHUNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/schema": "^10.0.36", + "@graphql-tools/utils": "^11.2.0", + "p-limit": "3.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/merge": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.2.0.tgz", + "integrity": "sha512-kChDH/sOxm3TCICup5NgTiz/aJBk+5GAuC0lfJS8FcRfsqZvlCkNwpsYTGAATBCJMrgZ9+csRugCjS97jPcNMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.2.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/optimize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-2.0.0.tgz", + "integrity": "sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/relay-operation-optimizer": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.1.6.tgz", + "integrity": "sha512-uh4ikON4vCb95M8pjGRckucCAm7eq6TB9FXP0zZByaSO6dFkTR1jKrOSWrJ2qx+IR8B6bVaR/Zst9vGs26ZjXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ardatan/relay-compiler": "^13.0.1", + "@graphql-tools/utils": "^11.2.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/schema": { + "version": "10.0.36", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.36.tgz", + "integrity": "sha512-g8S5aLirZInoi3NojzmBxwsZfVawOE0UBlVWYe8kDAR0FxS0riBDiyW7JnlAKayooHMRAMwGaze4RQU3VTTyig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/merge": "^9.2.0", + "@graphql-tools/utils": "^11.2.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/url-loader": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-9.1.4.tgz", + "integrity": "sha512-w65oPIvUxdJ8eSydIfG2jllbBY5+lijG1mCY22kpGcp/gqPUdH+L6TIr81ZeTZIWnV2DioSP7g3rLE4JGW6uyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-graphql-ws": "^3.1.4", + "@graphql-tools/executor-http": "^3.3.0", + "@graphql-tools/executor-legacy-ws": "^1.1.30", + "@graphql-tools/utils": "^11.2.0", + "@graphql-tools/wrap": "^11.1.1", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.10.13", + "@whatwg-node/promise-helpers": "^1.0.0", + "isomorphic-ws": "^5.0.0", + "sync-fetch": "0.6.0", + "tslib": "^2.4.0", + "ws": "^8.21.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/utils": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.2.0.tgz", + "integrity": "sha512-eu9h1R3j/wWc4rvmYJF5AKtlwniDzstrZ/c6KSz+HdI+n7I7iog9xyKmBfpUwSbG1TqPNZBzWjFMkzdYOKq6Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/wrap": { + "version": "11.1.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-11.1.18.tgz", + "integrity": "sha512-qSstY1hw8rY3bTvy8NlRrJ4QOLtPdo6ykiv4y9EHaeYtNO3TWiIs0nLbUZX2F9wKT/i7T1aMbVysfeQoNmJvdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/delegate": "^12.0.19", + "@graphql-tools/schema": "^10.0.29", + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/promise-helpers": "^1.3.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "license": "MIT", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@hookform/resolvers": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.2.tgz", + "integrity": "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==", + "license": "MIT", + "dependencies": { + "@standard-schema/utils": "^0.3.0" + }, + "peerDependencies": { + "react-hook-form": "^7.55.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@inquirer/ansi": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.7.tgz", + "integrity": "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.2.1.tgz", + "integrity": "sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz", + "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz", + "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.2.2.tgz", + "integrity": "sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/external-editor": "^3.0.3", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.1.1.tgz", + "integrity": "sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.2" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.7.tgz", + "integrity": "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + } + }, + "node_modules/@inquirer/input": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.1.2.tgz", + "integrity": "sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.1.1.tgz", + "integrity": "sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.1.1.tgz", + "integrity": "sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.5.2.tgz", + "integrity": "sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^5.2.1", + "@inquirer/confirm": "^6.1.1", + "@inquirer/editor": "^5.2.2", + "@inquirer/expand": "^5.1.1", + "@inquirer/input": "^5.1.2", + "@inquirer/number": "^4.1.1", + "@inquirer/password": "^5.1.1", + "@inquirer/rawlist": "^5.3.1", + "@inquirer/search": "^4.2.1", + "@inquirer/select": "^5.2.1" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.3.1.tgz", + "integrity": "sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.2.1.tgz", + "integrity": "sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.2.1.tgz", + "integrity": "sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.7.tgz", + "integrity": "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@internationalized/date": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.1.tgz", + "integrity": "sha512-6IedsVWXyq4P9Tj+TxuU8WGWM70hYLl12nbYU8jkikVpa6WXapFazPUcHUMDMoWftIDE2ILDkFFte6W2nFCkRQ==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", + "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", + "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@react-leaflet/core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-3.0.0.tgz", + "integrity": "sha512-3EWmekh4Nz+pGcr+xjf0KNyYfC3U2JjnkWsh0zcqaexYqmmB5ZhH37kz41JXGmKzpaMZCnPofBBm64i+YrEvGQ==", + "license": "Hippocratic-2.1", + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + } + }, + "node_modules/@repeaterjs/repeater": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.1.0.tgz", + "integrity": "sha512-TaoVksZRSx2KWYYpyLQtMQXXeS98VsgZImzW65xmiVgbYhXLk+aEsmzPLirqVuE4/XuUapH2iMtxUzaBNDzdSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz", + "integrity": "sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.17.tgz", + "integrity": "sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.17.tgz", + "integrity": "sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.17.tgz", + "integrity": "sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.17.tgz", + "integrity": "sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.17.tgz", + "integrity": "sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.17.tgz", + "integrity": "sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.17.tgz", + "integrity": "sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.17.tgz", + "integrity": "sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.17.tgz", + "integrity": "sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.17.tgz", + "integrity": "sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.7", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", + "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.21.tgz", + "integrity": "sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tabby_ai/hijri-converter": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@tabby_ai/hijri-converter/-/hijri-converter-1.0.5.tgz", + "integrity": "sha512-r5bClKrcIusDoo049dSL8CawnHR6mRdDwhlQuIgZRNty68q0x8k3Lf1BtPAMxRf/GgnHBnIO4ujd3+GQdLWzxQ==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@tanstack/react-table": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz", + "integrity": "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.21.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", + "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/leaflet": { + "version": "1.9.21", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.21.tgz", + "integrity": "sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/node": { + "version": "24.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", + "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.0.tgz", + "integrity": "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.0", + "@typescript-eslint/type-utils": "8.59.0", + "@typescript-eslint/utils": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.0.tgz", + "integrity": "sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz", + "integrity": "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.59.0", + "@typescript-eslint/types": "^8.59.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.0.tgz", + "integrity": "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz", + "integrity": "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.0.tgz", + "integrity": "sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0", + "@typescript-eslint/utils": "8.59.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz", + "integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz", + "integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.59.0", + "@typescript-eslint/tsconfig-utils": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.0.tgz", + "integrity": "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz", + "integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.3.0.tgz", + "integrity": "sha512-bdyo8rB3NnQbikdMpHaML9Z1OZPBu6fFOBo+OtxsBlvMJtysWskmBcnbIDhUqgC8tcxNv/a+BcV5U+2nQMm1OQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", + "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.7" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/@whatwg-node/disposablestack": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@whatwg-node/disposablestack/-/disposablestack-0.0.6.tgz", + "integrity": "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/fetch": { + "version": "0.10.13", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.10.13.tgz", + "integrity": "sha512-b4PhJ+zYj4357zwk4TTuF2nEe0vVtOrwdsrNo5hL+u1ojXNhh1FgJ6pg1jzDlwlT4oBdzfSwaBwMCtFCsIWg8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/node-fetch": "^0.8.3", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/node-fetch": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.8.6.tgz", + "integrity": "sha512-BDMdYFcerLQkwA2RTldxOqRCs6ZQD1S7UgP3pUdGUkcbgTrP/V5ko77ZkCww9DHmC4lpoYuwigGfQYj285gMvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^3.1.1", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/promise-helpers": "^1.3.2", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/promise-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.3.2.tgz", + "integrity": "sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@wry/caches": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@wry/caches/-/caches-1.0.1.tgz", + "integrity": "sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/context": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.4.tgz", + "integrity": "sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/equality": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.7.tgz", + "integrity": "sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/trie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.5.0.tgz", + "integrity": "sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/auto-bind": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", + "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.43", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.43.tgz", + "integrity": "sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.6.tgz", + "integrity": "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.42", + "caniuse-lite": "^1.0.30001803", + "electron-to-chromium": "^1.5.389", + "node-releases": "^2.0.51", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001805", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001805.tgz", + "integrity": "sha512-52noaS3DubycKSXaU30TwPGIp+POyQSUVa5jBEq3vkRkY0kjyb3LQgvhU6WGyCcyXqVLWO0Cw0Q6BSdD0kUfVA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/change-case-all": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-2.1.0.tgz", + "integrity": "sha512-v6b0WWWkZUMHVuYk82l+WROgkUm4qEN2w5hKRNWtEOYwWqUGoi8C6xH0l1RLF1EoWqDFK6MFclmN3od6ws3/uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "change-case": "^5.2.0", + "sponge-case": "^2.0.2", + "swap-case": "^3.0.2", + "title-case": "^3.0.3" + } + }, + "node_modules/chardet": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", + "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-inspect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.1.tgz", + "integrity": "sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/dataloader": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.3.tgz", + "integrity": "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/date-fns-jalali": { + "version": "4.1.0-0", + "resolved": "https://registry.npmjs.org/date-fns-jalali/-/date-fns-jalali-4.1.0-0.tgz", + "integrity": "sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-3.0.0.tgz", + "integrity": "sha512-64byRbF0/AirwbuHqB3/ZpMG9/nckDa6ZA0yd6UnaQNwbbemCOwvz2sL5sjXLHhZHADyiwLm0M5qMhltUUx+TA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/detect-indent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", + "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/echarts": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz", + "integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "6.0.0" + } + }, + "node_modules/echarts-for-react": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/echarts-for-react/-/echarts-for-react-3.0.6.tgz", + "integrity": "sha512-4zqLgTGWS3JvkQDXjzkR1k1CHRdpd6by0988TWMJgnvDytegWLbeP/VNZmMa+0VJx2eD7Y632bi2JquXDgiGJg==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "size-sensor": "^1.0.1" + }, + "peerDependencies": { + "echarts": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "react": "^15.0.0 || >=16.0.0" + } + }, + "node_modules/echarts/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.391", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.391.tgz", + "integrity": "sha512-YmCu4856jkgKT1Nh6fwRdeVrM6Ydf/fBnq51tpmSfX+jOcUMTxh31yH6hjKScRenhB2oDSvA9oooxcpjogPeig==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.2.1.tgz", + "integrity": "sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.5.5", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz", + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/framer-motion": { + "version": "12.40.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.40.0.tgz", + "integrity": "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.40.0", + "motion-utils": "^12.39.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "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/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz", + "integrity": "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphql": { + "version": "16.13.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.2.tgz", + "integrity": "sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/graphql-config": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-5.1.6.tgz", + "integrity": "sha512-fCkYnm4Kdq3un0YIM4BCZHVR5xl0UeLP6syxxO7KAstdY7QVyVvTHP0kRPDYEP1v08uwtJVgis5sj3IOTLOniQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/graphql-file-loader": "^8.0.0", + "@graphql-tools/json-file-loader": "^8.0.0", + "@graphql-tools/load": "^8.1.0", + "@graphql-tools/merge": "^9.0.0", + "@graphql-tools/url-loader": "^9.0.0", + "@graphql-tools/utils": "^11.0.0", + "cosmiconfig": "^8.1.0", + "jiti": "^2.0.0", + "minimatch": "^10.0.0", + "string-env-interpolation": "^1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "cosmiconfig-toml-loader": "^1.0.0", + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "cosmiconfig-toml-loader": { + "optional": true + } + } + }, + "node_modules/graphql-config/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/graphql-tag": { + "version": "2.12.6", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", + "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/graphql-ws": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.1.0.tgz", + "integrity": "sha512-7ft6KWkuaLnLABwzEIimjUMeF0iByo2ThD6q0MICgsvp6nDuT5ppubKzEHniu8Kmlp5GNsLgr5dil8JMrIwUEQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@fastify/websocket": "^10 || ^11", + "crossws": "~0.3", + "graphql": "^15.10.1 || ^16 || ^17", + "ws": "^8" + }, + "peerDependenciesMeta": { + "@fastify/websocket": { + "optional": true + }, + "crossws": { + "optional": true + }, + "ws": { + "optional": true + } + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", + "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/isows": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", + "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-to-pretty-yaml": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz", + "integrity": "sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "remedial": "^1.0.7", + "remove-trailing-spaces": "^1.0.6" + }, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "license": "BSD-2-Clause" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-10.2.2.tgz", + "integrity": "sha512-JtNtbZj8q5BnDMR7trpwvwk3RIrANtIVzEUm8w7amp6xelLgyuq+4WZoTH913XaQAoH/cNdYhaNzBPA2U3xbDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.2.0", + "eventemitter3": "^5.0.4", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^10.0.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.9.0.tgz", + "integrity": "sha512-6qVAmbgCjcJz7sAGSPSSJ++RAwjlK2XCbRrZKv63Ciko1KT8jX0//CXxgI3jg2HlJu8tADqdYlNDebmYjeoruA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/meros": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/meros/-/meros-1.3.2.tgz", + "integrity": "sha512-Q3mobPbvEx7XbwhnC1J1r60+5H6EZyNccdzSz0eGexJRwouUtTZxPVRGdqKtxlpD84ScK4+tIGldkqDtCKdI0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=13" + }, + "peerDependencies": { + "@types/node": ">=13" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/motion-dom": { + "version": "12.40.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.40.0.tgz", + "integrity": "sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.39.0" + } + }, + "node_modules/motion-utils": { + "version": "12.39.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz", + "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz", + "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT", + "optional": true + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-releases": { + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-wheel": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", + "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==", + "license": "BSD-3-Clause" + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optimism": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.1.tgz", + "integrity": "sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ==", + "license": "MIT", + "dependencies": { + "@wry/caches": "^1.0.0", + "@wry/context": "^0.7.0", + "@wry/trie": "^0.5.0", + "tslib": "^2.3.0" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", + "dev": true, + "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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode.react": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-4.2.0.tgz", + "integrity": "sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", + "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-day-picker": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-9.14.0.tgz", + "integrity": "sha512-tBaoDWjPwe0M5pGrum4H0SR6Lyk+BO9oHnp9JbKpGKW2mlraNPgP9BMfsg5pWpwrssARmeqk7YBl2oXutZTaHA==", + "license": "MIT", + "dependencies": { + "@date-fns/tz": "^1.4.1", + "@tabby_ai/hijri-converter": "1.0.5", + "date-fns": "^4.1.0", + "date-fns-jalali": "4.1.0-0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.5" + } + }, + "node_modules/react-easy-crop": { + "version": "5.5.7", + "resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-5.5.7.tgz", + "integrity": "sha512-kYo4NtMeXFQB7h1U+h5yhUkE46WQbQdq7if54uDlbMdZHdRgNehfvaFrXnFw5NR1PNoUOJIfTwLnWmEx/MaZnA==", + "license": "MIT", + "dependencies": { + "normalize-wheel": "^1.0.1", + "tslib": "^2.0.1" + }, + "peerDependencies": { + "react": ">=16.4.0", + "react-dom": ">=16.4.0" + } + }, + "node_modules/react-hook-form": { + "version": "7.73.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.73.1.tgz", + "integrity": "sha512-VAfVYOPcx3piiEVQy95vyFmBwbVUsP/AUIN+mpFG8h11yshDd444nn0VyfaGWSRnhOLVgiDu7HIuBtAIzxn9dA==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-leaflet": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-5.0.0.tgz", + "integrity": "sha512-CWbTpr5vcHw5bt9i4zSlPEVQdTVcML390TjeDG0cK59z1ylexpqC6M1PJFjV8jD7CF+ACBFsLIDs6DRMoLEofw==", + "license": "Hippocratic-2.1", + "dependencies": { + "@react-leaflet/core": "^3.0.0" + }, + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.2.tgz", + "integrity": "sha512-yCqNne6I8IB6rVCH7XUvlBK7/QKyqypBFGv+8dj4QBFJiiRX+FG7/nkdAvGElyvVZ/HQP5N19wzteuTARXi5Gw==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.14.2.tgz", + "integrity": "sha512-YZcM5ES8jJSM+KrJ9BdvHHqlnGTg5tH3sC5ChFRj4inosKctdyzBDhOyyHdGk597q2OT6NTrCA1OvB/YDwfekQ==", + "license": "MIT", + "dependencies": { + "react-router": "7.14.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/remedial": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/remedial/-/remedial-1.0.8.tgz", + "integrity": "sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "engines": { + "node": "*" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true, + "license": "ISC" + }, + "node_modules/remove-trailing-spaces": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/remove-trailing-spaces/-/remove-trailing-spaces-1.0.9.tgz", + "integrity": "sha512-xzG7w5IRijvIkHIjDk65URsJJ7k4J95wmcArY5PRcmjldIOl7oTvG8+X2Ag690R7SfwiOcHrWZKVc1Pp5WIOzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.17.tgz", + "integrity": "sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.127.0", + "@rolldown/pluginutils": "1.0.0-rc.17" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.17", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.17", + "@rolldown/binding-darwin-x64": "1.0.0-rc.17", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.17", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.17", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.17", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.17", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.17", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.17", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.17", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.17.tgz", + "integrity": "sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==", + "dev": true, + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.99.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz", + "integrity": "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==", + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", + "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simplebar": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/simplebar/-/simplebar-6.3.3.tgz", + "integrity": "sha512-ni9cIiA8GRitiaenV7A/gh8nTStiVqO3gLxrfCMmq6CSy/pB+fz+QxqvJLo142QHb2Tvgvr8ILwZxf3qzAq7pg==", + "license": "MIT", + "dependencies": { + "simplebar-core": "^1.3.2" + } + }, + "node_modules/simplebar-core": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/simplebar-core/-/simplebar-core-1.3.2.tgz", + "integrity": "sha512-qKgTTuTqapjsFGkNhCjyPhysnbZGpQqNmjk0nOYjFN5ordC/Wjvg+RbYCyMSnW60l/Z0ZS82GbNltly6PMUH1w==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21", + "lodash-es": "^4.17.21" + } + }, + "node_modules/simplebar-react": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/simplebar-react/-/simplebar-react-3.3.2.tgz", + "integrity": "sha512-ZsgcQhKLtt5ra0BRIJeApfkTBQCa1vUPA/WXI4HcYReFt+oCEOvdVz6rR/XsGJcKxTlCRPmdGx1uJIUChupo+A==", + "license": "MIT", + "dependencies": { + "simplebar-core": "^1.3.2" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/size-sensor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/size-sensor/-/size-sensor-1.0.3.tgz", + "integrity": "sha512-+k9mJ2/rQMiRmQUcjn+qznch260leIXY8r4FyYKKyRBO/s5UoeMAHGkCJyE1R/4wrIhTJONfyloY55SkE7ve3A==", + "license": "ISC" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "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/sponge-case": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/sponge-case/-/sponge-case-2.0.3.tgz", + "integrity": "sha512-i4h9ZGRfxV6Xw3mpZSFOfbXjf0cQcYmssGWutgNIfFZ2VM+YIWfD71N/kjjwK6X/AAHzBr+rciEcn/L34S8TGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-env-interpolation": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz", + "integrity": "sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/swap-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-3.0.3.tgz", + "integrity": "sha512-6p4op8wE9CQv7uDFzulI6YXUw4lD9n4oQierdbFThEKVWVQcbQcUjdP27W8XE7V4QnWmnq9jueSHceyyQnqQVA==", + "dev": true, + "license": "MIT" + }, + "node_modules/sync-fetch": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.6.0.tgz", + "integrity": "sha512-IELLEvzHuCfc1uTsshPK58ViSdNqXxlml1U+fmwJIKLYKOr/rAtBrorE2RYm5IHaMpDNlmC0fr1LAvdXvyheEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^3.3.2", + "timeout-signal": "^2.0.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/timeout-signal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timeout-signal/-/timeout-signal-2.0.0.tgz", + "integrity": "sha512-YBGpG4bWsHoPvofT6y/5iqulfXIiIErl5B0LdtHT1mGXDFTAhhRrbUpTvBgYbovr+3cKblya2WAOcpoy90XguA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/title-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", + "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-log": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/ts-log/-/ts-log-3.0.2.tgz", + "integrity": "sha512-esq6hx2lM66sQV1YcFkIYTqrWWabmqBqobKHyn1CswdI5FgfQhkmiKiRWVGBNlIbdjBxEIkNvMIwLKKPgRYZLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20", + "npm": ">=10" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.0.tgz", + "integrity": "sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.59.0", + "@typescript-eslint/parser": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0", + "@typescript-eslint/utils": "8.59.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unixify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", + "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "normalize-path": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/vite": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.10.tgz", + "integrity": "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.10", + "rolldown": "1.0.0-rc.17", + "tinyglobby": "^0.2.16" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "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/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-10.0.0.tgz", + "integrity": "sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "string-width": "^8.2.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", + "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/zrender": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-6.0.0.tgz", + "integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } + }, + "node_modules/zrender/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, + "node_modules/zustand": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.12.tgz", + "integrity": "sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..068ea76 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,62 @@ +{ + "name": "fleet-ble-monitor", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --host 192.168.1.91", + "graphql:codegen": "graphql-codegen --config codegen.ts", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@apollo/client": "^4.1.9", + "@hookform/resolvers": "^5.2.2", + "@internationalized/date": "^3.12.1", + "@radix-ui/react-accordion": "^1.2.12", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-popover": "^1.1.15", + "@tanstack/react-table": "^8.21.3", + "date-fns": "^4.1.0", + "echarts": "^6.0.0", + "echarts-for-react": "^3.0.6", + "framer-motion": "^12.40.0", + "graphql": "^16.13.2", + "leaflet": "^1.9.4", + "lucide-react": "^1.9.0", + "qrcode.react": "^4.2.0", + "react": "^19.2.5", + "react-day-picker": "^9.14.0", + "react-dom": "^19.2.5", + "react-easy-crop": "^5.5.7", + "react-hook-form": "^7.73.1", + "react-leaflet": "^5.0.0", + "react-router-dom": "^7.14.2", + "sass": "^1.99.0", + "simplebar": "^6.3.3", + "simplebar-react": "^3.3.2", + "zod": "^4.3.6", + "zustand": "^5.0.12" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@graphql-codegen/cli": "^7.2.0", + "@graphql-codegen/client-preset": "^6.1.0", + "@graphql-typed-document-node/core": "^3.2.0", + "@types/leaflet": "^1.9.21", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-basic-ssl": "^2.3.0", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^10.2.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.5.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.2", + "vite": "^8.0.10" + } +} diff --git a/frontend/public/devices/армафон3.3+.webp b/frontend/public/devices/армафон3.3+.webp new file mode 100644 index 0000000000000000000000000000000000000000..c526803a29f16a728bae682cd9a09f15190d6fdf GIT binary patch literal 30714 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 literal 0 HcmV?d00001 diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg new file mode 100644 index 0000000..7ea007a --- /dev/null +++ b/frontend/public/favicon.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/frontend/public/photo_2025-03-29_20-05-51.jpg b/frontend/public/photo_2025-03-29_20-05-51.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bfcaa5f8e009526833330b96ba6724dd57014bc3 GIT binary patch literal 115439 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 z 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¬z_VP^b@Faj&GL^7%Dn% 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 literal 0 HcmV?d00001 diff --git a/frontend/src/App.scss b/frontend/src/App.scss new file mode 100644 index 0000000..1114bd7 --- /dev/null +++ b/frontend/src/App.scss @@ -0,0 +1,186 @@ +@use './shared/styles/variables' as *; + +.counter { + font-size: $font-size-16; + padding: 5px 10px; + border-radius: 5px; + color: var(--accent); + background: var(--accent-bg); + border: 2px solid $transparent; + transition: border-color 0.3s; + margin-bottom: 24px; + + &:hover { + border-color: var(--accent-border); + } + &:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; + } +} + +.hero { + position: relative; + + .base, + .framework, + .vite { + inset-inline: 0; + margin: 0 auto; + } + + .base { + width: 170px; + position: relative; + z-index: 0; + } + + .framework, + .vite { + position: absolute; + } + + .framework { + z-index: 1; + top: 34px; + height: 28px; + transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg) + scale(1.4); + } + + .vite { + z-index: 0; + top: 107px; + height: 26px; + width: auto; + transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg) + scale(0.8); + } +} + +#center { + display: flex; + flex-direction: column; + gap: 25px; + place-content: center; + place-items: center; + flex-grow: 1; + + @media (max-width: 1024px) { + padding: 32px 20px 24px; + gap: 18px; + } +} + +#next-steps { + display: flex; + border-top: 1px solid var(--border); + text-align: left; + + & > div { + flex: 1 1 0; + padding: 32px; + @media (max-width: 1024px) { + padding: 24px 20px; + } + } + + .icon { + margin-bottom: 16px; + width: 22px; + height: 22px; + } + + @media (max-width: 1024px) { + flex-direction: column; + text-align: center; + } +} + +#docs { + border-right: 1px solid var(--border); + + @media (max-width: 1024px) { + border-right: none; + border-bottom: 1px solid var(--border); + } +} + +#next-steps ul { + list-style: none; + padding: 0; + display: flex; + gap: 8px; + margin: 32px 0 0; + + .logo { + height: 18px; + } + + a { + color: var(--text-h); + font-size: $font-size-16; + border-radius: 6px; + background: var(--social-bg); + display: flex; + padding: 6px 12px; + align-items: center; + gap: 8px; + text-decoration: none; + transition: box-shadow 0.3s; + + &:hover { + box-shadow: var(--shadow); + } + .button-icon { + height: 18px; + width: 18px; + } + } + + @media (max-width: 1024px) { + margin-top: 20px; + flex-wrap: wrap; + justify-content: center; + + li { + flex: 1 1 calc(50% - 8px); + } + + a { + width: 100%; + justify-content: center; + box-sizing: border-box; + } + } +} + +#spacer { + height: 88px; + border-top: 1px solid var(--border); + @media (max-width: 1024px) { + height: 48px; + } +} + +.ticks { + position: relative; + width: 100%; + + &::before, + &::after { + content: ''; + position: absolute; + top: -4.5px; + border: 5px solid $transparent; + } + + &::before { + left: 0; + border-left-color: var(--border); + } + &::after { + right: 0; + border-right-color: var(--border); + } +} diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx new file mode 100644 index 0000000..30b7f0a --- /dev/null +++ b/frontend/src/App.tsx @@ -0,0 +1,21 @@ +//import reactLogo from './assets/react.svg' +//import viteLogo from './assets/vite.svg' +//import heroImg from './assets/hero.png' +import './App.scss' + +function App() { + //const [count, setCount] = useState(0) + + return ( + <> +
+ +
+ +
+
+ + ) +} + +export default App diff --git a/frontend/src/app/layouts/AppLayout.scss b/frontend/src/app/layouts/AppLayout.scss new file mode 100644 index 0000000..cadcbce --- /dev/null +++ b/frontend/src/app/layouts/AppLayout.scss @@ -0,0 +1,288 @@ +@use '../../shared/styles/variables' as *; + +.app-layout { + display: flex; + width: 100%; + min-width: 0; + height: 100vh; + min-height: 100vh; + overflow: hidden; + background: + radial-gradient( + 52% 42% at 16% 18%, + rgba(45, 140, 255, 0.055) 0%, + transparent 72% + ), + radial-gradient( + 50% 42% at 88% 16%, + rgba(3, 29, 154, 0.055) 0%, + transparent 74% + ), + radial-gradient( + 54% 44% at 14% 80%, + rgba(51, 179, 67, 0.06) 0%, + transparent 72% + ), + radial-gradient( + 56% 46% at 86% 78%, + rgba(66, 93, 232, 0.075) 0%, + transparent 74% + ), + radial-gradient( + 74% 44% at 50% 106%, + rgba(3, 29, 154, 0.075) 0%, + rgba(66, 93, 232, 0.04) 42%, + transparent 78% + ), + linear-gradient( + 180deg, + #eff2f7 0%, + #f8fafc 40%, + #f4f7fb 70%, + #eff2f7 100% + ); + + [data-theme='dark'] & { + --color-bg: #242a33; + + background: + radial-gradient( + 54% 46% at 16% 18%, + rgba(45, 140, 255, 0.085) 0%, + transparent 72% + ), + radial-gradient( + 52% 44% at 86% 16%, + rgba(99, 102, 241, 0.085) 0%, + transparent 72% + ), + radial-gradient( + 54% 44% at 14% 78%, + rgba(24, 184, 155, 0.07) 0%, + transparent 72% + ), + radial-gradient( + 58% 48% at 86% 78%, + rgba(45, 140, 255, 0.095) 0%, + transparent 74% + ), + radial-gradient( + 76% 46% at 50% 106%, + rgba(45, 140, 255, 0.16) 0%, + rgba(72, 96, 180, 0.085) 42%, + transparent 78% + ), + linear-gradient( + 180deg, + #242a33 0%, + #242a33 12%, + #222832 18%, + #1f252e 30%, + #1d232c 55%, + #171b22 100% + ); + } +} + +.app-layout__sidebar { + flex: 0 0 auto; +} + +.app-layout__content { + display: flex; + flex-direction: column; + flex: 1; + min-width: 0; + min-height: 0; + height: 100vh; + max-height: 100vh; + //padding: 0px 20px 20px 20px; +} + +.app-layout__scroll { + flex: 1 1 auto; + width: 100%; + height: 100%; + min-width: 0; + min-height: 0; + + .simplebar-content { + min-height: 100%; + box-sizing: border-box; + padding: + $layout-page-padding-top + $layout-page-padding-right + $layout-page-padding-bottom + $layout-page-padding-left; + + display: flex; + flex-direction: column; + } + + .simplebar-track.simplebar-vertical { + top: 74px; + right: -8px; + bottom: 8px; + width: 16px; + } + + .simplebar-scrollbar::before { + background: $gray50; + border-radius: 8px; + opacity: 0.65; + } +} + +.app-layout__route-content { + display: flex; + flex: 1 0 auto; + min-width: 0; + min-height: 0; + flex-direction: column; +} + +.app-layout__unsupported { + display: none !important; +} + +.app-layout__drawer-overlay { + position: fixed; + inset: 0; + z-index: 800; + background: $color-backdrop-soft; + backdrop-filter: blur(4px); + + &[data-state='open'] { + animation: appLayoutDrawerOverlayShow 0.18s ease both; + } + + &[data-state='closed'] { + animation: appLayoutDrawerOverlayHide 0.18s ease both; + } +} + +.app-layout__drawer { + position: fixed; + inset: 0 auto 0 0; + z-index: 801; + margin: 10px; + width: min(320px, calc(100vw - 32px)); + padding: 0; + border: none; + border-radius: 20px; + //background: $color-bg; + box-shadow: $shadow-modal-dark; + overflow: hidden; + + &[data-state='open'] { + animation: appLayoutDrawerShow 0.24s cubic-bezier(0.34, 1.02, 0.64, 1) both; + } + + &[data-state='closed'] { + animation: appLayoutDrawerHide 0.2s cubic-bezier(0.4, 0, 0.2, 1) both; + } +} + +.app-layout__drawer-scroll { + width: 100%; + height: 100%; + max-height: 100%; + + .simplebar-track.simplebar-vertical { + width: 10px; + right: 2px; + } + + .simplebar-scrollbar::before { + background: $gray50; + opacity: 0.55; + } +} + +.app-layout__drawer-title { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +@include wide-down { + .app-layout__sidebar { + display: none; + } + + .app-layout__content { + height: 100vh; + max-height: 100vh; + box-sizing: border-box; + } +} + +@media (max-width: 1279.98px) { + .app-layout { + min-height: 100vh; + } + + .app-layout__sidebar, + .app-layout__content, + .app-layout__drawer-overlay, + .app-layout__drawer { + display: none; + } + + .app-layout__unsupported { + display: flex !important; + min-height: 100vh !important; + padding: 32px !important; + background: $color-bg; + } +} + +@keyframes appLayoutDrawerOverlayShow { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes appLayoutDrawerOverlayHide { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +@keyframes appLayoutDrawerShow { + from { + opacity: 0; + transform: translateX(-16px); + } + + to { + opacity: 1; + transform: translateX(0); + } +} + +@keyframes appLayoutDrawerHide { + from { + opacity: 1; + transform: translateX(0); + } + + to { + opacity: 0; + transform: translateX(-16px); + } +} diff --git a/frontend/src/app/layouts/AppLayout.tsx b/frontend/src/app/layouts/AppLayout.tsx new file mode 100644 index 0000000..d901847 --- /dev/null +++ b/frontend/src/app/layouts/AppLayout.tsx @@ -0,0 +1,99 @@ +import { + useEffect, + useRef, + useState, + type Dispatch, + type SetStateAction, +} from 'react' +import { Outlet } from 'react-router-dom' +import * as Dialog from '@radix-ui/react-dialog' +import SimpleBar from 'simplebar-react' +import type SimpleBarCore from 'simplebar-core' +import 'simplebar-react/dist/simplebar.min.css' +import { Sidebar } from '../../widgets/Sidebar/Sidebar' +import './AppLayout.scss' +import { Navbar } from '../../widgets/Navbar/Navbar' +import { EmptyState } from '../../shared/ui/EmptyState/EmptyState' +import type { NavbarBreadcrumb } from '../../widgets/Navbar/Navbar' + +export type AppLayoutOutletContext = { + setNavbarBreadcrumbs: Dispatch> +} + +export function AppLayout() { + const [isSidebarDrawerOpen, setIsSidebarDrawerOpen] = useState(false) + const contentScrollRef = useRef(null) + const [isContentScrolled, setIsContentScrolled] = useState(false) + const [navbarBreadcrumbs, setNavbarBreadcrumbs] = useState< + NavbarBreadcrumb[] + >([]) + + useEffect(() => { + const scrollElement = contentScrollRef.current?.getScrollElement() + + if (!scrollElement) return undefined + const scrollContainer = scrollElement + + function handleScroll() { + setIsContentScrolled(scrollContainer.scrollTop > 0) + } + + handleScroll() + scrollContainer.addEventListener('scroll', handleScroll, { + passive: true, + }) + + return () => { + scrollContainer.removeEventListener('scroll', handleScroll) + } + }, []) + + return ( +
+
+ +
+ +
+ + setIsSidebarDrawerOpen(true)} + /> +
+ +
+
+
+ + + + + + + Навигация + + + + setIsSidebarDrawerOpen(false)} + /> + + + + + + +
+ ) +} diff --git a/frontend/src/app/router/router.tsx b/frontend/src/app/router/router.tsx new file mode 100644 index 0000000..99f79ce --- /dev/null +++ b/frontend/src/app/router/router.tsx @@ -0,0 +1,68 @@ +// src/app/router/router.tsx +import { lazy, Suspense, type ReactNode } from 'react' +import { createBrowserRouter, Navigate } from 'react-router-dom' + +import { AppLayout } from '../layouts/AppLayout' + +const EmployeesPage = lazy(() => + import('../../pages/EmployeesPage/EmployeesPage').then((module) => ({ + default: module.EmployeesPage, + })), +) + +const MachinesPage = lazy(() => + import('../../pages/MachinesPage/MachinesPage').then((module) => ({ + default: module.MachinesPage, + })), +) + +const MachinePage = lazy(() => + import('../../pages/MachinePage/MachinePage').then((module) => ({ + default: module.MachinePage, + })), +) + +function lazyRoute(element: ReactNode) { + return {element} +} + +export const router = createBrowserRouter([ + { + path: '/', + element: , + children: [ + { + index: true, + element: , + }, + { + path: 'users', + element: lazyRoute(), + }, + { + path: 'machines', + element: lazyRoute(), + }, + { + path: 'machines/:machineId', + element: lazyRoute(), + }, + { + path: 'employees', + element: , + }, + { + path: 'devices/*', + element: , + }, + { + path: 'map', + element: , + }, + { + path: '*', + element: , + }, + ], + }, +]) diff --git a/frontend/src/assets/Logo.svg b/frontend/src/assets/Logo.svg new file mode 100644 index 0000000..529828a --- /dev/null +++ b/frontend/src/assets/Logo.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/LogoIcon.svg b/frontend/src/assets/LogoIcon.svg new file mode 100644 index 0000000..7ea007a --- /dev/null +++ b/frontend/src/assets/LogoIcon.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/LogoIconWhite.svg b/frontend/src/assets/LogoIconWhite.svg new file mode 100644 index 0000000..a8611c7 --- /dev/null +++ b/frontend/src/assets/LogoIconWhite.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/LogoWhite.svg b/frontend/src/assets/LogoWhite.svg new file mode 100644 index 0000000..5e584aa --- /dev/null +++ b/frontend/src/assets/LogoWhite.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/empty_state.svg b/frontend/src/assets/empty_state.svg new file mode 100644 index 0000000..f753506 --- /dev/null +++ b/frontend/src/assets/empty_state.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/frontend/src/assets/fonts/Montserrat-VariableFont_wght.ttf b/frontend/src/assets/fonts/Montserrat-VariableFont_wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..451e69288c17eb9823f8e96f1a2b9621094d2668 GIT binary patch literal 688600 zcmeFZbwE_l_b_~B?(W{*rMqF5r5h9lMFA-hm6ot52?J2EMN!PPyF0L5Ozg()kKGuc zVqox5QF+eY1>^Je`+J_x`#$e~@1DKqPMn!JbLLFmnE?U-#)x=O6c!v3x+|ag3ZVW0 zK%+%iRAlV1q68Zd%s33pTjQ|U_%?|~n>GQ=$N*?9Y1=6IMA z&b9y){UJ0m*4=C9>~79z$1so*8y6V&>D~1dOiYOOvebd8{dP=!h>4R=X!lC*lbWxs zF4&E6c>rkkPDlSi5o-<5e>VDCqz^2RXlw9u02p<&56{fc>QiB|G#S8QF@VE~KjBjC9?;)89xBc>fv`44v$yrE0(q}|GFg}xkNotziBQ-;I z{RXB-U68(6HaZA9YWGIsztC=z-KSvilS^t>0kWn8IR4c;FFkeNC~wTa5Av&D-6wT$ zzJ|Z{Xr$kP^pf1vK0U5X*U1DBWaA^x&+A{1k{*=~aB&Q>KP10jk9@a-E0G!AVGOel z2$1@E(84!bK@+r=LjVZ)3_~b&=d(Qa^Jh2o;{3$}pa3b8Km-(X=ne~!YeuUW%MoKi z37o3uW15!Vw`7=zYL2^cML0Ld~Ba0>K+ zrk4Yd5BzaqL;yEz3thTv`F#X6RlIj=VH4;5xY?{e-{s$1VtV({DnQOuKUG>nw43)Y z=$FSi4$jUhz?YI&P*=umju=Cj)dnb^0L&0la1RmbYFXl&NAn>AFke(o6VV=_dXsM8 zMVg`g$8R~%`T(#Q*60x5K2XACvyQ6d!iy&-BtYhI{*+Jm<4XbzeTL8ehQ}HhfckHZ zPkrn9Z=9dX4*Cds2tTpP<)7{vNTbz2t@9(4Cg?VVG^QSy6Fyn5lz=womY|Oa#DlW3 z3ox(1Jq&7#QdDXxJ5eVZXgY;%nnVk+3qIOJ2Qlg;(It9_Kj5QJI9*0b5kq2xCd?-> zCMFo81Wl&IOcgi5+KcHD;7SM;8N`TffO0%=MVC{M+M8G?Ig@}3_&{5TgB0iugJBH1 z;*Y2)c~zM;IL;c}wK(25sR1QA9Cu1ttLXGN9vkQkl;x>%H~NLfgyXb<#!M*(25ppZ z+Msj~sP}8yGTzrd!^+3L-m1A>y;U>YdMj_+FIG)$a9Gj>#aPb^;YiE z5-T@Jy_Ks~y_Jh)y_K_NhLw{=y_KUyoRx!ly_M9Y-b!LxZ)JsVOT&6A3!{1~b9|fm znbdbS_A{*SY|5F8IFo@%fMI>IUWsnJPKkEBZjyGAMu~bnzl0aBp2SPi;#u+hdEI#< zd53rpc&t{5X1toEIG(i>#FG+;*G%%zoUTd5NrEJafIJisNYa8lmOJM2)Wo7iVQ`&c;|;cH{zT0^wl`0t%jb zgPDLO^SZ%IL6dpdU}nIJ+0tO<{X)YBQ)YI9y8zt>HkgHA&BQgBMZcKUFdnWhbLp!8 zV%8wmsO&0tO=w2WG?=wPpX_Qd>wu6n@?i4Q9o1BwtW?nuG3cURE8`(*Kk143Pu{S$ z>XYFOG@9T6&U_*Ef?s}MmPYq^$u!idmW&`X2${Wmv zUVTm#Fw_7H`@8v1xs5^UETrY~-0#0gq&>!# zg(Xk`KTUs5`)B@tQvS&;5YsDANegxKedP*M7*mD#re(BcTm+5{N}pCdM^Lne!g#mxEy>$Qh>_jWJ}P z%K(fm16}%|xd3_NXk$^6+T%O2A^l%t=JNhC1{b92qzv63-MKQ5fG2XsJ(6EI`#s%8 zZci{d);D%2g%RL72uMUgr3B)UT%te}k4I%ziey$BU&ixOW_+rc+O89ANiLtiF z{I&d}F8qw^f3L-jlFo%7jYG=Nw5{$Re~dJhP>fMxzw+S8;fxEGNt|H z5BoQzUG~F1RcUYc!|uh|$xpkT(%$EXzd2`TTz}XNl;J=Au$w6TML+C4l;L$6?Z`F9 z-vP8!n1wuA;v<2kh?`-#5o}-65NDvK5v)gp5f8<@6CBr#M?4Wq5pRcch%dlr#C1d; z2#zML5KDDg3@b+T(qXW(40$g{zd!IA&7_5 zv53c0Op8vWlMqj#C5YG4t%ytMA;d@N8N}!4W5iFHHb9tQrU&9|<{;w3yeRD1qj_;a zdGWlVXdcePICEk?YIw;b_G9>&Q#!aIfd4DTl5+q??IPxy&I_{sck zh*SBHA>xsIjEyhn??Zfm{}JWWh$noK{f5ZozIe?-T4t zd{BUcIKffDF~sG9+lcQ9?je34c!;<{@Dy>Spc?UO!5hRif*Qo{1@94m6#R|&v*0V@ z?}G0@SYUBx#|l^t#9A!Q5m_Bp2eBS&hS-92K$oihB$-GM4Zj$Anwf;As)>ZBOc3+Lp*`Sa$%>ia}Y0J7a(55EQ9EXsl1!yZ9=j4eleian3`3X9TXZ?Y(P_6~ao@qP9Y z;>YZB#IM=6h~KgGK!ij{5etNRhz*1Wh>e6sh%JSdh^0a)Vq2j-Vn?A9VizIiUFadi zT#I-jl$A&z5+K$Tp{ztw5z>nsMUIGlMZSphM0tn{MTNkK#)xJjo-Mk8_?B1`7_pAn z46#g%BQmj**a@+-*awKXg&5^2ZY^$&xUCpVU)){X9dVjC197GpB`NML?t{3WxIfkx zf}!LPDpLbYZ8KG0^kvvnP!K5j z1d&2?0Ar?NHPAv1b-+YyBen%oC5PrnC;Ach)`qy9MdhM$a8ahxpl(F9Q`N)I>CC_f$cSCNBa7Lz4arG!(@O}dN9czX1l|9 zFOYk|J#>}wCJB4I-$?1+Rt z(XciKHpIfgSUAxMb|k>=1UQlaXA|ILS2&dl6=_76L&W(^49Y+$hk5gkA3uKc!p;jf zFNa)?yi#{{#r0J;PTf3y^XAR!TZ-EYZZE&R?e_M28}IGBclDn5{`UKO?|*o-w_8aR<(Y$*Q+hBuD!ne`o`;9ukXIO`KIpe z-M3HP{{5D|HGSK;W>w9-n)@{sHBV|PYiervHKH1EjarR*jmf(;@2+$~4`-=BZ-amc+?Y-c``45jjJo)hS!?O>SAF4jod=PwKKOXv6`SHca_aC)t6}87} zFVx!+`EUyZ+A{r2eF`){AVeg5|4Tiv&> z-@bn{{ATj~`uD2uU%uCU|N5PL7k}6K9$x>nzOMdj{kQt>_4W0%UQo~0i|Z{&HF-lm zk#D4)5JCw<1VoK!5N-OBA}f@Kt3d)Prdrg5N~j$TVcs(DnRCN?r}GmiL)g$NSFX^H`n`8z3=Hji=7j+tpY27DvF3Ez@0<;(bXd<@IYH_&GdSQFNgm9RE!xR57gg(9I? zs3Fu6>Iij(dP04nq0m%lj_s(G&_h%$`X=IIODPs3gpQmhU&)Zrs`(u=IR#emg*99YjqoS zTMe;>hK81gwuXs@sfL+`g@&bum4=Omorbd}(G+UxYMNnlepWO?yoT zO=nG4&1RZDn%%W(v}(1)T3TBAS_WE1TIO1oT2d`*Et!^$mV=g~maA4vEq|?k+G1@3 zZ6j?fZK<|Q+eX_~+fLhF+dOFdgXJ3V_n2R#=(S3PgN zw)z$NmHM^%e0{OLzP^dRrM`{6t-gc4qrR)Yo4$v>r@ohdbNy)j7z0ZKD+8&4wSmmQ z#=ybA$-v#f!@$$f$WUr%V`y*aVCZS+W!S{9siC)FGeaMv8Y5jJBO_xY2O~!#cOws@ zrbgaI&5W8G`4|Nl3yh78O^jv6&c-grp2l9r&5eDGeT`d~d@|vi=$lxYNK9lV4kpef zt|ne4J|?~Sx;8G{7{_G{UsK zX^iP`Gea{oGg~tsGe5IdX06Tq&4SF@n?;*@n0uMGFmG+{ZysPCXdYr7ZeecWXAx)- zWD#u9*0RE~+OpPC-_p|3)3Sx7pQXQLkY%uCh-Ii{m}R(SJIjui@s!v{M_6~T?r0rv-AQIClgS)pUb5!0P+7PvQWhnPk@c}@W)ox+ zX4B3l#wOM#*(TRE%r@FK)~=&nq+OI%dMwdp4(veWcRM_neM&a^V|n{bn{5@$oA;tk?WD?nc^S;eT`1JHC@EPno zxMfbu!2vx31_k$x3eCvCew*vD$?*#}D=MpNYU{q%6CPh66p1yo^i51H9bCQq8ff6= zy^6}`)iv)ve60QZOWoIR^@Q^HtXNkc$&|f4n7zdnd3*veQv7kfAUCSf=T?N2Z=NQ% z#+-~67Vv8fXy7`6FN}aqq?k-5v&jmwmaHdx$VY5bWwZ%xj&p%%8b_087n(vdX>Xc` zGlBth1TCV)bTXYvXVN)zK3zf;^azgq@6l@dntsJLScB1H3>Y&;!Z{k}?3C=49FQE6>PZcy)>1pvOE+n-G)~%0I!3y{npz92wXAim z4XjPAEv=oc+ghhs_psSzbIEpv?RMMUwg+sF*q*dKV|&j2xl5)?o=g7{(-QlVz>+B? zvr0CWY$@4Oa;oHf$=!{ybrio0aX$@^;M}?euJLUlPU+WM;{_lFcQhB_~VHmfS|! z;#W7}cHtTv1#^1+%kTT%Uo2aHnAlFxa;|!ZKK9Rit2C-6 zp=oB7@|%~6uBvC1s7j1OJuiUDn#%8$mX)TQPh}T;BJjblnw374E|sEZFEPcuC!HSS zw@=mY@rK9i9(e*DngiQkN~@>}x*_-%i9{Er4c=7gVy z&t(2l{&9Xe|D0f#U_Z{yfAB9TS4AK|ZW@1ry__rig|iFS3AYHh39)>B{)Af^&BAq@ zNw`+H38@sq9gXhjwyDvKzDOl3`}wGRgxeb4T*z%d!(vQ(g$IR)h2_Fi!ZX4v!oP&K zg?Afc)x!MD2wKMA}#q zwzwM4eZA|2Ydu3@94x|bOC_)y4&Vw;EqsOVL`;luMJI$rkXX`*qzfMkj|(4(;)FNF zt~8kDU@JWW*Jw)Vc3hXaNS|Wc@e$h%b!?GCmkE0L=xP-G_36FZCa1q$J7QLM;7?1SUYDB%L(Lb02ut4LRPNbD<|FDMnh z5%w463k!q?@jC>?uMQH>!5U_btBOguR@@QSJ7?kw)nu3oVQ>cS;|kRksDWFew(y2D zA-2SkxR3<+!enAU6GA)C4D4~Z-ew?Oiml)*x`^JUm+4>hI-QK8c^AeUdli4iUKGx> zV#YCpnc>VxW&;z>Yywl-71sbm!HjkTH`*VX(816YSFk+j0BA`^LTfr2y3iHSj!uIF zx){3C)%b0CI`pGukdJk`fbNC(ATyh^WTp~- zW+v&tEF+1`Mv_D_m@<;Z>?1vxJxn&u2S;$Bec?4Uqr-6BFc5<2L|miJf)wb3Yb^sv zD9pnzO{?iU`icGx`=OjMg3Iubaf8oHTarQ~On+icyqO6kfV3rD83pNy>v!4ElPUz; z1v>=W1Us=$3&l0Sb+DZwa1c&1h9IKtVG_Lxml!MJzzidv%oyUz6cKl3H1S}HaaV~h zjR)@Au?@|J!SpcnrMqDTeGS!23wXt}gdDn+R^nJBgvue0?tl}FK3LFHkkKr7%d`e< z8Vkm>GsM${(3viWDfAl5rgz~cV+WOtH=#@n5ikkFnHfR+m}x|ZNh9V=E)1bZppc$` z({P>%0zKLZ+S3_un{j{-xJG%0afG{!6Y0)u11o4w3tnH{tTj)nR#eslsIOH1fx`hxDGJDEs&0mnZN@k6ga!_dz-_cWk^j0Ka- zbYccF1DGMqEM_6ISg=R1R~#e`5c`W;;p$X~I9MDgZX@;(HxY-4J;h$)rs7bMy4YLn zB5sCjSk1-mBB4l4G)XiS*P#}RR*2?{CgR%BTG2w$Own9XiQuH*l;Ex4u%HT8C|?L( z3aSN91zjuJCvau+wBU^3tl*sBqTmkBSnmt&aVwmHCxXYg z#`&CE+ho(&bX;ZZ!S=%S#XL5j?aTIK2e6}XopB6X%&jxBa&{uFG)`k@vvb%!Y%V*O z&19$Is^fHa20N3T#7<^su>;xuY!N$NP{Ym>ykqAJ-m?pEfnuTH0$YGP~8!`iZESv&Te;3%%i+Oy|b2lfK%$X;Zf*h{Q4dzp2?Ra95@ zD(lAnCHT&+!c~B+tS5T|SA1^@orI1|I~pXqF1jYVAv!Di3)lP#!IGwd9qkGBxB~Bl z>+fE45ctz#2%ux24X(cX(IRL?M?p8b3cAvj5Jl%eCfx`f=uGHMx4|G>i62Ez!)RQK zFQTVl1TBZ*^f)Y}6)=t7faUZRtfFsW4Sf#^`W;GXJ?vm8Y^HTk#;~x55yD%5* z%u>>kSxzFE6(ovTN#dDxB#tQ|$;@Vw$?PTB%zl!?9H8f!d}a-^opxt%>B4L!otZ798&gWsn4Q9F!mBt^xGt;~z7kdm zUkG0cpNlL+mN<@>C)h3W6nTr>MINH2B7ac}T-j+NauT%``H7l|nu}WED!G=>iw+lM ziBd)Bq8_3gQBP5}C{2_h$`r+ml0=W7g40BqiBF=h-jc_sA!OAm}szQIB;7@ zcH;LT5lv_Ezy$Vzl*BNrg*HN&&|2sK#q=z!r5{8hkp}6-9D=dnP78=3lZD@!(qN;w zEs?n*DjrtlM)j;#mB`)M@4q*&_1GFc-yd02P@FiPjB={ z!YD8lhQ%l%Vr3E0$%&E>d5SU=y2SlvQ~CRFF)IBUObQwlm#7GJMt7x;${wb)BcaOL z_8;Eijovbe0;1&dj8b51F`59gQld2QgC-?mPLgDbG-sJqme>QMDiwmdG%h6wP3ny% zA_>D3BxTx=hEIBetc*06k`on@l+2{INDb6hq5Q{|fwye1%ABH*q)Q|UfvqepDp4*~ zkQA9&gFPk@B}P)s74f-XPNk9>xbfugt=g5&rI15A&ESYUosH8V53jjrt(wC=nP}-+S}Ou#6FJ%xGt_x$Qc|$13#VO@L|G3rSyHLKzC1sqR9ibJLLP*Qj=H8) zu+mh4U5c|jQNgJkr)VZ`Ym}QnT_KkBXroY*wfW)W5B@420q4WY+9-&jO6no95Q%Y)JYANC z8W<3jm}Qokl!|dH0%WNQo~(^oDG%CU?J_2qrI1qS=!|)bKpl*9j_Qn+loN(TE)SNJ z2Jq}s(^ENnuoUaPyunKr9L!bP#t1vGLh<6H(5I_Ib^mS$2Gp??PMVtNWnd+843oqP%6p5jewlW zK$NoG_^(75#SbD0mZ>swxpqrVZ#WzJD{W}Ozg&^^yEXfVH59#38F;pCDqT_V>^RL! zlq!0fDS9Vy`l2F9RTQO3)!u0VUg>65+QsuE27PtyzreLuL$V}}alVanJZb?eHDvJ+OZ-*L^r~os$Tqai# zWYIPhi7|RRg}^SHd*MIdS(e%Z3z17tlG;NVHWb-aN{8dmEJP+vLK14r$(<7%wiam| zN|&QHD!O8A$LYIks9|vBBlprFTlfZb70g36&^|Iu$jU6GAv=OTvg$gd(i5 z%J3Kk$4wvS(ypxSPZxBwRpdFVh=s~nk+YaYMHH7P_h*%VH1u^=P$M7oiZ=jN&x{K#QBds4l#PZed^i`>tih!r7`iCiU9Q)}enrKCnu=dlq5>{{ zg}U-DvQ-Fev7i+^19t_k6^ zl7z}26m_Ve$fB z(^E239W_cB@GBHIR6==RLE|6Gb|BX@#U=91cwEiG8l@PdDpIUgC>M_4hyNgK2{~!0 zBq`+lm$7~g+}k_-RO5<^u`mZn0aWQ1#t?1UU+|2-*2RY2{y z1h8?Xs%*65vcg9}W1W`E(^GMT)m4+Lq3U)z=&p--^2MzAHslRuGaU0B#ifosV1|{} zxI`}dYN!NC$6opvy za=B3B&pyI`(rYLKaFriRS>wl>i>0ADh=UYrLEQKS3s52A+95YA-@+4|x}jDmhZDba zhe{`|D*oC@8gsHoL1PeYRP36u z9pc)ZBx4*)#c-ozoB_zRCBzT>RMR4vO54v?yz^;Lc%fVP@xm-oZjmg!iJR%l_z|GjiK4xO% z>BszQzVrX&jh$0a9JW_wkS!Z5>xDX^$NF-gbQN*sk3{S!($>rFk%4OWV zsuMTSLCksL-cS#7ZhXLvWq#0GnB!dSR|j>B0P|K>ztNnVIQ>j_)Q@xrVY(a#^2UVA zAnT9Gawv#_6K83@o|i8~EYun&wjy*B>^OgbRpTKfb1kk$a!*$JS8>M z2)|MW&|Y*9e(BvqPteP_rzVa`VU{sRnU6ez-xb4nF}ze>AKnn&UOw<`>V)WI>GacCrgKYIiaSz#bwhMJ=qBmr=nm1HsJlRSz3xuk zBf6J$@9DnM{jA5=)6q-U%hMaCH(qa+-cr2{db{+F>Rr*R!2Ku_^k?gz(!Yv(R$l3U zGte-wFo-r7WKe7{&ETxTTSE)O-i8MZpBsKOB1Y=C_rwPGodg)QH%c^`WOUkCY;0(3 zhr3PM7VlvxgxydGzOD1in1PwPnX#FTSyQuMvpBO1v;Jly%_f=6Gb=HB zW^QHfY~IW~)I7#K+kCD0HuDGOFD!_K)WX%m*CNCs+M=sPj>Q~{-4@3zE?T^>sI{b) znwF-Pc9ve2iIy3b`Id_<4_cnaJt?m(zgP*Zbge9{oN$*(g4IN;IaVvIHe2nnI&O8z z>Y-J&)dz_oe)S(L86%l4SuRmX4ofac9!jbupK$xBvD888gF8>+q$$#T>2T=;>3r#G zsY1G6dP@42^r5s``pMeCx`}mX>xtHLtXEiXwmx8e+WMBv9QUF$l?BKmWXZBj*+AK7 z*-Y6=**4ix*#+5c*)!QY*>@YUjiHUTjh9Uuo8>muHh;?7``%wEB`)>9 zA={zAVYS04hrb-v9E}`(9D^OB9J@GXJN9=R={U)8o@0sQcE^K`ubn)cVw{FLjdPme zw8Uwh(-o)tPA{DGoh8mu&i$NcJ1=)W?R?Gok@G9(&n|oy9T%yKt4k}F4lZ3?a$E+u zjB=UcvczSx%K?}3E_Yq3Tt2vhtG27TtAlG3*C5wO*HNxhTo<^maV>Q{;Ck9k?B?gz z)-BF0#jUs7V7D=D$K5Wu-E}u`m$(PHN4j@*&vNhYKGJ=X`#kqm?pxgVy5IHC@Cfio z^cd(d)nl*6QIGGQB2Rr!Yfn#4f6oq{ojo&g|IA3wsh*2HH+YtL9`n55dDpYj^Su}G zQui|Qvi5TF^7ab!YVVccmFAV}wcYEWS6!2gCizWT&&_$wwVRtaw{PC0d13Rb%^&zU`Q-Wx z^^yCW@+H3NzDB;*zOKG4eM5cYd{cb$d<%Ui`7ZEX?Yq@?uWz~UW#7BLmA>ypVZIQZ?Ipn-yy#vHsot=lNgoza0Pp>H)?9HUS<1egSO* z;sR0v@&kqkOb(bIusT2yus`5zz>`2hpl+abpm$(KV1D4Fz0D6vyi}$_92NO=^?oxLqo=f>FD=;6?_ zp|?V-LTkf#VY*=!VGd!0Q7QQb{u~FTkU`9lsLH61 z(M+^Xv_-T-bdzZR=#J6dqWeS-kDe4gH+n_%rs%!VrU-Eb?%hYX;7!Jou+qM)M-PfJ)KTClx16O zFLb`$`9&AqF48VRU5dI)>hh+mT345@v0b}$&FMOzYf;w?U3Yao+Vw&=(#@e;c(+Wvd)4S((AJTnH_i5c1bzj@PvirO4-%^Ar!6}g`V^T^| zwxt|MIhArXF3jLraw-9 zlcASknb9&MGoxR|h>R^6dooUB)b{Z0F|^0H9*25VWa?y^XU1f9&CJdmm^mtQa^|@# zjVyz#4q5qG!?MO@&CFVowJvK%*2`?iZ13!p?BeWc*~_vwWFO1EkbNurN%ouUZ#lvo z!yM}z&m8}p4mn+NvU2+66y{9KnVqvNXG6};oZ~rHa~|}x>FLrlr01ZX3wo~ZspwhO z^KCEfUS_@8^-Ag0tJjKNn|f9Cdf)4NZ&7dk-d4TSd(Y~9y!VIR^?h3ODeN=5&$d1X z`<(7mpDWHa$d%-}j%|DTUIsaB)+E=r0v%VpHqx+^}W&eao;z6>-(AXv+d{EFQs3vegpf>>9@S!#(ul|J?(GaziEH}{_XmA z>Yv)bcmKiti~E=MKhXa{|Cjx13#FpGYA@^+}kP~)LC zLlcJ18hUx?-Jvgs)(+zj(;j9v%x;+HuvWv`51Tpc#;|Y0HHX^{_ZZ%Cc-Zim;k||r z96oCJl;K;4?;C!1`0GNgLes)Fg&hhL3)2hp3WpYsEu3Aryl`vb!NT)}w+f#WzA3C5 zAs%5m!f}Mph_DecBf5^r9x-S{*@#yoK8<8X>W;J=={2(T$etqyjFgXDKXT{DBO}j` zyfyOa$eJSaB8Q@|qL`wtMFWb8iY67!Em~2uxu~q@Zc$~?yP|KS%tzUe3LKR@s>i7O zQNu=!8#Qy((oqLTm5;hG>ei^Iqu!4CI$Ai|VRXmQNux7H_a8la^o-HVMsFFtXY}#W zS4UTjt|^9Mtzy$++v29h{>2f+$;Ca2^NWWSk1L*8yrg(t@%G|F#jlG$kCBdv9MgGB z)|mcdipQK7b7{<-G0(=-jHw?h9&0?-W^9wOfny`bb{m^BwqWeYv6IHm9lK)erm?%n zmXEzQ&THJDaYx3T8+UWO_IR)Ht;P==KWhBs@$<&79KU&d+4$NC+7pZ?$R@Z=@SPAm zA#y^u2|Xtam{2rf(uBDaR!mqwVaJ4<6FyFaiL!~#6Pr)WpE!2njEPGouA6vz;YRZi%&!*H&`8t)IYB<$;s_RsrsbN!Nr;eXGYwEJ88>jA`dTi>&Y1-4w zr*)i`G%aIV-n609#!Z_s?ees{(<-OEo9;Zl+4St`lc&#{zH<8J>1ET8Pro$%?ewoR zgfsMJSk3UC5iuiSM*57r85?F?pYdrX%v7JLKht|=%*_5XXU*I<^VG~sGizqq%<`TU zI4fpW*I5H+mCU+2>&~poS?_1N&i0-iF*{*)`s@X>_s>2xyJn8|9OF5XIo@+x%?X*4 zJZHq5iE}Q@c`;XguKnELxlwbo=8m5`YwpguN9KN-2lHCYE0|X_Z{xh}^X|^Ko*y-T z%=~rppUkgbAX;FsK(fGPL8k?y7OY*cZNb3>9~Q#G4hxeO_E=c7aK*yS3$HA^zldGr zxX63a=tWZ(EnKvA(Y?hwi(4%2wphM+=i(!a&o92V_|X!pCC*ElF9}*QV9BT@Q*XVs&s)B7 z`IhB-mLFOEYWc?%WQE2GgB8*hX)AJ9%vy19Mfr*gD{ikeUDcFbgt1hp)yXwiRx2wLc7OvJ`Em`fd+GlnC>cOiwuimrz$QsQx{%fMvbY9bY z&7d{Y)*M>%V$HiX-_{D(wq84C?ZUNd)+*LMD`87?OInq5F3B$$j5~7Ylq|tLqkBq@ zuj8##U+1)qBjTi<*AiuIe|aVH}2ecWaIgbw>D{RO5BvOY1F1goAzxwx#{_)kDDzv+is5E zynOSf&1IX9Z~n5yV@v#&fm@buIkV;3mWNxaw!Gi!vbFivHd{MvE!;X`>#VIyw_aDc zDtr_{ijImTMTR0zu}pDA@pozK(m|yoOP7|O+NQqEW1HW$$=l9vyS80zd&ljawx@3I zy?x5|<=fY7S8OlaerJ2-4(lCmJG$+dx#QxFCp+Hk__C9~v*XTAJG<@7+}U^M@SQ7m zZrb^FXWcH@uB2V5yK;6F>{`9+&Tie^>AUCbK34{1YGsCHmSv7*DP_IN29}K~n_M=p zY-QQzvZs5@_c-hc+!MYhde6i?+xFbv%kI_MYqU3EZ~oqOdyns}*!z8-|GvTd7VX=x z@78{`{jK(A>>s;-!T#<0%MZ{4;sbsM+8-EpVB>-E1Aia%KiKJD$-y^=q=!5Ybw4!i z(1t^I4n00pcbGY>cDU8yxWi)(?>Kz%2y-OzNY;_Eqr9Wdj&?XY?C8d$jPgF^1ItI2Pbi;JzOZ~%`KI!n|;St5e~p;!pKBHTu-@Q@2kWoOV7Pb~^9$ zjMK|cZ#{kfjPQ*18RIkdXPTX9e62tn94&*_LO+&c>bXayH{^{@KB2 zi_T6syYlS*v+vJ2oojin{kgbvUCw2k>wT`^-0*V?&aF9DdhWov+vom1&z#pfZ*|`N ze9QA~&&QolIiGz#|NNBm^Utq7uQ-4H{EPFo7w84u3)UChF0{N5bRqLX?u8{6HeI-K z;r@kJ7d~H9yQqJ$)5VLIY%T>{D!DAWoPK%AeO&j%;)&yvW>4BZiO1d5lb@`AQu^fllj~0& zJgIt8^Hk%h*V9f1o!%4d~tD!<|$aKkEDl}nXxRhz2FsxDPIRRgO=R!ykdTD8CGbk+5$2UXQopPvh! zYdtr6Zu8vrx%czd&%>TaJx_X``h48;sn6#SeR=ie-Iq^Z*1Y^)tx;`S-KsjI zx)(nrIOp&!S6Jn->utwwFA zYVW!MRjzp=QvQtb?yOd1@4o}k{Dpp((!7}CJ;9pM2q`3<6Q zPfQb7PmY5O_gTw+1Ak%&^XY{e5+ zTfqh2TgjPU0ne{`aDe{50PfF28%!fUh|m2F)E3Kn4VKYf)D9h`6zuU{wVQaS%kSm> z?`=DAXW&jwhdF&EG5?Ps7xi>Hg3)jK*#!3yHi0nG3w5y9{|0*FEfpNhMLi0~oTY-- zuRt1Y33!U?pAb&%$T4cCr0?=;sDEk34S2r*{~w_ZmG;Sqe=i#uN~{;|+O?+5FrU6u z8%AJ#8$xvd9bmctM+n?~$$?U*3GQ%%H)uYElnw}KO3axYsE{n>-hdO6U!W^oLE9Ci zUrAcyX=l*Du@-M;iCq0~2njL<+5D7fTQyD+oqUC75LU6I0#&P%u7=bNos^SuJgIY@7*Ush2Y6QC*AVTL zHh;W)(7&;LqBgi|`y9cuGVl>T5-EpOK=tuF8E0-7;WUhM#8iqSotAjcY$Be`8uo8X z49~kx#S;haAXkQ51*@PMs!3m1i;xZ3WFLncpcme8)C}gJ?H=wo%EDXtvVMapWD2@k z{LuR!B0jg=uj{u&PNWb#y%8Ff&W*8*^c^KhQF;qVXm z#F>aaQkeY_qKPJG<4NP6a7tySz3{!C9L95nxx|RW{}m44X~RbNNhNBeC(Frl7(|v+ z3+nkBM58U31C;Qu(BU^*6Fm9%E1V{!)CKE=6G|hOT*bS?{$B!~D&$}io^}uTmoQaD zk2-qV$n2)IoCD^TMG+XCwM3-~se)A5aF zj)pW+{ucg6T!(RgMW2zrFzu9rgywRrz(8PP*N#=UF*X$yq_vYoc4 znxp`C)Z{`sf($OJ#?8txViMxPc%m_xvyuKVo*YHJas?e6-{Bw0Orws7SCJ6BMIZ^zkR+N(B5`bifMW@JYERmroX!F_S4|^o zG?J<#L{TG>h;0RqDc}YfgEtL?kwR=UZ1FVlY|;+<GVn}p3Av0XdKTer1PLS( z<7-YWX&=0M*bn3T8}BXPV$?w}A{$8w#<`Ff&{L>_c8 zPwT)G&pDfd8P0f8XehaeXVfF{KA>rMBi=N~SM~W^2r?S+COk21s_b#Q;%Utg(t`w( z#qd(u6ZQN_tLmF+4=5!g;3dxWx8f{b4@W@r@LaGE+ckY0w_SxL#Eoo#FYp)yV1ehB zU&CBz4MVAb;2mLj2jW85N&IofWQwC3M6W;U9DGpR@6X zwTJ(EY5Xas>sSL?p@t4qrgk08Ef9{XfJc>m@FRFcj?w^}9ekv&)D_zYrJXb5jTaIn z%??n|4CwfSXU?Rw;rzv&I#Xw5jK7+X(jgph?s&qzADKaB;0WKL(TuJ`Ilw(^=TXyB zNoUfX^G7cB;1dsVZa}Va{!G27IcW!Kphg7H9Aj#$)QS|cge*bVZOC^B zZHf0yayRjEk3QhI8e>?C5<3HrjBmZ;(hhJQLelcT6a*%8z^T>kV zUH^aE|MwE0Qql!apti-`m#BZr^lsv4trxBbtwGyNY6j1+O)kb+Q!%z7!>~nOfo=Z) z)R!&Tc5J~mWfy7!u7{DqxT2v;+u?Xfsd+dqe}Qu;U1&n0Nir-Tr*LGDhN=bpRKTO1 zWDU+jxElevTYo45I^l@b7Ad>Ia_pnjC3DLGB6TykJ}tSk?rJnu5G3Ol}Huu;2Cud2^WF99A~xt`QvX12cV~$QMTY z!bD$~>I(~eVN44c+k(4WaCQq=hz7h{uqDiF35#1okso)@puF*h!P%`~V(W&x1*f%! zxvgPiYnbE@)BRzAKj8I(a|2+R@_NC!fv`3Z6oG)349;%@?)!XTI#46}k^ zw(`Qki@`7{1QvwAyiiyj29w&tytc5oEv&-&jaYfr;HY-6pdB1+2U8=sYX?_HfFc5p zM8JU#aIyn;=imXnc`ypfqTpc^D5AM52(QM%p*T1l2l9A08V_gV;a)tHC&0yI*xni5 zbcTwqa5n`ur^16&s7QzEEO^|Dhzp46Fk&%++(Mx%3*^AF6Q6Eey7A<8mwTp<^eYZm z7(PAzRR7uWDvjs*uWr5adTsgk&bzyK_1`nR@{fJ5_FnhH|6=bwz^f{{z42+gos*o< zI~aNs$T{hNKpMSCFDir(Y9N@%4+Fs>&}>ltM&FtNyUj=#_o^dyYx z3HApwn8kvu9zP26ATX4t4C2L!iZF&(3+97bi!7LViGxw5rlt+kc9qQLFk>f;*j2(2 z`kGcE4Ayz(>Z;l`>{`k&U3HkGYv{Cs0lLaCJy$bOE07py6lB`WT%BMOn3?MpS0S!C zjLX%8c{yoZu0dRST&H*kCgtjAgK`bxo5#0~A0Da`s;5lJHG(0zW})_>P6@SPG_Eep z#+{Sk8IEgQp@uRN*8=9@I>I1aQz+cFtdv-(X{BbBT31S{lw7HM<+#cXVDPPZ<(8FO zRcQ$|T4~fRqe@$tbdv_%T2yW68gr|fRyDn9$EuyHHLupHTI+HK-P%@bU%htqrqx?i z4=Yn{<7(800k_sQl53>YNQ3#d_BHZqbgMC;W?ap4YbMo9i<)igR5Q0`Ud?Vb`_#Os zRx%8>rNdZTR;>$RoUN@k&z1xA*}U4FYmcqds7`vFOc-eE1oLd!b#m%-uX91&#&w&) zWK(wCoO-S5Wxz07wld1r1M09X&q+Tg^PINI09)6@)`=YwJ0@o1&{&s5*92S7#PbvT zCk{v)k~k`HV*L*FJJrvw-=ls{7+~vHzduxB2i6}{e@y*x4SFggY<(K^Yj9!1?1p*D z_}cj}zc#qxutvS4>9xk~8V_hZu<@YAgPU|~GO)?uCc~TNG#%P>c+(M0Cp61y)}z@V zm|MH3S$?x=&3iQO(|l0#!Oe%j?AnOt`OOPkv~4k=WxJNcV03L%%Ly$fwJd=uYR_}e zSH{=Iv>MfFOslc2#+vweHW3P^Q(MnzGo;N0ZAP>i)uyn` z_%;*UOiLQCjImvuRHDqWO;QHgE`b@g!pMY3Nu(6U*ybh=OP-KilsqkYX3CJ15h>$R zrlw4XVYXSRV^YV$G~3M7S*f$3Dmo3u*+!;MPM-x8(YYC=8PhW^%^a0Ex9z3v=Cq%B z-t_Zkb(+{|PS=aON)xddx&A9pdf){723S7%4+6gqR%`x6{`@=Qc)$*m1%BYuVQP$l}jl{C`NRq(rr(HQ9g zh^qqYIt%`zFbI}0R)RVkL;`d}+1Ie>5d9ucLS2TD1`3A5TFo@PlQ667AU9FBvq1pA z8;*M`Zrc`X3MYhOOM_dUz-0v;iY__Jv1k4Xnw58v4Z8#e$vj{*b%h6`oe z;WyMU4ZZ{$Ab%&*B?5Y5e|IVE47&{VNNw7dG^QUBp&?HC>`8p%>=4g#$pTRyX>zf* z>Vdu(Qg%YdodGO15cgl?MBi0Kn&x~n>g0!A*8){Bx_ag97=f zc4FjKf#j7P}25q!y#CnlIa_vkN*{%kFxpFz{=D-4VLfOi~H~Q`;oxu z-(h!>0BF&G^m#?tU6Nsd$RMrG3Ij3!(o4Go`TE&#T?4?{Mv%FqibP1M$UuqeGu?H`{U34eA@gcI%0m?>4NMt@dxG` z_-6xg&S~%DT;v-&XMM&#O1i{QQuzb&6+<)8`&ysm(g>5KXRWkdmkm!47 zmK~GnU>h#|Y#?!8;+X6!Syx!i3y3+Gmt=qT121z7+VEP~ZR-MydG~{!=m4DjPr_Xo zzyCV_N&HQ$F&bdusWb{p@Vtslm*ZW-)mniCTT*Z?+EK%J>dT*fx(&~BlYo(RC1#1(3!qPzbreX;1v2Wom7{=)}UMx z91}EAHJoT6UZsg>j#6%6?R7?nB&Xxa$LRDsV&6d!=k;+0XD>Xul$!3*315 zE((*tO)UVF0{Q|f0peUJdjkHsfQkT_22ge!ehYw17Xq}Wl`)TpNKH3fc8vZ8PXBMn ztE_CjA83QJ9W7OhVj(5AR+LB*B* z48H)9VEJB_=@|ItY4|3>WxvxbQUjVe4e+kIK$z%b5LTJ#5`5!KHKOHYemtixSEn_o$q zvRlX`1#({Vp8u2nb)@m>-=QaoDFOSIvEDQ9OybT8OWb$#C&V?JrbH@PLS(RPgrFfO@`5#ki`Jl6QEH>12)4lW-@5@ z|0MiMGR~TR60Aq+Z}SxJTQsl|l+6!s!2+?Qd1c%@%zIPd_e8!DW|W91w) zfV(f#v{CP$#BcoY3M?4wFs}~Y1VDu!MgHJ%h)ra+*nr>2bZy}Oa~S`3e}j1?9gu+Z zZRyCe?^u%Wd)J{35^93)0-*1cR8|@9C0vbo06l_s)X%5;^h;6+(1KZIzo>UBk$zX% zVTA*GP*;fyF0}MLyK(n|wylPCk?#k9uCd8%4TIs=1XOmRY!m!sKn=hI7s~#C9|p*D zRRKAW`jyZISPN9R>?Clo1ajYJLsLOIYQ18m%#G3^j#?S zJzeJp%2ep`t4mF@aB0lE=Wu?}a@w}C5Lz>hle-PB1>(Bo>XeIpud<2|6 zkCqF|IaIHu<^8gs%ZH&$b;fj9gZ*=#obSAOtSf1z=CN{fmp6}sm^O-t@sU4Os4XWfIEvZkKGIz))45eKxRQ-CJUe) zJ_7SwAMz;HK=`nvZPRgO-;&4h{3^!Z99`HRR zQOai^4_Xw3JiLF<1rC$$d@J5%0HiD+3-QkZc0#UmF7mnocK`tR<=~wZg0Hb1{MuBq zNaO+r;x~~hq!#q8(T;hKx^8BEJFPnf_G6H*18$^(2H=RLqFaE zbX)?d#QQ`3fp4=n@cs|CyzCRCc^>c*X~uE4IPZq<;Vwh54d3Yp*nt})yfPMn9+I$} z)aOs5%C*1)fXdP|uR@?Q*Y$LP>ETOl?9;^YI1HYJ@&jYB(5RxaVKyI)f@BzLNDSMs^ z&}0WdyFW{6@Y%R80(~X>Ow|u{R6OtqZk6!yoTI$YHkuzA!Ws^pXwdYbDF1N|@_LEP zKv`z+;lvTE&_B1KFTl&?4Z%;9XlE};C9kWjY#m!sb_l$dX{bXtJfFh)XR(>U{kiydRZ(eFA7zx~T!DJ5M%q`9 zCjg2-(^Y#kK-^UDK<|OS7LZNSu-BNT+81psd8(@YB>!?C-sv`!yu@f5%C_Y!~ZaM{JU2!;ymVFYzAjsOmUNrJXWfjOQ(XUi_}u{) z07e4_19||40lai0@qE^F(1(*coWr!=9DXA}5+DW83eXtP8t}K$k-N(V@snhjhGyDt z?(>uIEc5+a`Td`s4)Y9=fHo#X-i&oAU^GDf$#?jptJgkKSUZ*o3)8uaugt@!d|zt)#yhyltspfcc4skk=gKC3RiefnJOtJOQu*aWb!dq@IcI@^caQ8elhM zL-PGjG6-}=J23{&a-M?xUG?`HWVGyWmV~kG!hGMe7k9d!hcps;;QIyeBm4%)2}YN_ zFXuklPM`%ANZCHh+XLS#MIA;!&KnVzLgqgN`-LGmvoHiVx(vasTtjeE*ATJ+0W!a-fI9$N0FP;3rb9VYIc0gg zHublsth<-rnf%ksAj4k!%Kq`%_w@S8@CN|d|GG_8dp0;r8$!1_+I})$`TLmw*Sk_b4#VfbhPV%=>aaVqSlZF@JKc_)H4|nrWZIh315O4+JBwh^!9&f>U ztxE9M0LlRG0agK4>#%&5@74kK0%W{|Hvn=x$@EX-i#g;Ok`3B5OU|3L7;{xIX(Q(< zyvOfoOJF&)u`%aKy#eUdNSOfkEerIV(?HHYQa&f=4Mp2X{T<2Q0goGNLI&u$DoWo# z?$u=)%%?OU=YIHcWR98>cJ4WVw=S4fQpD;MHeIo0f}^7 zPCvN&dt?oR+pAB{L^`u~)}Tb%wRg{4(6+t%_evyR_3P6M@dIS~{R8^sCXuHH^y`7= zLEQ!s8s#;E#RS*Mpu~4Gwqy{t$IT9B7sJL?7g$3ul5hq zSN(_SEC0jvmHuJ+ivKWu!aqzO_Yc!MXHHLh5+l1yzeI8{yMNb2@>ovSfr;euUOjRX zNx%O6vJ=rqXX~LVXU_4g=|lf8ef&R6AN+^u17}I!mQacNa?L&qZdN$UFJ*enV;GU; zasSMi-!MPFXexc8AW~XDA1=r*Eu`xT3MNgVD@GTMA4`{wo?JYME*?{oUqI(0BA?DK znmlb1omx~}P(&vycbsxZDfa^94pMGk<#tzYu5vplH$%A*<({kDCdy4zZY^YALaP+Z zuY`(AMo*^Z6!}bG!E`b?Svr357;?OHQo$5*q_i|COb(S!8--J*rPHRAlJ}<~C3#EL zJw>^g)6ou1)J)b6kCFnS*at|rDO~wS)%wk_;)PWxRk_WTE9Z5Jxk9?NmD^akptulI zQ@J&i>&`aS)pH}|HdJmsg#2Ot=(CRfL9A zW!;|{>MhnP^sEESXrHz}ZE0HHv|4E-^&MEuUXePr#je_+n%iqGt+Btxuo|^$467ch z_G`8FRS#6%RdsXKRaHk;jo@gEsB)yr#wxR`6jiyX@{!8BDsQN~vhu>pQ!0!s)fLqe9hV_j_uyb+^PI6xh8xq&iWjNz`1J0W-r#ImS z^_%G}^j6rNxt*@W3C%m{U9duM53GRP3u{$tU<2hox(=tK*W-lpgRt85Fnxq>fK7G-_OuZuz~O#PDj2#x8TNum*~rME8T`u{X6JR`U>5}I>2hgt2jlv z2Pcj9(br*z=1uw*EYG|{-=+I;Kf?R;1NtHTh#sIH(@*H9^dS9=evVrcpjk)1qF>W* z=(qGR{f>T5f1pR`kMt+{Gd)U=(c?IJ^(+02{;m#S{XtLBG91yPj4{pxGnk3PST=K5 zfCX_*I-Z4KA*2G%TvuY1Srt~5Rl}_eHDEES7OTzb;DmBLb`CDxs}Fla4Ot`Bm^Hz< z?Pjbwtg^I(4Ukr>HERRgQem8OO=c-9m8IcScLvT2wq@;Dd;Thajql-m`9A(Se}lh? z+rHoC@9=l|e*PYRpMStV!|F5)PbI5miMsQC-v!HPzv>I-;(qC(aRxqP}P#8saYd#-fR6Dw>JrqJ?NF&K0e2 zK&_2P5@8V$$s$FhiZqcfGDN0mi~A|si}OSW(NS~~St48Hh+L5;I^))guA-ahE_#Tb zqL=6``iQ=wzZf6}86O!3jE{{^j8Bb&#%IRo#uvsR<4fZ!<7?v^<6Gmf@tyI#@q=;1 z_|f>u_}MsW95ap^zZkz7zZt(9CybNEAI2%8%!K-s$xLnv(=bib!m&BW446SP4#($0 zW`bG4tcYWDmCY(ee?~@MrLEPiP_X_W;Qol zm@Un7%~ob>vyGW#hRukXY^Ip0W}2Cf+ch%Hwq`rCy?LJ5!R%;uGPBHVGY5BWSA@Zx>?<=9#&7Q7j6>iWA(MpxB6NAtpV0RYmhbA8e$E_{UXDy z3#<#Ri>wjWNGsp^$@tIP(Q)n+!gg>BfTZP~W% z;69R|9fu>2Av?jY;5+yj#@!^A)5vM+Gz$z448fc`9dn+X?Q4-n@H4?XXb2ubXVRE- z#lE{K$;W?3@ZiRhPGlmP2EN-2><{~ptH@&Tqn5zNz#v$^xD%>Bbl?u}nfzQx_v_fgL7XAfZTKExiP z7H*S&3{7&3a~j|VH*iaNF3+X4_&7eD*2Ycpuug@$h|RyYk(9H|;LY7yW1t zF;EPoy~G8gl=c?W#C$qNtP=Oq60t^Xrc=cW;sv@yyeM9#*NSao8(k(|5xeR2Vvl%( zE*I~L{q$DxrTB*4E)I(y=w0GRah%>Oeigsb`^5=yl0G2HL>Ya^z!XX!#&OjI`iN1{ zs6ih$>KJwDCL_^Eq|X@*jTZEI1J_~D?M7=OiS97+jeNSxm}jh`yN&h6L-d&OxUq@; zX1rj$#hCG~@gA#Td|-UYYMT$553#zqO?xvt$J}P_WQn**dk<@5zHYwGnwjsI@37|P ze)9v?0(WU2Vy$rx_hFW7{%HQlQY@G(VW~JYo50fKp;?xWo2Bcq^Kg%JW7ZKjM>l2J zxGTC9%fao~ZCD=ehmNq$xQlxf>w=rOC$p}&hkGjPY0a=^u)fwDYYsafcjU}x{csca z5;oAf*}9nx!!6fOvf;SZ`UQ3Y?ycU+M&Xv~-E1`OrGAZ##ZA<2uyMG1`)xMf+HdV= z6Kq_K!X`SxF<6n4=p?eqPGhGDE5?1k-Ppx}{(=6i1iK-*cau=dUBkiiF-1SZ*fDWF z+`WjU>``C3CcynVpf{LIX+A`l5obP#wf{?`6p+O+$OJ)c((2+B_?j{R9X1yBP$tpI zcCwvfr`l3rjS9cYKTjb*r_ntf@XXLqnW+MVnyJKN5&bL~94Gj28NXZN=U*aPiB z_F#L6J=7j%Z^j)*FW~m)m+h_gZu<>&JM@S4NA>~xWBU{PQ~P`S2m6TqqfwHDZal zRxB0QiDlw?af7%~EEhM472;-bi?~(XCT_Po7H@=%1fv4xv`RRNU&W|uR5Pj@HH?}@Eu*%a#!zFJ zG2FPoxX`!=w||Yqd^*Y~Fh(1N#u#I)G0qroOu(IBMaCp!vQcbIF)lVrj8bE&G0m86 z%rIsevy9oeF>H=;sWBI`@O z9x@&_9x*l;j~b6*hJONglWjDfGM+Y`F`hLx8JmsgjOQ`uZ^4aaFBvZzTa9hTc4LRJ z(|E<$W$ZRyHC{9J7<-L<#_Pr##+$}l#@liQGTsrtqtD(o_8adR@1t!#FgD0_!mekZ zW4~&@X7920+WYKZ?ceO*?GyG%`w#n+UFN|4g2No{7*4}L!$6}z<3N)@(?GL83(UC# zaFf{}%$-$OM;?#uUIO1u_NoxB`GNBxD~`^|ybitQ-yGY2HL}k>uH~qf-O)P~<5!N}RKv8n4k&3Tp1ZVSLuaILQL_lB1-;Pl6VI3>ME! zSo^YRB4xAzok(kg;x2*hF;Lueyrj741iQLjgHBYVcaj>tlhx=gQKNUR8ol$>=$)@d z?`3NAUam&(6>9V@P^0%MHF~dBqj#Yiy^GZ7T^t>~6kIGxgE7!f?Fq5F*nJW9#r4EIYNI0);Z$y}4f8u?KL5d>G z4d$Z~5Gy4Tud-ZT8zqpOsYWOjN8IOtO8SdQcxL2Pq>*oS{pk&5xrp;h+ySQp-MpIU zyei>sYn@kXRqEmPXoO{Mb$q$G?+We7DlN5(eYu)t4qEb(W@?mbSdmC*i>RLXBO_vMB* zrPHytqD`?+^(1d@Z>?9UcLP_wTGT^ntEllK*yq^6e1Q~#EJW<>G6(2Oz7F3_%^)j^ z!^odPFUIIErBmfznD5{_`72!FavXTWBe1(aOumE7xQp0oc7V6#?V$DGiIq!7Jxc;`h8{vDLJKRdD53gQty?+tf(857<@#tpuz^OUXI15#U$VY6Ne% zdOCzScU;S~%y};mf{I8x>~qubrUF1pOBlFQ>Hov~Y`63&(bCION=b zVs5tbSqHnCT@xc%)>5YPRvekG5?W^og#Am=@(y;;H;_2s{&EtJ7QBUou#>)nRKz}d zHK{6h(4@9pr%7G8k0$l7lYWFGV$I%2>dSpJX)1Tpq&ZgZ7f4IFpC;#GNBt&g9cY7{ zbon-`0e#PXd<%aO_bR{44)Lw#CR?t74%^G#V+YtL>>&GseQiEvH&uNVAV9j zFY(16@Wl^{#hXw0;jw1Jad|ZUYf8l z;qrtz3DXm%Buq#cop2HEcFB{YEXxhe^v1UrF+PKJ($j)cAm zeI7ax+8=r&^lE5(XiMnX&=aADL+e7TLMuZnLd!ynLsy38hGvFJLPeo5p^>3sp#h=Z zp{}897_&C2#NSp@xR9Z6n{AWQ2ZzH@5jFtzbAfY{7dnh<2S}{ zh+iMSI{wc1TjFnsUlM;+{QUUY@l)d`$B&C289yw3Kz#4`uJPIN?c>wplj2*%H;S(p zUn9O!d|bR4PvU-$I~wW?V^JQQVlgk#WP~2E_G_>l&9G*FG*SE-9`>T%)*pFxgirE-ucDBf;N;M}yx7 zzX~16laAR;oaD8xf@Xp{Z!5e~0f>#CS2WJPT1}6u{1xE!h2o4JN z4R#Oa20H{Zf|204!6v~(+}m9x7z)}!7C0F=9yk*CCU7wDVc?y>zQC@)*1+?Drvr}# z9t^Av+#R?ruspCdurP3WU`}9qU`k*@V07T3z>q*c(8Rfc4uOn7BycWv)QK=USS1hw zpN@ftcO1OAZ@}w2;OqxC>s8>&7Ux+|*AF}Ez!h7GF}@5Ov@4yt&U9yrGr<|{T;vRK z`Z+zF&Q2$%t&`%kcA9~gSjVXb{#yXbo2Rg^|H(cKUgIa=J-%h{iF*s&$d|yy+h}jF z*W0V@JM9(rGJ7%ZFQ04Av`g$FdyG92e7*s8Z@Vjaf$hQNOtM?pjj$i7VON4&!L$iv z5J#==L5m#(o%W8k&)Q{ewVt=0wjQ${wANa8Ten%uaXb1#>vHgcr-Lq=02=Kg$Ts>x z?$H@Ck+z`p8iC6!%%kS#=3C}g^9e{&mP7Kg5K@^rkl0LtG-osvBCkRU0-B1$wkziBe*3= zN=Mc!>BwVBIH$WA34c|}P_b}8w|K_wmeMoCA$Q__(ilyt;W(h*xpM}kT^ z5(l2|b2J3L?`t#xGtFLF0Wh69S)q4qCuiH)7CU1o#w z#27|CcCq~m;r4Dw5q2Q7&)yDqkG&0UXY8FB`1S4J=GtxH=Gd8Vv+WGHS#~t+a5b;2I<96xNU7n1R>2B3^&6De-F})fpF980dQ08{%})lP{inu z^ND3&ZZE+MGT9z&_r-qOvM;l*vG2Dh*#&kVI}hRcm{rzcJ{g6XBp2a%_9FW}d!n6h z_p);ko@+0(*V+>>+w`=v5x&&E+FoOiw@27L>@0-m*jHhG8VCK1?sg}HFR>Tc_u6Ca z3+--pM}%i%&RT`p>H^GD9T1*nUt!;47uv(YM}P#!`qoCjSl`&7_^@~U1MWfV1l&)o z-{F32p^vb`L~CQW`7_)M3$2FzXIHo>Ru0@`3vFsXBv60zL4o=k8$@5Y`$ZqP@8YaF zGu{-v;JzVx!hK!zfV)q0hr3sFgS$r{H{&(Y1@5b&Gu+)G5AH6U4P?eEIIYKwogy3V z4v__SyXXXW8?0t9V=L?dGUH`|x)?7B^s(`xKzWQU0)1?}AW&LklRzIE&kFRh@r*zp z8&3=LvGJ5Z9~&D5`q+39=Zl!}gb2fZTqI!^v)kAJcbBmaF-t@nxYvl*a2JbKa2LTY z5Hl8vmT<2YE#O`yn!{Znn!&wNG=+PGXaY{kWaDzt7@^BVBe?T%HjWwdL<6{UVb_uI zQO0yU4-<)ae#JN+?oLCtUmaLFV@54e4{l9S7j6wv2X1vy8*VjG3vN|W6K)kz18!xU z%4J3+Q4MZIQ59|loDXD1f~X8Pg!8M+h!+*%#)%4$;+=y1XvTMls#H zWdz)(1c$p(Ft|^`<~f7Z2G}MZ=VfpogUtgb9>r-*CN|)l4ik@X;GcMy1OLQBIOWR3 zgB(~W9^k-2v7V#6;(mS%?mB)H?tL71Dc16z;I836!o8OtfxC+T0CzslU@$R{e+PFi zKMZ#c$1Ec*;orcW&A)~_i+=@oCYNn6gC9bjwu$Nd3xuZe&*7Hx&)}BugK#hApTeEO zKY?4!KZZLQCxDrl#6N;t#6N^Pk$(Vp0)HRwc>W&TaeP1AvHV@QWB5C83;Ek{NAtJf z7VtOWj^b~?&F8Pf9m)5>9f7l?Ok9MMrc7MOUnAVyATHpqq6a@@64O6m64T$qsVFc(nZs&OT(=U^_t*(Xlx z7?~)mY&GUnV5>2Y9zly#RI@-n1 zWY7)S3HM#P1MZu2JKQ(uHn^|Tt#J3@yeSiV=}U0;K+m6vS79Z9LA&GyNg2@R@w|&Z z2lo}a8SXZ^3GU1E8MrUer{TUxpMv`WeHOKu0&SIz2yMb$4Vbs+6L6oQkHdYMJ_h$G z`Y7CubOYQc=_7ETpbx`+9FjH6Tl7J=kJ1O=ZlLSoK0@z@`!HPx_aU50!@Nb;!hL|Q zfx8~(z%Xyod*QC5tKi;8?}59P-VJvRy$kNW^iH^|=pE{LrFy;{m@q>u!1H{18{By~ zuZEe7-U9bhdNbTPbOqc?=uL2E;}j|8GkPOj+ zYvE3zOW+pMYv4}C`BThfbP?Plx)AO}dNte$^eVXHsVv1fdL`Vk^a{9R=;d$=>1A+7 z)A?`<=sdWia0d%!GI}Z8kvRW{nT%cn_aZtQ?uB%gJCo6wiU*)Ld1i0k2-*afiOZGN zz+X!i|14Ept>pe&w51zn71|hHi~jq17+%|M)vbFbEsDR^ zp*ZxH`V*&XPn=zMqW0g`jrgxcC2^7YSkP6EDDC@*?avM`BMp3j5a4N*`t~IAmwm*7NDeDBTzfytam}K5bNg z&(q%f7@B*o-rixQvFGaRx!QVvXiYt-r)NfW^qL0Z|D>VU0@91Yp2m&R*nJvjG~_9b z#!AlHf@I(%SUX7ht3b-13#nZf{MRKT@eiy1I0JePv~nlloQAwVuMzl83-HTp@E;*J z;~y91KrWR+?uYd2Jn|$?f_KF!$!Bn%-6pabJp1kV?@e~%zYlp0ca!zSy<#W8q5cC} z1eZdKAOwz81zL?PrS)ljaue-DaS0CYe(OSRrrl_F+y&I14kRn-NIH_-g*z=LlDi>q zEWw%1jx2}V%PwFS;4Eh$tZUrQ#9aiVe` zdz@`1Z?fmvtK=iLhwUMU**^9W`Hp?e4v`b=D|VD}4i$b{0oTOD(~8hcss;VuIy{p$ z=Iwb7&Ea``1nt4|`B*xJ&*0b7N&H5BD_zKM=PT)Td@Wx`ujkM6t#mo0p}U~TD>Z`e zQX0W`D~;f%l}7MZr4hVcX#^j@p7CY+vC;@Ws5F8{rx5j;R?1W!;J!IP9maIw+|z8G@%msyFq9eTl~N-uc2(g>an zjo|m$B}yZBuF?p;LTLnFX&yI^vjs{o_$s9re6`XGUa0hfmnyyBWlAsjMx__LTdNwnJ*9v7Jhr_!aPoCbL~qzlFU8{gzGaZTmUV z?FXlAH+v8It#7gS?GNow*+mHfTZO8x;lulejp zr@$#-KRJa?A^X`G>x^Ybp#i&)9Ru%vG5ZbruS?kPQUjKqkPW~ZbUEGvT+ z>>Zp+O<2yr^Iy#c^kDDfmXzReTT1YFKx)JCAhcnhyV)O)d>B&F}`00)h};ye`}mL z!>=2VkpA_^=M;Q|8H09}IgSmC z3ycp;3`~yZT|JgJD`5BIRMI8lPH3N=z?m5NjTTNz=Um8sBKm9C(#yZHm6+wv@E4ed z$VRvWoKa2%HK+;If1B)}4(?G7(l{EAd3_XQ6BTGhT8TVFE7K~pDy@c_cnfF^S`*e8 z9;UT%gKQmGmuO7u;hwid%>NB&L)r*B34hSWun#brHla;vGu$iL0;lbp(sOAm+)&wu zCebkN4o{{jxK}lerqc|XNxsHfR*1V9+tK#)JhBrvzjwq+l7*W>b8t#z7uJ)`WH;?1 zZvmy(iho_yRq zUqD*Y(a>`nL&wr_&~(FEM3pW-Ialhz;MO~6!r%tdQnCkUPkyJ<$X-ZTX82D6!ZONS zc@_{Bd@l2!1|)6%>O3Gh2n#?fyfcBYW_SCUPX&@O*jY!g$KL0j4aEJd55`Uh;^e_& z?)gCSCQb-GrOpRFd*%~@xb1d3dBi;>NH)OM(k^*U5Sl!%!4A&Cj{ zrr4gW7jBV&N=D0c;>{0v*hTu%T=i8xD%)Lg+({U?W*R8->w08q~`eHkOS8 z{W5_~WJPQeo6L&Y6m~HyVWn&;o5rTI8Eht-#b&ch*c^5#o6F|0`Rp=wIlF>g$riAy z*wt(yTcmW4mOyg1lwHS`vFq6l>_)bn-NaU~o7pYwR(2b^ovmbdushjZ>~3}sTgC2$ zW)^5A$obYm%D0|90BY$W&`OW64N}qvdg%%FB-_ZIVo$SY*t2XC+YH&?^Xvt-g}umL zVlT6;Y#ZCocCel76}F4*X0JjjxCb)9ee8Ai278me#olJ`uy@&hXnDNPK42fRk02}j zn0>-Ng~rEc>~m;+9D>~NEA}<}hJDKpv+vmV><4y){m6b|KeMCIlRD0RVZXB9*zfEF zJBiEuPO&nM<%2U&tmC<)*bLBX7Pq-WCh`Ce@;Dw34XgxG#4GTMyb`ZWCh#h}DzCK5xJq@rVkkS;ulhk1ljp3GBtDo^9-JcDOS87Fj7x{@iN6wl)wct=vgJMk=@&2u36%;TL& zDeuC&l8bpa-kta0J$WzQoA=>;`T4vb@6QMDfqW1j%!lxyd>H8lYl7YR1^hzt8^4H; zfYdafkKzS<@^eMCF#W%@T>UMd?8=N7n9!n8oq>I%a`)&_%ePy z^!56HzFp35;w$*g{1$#IWVN7lA*;QU-^K6d_u#(ZzI+wGm#^k)_*&RsypOMg40k<$ zfIr9|;t%sj_y+zce~irJkCT367Jq_2$v2Wq_*498{tSPXZ{nND9R3_=<`?)D*g$+y z>IdAmwW;F#>v>Z zUf72`0@=vmv!CsS^^Cdh`Cc+#p714?`Oo;`u9|;&%9jkqC6nr$FBx|FNnhC8YYNHO z1>`WKWY3=I#4ouJ(zq}G?Nh(dLR2Sz2Z}*H4%q+C&ohxNAM}RaFyDlp*xTS(ybFHCd*=JlBKpw$$UIc&?Ni9JY;@per0}beq(+MUdDIk_vR1g5%4p9GJl4y*)i}meldSFe=~nK zPnajoKg?5R88nfo#Vl?K%dkw#vTVz-0#?w9!zIEYb&YUETqIl>+>feOHLJQ+16K;y zvT9p(Bqzi=$4a#7TMfVuX=F9Fnt&tHjNC!)w3=Hjtd^29VzmZmB*_YcGvc0ba8E;I zo@OT?3zhA z8du=NSeHRt?+Sfh;%ew$ErRwH_%YVC(B!+$T4r5u-C*4a-pozb3h-ubv2KNy-|gVf z++p2m-36V$d#qK~z1C`L4Y)P;S?jF(t@YLe&m|w6v9?*;tsT}*@OE}tyRBEj-PvR9g^uCt;PAX@y#)@> zJJ!44@Vxi;&WXrVC)N+v5$ng(>?r&OEyff7mK}v^lCxyj1ZSzXT?d>c$xluMZ>fRZ z5PFi0?Iw0pyP4e_T9Ym9bM01kYr73}D8qIHnp1y1H-4s**Il5~)D3!1J)j%a3;I)i zpksBW)7WR?VHZLtYAp1o#zVJiBJ{5&K}W0Do?>4N?aoqrsy)q~ZqI>qu zOQDH1587InL8I#m=u|C$-qqF6%~}Ngt!tp;b*;VBz79H~*V{Lc+wB`+G3O@ejNWYD zV&7`tX5VhFwC{ix>0S2S(7sv)4XxGC;#vz$uXW1GPgR`ns16;=nm8L%o791Z*n0Z` z`$795`(gVL=%7AoKW0B}KVd%!e%w>`)Alp=v*5{X21m|4XZ|9zRpnW8|4I7YicjyJ zTYX)hL4VtR$9~t|FVEP6bA1%&>_3Dx!sEV^>Hc%~U)f*V-`L+mGxj_0#Jc3{dFS!Z zdKwmX2$T&C+i{>@8+78Fcqil}NKT+riEyW~x>&rLQ{AcI)Wr4TwVgURWs(4nd_D32 zIAZt0?$;{vGPxR-kW6TbcXaAH^_+9SL#(f539xS9z&?l59Oo4tBageh9g^*|0)M9s zPJzVXPOFiy6Whs2a>C&FBtz>rm28ErjVBcU{weVC*W;wf3y=#0oHQpLJfTeR*4jDk zo%5UyPDf}8XF1tUj+5);k+skq?&5THx;fpQ9?&E1<@9#?IDMf7>yU-eZ@q>rCQHZ_ z&iPJ1oCo^K=}#^vFF6C8fzBXjFm#WHI>Vgd&IQhe&_o_Vu5?C1-_-&abQJjoT+q?r zfsO$ObeuCD+RDnp0a*YW2gS}5vckF8DRD}jso*;PK#oA_kVvkBoZ=jE6HW}=2&qIq zSxvH>X*lt+68g?FV6E|1vc{PSOsQJ+KZZC)O+b0}ny}`VnVCIV%KD zDLVwuDoX^ICWr>IKe$CVKrqgK{Umo8zo^OK7RL z3dr*yNr5nQ){_G%fz&`+ARQX)nSr*DPPGr52YvRAflh%evJ@via>%vhW3oSx9mpY{ z26ABy^ds^fd7m60p9Jy(odaD0T_ry{&;$JFUV+}=NB0Fcx?fbrH5gj*Lj%JC!vhxt zE(E7^L||kfUvYa!gHJj}b4MqDKPow=E|2tL#Rr}mmGXpuJi>Kxn6ckRLDw88S?`P?5jgzz8Y&xs#(PAlPZb81Rh-&Dt zu5dVl=#t`ml?w`|Dgj@$XHq!B3%l(W&d79g&G2$pg+uPCW}fOsGcWoPw6gAnu!OC;{KFZY-QQ=s%^J?r4dIm|tizeQnLDSLT~rGMyTm%n z%_0&BbSYPxq;RI&X^|9-0})-yJlz1{9MN@Deu?}&@JLtL{UpK}!LH@MfjC`_h;GS< z$|x({jYqXr9$D!bxvX3F3f&Z%j_BT6T0w-pQ?pxiD56WjV{!+$O(2YUuxj4i$#$X{i$TH8Qf2VlXb0<-E`qh zFP*MkicX)CZuX3gyhyT|Bv9#Gvu6}5!+FUXx0AC)PxOadtmr3H))>WJmfojStr4#q zHd(iZ`{{6Aii*d34YFBG=o zy&E5iB=Nk-W94r#$RcJRU$^CIM9fs(7tYI76@jlSlB+9_t3R3Relns*e8j^tx4V-f zZeO6g^}xu6N{jMK$3;6CO`^Y;;x>FFqQj}WeyKVyccnlFc|$JC z?B{k&zi7uKg>~wPH$A56R!i0OOm#~V340~hUv*1?+*8c{zQU#HLZqby`=#KX!oUEDO?aNhFhVW+#yqM==6 ziKL{M1N}Ip+9;ftu5kmCsYJDKu9^f9uWFC5UJY{fWSXnd*`2=7`)S6&7_Q{$ignf) z>Gm#C=^o3=iy!!BTnVRH1O2#?o@EX6PczwJW1w7-&4Ip2CS89jT^Br4_d~iKo$iE# zisL%@$jAx~ zjb);Ls=gb}!|E_J`qQMayJjO=x3f3DW$Cbs(|Dg@4)bAEW>R2SxrHR0=Mf2RMUk`W z3C#1^acYvtOl>Xg?8*QVr$qxv;m%1akf6yMcPYpkl%QA7Xjsqf(Xc{@ysXp0Inl80 zBrhDqeC0m(?^QwlHanui(wugJipU772w2lLvsz0#yTL3~Y5lD5Q$4%2$jb8tveW#5 zB!3{{52Qo`m{fCBph8xxx1w)BQO1%=^3wmt|E;VH{~Nd5Zj&dur3httSQJet$lC0`6Ax6Er=@dffqPpcy_8MP} zr)Vn7ZJkvB)U6w-soZD^N$UCnox{FBPOLS7a{gpFsVbT2W*T%UXB8E6DN6mUX1`dD zpe>_;a9-H$p9*zd z*qeu%&GdUUn{=~Wf*yMi9 z?4}Y}-MTA3=n}2^IaZDe-OkYW7#wa7gu0dMEw{Q6x4H@4qLZnwC^>ojAP^f3N#SzScv|c? zcoPdqsz~K#4pd%nU~Cmqg#xvtU&OG_Ep4ug%M}Km0Tm@R6)hyFKR1uiz(3)oB(tIk zC9M?=NP^2Bh&4Cf`1?zboZ!IIaW~H`LO@Yv(X2p%#kvvHMy#3f#^0EEvBtz3x5+A% zquHW)qK3M)QxTyk z1?S5wBi0R)meaYEZz)ODsTbx@_x;cq4pi__cj{$m=%4x!8OIPxl6^Xt@?VhzpnBns zvd*!BVcX^F_DD*(%-kZI!`wVw!cafQreZhCOt&i&V&tOldzrCMfF^W{SmiV_P$jS8 ztvHHJkTuASJdGf9BfT#5r>uH9xu=ry0VBp$J)Hre-l)AsL~mho)7`yAM3eH740rdC zo1SOptMTVj*jakJ>+)&9C(;}hkHmHfV$6h^63^0Gl`M~usJAvQKL~V~{%n%oPUmWF zNW@F0Qm!nZbhC1QjTVu70v5v$Az|;S9Bh!Zy|2 zLq(Ev%+b*;DCj6%@vxVxW>F-$EQ?60+fcbKV+^I%4e0I1-R%-q5V!Q2Au_-5l2OIl4P?bZK&QX>xR1CZz@n%heBDgX=-*(5b(Y~& zt1#Ac=oX#cV*$9VfuxAryjYm^@3M7K!*2R;uGb*$W;x<+)zGbOgM_{Egmt*HE_zzB zIaakqaBQr%)Yu3|k^^JQ)ha2X`Bf3U0gPnoTwJ~s2o2Rh_^OT%=ZbML&Z4fGTLdJ| z42~=RO~mQyMRW^CR7T(|s(2JY?~XI|-Zd@N93LH@Sf4bfB1yM?q_Z>L-T(FL;f`RB z$CaboDJk0;ulr@ZzaP@{`?L&myl=}N$z|gwR2Z+u&4>x^Rq#GqAY!>-OaHd9u zOqZV(Ny{;dqDYP`-C~B5b3_rk)oqUG_f*!H9dvoz=E0A2pQR}u6N~nf^$77;%37Qd zNq2uAN$YG*Rz(X=&Yx0TI<=&D%D6&vvadKPy0jikJj$f>TG4Hhh{pwTIfG#I>Zvs) zlNWl-$@EmS*pCGs^HCKBOiA5txf-cF29nEY0(q@FFrq6P(VgUW4mM`$J^ao_ag5RA zvZFwuc)99S?i`NzaD4Hf8BLg=iv9C|I}c*OsIr18)YZ?^&6B6gmYNbQ{u5JDe=$Xu zH=@&egC|wt3G&u?>eVPWU8hUQHgWrr7BOLLrI;nr4g!U)Xx-%4V)wyVH zSHzp5qbTmZ&oxVqBdm+z&Wpf}bYof!lk#-Sxf zaR84~ukX>Ym%pZ7UAAOicJ#gc9wx0=*zHv>toWLd3^%>xYnu6rpbh4$7SPWMY1Ok! zqi6X!FxmdCpWcVM$;xdNvSYhFNz$s^D&)ty(4T!QDX3bP<*7gH|5jFPXDNx_Xa<;r z-Q92~-$Sw3yKru-?4Z@k<>&rNehE$H27>wJ_dobhZ2yA~>42u2-OqSk<}te@1+Ct= zWVCurh*8whvVq`?l|a(g>P;{|#*F}x?WWemcJ!wxudi4jPIc*YLPj7M|Ws+2!y-ce5s%eZLR;5g@Ef;f*n`13^f~cJq>I_GOUmN6)bTqp5Du z%rU;yVYi{oA{7^O39jgS&?CMK!WwH7K7#(zKPlf$k`nX%KG{v>NSZ7fjWqreC&&6n zl4#Ln7?rU%l30tqiKMxKV3DF4)C;TFMW}#UL{*gOe$$Z)s)`7@t7LOmx7_&79$u&|R3+a|Pe(q#{DmCCXQt z41Z}dH2S$KRy37dwxR)4K(jw)skq>**wk9Vw}z>gp;_gS-mRwQd%J&HeiU$*U`)vc@)4{{Ah&u< z0>>u$m;pYNmjJ6(fxyC8;CRa-p7f&Vrpc2_qJESMqW1_4_a4y+-XmH;J-Q2FL8#m^ zs1s#*iQFa7i;d+imp?ByRs*?&6vX)!KK&uN?75F>(er-jmCs%9P%Ax;dhfkLyGxzU zAXWV;y5R~*T+@?ycZ!lM`s$8p(L`VH1r zufOo9iZfa%!bRUFd5C~k!Q7|{hWdLo1v5UDK~fAOQZe1SX~P-v+p<2A%@uu=G(>?} zICUI6Av?v1_KD*W5s35JM*Ut95V~n3`A`rlM?B~^l63GA#SmJO4LVj54c?jpdLUZ8=3Q z=zJAEx$Pn82A!Ft8oYd?Ie_gJEsi7}bPkf|?LJ~!k3OpUh%q`0bdawEWK}w;Tqbk| za?LGp#(MLW(v}uz zY5U`orX)}xG!z0fSflrQ&b`kzlI`?;-#^}bBG2=jyPbRPx#ym9?z#7YyUu(h&%1%0 z)ei0AF_c_)Muz5vRtDyRG~yu-Ir6OBCJ9=&8*)04{yFTkIrXgk79km1mEUNH9DFJ- z`S{FYh#@hsCf#~C4U5R|Ol7FivsW$|{A5szhYqel0DU8N$W>sFI-H8U;{|HC#H? zn1-c%*lTFS3RlvHjYng_#+cGf^GbK5N=JPr@^DH5>XAAymqw}$Jp%`+{i^ECAwXWU zQPz7^4UCG{P=JTi4p}W5w8DP0K^r_8!U|f20R`$jO%Zx9?3FG}ezMC=lr-CKrj2XW zKJ9KBk49%8qm9m>6=V8At1v|oJe*cB%Ih69*d+rVPXN*m6ZEistwUYZm{+<%@uVgJ zHQ+luWfH)>V04h&qbffh4GQ4VLY{VtWrc8+;xX%R%G`lfZW5rS#h@*;SgR2Vg93Uf zlZdj;V4tdL0qq(!!S7|m#$Xj>FzQDJsz2A^WmWZHjp1y{*J{>oF60n$26E(dHHu;5 z#(Ff`#Bxm1(<>dYc=Fj?v7BHGkQ5lYQ4ow_APW*1P&`t{(#aYdPCJ5sWU;tKadY`c z%m6`W94Bv~krNJFDtT1B!zLi4(?~jdr9;vuixUxvL&Q4~q@VB@$2z z>x99V*mbu?#x8bjc^ShoRPL3|U$YsO#Ybrv!2w<8g*Edxz7GXD3GSGNhfrKi(70`Al{yfGLX_4X5wKH1j!OpaL=x z$7G#IouhD411(_F|5H{Y+*k)a(bn!+bUyW#NsjSq?KeF4r}Om zViAcjGDM8DQ&g+ra2WPE+zrE7HfMwCEsv+9u^d3d&A{o>$)K{bU6Xd&#Hh`p4xGDa z`wX>hcpip*4!^^2md)#6v~6^W-057_K4#L}pt6#$fgh!(!NABMm-I3ic`Yb;7>3i} zUl{fp-UU24r!t!>*>=BzQM7uY_cMw52D`dLmrcm$Zq_>r4hXub&XNA$7JcsMTR>0~Z;isG! zobEF{8D@4Y`J{96JG>djV~*w6u(Cq^G}D=v*b29$vnkH+Ub7~jX^nG&&os%^t1+pp zYNT;)zQcYbfx+(qr|08gymEoB5R`&+mS_InR(h zhfQx5qSzRtQlDwv+mlmS(_&@I*tg~9^}_ycO$|d#*!qBxrFGEEFEHOp~t$6k77}N727_39940jI%iRo=o@Gr#-orn8v?=+OFOduO|u-+iX>Y)>}1fIHm6 zjxd>S+0yELssMmpW)7pzw5K_HCR@_{=p}QSp8`(nS=LLlRT|4OH`%lN@9oB%yebt+TPi|HQ!O*?4ZvyZ#j9U zv~l^_d(=SLODa3VvXtJ=FFsRw=T|v%*dQ?95eV#%Y0!@y@6^MGPX4BRE7vyRC1c~2NAK2!TQ8$v;gMy4HLB{%nzF~IKur$u1qLEkOe z$;{5S0jK-z27+0FLRpMj<-oG3U{5!>UQ)Zi&z_$`UF`2r`b|dhnKp!39gzR*Eg1U2En$ zCJ@;x{O%>Ag`a$;<)U7v5q@mLaB`l*kYSMQ8E-Aw-_4#gGzg|$STvz7NF;N6G; zjd6NQF9+4OL}hFpepSqv3RP_BZKEzzx)B1!<#c(vIjYM5Lj1~hbQvfZ)m0F?t}ac` z)%jFig)ZwV$XHkBf^~#S6TZ5-3PV>x^E%G%GF*mKqa6;$!>MXjhLa23le+1HHY@n_#UC>p?w63mA&{dGLE^j}G>N4CCc*$eGy1WemaD}gmUDoC8 z2!Jd6WYjszNqXw?OgYjy77xD$o<={6cY_WxWL{TcpSrr*Lsyacy1Y^W^&9mW_^I~f zRUuJb9`nYps$WIi>gp_nu41iq8P6BhReZ7DE{`?qG9ovs_sHODUEOY?%d_x+%khaD zbdk5F0Iu4T$Hwul@RR%&)zy6sy1K$dSLgM0c_{|cW%;;4S9z%h;Hnh>31-u4pJ<*fzy zRpYf#m6s>g0axYK{R6tX{6m)~*rWP@nl}Tgyt=kQA5i56)Hn>te#h0ki>vt-SNt9~ z_*C`zmSQ_>OS9gVLheDcHrl%|Uu>~Um}zzl z)Hza#4q0JlnJAVM^959}z4X~%pp;nI92nSfGY)l1nFg)PEMq&4h*@E;+8%VL(+;Ou zrXM>!){7lCQpl_ndpqR%HB;=Ts==!E6nnRA$M%RbZQ1OHG{JjT3K-CO(aFnaGzymE z7b(BheJr{<6QQen3UnF#8`ag3AzfX9qpRRxU0rXZtHUUIOwE&+l9Tej50sbdnl3M4 ziR$XSh8|P$IHu%)3T)Ta?L)e}atYPbalgvt`1h{@>&ektK_S?FGiPVB%-=J zB!geMuIh0mr{uLPfGd3E5g)uOIiap&(dC&D;9=CS@KGlzbamZ}E(7(EPss;)3;^$n zF1nI$>Wq}G0{wM$)JRuHkaTs|iLQ>QI|5k0(GLsd{=;J?io#T^*LwWz0UxD>|s_MRavHm99>#=}JG* z<K+qa9of>=p+8+7^22(d=&KG<=?fJdx*bamEE zS4X_`0mat?s@#AY{{h+WxYEz!N-v8meJF0|K{9?ns;f(?;!1Ccw+u*mk3*y^?~U~W zv5U_4l=ULknv$MKc~|R)Szo&|9b1yl`qlbk=1*C#;D~YNA8@`S2*!~PSBCRF1z((v zcc!P{r_1X}%=Ho{-ktduI^SVRaJspEs``v~#K}`S)=Nom>|xXUie>$Z{_;kXwKvII zSoD~EU5MEwIR$VSvR5YuxAkIQPh<8)!WMfB7O*dEv^8v2V2?f4b$iw7rU1E~Qiz3F zCT?F?Ks76cyiaB}`;7q*Znl)TePOZ1DPwLr7Cn3C)aiMNj_o`<<}2I)W~25q@R+f- z6nogdPTmc(3~g$fFZPQ`FeU9Nwk}}O*-~f=(5L{@i(hzcjJ4~ybL`Nr-9zra{UZ|8 z(~i@B1d^}4eeU7?BZ$T!5G=k7yy1ruoBQPw29FVomY#$(jquAN4Zkd6kj^3kzbrDa zH_S^0(s?Pt@qaFlUwOi=UmcX~R~ISvtBb7q)fut=-dd)5iSC4l**Any#%A2I z=h)$#DCLcyl$~>$Y#5Et^n?V)hhw44P7vU6C?eV=Hu9beNQlwLzNS9UOLDq;2T;cJ(URfU@#5K|b z*NKNrRV(2n>*Xh|neuVnluy-8kE(vkC|jT>Ze#c8;X~X8KTsR=pxU5E*@k?gHaH)( z!TDqx{3zStjNAr4aT}v24jtn*_<`D>2h|2W$~NQ^wZZwQ4bCUq;78d8XXG~MiC7Q8 z2+T70)xDq?=i8sfl#RMkA zfR!b0-w8y^?>R*0B2}h<2};QZM&F0L_G}EYvSFwWAICj+$hQl`m$U)|fm*5WTn{4q zxCGK=B?xL_fJ)8g7b7XxL`)_7O@Jedh3D8XXR%?)BPlTgc0LPVLe{(Y;9(r6#nVjV z2}`xlcpf$vv}lV|v=PuE74H`1&}mVQnigpgAYB@0Ez!I5LEivY+S z!!KJ%xW1}2)9nZHzs54CrCWNE0XxmKni|45Ax!LyIXM1MuLEeOd zCGf0!Ic{zE@S$A_8YQUp9LJc^wFR~u&9*w|*~pD&<<^KrdsPj6O+yEHWRb5$!Eh|t z%xB=&M|G-xwW@rrwtPJb)`NV_UJe1aVH5+jEnq?i%|6*+slA{w21Se>V4K9GDm@!i zrDubxc#gMa?>~I_=Am7OPcmH;-u(*4ejDD>?2jooaZH*2G373fDK|h&ZMVdfJ0R8) z%|a~6u0012pQ3Kc29!@frhGOr<%^FgA4^R6mSf6i5L0^ z?=Pl&c`@b7iz(k-O!@9&%6Au2J}Pq%m9H+Qe0eeDGmEMFO=9Y5+kSP=Nq?WgfEZwt ztn_SoS`ZLx0tjY0_6QzXO5`f;7At&ANf>;zaT@L<_q>P7#FP>pKMUOzb$I_w?)~>Ey~;9qIQW}lo!86N@g4tVdWEN zf|P4amg`B#-D3PIxZEwqJL|akWu2=hA$NoE%dRy1_7PoCAH04l(4FpfH6G#dQ;&S` ziKYp)%^ErJm?|hW^v%al92?!UJAE&)O7_V;$BtvAfb|5;Et6rKEzgm_B;yznd^@D6 z_okk{Wee9eog6yWbMSbyxs(Qr63Fj3B{jTedN`Ldw)LizQjIN~lAsz}IDMs5jH9ws zaV$0x5W$n0R&Gn1whLS<41p;nL*yZt0-fbBdZr{3D(Xb`l(g{f!#G-gYzkbG1Dgt| zxJzwHohDmn@#o4yrATbjaCiYeN1+I3LG*{akA>09F( zzUA%Gse;g?t`-)e0Y}j^Xp+ zF_B1AguP;6P%I25U&&0qvMy6Rn@MG~&rPiR$3S3mQkHWMYc>2$c#ro1SA*-K2|r}Q zF9H4u6aIpNM=}d2zsr*u!td`WeR5EH%59X3c*k80SAT-9Sly_6&?ry+aDQz|{l!Rs z&20bAr=%C+%j0Qgy49bHgx@sq3l8|F&HC~Q&i(nc>)*}(81-5Gxl#EbzPH8Yxj$c; zQa`@3pJ>I7scrR1sJl?Yo_+_)cJk_5f(8p`mXO+YFNczyY z;d|BwAMm)D`K|f_)7EFe=Zdd2zRd=TLGQM(G<*IYJ z(kq*^xIRydwan5&L7x`Ef%dpwQ&Ux$kr4{!=coG<5r51tKDGSpP$IGGp5-g<8ES1E zx@YCkrOlf!4efk%^X5myvpG4zwD{oND_7jLL)QoITE61$o$=s?hlhtgx_$r%-`f`@&5eeEw*W#{F!_4)vsDOZB}h(cz@S`VQ|U@ z!IGg$csvym?WyFS2a|su7TuYmdtGL7g%l1iPOQ^D2l3#-H})V`+@FD5$#7-j3w!yD zU#KcUq9x?d>Na#rV>&PQb)8J+yOX^frMWsIC^jn-FOCA_`w|{1zYk%!HkTmL`yzBR8?2B z5O-8n#Epk@B6RT1w%tAcH8;23epm9BqVULx6GxJ-i_G1J5ARO?Nqcegrj8Xg*>hHR zZW;`%TEBi}VD-wCtBHo(mYZfsHRCq!TEV!T!wdlqb~q%PaGjf+$G9PPcnW3~MkZ?h z6x@C;N}RZT%YDbR$X)#?xMeoRBMwUV@P)q?mn%?HgGmw#(Y(kH2d1RfiMxcWNq%{E7_&{aR}*u^`w zP*qjf7&((pDP$VFCFk>>&&j*)Kz=C@_?R`8G&ZXB5VuUsYB36P&N=a4$!bw}_~h}U zV2^+tvgI2Y2mqp_b0c3GG41rV6`U$_E)Cj(iYLvmmBg6XA>u@ku3y zRxG@&F)Mm(!Q$Jt#bVoTTfE>{G^_D8cYNnv%a`A^Gv3hXYpRKDJ+o-hnXR!%ldrK6 ze8;W0hg~(UMmZ;32buSC(E7h|>)7D%CZhQDb#a*ZH?j0Oc!+I0KT~nJNVqVL z^+XBG0m3oE`}|RwF`bZ*51N?Qc%MJWbJ{Ee>Y1q??*#{Znc3fQ+26@4lbzcA=x-s@ zJ0qi}CgP5`Yicq)k=E9HFnKtTpWm8D7l}Yjc!YL;USqVu|HHIz7sR7^K7RR@`=1Nq z&Hjl)VpiJKg5)34lW#u~3Tv~<#eE*JuOXD5pUtny$J3Kz4WV$TRs3_B_+)bBjAR$2 z&8o=>cdNSrUk7c%@K@0~gu%wb<2F~N>8P)LI#?R*oaL#WAG!V*XnXtSw3lf*DaNcr-t`_s7>|fdN`A`mWn5&6`O`nM{|QIa1DM zR7Jq(aviQZC%lKRY}&jI?`7cf`t&^lk6<0pHUPsc8m)@TnmD2hA?o7NSg0h0NzA?T zj?=e@SxH^Imi(azC;#*0;UfpOY}_Xzfr5y-%}$Q zk#HU{H>XcSYqf4~L~YV4v8fB^94dlR3{?BtMjrXa#4)f(I!%t)$aaN%Zdawv8d_{u2I-BR^?< z5`NhM|Bix3GK&b#bng@yX8TjqgD#a09vHFV{S|QvbP%rjSW%a2FS(j&J*}bX(i#i% z0~s6;?M<4pGn8h931qDBy&J|lx<-1_dbUMtde_hGJQ>X_S+pY3Hr%~;(?>5X*xi2e z^xAuBa%#`JqZ`}0*VJXtS=!v#*O*^fnHwt2sa%v8SQ(hTw0+f%xpmo%G;v)E@lV*8 zBNa4j@#n^$7EU%ni(VsM$w{6O_Xf0!f#k;nz&{iChfVw=iG0G2t)r^A@dSO4)=OzW zS*mh|2yQ%In^SYo+S4c7hkGu3bkpAMUF|h12TC)er#j}Y@2!b$>q+Y!>FOABw=`zg z&E2u8ed+AL%7Mh9%AC?rZe?XYdegjgPIldz?zW9lmzey|$qDf-tk-2&pDJqr?%>`?YAzjU$dlgX8H1sb9q_bc?auXnE@|pf6xL4v_)sO#Byhs=9E?k;)Cy7 zw&bo|3BtA#<6Hp#&G3}4jOBNdjr2~kck;KG55hHoeC^;MjDX3{v9O!b4UlPIR0Gm4 zoFU2M?)`FJAfuyQ`+Z=dv}Jxtx;BF>QqqVfw2SXe zA5KK#G4bTev%6Ybcb#3i=yvGjW4%jm-yVx?zkNyXiKeW^+dmr!Os@{tHsv%nZqbtH z54Xr`(kS=m0oPuZXA(}nE(yN`_$Q{xf64LlSSm%bl5(Uszn%_YK#jk_X@O_X1Hr? z6C^DZ5=FDy=C{r69qEV-uPw?c**MY~-MnZH13wfWXsK(Q-!y+&WkD>GJttliYFdJ= z^X9r}Z}W#Nn$SuiX>!>{6QAOVIX9w71gz${F=qrs{PcC1<39p{aWM%A__N99#qYJh zaLol*N9KXtH8mbjBmp6Trw9xOB0-oOS$K@Yh9QquzI*iR_bnT^ZOt}qW8aa!*((;* zY#fYb#rJHjS-c@K|K`3Gw=G`v!Izf>Giv5-Xl)%R$()&&<*gmiXJa!a%{!~uKWo;E zG*4p1oWznj-WlG?Rh=E%duv%%VkF30LOx@7gDc=Dqd%Ij+QY$#e+gnPvHJ*~U~dv>9et|8^6IeLSvh32H@W2XFgu@Sanr?%|T3a&Ox7;P|s&zWdzy2R}}87JYO*!khw`9`m0I zQZ~rg(~z;t0MDh`ZKHxb;9){tEb2NiC#!aM+u^%{J;#&(8FW{dvLnUEATg^-opE9FN(+U&$JDQe;mbspguWj@|n-x zFJ<)PFw1E0zX-6#FX5K}CmEd%c%d!-MU_7lenG+~{}Q#nZp;6)$`5~}>rc!*vi`Fc zTzK8zg`^^QBr}iTq`OWI3lG{q0qE1Va^tGpiOE6N)2y?~`T%F{nt}W;+S)&_@`DRp z|KKKFTjswqxyROT(zPZ08I`{r`IGEnWq4+Vg0GyccfDe^n~|CO-^3rcL$@0SA3y~Q zH8M1xuRt?uIXdTqhPEA6ehxjA`x;30U+L^bmk?_9|#{7CSA zk;c5ZS?UVK$mMpEMkev;0zM?^t0y;!Y?QX(hgc^|14cWTGc9csS_HJ_V8)l@+e>_< zYnvZVzAK70xZ_P(4bkVs8-ZlTu3@T^%Q6ig0~KJWO+JY+5w0xM`7G*`8mzPjq)QcZ ziF!+V3b&B)L``2^<*J@{-sv1Dt?sCpvoc0)b!>DO#cRsiX9vonMdc0ovzK>^Uj>q) zZ$0F(#_j%yamH*ib!4MXl59@Q_ls61^5m5x9T=5i%a3(1$m>KL?jVmFLsB6U;-lgx z#mT?SdL<}+lYBNuZ2n5I_+|1NGm{T7wa;WHZvh3k2ByFhOo0bn1Eyv6qz!)2fKPg; zMT`#Rhh{QBbR-FALCGE*U{49v{$1^t@EWm(2mIi$BhQ(Kg&iY#wtPWHIJtmu>$Qrj4MuLHgP)T?5f<$?!pw867JG8&Y z*hw5e;(Ca2CvOFMY{D59lnXJm8HEmM_#Q z`8)u}T)WH^a$~J`@ybGW1bA5W8#E#vpe%^`4`YeCX`Naya zSndzbNPaCV`Bg6}{<<~*zIzhQ9k&P5!nbWXdMixnH{{H~R8%so|SG~qm3Qd>RGdmw@>`)1Tm84)GO{|7ZX4dm=e~|S&n9hdX{3ZA1jSr3|w}>Z6-%G~Hh-Sg)T$CeVzGfp7urHL>i%i0@&KbOM8s;%%DQ%TiQNu^|1D$#AAZ? z#$|tLwWqe>f5A=>d<)p|p|SN~&xc3XgON?q5`7vC^$ZNO*sGTL6-$Hp^$Td+!!+ox z@_N5{tM>JY{^q64sEU0BZZB{SxFV!?rp6SIg+{VKZsJ+HcgFUKv3;k0O^evrI|;OG zJ+pZ6nXN6xFIitb(04DPH#rzRyN6Njp&*h0W})&g<_AdPTRJDe@B1+9qZSg=?&gHcKp6z?=5b9sJC~guJ7#a9nu3gZ{0F7cT-pQ z=BW6<+zlPW!>e}eST#J{v0*OpB>4-x%<=!1k|!rwo=7-(FC_eu>!jhmaOA%TIPLu{ zL_Gm`DKb3eEOAroy`b_*_@`C9e_S*iMz2%*dR~A0BLY!1yaXVg9%LiRXdFl^& z#R+e#{$kg^uvc8RPhN3ndLi&2uXrlnPdo4?`6}sg)&Zvo7+GJQ>Q9mDBuCW9`mA#3 zkBz=oxxkcipaXk-WP419Y4AJmsE;&#ng5FGH0vC){S}aO9d;fky%mf`_B4e^kY#Oz z(p-z}dj^}^TC-;4WoGsCM$rXY_uAH2X^B;0hl58VM$!8pJ@-9jE zWe1%083<1M5C%t|2OO~XMJHqTS*y`dv>(UjO`HmmJ_`@ zUR|%>ajs|0{p;Iz&3o>-dAr)zpTDW++#Pz`op;agJ+Vda-qVf$rF5)k=~(ZYPnfac zlkm_IZWomBSuwJtCt;b7w4|`l$0B-uS0XQCW`-d)>38|<%jYa^oKxnn$eNj3otwf# zKWvDEn)L#|5QZqF-)$e>mNTO^QBhu=H8aPT{e~e`jbAyYz?t>SUtuh0XOzZ5xEdjK z?`996OQ@JJ=6RyAfiV1Vt*xTiKy%s{4eezEqp3j}vi+~4eNFK~MyAheK}oA14yhq1 zYi@Q)K-@{GPVOWRf#fQZPf|{vWDkMls;^E-hy1anTk^#y&vFUt5Vkhc0^qt3)*;y9 z*cYB+*}}-R?a7MIjb7Ql{mSTLkBxk6L9YAeM_9f1f z(u*FD#dtqc&riNF=(a``z?obF9*c(eo0#4&T0c9Lj^b|-XD4Y%<3D-U9bw(4(vm#Z zUR4;AoR$QfG7D!^n{(tEs?a0FdZN9&sIsr8Y(uASUh-=x6MBkjbS9@PT9IBID_rDT ze!sC27{82NyZft3GfNn9(ZViO%A`{qP#i&@adJTACv3Xf-8)-bcix@4N@+W0^>@{{ z-NDusv!@_8MQ{67ZhFc57O`U4u3t|Sw0C$6Z_9@;GFk9k!b`;?L+TlrIaCpeg{!TB zIrrB49%9}W|L29m7m}IQ(40BM9G*-%dHh4n<4MKiy(W*_;TK&B4j&BgfE=Lwurzu} z;?PX7=YHDA&2Z92WbNYy9Co=?3;Aq%r3FH8mZy}Tv@yV0uG+DpwNlpij9K5PqrS^1 zXLx2Ts==dnJ-QKpUyFA43xpe{k}t_#8#ip*R_$XLn=nSE2HYdL!!~t@Nm>&aBKt6j zvC`#>=bDo!($!lmN*x3CL}6Zj54IfDj8A?q+8)RWKWGjgd5k)+(v*R75dmk}D3EeZ z=^RL4+w%_2N@smOy8PZMU&ZZ9mJiL1uHG@YI@-MNrnW;hGwb%wU9z(&x_WTO>S)UW zcUygSq_u8QeM>i-JP}-^v%00KG`DP4{i22#K!p(;IA7h2v1bg3gG8p{pgiUv3IDQ! zM-Y<_I5h8ot3+til)FgjCj2S0T-Yp^#~O17_G-{$m5x}NJmSDqEH0R}c^tW)v*iX~ zDxAm7+=I5<#Fu%@mmT2CGLrb5pZF4R@FkbSD8T;!58%tn!XhnK31K*PA^{Ia9k8v; zR&#zBa#TL?hdIm-ZoL z|IGTGc)3;%ZD7jg!Z9&^Na%yOI^V)JK#8-CR>4}E=L!m%$E3_kWVyM z_=J(o-c4~?J1t)E(TE=EY|r%uy~bqPzOJt?-!N{aF`J(wgmZ?S886OnnHx~nEM_X= z_S_Uh1xrPQs>o9C!TCtGc59*vQ;Lo@kwQ-PYE2~WUi?2pJIMh<2J6nD{}Gi34$@%) zQoRoz&|VC-{n-$mCLn`#=+D}Mfy5X07|zH&Urf;HK1tV4n{;{<^dLX1gd3yb90iMq z3l;T3CJ%3N@aXTrqZB6xEkwJ3e$g5OIZY=I#lqyPh*r-Ov2gNLm^wI61apUJ(4}pX zG=N;e5X{pO$nSHjum$*IBY2;Mcep+pLbZi~($Y*33@3l$Eh@~NQ&>=k*nMyECt(rH z1fVeT?O>$1u%kPXudSGPB-pICgeqrORnbFG+duJaexj?rptLrKUT0#C0Z&k4Axpb) zR~4@X*yYw9(Y`}kzEjr09m75Y3>CcX;=CGulG<4$za26)z@j^+$PW!N`Kt>Th_9J4 zw7bnMg3bsRaL~&*jU_gV&T#U3naS^kMJJhtbV3tkLT;!QY1rMM-J}Y4EKn8TKX;Wo z<`$)I=l^2n+rhUpe-U~+_*U9miqcGN?aIU!!hy^4%wMKt{M#&PQ{fj}b~s5+ng8rH z;Nu2-a**&d^8?P3E4BXflwb8{T>DS5oUQ)M)8t06qg%hq{6Tgk+7kBGuFe1F;D6e> zH&)XaNXzmEXZ1|n!~I0PWGdC6@;C-U-cNxDcK)6=0F!{%f;8V9D5lLqT zoxyyY{!WhgQL;z8oUF@v$KZ-hJR%#^h@^8X#4UFC1?*Z<>k>{QBJ-cU27KIrgU^AL znICW-k<|LnQ-0NpA8S8@M(z^4Tb~GFM~`|FXl>2cemt{sRaNq8dQf#LS=`mFeLpvx z*Ph&*^N#A=rJbAGA$p?;Zkr`bz5WA>s_!KW?Mn8)HGOxm)DRD@czbTKihg(vu+ zvL}!;F$hNj>OqvI8dt=&@S0o5G)aYD1fLPDQsEaIaN+}5&$t0M$J>BIu2DTWMI!k? z!Y@PKk#5TM8?>?afizP`Kaz2A$m)xXToA4uqTY23<=ybOVQ_W?MZNfN@-S%Aik|ks zDx(-soSSMw5GeU{aB9npsh^b=5ohuDi8Ac;Bg0_ho3=;^E=5Jw0cKlOy7h z4~&n0Ai3{n9OuDxv1~l8=8BB9mheO1eF-;WttFf^K7!MI1QaDr_Yv&n`v^#{ev;z< zWIFr@d)be0qw+zcJoSz4BS@*g80oKpFJ$|;k02$z(6yKEBS`JfMZ(W4M?M_cA0rlA z<|mC!_9vh6bANuqyQi{0Mmh3}$o|}@e9)!JbAPaVno@tU>$|*rD%;2IX-Yc!!@i)@ z{ygpI56LFkpR*1)**&s9d8$7}uD#OkVSKD|=#QiijT`%%WPRLElWtahfobbA=;QI8 zH|pbdXkC)^U2*NVjRRR268?-MKdo01e%XM-f_TA(*H^@=JfEH8Mz;a%m6|rUi`xKH zJ&zf1+y-FpAM*2U0C&Rs@g%$-G?&=xJpF8KNBZ{OGYr4NKAObh z5lmu=ff&O-|D#qI^ny<57=IM!h4_(Hd9*6zhq_O<1>BvyL%ekLKJlew@A*5PfBxj1 z*kek5JCOWZ;5UK5Z^TFMe=P9e+2qaO0Ir)Q#3dymUgMFJa2hcQzwDCmbI|HP2wc<| zRIS;H1WNy)o6cLek>rqYNN(F1)UL zVPo^n^bV7`W5$@OtyR&F!)4tgJ#@G%acK3tvD(ar{T)Y+?%nk1PvKFc^+)Xxq&uVwmr_W ztp|QWt1UW5Ih%biJ&*-fUr6T7W*L5?dV?;bUTT+Qp0nLz*L^JWBuz->In(L9FGY-` z((-9Xe@J#wIl6-u2i&R+H1ZrYl@t$q@vQY(0>tDE>fPgzS5qlZXPROIh64!;MdT_K_eq$DHIajTPjunpc|~9P&GG2zyvC zoBw}v;?uPi*wDF11h>OqQWFtj!5ba$TTOo|a`A0DinUuj6Axv~d35NSry^T6cL}dQ zdDXLe5F5qQpNdr4CfOJ{Sgo+Th?T?=s(ei7&eOMdjnrmGhT4uFN)w00>$`3(Ezd10 zKD0AgK}Qrp{X4Pf_3#XZiv=@x9BY6)q1d4vLEUsFi6SpK^wQY^Ma}YIMGl;`HAO+Q z-xh~Ik(2MsYp&HA%vLATU&7PKfo(i~|wwzt>xK?DM7z7Fv3=Hz*_~C%8<0lZJ20oMly2I{Ni+;hJpA4%MN(AuoHaj%vk$yc z0qd&%J&hchJvSV^Z;1E}2k@mVs#u(NFJJeiq|6vC!IpVF9A+EMQZ*F zDnI;C;*_nPrycdsx+&{9>wuGAn&5Pn3hk2KF!>bk*~oURa^pt1$w8u*Ss&oM-lpPp z-pJ2*(RwS}zcTr>t$(!MO87I5{KP2|ewpz~bIqNsQ{z-9W3PCmlnO{|r}TAmG@Utq zGs1O6q5AU7`ufHae|h%I+{o8$Bl=pfrX(C|3Hgc_msfIlobN|!kkOulFLKECw>ZPW z9m#(YX?6}t;>ILvWN9^`o?tb4ilLLs9Q1n}^m`5ZK-%OZ@9_-QK6wU9TN0S~q;Uod zWqIuXm3hcIgY}5`B6z!uPe@74!qkstaHRbVR%Bhz&wkdqtkQl4YhQ88?8**0gH=*i zPiL^S)q#nRnP;#b5&z3GSWe`{H`O_mN8I0JtKccZU;L|vvp}E;tc#Yk&FGT%HQaF}a;B<&8=P$OQK{d1Q~ ze-+it3!@B%AtP>U->%<=J57$mJSk^vn)-q_z zP3!a?p24ZDo;UM%x?iMILR=4>Z2S<#ii%)OQ*6(Y-pdKH`6BAN;?M#}wxh zh??L@=s7Z&BR<{H2kZ^KW1Ky-AA;B*&m=r2KIJ?Mk=%mGK&#*xbvmJ#=CGv;$OvE$ zR{v7md}xHPUL!PbV=(hZ!FXry^S<(m_r8aX_&ehl+Ef}SUyeR{hKIW;nY4lQ}ONgfk?u;%mpsCR%23$s$09O@V;+C-uw9Db1((A<>VX`u%?;LBQ zeLjT%CcebI5?^QRiGcyQmt#*f;O>I=TKP+5%qpp{@;;G#+~SA1TU40UadgviP`-Bk zHhuTeT7T)^2E{Y8mMrbA0sRYRsy*&|VXbsK`X;)1O5dT1%HRD{WrClgzN~;?V zU@bqh=f3{F^F5jK?qvpAZx+_>pIE7VndTYoMn4Rh3aN#8W*!=&2R>OQK5*-U!MjhM zyqgXe-Q#|6TwFjB)1Gw|DrfzMzs9iq!UG~01j!vBhPdn)U0w=x*d<{ z%G>ezJ$qlce`ftoylBm^r(^BdPAgg}KR)E>CFzo~H_tfWq)STpWe1%0H@Fq}Zsh1< zl-YMf5iNXQfGYPD@dB@OvVHQk$@(5eIV1ApVU9>3xD#7ztP52u77uN5@apd{mgJW} zD`^NB0y)h=G%#;`kAq`aG~7r#?qUP6y8&*>S61^WW+|H!l7xx%%!~ zZn+!YU*mVx_&MCZIVdTa)=A^6mCBhdnhm~iz%Mx9kj5(i*=xYZP52=7!ORc1!KaS; z&r^QY=U1^?4jYg><*IY|aR@HeeQbYnU_(Y)r_tXXb}HnR)i#AaRb8{S;pAszm!~1e z#>!ZEj(cXF-v?K z_}UU5xc`c_8JB|m`YjTuKW2-M_?O#Ys#hy{x{axx3cuj8!-?uL|JiH6$4&U4c7>@f z^N$PMwm40@=PAGJv%4JoqilH_fwj~0*(5kc>|CSsCef!S!uu?0&rNP0zK7%OWxpYv zRR6BHcG&2Fd8^=;8DDMkoykYsIGvA~f&Q7=W9u{+(+tTVD^1*bjgd;$xU;T3S{iOC zvPKN@h%v#;-Uc-T=VV;kcHl9Sy=As|1yNN+H}57i7l$n*T?ku9zUg`8`<}1bcKqpf zAdCvv!rXuptt?|@q(Um(h+s&C8xaf=PFy1EF(Mce@bCjm8(c;(B%syU;l^G+?W#Y? z+Rkah2fOOOV5!#wxXr^3_-7cdEOJOgwr?~2^-@OH*`*qC|2t}vd+~GJ_1D{rpKI;K zf0y^-zi92nFCe-@hfO2B!$Y1#Bl4Q=RFX=UWfQ^_tFx+eL?Zxfk4s+Uqt%EpMX^-^4FXB;ft`Bppu<$zy0>z!PEa{ zFDKk!GvOKm;bx;OqN$((3u=ST_>bg@Pk4j=Q7!(E+{R`>?p#*~WVMGHq0j|}ex1FE^*@Tzk!YclgC=G&KD z2XnI|uuCl&R3!=XqLf;Tm-HCexeHR#3g4jHH&QWw+Q1PMd|s8v@Se4xh}tnQ&tuGs z-WW6Mu}X}q5;PJsR0*;OF%m{@TTOu}H5sFq;XQA)t^L8o=!y-BJ6{yXJj2jd@N)xN z&2S?|$!JacgqiEIDqAo9!-m^eT)(k$yR(eknG3&f)?q=tk6P`!2aLSl#}qW*(d$Ri z>%YMK?U{TQ@SAvEAzJi3&n!L+a)a6R=g`fP|8;{owp4p!V#w@`_KJ!3VSG`Y7`;pGnX}_}w(_TxrklMaUtaZ=sX^<1Yv!5qE ztw7*H_s7uk3igKbmZeR)V3&=yER_Tb^NK<)qaYm-@gQiKjFGJLXwk9W-ebv^f|;2=!(Fzxub2OI_nlh4;zVEHi51IF^|`e-le-57 zUdo*}x@hsC?(Rd2fi&@gY8e<|J%W@R?~~9$!bd^L6WPZe*D-wkVFRL>u}+4~$Ty1X zm+V0S{)V0IG+85OnF5KS{>EAGS-feTe^{2Wz_RK%NwQKnB zt_@oce@lC5m;al zkf}D?g?+WDRFmPD#-8`IBs}UMVYsHbu%f-tm)~04)OTHS?x|=l&nYbO6^7d5$v37@ z7TD3QpO^h!5m$_`vtKhn-*|C)I&n7&I3K&a2m`jA_mv-dNj>koI5Rglb7oG?jnDcD zoionN%$4Ih>KNC{7}wXK#{@yiQIr4brlaNb97u}%n1h5VT$ub1QF&ud)V4z<0v^tJ z@ZRxoBP99yv*F30IQ<^*c!lslWG`gluOX3OgWI@DF%r)`BZx^~GS=HWwxn&S!Z&M+ z-glt8`#_(*WtOjE$lZ5x#fp=?b#*y&BA9QB4?#%e)YW0m$=XRe9Fv;PRg%By7=sFK zQ~DPS2{2u&MD~5xY&p4?Xg+Q0B7=R-sTf?mO5D*pSx>z-@p|3{HLykW6R?GLrqYN` zMjCV+8AK&t{7X7=?mo5VM(uLdO*4F0K)J1Z>nEt6?Lv4;PCsG^9x$J%} z*f7U8@%kI??-u+h{hvPR4~oKKq0bPdRk{AWY=1x$6er(IPyS_PUY@@J+pc0o^3$H= z<3wNdSvv{Yl||>FoZq=HrR{XI{&ldVDN*bx@2dX#H7PEh`*K5jsmRXD%}O*+JUl(^ zLE#wq>X)pWbYbKPr)NRGo8-Rf^*N2zfNOKxzpw^yjZv2?KV%Zopn>Ok*>vm7lLeU*tn9bugRICJz?hdcwcsX#q|vZx7RYBE^8Td)H04*=o=SA zg_pEnV6`oiJ5lEN^ZgmqQUQUf(zOKx_Il)))zVSot(ZUO22?3+>?m>P`13MbqZ1F) zTGl$*p?yW+1hQu3iC44a>`?slCGl;x?Tod>FY(Voryic5d5A3hWZw~^Gv@Mu>Y6iGp(4JtOkl@=) zcm(jvJVP#O2k`55K~iXGNDsTJ=%j;rvkf-Ua)?)y52E*2XWo?@M|jXWBcYe3gqc3trOe?6lBv1tpvfdXbe5oTsVzysZwh#AVG_Y*4bq zCG;5^l&l>Iy=+0A2HNd@7<>brdE_ufwUHyqS7Su65?Qwsd)O`phh8QccUf-rUUS{Dx44yv+;vF2h>? z@0dFr>%ds5&#st(xO7=Q+pUJRn;*tCE|BD+q;+TKuC4Co)zQ|CvBu4{-s-iHxocV) zmNahMux4oP+SZo6)!DTN+_U@Ub_~p%)fTDioK;Zh4~K;)iq%v$7Y4fGv%9K=HWR4ZWgXMW_Hj%vvuf{_}&Lw(Qw>LyIL9Dyab7A%xUq1WMW3g?)jF* zT(vtvbUf(p9b2Yp!kp94cO!FP6hjwUezFhW4R~|1M1-J!VP`&UT8RiSaYVERGcvt- z-n1FHo_M^c%bS;(?#Z2@xAy#0)AEGYk9H)lZc|#YXhBBVJc;dQ{{rB#(;Z^v4yaFLTVS$4x20QdP^)KF?!eNLh}MB~H1{ zSdixf3{rEgv1r>dP;>3Uhz#s($7tZgU~f)#h;NYB*Yhn}h15Ib2)#oxUVNIkqy;fS zUT{ez%{e~0AB%Y?zNI1&P@h`iXte~~Eux@dZBNaa+rrx0;;G~z?d^uKLtTTdjhmN- zvh!E$cr`z|Oy4-_5uNnCl~;3it)9PXcDSx2dsbrsG~qCs+YavFJ2;$i&ZQa$I^WvU zRg%c_l<6V9T>aP)%9X>&h00E)N^df(xVF&99_EPSWlqyK>x!1ot^s^ z_8;hEc}G~0^nRA9{s6WRge!ZpQ(T3o-{c3}8UUNfaccmM2&-EIw9>i7ImOkXpXL81 zx4hWjTv-{-4wvQqclgb`%Ho`ordNySmgd*Z?Wh(XO>Qb_ZmiF*p4%7+M(Sea;+f>l z<%yQ2g0iNhf4f#w7z{7>^o?~qmX64$1pvO z{aIM*F|==d{l)q5mwzZ}Y;G*kx3qWftML`}t!`*o)m6o?|7u#$6sc>C=nJdr>V2iP zq5Ov4hB+M#k;cyY{~``phJTW>{?wDj21C-x;>sXbSJkx&b@vzfYW8)vZ_#BF^_`88 zhK@O?I6qWd>Z`A-TBzf~tq7V%<&*Gsi!We4luy?KzN`bEulXmgDzPQjc_QK~S-Ngc z`|fTAr8g~z)-`q3we(ih*ZF4E2CJ90HO`OL&+V#HmKX61t^9JtFPkHNAJ0MZa^m## zbh8k`r8;%YQ-|C+&g(^G@^kNTHr^EoY`ErxB+84)Zt)4tLtnuPN615G|GEvkq2&>8 zlEUiiHW?Xi?f94Xv<}W+to7>~^y04OrUP9w>sKx+Yg<^>vR?1n)qdd5UkQYk?w!}z zk>?Ni138WTO=WFW)pa>#vvX^EW;ZXI>+|M>dt3TOR}mItSlDpt8{S~r8=P(zbu4A` z^v&e`Q@2eaR}p2V>0DFMHR~dQe%e{zX;BG}@zg4{L+n2qo9uF&O234&_OD?T`7Pn? zeiY+Qs|dw1u7UK`VCmPZ{xn__3y(GX`3_C>Ih>S^2Bv-yXIez3d>zNc?u?1u1z`6% z$UQ$}J!HbqD)?{;d|biDuzznqlW*LtG6so8qc$5u$a@yp?WS#Aa}%6zz%dsdt(f<{ z5#}ei!NWDtB62>5)mt0<-1V^b*BFVvC;rLI0mW5MUH765x8xr11oq#Ne>D=* zc>U!3_%a3Z1D=OcKeynSWeT1Jxb#=b`e$7OUMk^}&msTcTlILKR{0?vTz|{k z!NEzcKe%;;Kb_qm{ORn*8rM;?f3y-xe2Jq7-(h?Q$Le=P^_#SpHDrs?dgJ=64UhAx z95i0nOS~^C>${@hvj1d{N&G4m+=u+XV!15g6$*~;Q@Q@kq`T2RzKio3Q-AVZ;pfN$ zSAfn)D`(S~>5@UD!Wo;>#SI^?%k>T-(6h-j@uCxF{-vPXf!D*LVVcR ztN=|UuB1~-T+1b{h&5U!(x>3+@jeb(K?Z@Ao#G-z#dA5MFNlt(J1k(q=d32}V>RZg z8|Rwo+bw(-i(HG~*5|;s4E_oizR(n-uQX-NYRmIgCR*ab`9BCI@O7qt$KR{aKFeW| z3`{)VKJY4aK^x>S5{%bpCp%q_GmdYfP2%GX_!SJlACyGjqzz=YmuEHMs2JSArGCq! zFKe4cwM_#rRq(%>>~Q^-T6ce2wSFAG+T@pj)$h4=@JCAfG&}_s4vT;3z(V{r?Tffo z4S&s4L!{3%b=Zg4QJ*o^Q|h$_oxEMN^3`Ij)E86eOE(_*)gN~vaF;k<`tP})4~l#L zJNN3N1!C>rW+i{9y$NX&%}Rb7V~?TLYTYE^e?>iKc>oE|>rySROA^lO67rAXd25SoW928Uvy{{6>1Lq_d`@ zHYe2nPu@4e#U62!M|(5Bxqjk)@dwY5?%Mj?aQH`sNw22o-A-TLf^F(bGDaRt(!3wi zg;8GytoeQ<*Cg`r7uonL6vjmp)^~^S4NJMjuypX7ZF>UW0sBQIlDWAe9?^98U5UrA~}(@?U>137QO zpHuP|wFugmQTb>5jq8uLb-~JStOxJltY5l&xvD=R*9q|ZWz_dMj7=-*%TqLw@ntZf zaY71zkAgD)CTRnSi_Z;7&LNp;wC|La+T^>Fqr#gM;gP2V?SIE&U;P z->NmM#iGs5fJ9R}lN^9HVZ*yK7{do#Z}He+OaaGQui)bb9A5+hj&`_;t>|RjLb<%_!9Ni7m%bmW8sl% zzkxPFX|}#8K)TVk!cNlzHCJ zS)8`ie5GcHV^c61huc_210YI}_bSN`;dC;kIvko8AMNcux_I%io}OciZ5!a%-a;i_ zBEN0}^BvZE;=6Rxa3oZ=j1J$ZZ9Z0it@b}JesXOTek)~rDi)WNhsKH9#c81zEGX?; zxv3x62}3`y6L!1Y38OuBnp>2Hm56R%L|?C0GN?)d1KRO&)LJ}Z?07ZMj+Y~?Fx}Yk zvRcHBmxUusTS@D)7L+1QRXur(c~LsWtV+7jER`jUm;u7dDiLs$puQ3xQwh=wSMFsUmxLCaKo~;N8bcAY{^q`T1gHUoSL#fXXE9i86mbp{=ETPnA zgX3S}J}>`&*z4)liT6&6bJtKi)bx2TG}5+C(N0oF{vq4Q!}?Yu|BMX^pQwUfwxG1* z$x!TuGQWk=jor|ODQUrU+6`SXIjJSFCNmfD&W!CVOXjI4-oS{&Qope@qiIo7L349K zMN_zDSzF)A;OgGCr8VKkih|1eP{G`Rxh+c~Gi#TKNZ-chMIY{}*|sa%xp&@{{C1agd+f?BO84U5TX>d+SD!Uu|tSLTg96BXbbsCj-Fb z8t^RITw{*{pbO^kcl#SnhOaa-J~a>G6qD`|jcmV!2N)UvaWe?xnx1{S^Z1 zlK1=rG2Eef^C*_PTUv3{GI7;HDZ%+HAL(%;yfRAYc&~+}jMYk6iPYFT&~pRjR5yhq z;C7Lkm=u5hB=$!g-erU(TIdJtXp02(1mU|@G_@1EYtazF-2bm==>AM{XetrYTvebJ zMQzAP{3#Iy85!3YKf35q+BPngPV$OpMkUC<`dzcOKQ&HEC zR&%uN7=(Wiw%Li#4g z$h7H0m6arw{4oDQBddg4+rD2*|B$Vo>PE6YzE4QY<;-+0?qLQlW>T!4oW@qc%Pfx z#NGz%?g377U-tNE&Mj$2Im%hRuM*%`mo78)j-rLN zT81l^d@Is@X6!8akCwL8n!y?3-kSDu6`GN}12_+&FE!YiU7#;Q zy2aFwXW>H_{Ozn?%pWbyD%m}6+v=M6%a_lusadlix}!9!Y+b|p6@V<8UsJcsehPq1>v?eq3 zBH40*zdUH9F%QWS7i}f{W{I#Y@gmt`R>vCE zfu-(EQE-T9?Bse z$SVt^GJ!vTro{yv%b)Q6jTe}(2NhJg#to9O(EIIyRb#fes)@%qstR?4!N=Qis}${) zQEv>VA59O69{6MTf?%tzSNif26C&asXczA$XC^wzeStjj4zFncH*N0$7*}=d5AV5G z+SRJ>?v+->vbt8iODjuOvDK?B$-T+F$Q@T~Awgm7o)HYSwRy_X&Pnz0eH4aH;VM0o6e3ZQ+ zDYwagc-~AeO^Z!%Mk(=Clhnk3k=nqn(#AUYNck9`kN7i88aGm&Jy6r2Iur5OHM;E3 zx~n;ibwXK)pYU94n}iYroq{CkK?o0UxW>NDbv2hi#E|rA`?NiC;2h`;4UGzNR=NDC zf0Dx5CaGrjk-(uw5DxCema?&9CV%EQzqP2mG=)6>%je^MVe+4^ll}7(gwq=134b^+ zk!IZ?G%L1_l75cf8%_3h6ox*!ELtEdv3<&7V=L-TX@Ag`w6j`)t=*hLQXL3A5fpk{ zgEmsnHG0W=ox*28Adb5XI7lOl-W~EmDYJn?bHeTDGkkz4w8vaOw%8B
e;Wr%`Uu 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

i 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 + +export function Apps({ className, ...props }: IconProps) { + return ( + + + + + + + ) +} diff --git a/frontend/src/assets/icons/Block.tsx b/frontend/src/assets/icons/Block.tsx new file mode 100644 index 0000000..adeda89 --- /dev/null +++ b/frontend/src/assets/icons/Block.tsx @@ -0,0 +1,11 @@ +import type { SVGProps } from 'react' + +type IconProps = SVGProps + +export function BlockIcon({ className, ...props }: IconProps) { + return ( + + + + ) +} \ No newline at end of file diff --git a/frontend/src/assets/icons/Bluetooth.tsx b/frontend/src/assets/icons/Bluetooth.tsx new file mode 100644 index 0000000..98f222a --- /dev/null +++ b/frontend/src/assets/icons/Bluetooth.tsx @@ -0,0 +1,11 @@ +import type { SVGProps } from 'react' + +type IconProps = SVGProps + +export function BluetoothIcon({ className, ...props }: IconProps) { + return ( + + + + ) +} \ No newline at end of file diff --git a/frontend/src/assets/icons/Camera.tsx b/frontend/src/assets/icons/Camera.tsx new file mode 100644 index 0000000..9d5b1f9 --- /dev/null +++ b/frontend/src/assets/icons/Camera.tsx @@ -0,0 +1,11 @@ +import type { SVGProps } from 'react' + +type IconProps = SVGProps + +export function CameraIcon({ className, ...props }: IconProps) { + return ( + + + + ) +} \ No newline at end of file diff --git a/frontend/src/assets/icons/Gps.tsx b/frontend/src/assets/icons/Gps.tsx new file mode 100644 index 0000000..0537a18 --- /dev/null +++ b/frontend/src/assets/icons/Gps.tsx @@ -0,0 +1,13 @@ +import type { SVGProps } from 'react' + +type IconProps = SVGProps + +export function GpsIcon({ className, ...props }: IconProps) { + return ( + + + + + + ) +} \ No newline at end of file diff --git a/frontend/src/assets/icons/Kiosk.tsx b/frontend/src/assets/icons/Kiosk.tsx new file mode 100644 index 0000000..b92361f --- /dev/null +++ b/frontend/src/assets/icons/Kiosk.tsx @@ -0,0 +1,11 @@ +import type { SVGProps } from 'react' + +type IconProps = SVGProps + +export function KioskIcon({ className, ...props }: IconProps) { + return ( + + + + ) +} \ No newline at end of file diff --git a/frontend/src/assets/icons/LoadingTwotoneLoop.tsx b/frontend/src/assets/icons/LoadingTwotoneLoop.tsx new file mode 100644 index 0000000..c6eb68f --- /dev/null +++ b/frontend/src/assets/icons/LoadingTwotoneLoop.tsx @@ -0,0 +1,32 @@ +import type { SVGProps } from 'react' + +type IconProps = SVGProps + +export function LoadingTwotoneLoopIcon({ className, ...props }: IconProps) { + return ( + + + + + + + ) +} diff --git a/frontend/src/assets/icons/Message.tsx b/frontend/src/assets/icons/Message.tsx new file mode 100644 index 0000000..e774849 --- /dev/null +++ b/frontend/src/assets/icons/Message.tsx @@ -0,0 +1,11 @@ +import type { SVGProps } from 'react' + +type IconProps = SVGProps + +export function MessageIcon({ className, ...props }: IconProps) { + return ( + + + + ) +} \ No newline at end of file diff --git a/frontend/src/assets/icons/Reboot.tsx b/frontend/src/assets/icons/Reboot.tsx new file mode 100644 index 0000000..1fc624a --- /dev/null +++ b/frontend/src/assets/icons/Reboot.tsx @@ -0,0 +1,11 @@ +import type { SVGProps } from 'react' + +type IconProps = SVGProps + +export function RebootIcon({ className, ...props }: IconProps) { + return ( + + + + ) +} \ No newline at end of file diff --git a/frontend/src/assets/icons/Sim.tsx b/frontend/src/assets/icons/Sim.tsx new file mode 100644 index 0000000..5c36140 --- /dev/null +++ b/frontend/src/assets/icons/Sim.tsx @@ -0,0 +1,12 @@ +import type { SVGProps } from 'react' + +type IconProps = SVGProps + +export function SimIcon({ className, ...props }: IconProps) { + return ( + + + + + ) +} \ No newline at end of file diff --git a/frontend/src/assets/icons/Volume.tsx b/frontend/src/assets/icons/Volume.tsx new file mode 100644 index 0000000..86c0e0d --- /dev/null +++ b/frontend/src/assets/icons/Volume.tsx @@ -0,0 +1,18 @@ +import type { SVGProps } from 'react' + +type IconProps = SVGProps + +export function VolumeIcon({ className, ...props }: IconProps) { + return ( + + + + + + + + + + + ) +} \ No newline at end of file diff --git a/frontend/src/assets/icons/Wifi.tsx b/frontend/src/assets/icons/Wifi.tsx new file mode 100644 index 0000000..ac4a75f --- /dev/null +++ b/frontend/src/assets/icons/Wifi.tsx @@ -0,0 +1,11 @@ +import type { SVGProps } from 'react' + +type IconProps = SVGProps + +export function WifiIcon({ className, ...props }: IconProps) { + return ( + + + + ) +} \ No newline at end of file diff --git a/frontend/src/assets/no_items.svg b/frontend/src/assets/no_items.svg new file mode 100644 index 0000000..ab5b250 --- /dev/null +++ b/frontend/src/assets/no_items.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/frontend/src/entities/beacon/api/beaconsService.ts b/frontend/src/entities/beacon/api/beaconsService.ts new file mode 100644 index 0000000..014d4a6 --- /dev/null +++ b/frontend/src/entities/beacon/api/beaconsService.ts @@ -0,0 +1,58 @@ +import { mockBeacons } from '../mock/mockBeacons' +import type { Beacon } from '../model/types' + +const BEACONS_STORAGE_KEY = 'fleet-ble-monitor.beacons' + +function cloneBeacon(beacon: Beacon): Beacon { + return { ...beacon } +} + +export function readBeacons(): Beacon[] { + if (typeof window === 'undefined') { + return mockBeacons.map(cloneBeacon) + } + + const storedBeacons = window.localStorage.getItem(BEACONS_STORAGE_KEY) + + if (!storedBeacons) { + const initialBeacons = mockBeacons.map(cloneBeacon) + window.localStorage.setItem(BEACONS_STORAGE_KEY, JSON.stringify(initialBeacons)) + + return initialBeacons + } + + try { + return (JSON.parse(storedBeacons) as Beacon[]).map(cloneBeacon) + } catch { + const initialBeacons = mockBeacons.map(cloneBeacon) + window.localStorage.setItem(BEACONS_STORAGE_KEY, JSON.stringify(initialBeacons)) + + return initialBeacons + } +} + +export function writeBeacons(beacons: Beacon[]) { + if (typeof window === 'undefined') return + + window.localStorage.setItem(BEACONS_STORAGE_KEY, JSON.stringify(beacons)) + window.dispatchEvent(new Event('beacons:change')) +} + +export const beaconsService = { + async getBeacons(): Promise { + return readBeacons().map(cloneBeacon) + }, + + async getFreeBeacons(): Promise { + return readBeacons() + .filter((beacon) => beacon.status === 'FREE') + .map(cloneBeacon) + }, + + async getBeaconById(id: number | string): Promise { + const numericId = Number(id) + const beacon = readBeacons().find((item) => item.id === numericId) + + return beacon ? cloneBeacon(beacon) : null + }, +} diff --git a/frontend/src/entities/beacon/mock/mockBeaconVibrationSamples.ts b/frontend/src/entities/beacon/mock/mockBeaconVibrationSamples.ts new file mode 100644 index 0000000..ac0451f --- /dev/null +++ b/frontend/src/entities/beacon/mock/mockBeaconVibrationSamples.ts @@ -0,0 +1,141 @@ +import type { BeaconVibrationSample } from '../model/types' + +type VibrationMode = 'idle' | 'engine' | 'moving' | 'load' + +type VibrationSegment = { + mode: VibrationMode + startMinute: number + endMinute: number +} + +type MachineVibrationProfile = { + mac: string + idle: [number, number] + engine: [number, number] + moving: [number, number] + load: [number, number] + segments: VibrationSegment[] +} + +const baseDayUtc = Date.UTC(2026, 6, 9) +const dayMs = 24 * 60 * 60 * 1000 +const minuteMs = 60 * 1000 +const sampleStepMinutes = 15 +const sampleDurationSeconds = sampleStepMinutes * 60 + +const profiles: MachineVibrationProfile[] = [ + { + mac: 'E4:5F:01:AA:10:01', + idle: [0.015, 0.055], + engine: [0.11, 0.24], + moving: [0.38, 0.95], + load: [0.7, 1.15], + segments: [ + { mode: 'idle', startMinute: 45, endMinute: 95 }, + { mode: 'engine', startMinute: 95, endMinute: 125 }, + { mode: 'moving', startMinute: 125, endMinute: 280 }, + { mode: 'idle', startMinute: 280, endMinute: 335 }, + { mode: 'engine', startMinute: 335, endMinute: 365 }, + { mode: 'load', startMinute: 365, endMinute: 540 }, + { mode: 'moving', startMinute: 540, endMinute: 650 }, + { mode: 'engine', startMinute: 650, endMinute: 690 }, + { mode: 'idle', startMinute: 690, endMinute: 750 }, + ], + }, + { + mac: 'E4:5F:01:AA:10:09', + idle: [0.02, 0.075], + engine: [0.18, 0.38], + moving: [0.55, 1.18], + load: [0.95, 1.68], + segments: [ + { mode: 'idle', startMinute: 35, endMinute: 80 }, + { mode: 'engine', startMinute: 80, endMinute: 120 }, + { mode: 'load', startMinute: 120, endMinute: 245 }, + { mode: 'idle', startMinute: 245, endMinute: 320 }, + { mode: 'engine', startMinute: 320, endMinute: 360 }, + { mode: 'load', startMinute: 360, endMinute: 535 }, + { mode: 'moving', startMinute: 535, endMinute: 630 }, + { mode: 'engine', startMinute: 630, endMinute: 680 }, + { mode: 'idle', startMinute: 680, endMinute: 735 }, + ], + }, + { + mac: 'E4:5F:01:AA:10:10', + idle: [0.006, 0.035], + engine: [0.052, 0.155], + moving: [0.19, 0.58], + load: [0.34, 0.78], + segments: [ + { mode: 'idle', startMinute: 70, endMinute: 110 }, + { mode: 'engine', startMinute: 110, endMinute: 135 }, + { mode: 'moving', startMinute: 135, endMinute: 225 }, + { mode: 'idle', startMinute: 225, endMinute: 285 }, + { mode: 'engine', startMinute: 285, endMinute: 315 }, + { mode: 'moving', startMinute: 315, endMinute: 430 }, + { mode: 'idle', startMinute: 430, endMinute: 520 }, + { mode: 'engine', startMinute: 520, endMinute: 548 }, + { mode: 'load', startMinute: 548, endMinute: 625 }, + { mode: 'moving', startMinute: 625, endMinute: 700 }, + ], + }, +] + +function getValueInRange( + range: [number, number], + machineIndex: number, + dayOffset: number, + sampleIndex: number, +) { + const [min, max] = range + const seed = ( + machineIndex * 31 + + Math.abs(dayOffset) * 17 + + sampleIndex * 11 + ) % 100 + const ratio = seed / 100 + const wave = Math.sin((sampleIndex + machineIndex * 3) / 3) * 0.08 + const value = min + (max - min) * Math.min(1, Math.max(0, ratio + wave)) + + return Number(value.toFixed(3)) +} + +function buildSamples() { + let nextId = 1 + const samples: BeaconVibrationSample[] = [] + + profiles.forEach((profile, machineIndex) => { + for (let dayOffset = -4; dayOffset <= 0; dayOffset += 1) { + const shift = ((machineIndex + Math.abs(dayOffset)) % 3) * 5 + + profile.segments.forEach((segment) => { + for ( + let minute = segment.startMinute + shift; + minute < segment.endMinute + shift; + minute += sampleStepMinutes + ) { + const timeMillis = baseDayUtc + dayOffset * dayMs + minute * minuteMs + + samples.push({ + id: nextId, + mac: profile.mac, + vibration: getValueInRange( + profile[segment.mode], + machineIndex, + dayOffset, + nextId, + ), + duration: sampleDurationSeconds, + timeMillis, + }) + + nextId += 1 + } + }) + } + }) + + return samples +} + +export const mockBeaconVibrationSamples: BeaconVibrationSample[] = buildSamples() diff --git a/frontend/src/entities/beacon/mock/mockBeacons.ts b/frontend/src/entities/beacon/mock/mockBeacons.ts new file mode 100644 index 0000000..1fe25f8 --- /dev/null +++ b/frontend/src/entities/beacon/mock/mockBeacons.ts @@ -0,0 +1,108 @@ +import type { Beacon } from '../model/types' + +export const mockBeacons: Beacon[] = [ + { + id: 1, + identifier: 'BLE-TRK-0001', + macAddress: 'E4:5F:01:AA:10:01', + status: 'BOUND', + boundMachineId: 1, + lastSeenAt: '2026-07-09T06:14:00.000Z', + }, + { + id: 2, + identifier: 'BLE-TRK-0002', + macAddress: 'E4:5F:01:AA:10:02', + status: 'BOUND', + boundMachineId: 2, + lastSeenAt: '2026-07-09T06:06:00.000Z', + }, + { + id: 3, + identifier: 'BLE-TRK-0003', + macAddress: 'E4:5F:01:AA:10:03', + status: 'BOUND', + boundMachineId: 3, + lastSeenAt: '2026-07-09T05:47:00.000Z', + }, + { + id: 4, + identifier: 'BLE-TRK-0004', + macAddress: 'E4:5F:01:AA:10:04', + status: 'BOUND', + boundMachineId: 5, + lastSeenAt: '2026-07-09T06:18:00.000Z', + }, + { + id: 5, + identifier: 'BLE-TRK-0005', + macAddress: 'E4:5F:01:AA:10:05', + status: 'BOUND', + boundMachineId: 6, + lastSeenAt: '2026-07-09T04:50:00.000Z', + }, + { + id: 6, + identifier: 'BLE-TRK-0006', + macAddress: 'E4:5F:01:AA:10:06', + status: 'BOUND', + boundMachineId: 7, + lastSeenAt: '2026-07-09T06:01:00.000Z', + }, + { + id: 7, + identifier: 'BLE-TRK-0007', + macAddress: 'E4:5F:01:AA:10:07', + status: 'BOUND', + boundMachineId: 9, + lastSeenAt: '2026-07-07T12:25:00.000Z', + }, + { + id: 8, + identifier: 'BLE-TRK-0008', + macAddress: 'E4:5F:01:AA:10:08', + status: 'BOUND', + boundMachineId: 10, + lastSeenAt: '2026-07-09T06:11:00.000Z', + }, + { + id: 9, + identifier: 'BLE-TRK-0009', + macAddress: 'E4:5F:01:AA:10:09', + status: 'BOUND', + boundMachineId: 12, + lastSeenAt: '2026-07-09T05:58:00.000Z', + }, + { + id: 10, + identifier: 'BLE-TRK-0010', + macAddress: 'E4:5F:01:AA:10:10', + status: 'BOUND', + boundMachineId: 11, + lastSeenAt: '2026-07-09T11:40:00.000Z', + }, + { + id: 11, + identifier: 'BLE-TRK-0011', + macAddress: 'E4:5F:01:AA:10:11', + status: 'FREE', + boundMachineId: null, + lastSeenAt: '2026-07-08T17:12:00.000Z', + }, + { + id: 12, + identifier: 'BLE-TRK-0012', + macAddress: 'E4:5F:01:AA:10:12', + status: 'FREE', + boundMachineId: null, + lastSeenAt: null, + }, + { + id: 13, + identifier: 'BLE-TRK-0013', + macAddress: 'E4:5F:01:AA:10:13', + status: 'FREE', + boundMachineId: null, + lastSeenAt: '2026-07-09T03:44:00.000Z', + }, +] diff --git a/frontend/src/entities/beacon/model/types.ts b/frontend/src/entities/beacon/model/types.ts new file mode 100644 index 0000000..bf220e7 --- /dev/null +++ b/frontend/src/entities/beacon/model/types.ts @@ -0,0 +1,18 @@ +export type BeaconStatus = 'FREE' | 'BOUND' + +export type Beacon = { + id: number + identifier: string + macAddress: string + status: BeaconStatus + boundMachineId: number | null + lastSeenAt: string | null +} + +export type BeaconVibrationSample = { + id: number + mac: string + vibration: number + duration: number + timeMillis: number +} diff --git a/frontend/src/entities/device/api/device.graphql.ts b/frontend/src/entities/device/api/device.graphql.ts new file mode 100644 index 0000000..31d641e --- /dev/null +++ b/frontend/src/entities/device/api/device.graphql.ts @@ -0,0 +1,390 @@ +import { gql } from '@apollo/client' + +export const GET_PHONES_QUERY = gql` + query GetPhones( + $page: Int! + $query: String + $locked: Boolean + $needMaintenance: Boolean + $networkStatus: [PhoneNetworkStatus!] + $orgs: [ID!] + $sortDirection: SortDirection! + $sortField: PhoneSortField! + ) { + getPhones( + page: $page + query: $query + locked: $locked + needMaintenance: $needMaintenance + networkStatus: $networkStatus + orgs: $orgs + sortDirection: $sortDirection + sortField: $sortField + ) { + page { + id + imei + imei2 + serial + networkStatus + + lastLocation { + alt + date + lat + lng + } + + org { + id + logoUrl + name + + policy { + bluetooth + bluetoothEditable + camera + cameraEditable + GPS + gpsEditable + sim + simEditable + offlineTimeThreshold + } + } + + orgId + + policy { + bluetooth + camera + GPS + sim + locked + } + + techState { + batteryLevel + needMaintenance + temperature + } + } + + totalElements + totalPages + } + } +` + +export const GET_PHONES_TABS_STATS_QUERY = gql` + query GetPhonesTabsStats($query: String, $orgs: [ID!]) { + totalPhones: getPhones( + page: 0 + query: $query + orgs: $orgs + sortDirection: DESC + sortField: ID + ) { + totalElements + } + + onlinePhones: getPhones( + page: 0 + query: $query + networkStatus: [Online] + orgs: $orgs + sortDirection: DESC + sortField: ID + ) { + totalElements + } + + lockedPhones: getPhones( + page: 0 + query: $query + locked: true + orgs: $orgs + sortDirection: DESC + sortField: ID + ) { + totalElements + } + + lostPhones: getPhones( + page: 0 + query: $query + networkStatus: [Lost] + orgs: $orgs + sortDirection: DESC + sortField: ID + ) { + totalElements + } + + maintenancePhones: getPhones( + page: 0 + query: $query + needMaintenance: true + orgs: $orgs + sortDirection: DESC + sortField: ID + ) { + totalElements + } + } +` + +export const GET_PHONE_QUERY = gql` + query GetPhone($id: Int!) { + getPhone(id: $id) { + id + imei + imei2 + networkStatus + + lastLocation { + alt + date + lat + lng + } + + org { + creationDate + id + name + policy { + bluetooth + bluetoothEditable + camera + cameraEditable + GPS + gpsEditable + sim + simEditable + offlineTimeThreshold + } + } + + orgId + + policy { + bluetooth + camera + GPS + sim + locked + } + + registerDate + serial + + techState { + batteryCycles + batteryLevel + batteryRemainingCapacity + hits + needMaintenance + overheats + worktime + } + } + } +` + +export const GET_PHONE_GPS_TRACK_QUERY = gql` + query GetPhoneGpsTrack($phoneId: ID!, $startDate: Float!, $endDate: Float) { + getPhoneGpsTrack(phoneId: $phoneId, startDate: $startDate, endDate: $endDate) { + alt + date + lat + lng + } + } +` + +export const GET_PHONE_PACKAGES_QUERY = gql` + query GetPhonePackages($phoneId: ID!) { + getPhonePackages(phoneId: $phoneId) { + category + iconUrl + installDate + name + packageName + version + versionName + } + } +` + +export const GET_TELEMETRY_QUERY = gql` + query GetTelemetry( + $phoneId: Int! + $packagesPhoneId: ID! + $startDate: Float! + $endDate: Float + ) { + getTelemetry(phoneId: $phoneId, startDate: $startDate, endDate: $endDate) { + batteryCapacity + batteryCycles + batteryLevel + date + temperature + } + + getPhoneStateEvents(phoneId: $packagesPhoneId, startDate: $startDate, endDate: $endDate) { + date + phoneId + type + } + + getPhonePackagesUseEvents( + phoneId: $packagesPhoneId + startDate: $startDate + endDate: $endDate + ) { + events { + type + packageName + date + } + + phonePackage { + category + iconUrl + installDate + name + packageName + version + versionName + } + } + } +` + +export const GET_DEVICE_PAGE_QUERY = gql` + query GetDevicePage( + $id: Int! + $phoneId: ID! + $telemetryStartDate: Float! + $telemetryEndDate: Float + $gpsStartDate: Float! + $gpsEndDate: Float + ) { + getPhone(id: $id) { + id + imei + imei2 + networkStatus + + lastLocation { + alt + date + lat + lng + } + + org { + creationDate + id + name + policy { + bluetooth + bluetoothEditable + camera + cameraEditable + GPS + gpsEditable + sim + simEditable + offlineTimeThreshold + } + } + + orgId + + policy { + bluetooth + camera + GPS + sim + locked + } + + registerDate + serial + + techState { + batteryCycles + batteryLevel + batteryRemainingCapacity + hits + needMaintenance + overheats + temperature + worktime + } +} + + getTelemetry( + phoneId: $id + startDate: $telemetryStartDate + endDate: $telemetryEndDate + ) { + batteryCapacity + batteryCycles + batteryLevel + date + temperature + } + + getPhoneGpsTrack( + phoneId: $phoneId + startDate: $gpsStartDate + endDate: $gpsEndDate + ) { + alt + date + lat + lng + } + } +` + +export const CREATE_PHONE_REGISTRATION_TOKEN_MUTATION = gql` + mutation CreatePhoneRegistrationToken { + createPhoneRegistrationToken { + address + expiresIn + token + } + } +` + +export const CHANGE_PHONE_POLICY_MUTATION = gql` + mutation ChangePhonePolicy( + $id: ID! + $bluetooth: ServiceUseOption! + $camera: ComponentUseOption! + $GPS: ServiceUseOption! + $sim: ServiceUseOption! + $locked: Boolean! + ) { + changePhonePolicy( + id: $id + policy: { + bluetooth: $bluetooth + camera: $camera + GPS: $GPS + sim: $sim + locked: $locked + } + ) { + bluetooth + camera + GPS + sim + locked + } + } +` diff --git a/frontend/src/entities/device/lib/phonePolicy.ts b/frontend/src/entities/device/lib/phonePolicy.ts new file mode 100644 index 0000000..565e07c --- /dev/null +++ b/frontend/src/entities/device/lib/phonePolicy.ts @@ -0,0 +1,85 @@ +import type { + ComponentUseOption, + LegacyPhoneUsePolicyOption, + PhoneUsePolicyOption, + ServiceUseOption, +} from '../model/types' + +type PhonePolicyValue = + | PhoneUsePolicyOption + | LegacyPhoneUsePolicyOption + | boolean + | null + | undefined + +export function isPhonePolicyOptionEnabled(value: PhonePolicyValue) { + if (typeof value === 'boolean') return value + + return value === 'Enabled' || value === 'Allowed' +} + +export function booleanToPhonePolicyOption( + enabled: boolean, +): ServiceUseOption { + return enabled ? 'Enabled' : 'Disabled' +} + +export function booleanToServiceUseOption(enabled: boolean): ServiceUseOption { + return enabled ? 'Enabled' : 'Disabled' +} + +export function booleanToComponentUseOption( + enabled: boolean, +): ComponentUseOption { + return enabled ? 'Allowed' : 'Disallowed' +} + +export function normalizeServiceUseOption( + value?: ServiceUseOption | LegacyPhoneUsePolicyOption | boolean | null, + fallbackBoolean?: boolean | null, +): ServiceUseOption { + if (value === 'Disabled' || value === 'Enabled' || value === 'Unspecified') { + return value + } + + if (value === 'Allowed') return 'Enabled' + if (value === 'Disallowed') return 'Disabled' + if (value === 'Changeable') return 'Unspecified' + + if (typeof value === 'boolean') { + return booleanToServiceUseOption(value) + } + + if (typeof fallbackBoolean === 'boolean') { + return booleanToServiceUseOption(fallbackBoolean) + } + + return 'Unspecified' +} + +export function normalizeComponentUseOption( + value?: + | ComponentUseOption + | ServiceUseOption + | LegacyPhoneUsePolicyOption + | boolean + | null, + fallbackBoolean?: boolean | null, +): ComponentUseOption { + if (value === 'Allowed' || value === 'Disallowed') { + return value + } + + if (value === 'Enabled') return 'Allowed' + if (value === 'Disabled') return 'Disallowed' + + if (typeof value === 'boolean') { + return booleanToComponentUseOption(value) + } + + if (typeof fallbackBoolean === 'boolean') { + return booleanToComponentUseOption(fallbackBoolean) + } + + return 'Disallowed' +} diff --git a/frontend/src/entities/device/model/types.ts b/frontend/src/entities/device/model/types.ts new file mode 100644 index 0000000..ea39e04 --- /dev/null +++ b/frontend/src/entities/device/model/types.ts @@ -0,0 +1,268 @@ +export type DeviceLocation = { + alt: number + date: number + lat: number + lng: number +} + +export type ServiceUseOption = + | 'Disabled' + | 'Enabled' + | 'Unspecified' + +export type ComponentUseOption = + | 'Allowed' + | 'Disallowed' + +export type PhoneUsePolicyOption = ServiceUseOption | ComponentUseOption + +export type LegacyPhoneUsePolicyOption = + | 'Allowed' + | 'Disallowed' + | 'Changeable' + +export type GroupUsePolicy = { + bluetooth?: ServiceUseOption | LegacyPhoneUsePolicyOption + bluetoothEditable?: boolean + camera?: ComponentUseOption | LegacyPhoneUsePolicyOption + cameraEditable?: boolean + GPS?: ServiceUseOption | LegacyPhoneUsePolicyOption + gpsEditable?: boolean + sim?: ServiceUseOption | LegacyPhoneUsePolicyOption + simEditable?: boolean + offlineTimeThreshold?: number + date?: number +} + +export type DevicePolicy = { + bluetooth?: ServiceUseOption | LegacyPhoneUsePolicyOption + camera?: ComponentUseOption | LegacyPhoneUsePolicyOption + GPS?: ServiceUseOption | LegacyPhoneUsePolicyOption + sim?: ServiceUseOption | LegacyPhoneUsePolicyOption + canUseBluetooth?: boolean + canUseCamera?: boolean + canUseGPS?: boolean + canUseSim?: boolean + locked?: boolean +} + +export type DeviceTechState = { + batteryCycles: number | null + batteryLevel: number | null + batteryRemainingCapacity: number | null + hits: number | null + needMaintenance: boolean + overheats: number | null + temperature?: number | null + worktime: number | null +} + +export type DeviceNetworkStatus = 'Online' | 'Offline' | 'Lost' + +export type DeviceOrganisation = { + creationDate?: number + id: number + logoUrl?: string | null + name: string + policy?: GroupUsePolicy | null +} + +export type Device = { + id: number + imei: string + imei2: string + serial: string + networkStatus?: DeviceNetworkStatus + orgId: number + registerDate: number + org: DeviceOrganisation | null + policy: DevicePolicy | null + techState: DeviceTechState | null + lastLocation: DeviceLocation | null +} + +export type GetPhonesData = { + getPhones: { + page: Device[] + totalElements: number + totalPages: number + } +} + +export type GetPhonesVariables = { + page: number + query?: string + locked?: boolean + needMaintenance?: boolean + networkStatus?: DeviceNetworkStatus[] + orgs?: string[] + sortDirection: 'ASC' | 'DESC' + sortField: 'ID' | 'Serial' | 'Date' +} + +type GetPhonesStatsPage = { + totalElements: number +} + +export type GetPhonesTabsStatsData = { + totalPhones: GetPhonesStatsPage + onlinePhones: GetPhonesStatsPage + lockedPhones: GetPhonesStatsPage + lostPhones: GetPhonesStatsPage + maintenancePhones: GetPhonesStatsPage +} + +export type GetPhonesTabsStatsVariables = { + query?: string + orgs?: string[] +} + +export type GetPhoneData = { + getPhone: Device | null +} + +export type GetPhoneVariables = { + id: number +} + +export type DeviceTelemetryItem = { + batteryCapacity: number | null + batteryCycles: number | null + batteryLevel: number | null + date: number + temperature: number | null +} + +export type DeviceTelemetryEventItem = { + date: number; + type: 'event'; + eventType: DevicePhoneStateEventType; + label: string; +}; + +export type DeviceHistoryChartItem = + | DeviceTelemetryItem + | DeviceTelemetryEventItem; + +export type DevicePhoneStateEventType = + | 'ScreenOn' + | 'ScreenOff' + | 'EnterNetwork' + | 'LeaveNetwork' + | 'PowerOn' + | 'PowerOff' + | 'Hit' + | 'Overheat' + | 'PowerAC' + | 'PowerUSB' + | 'PowerWireless' + | 'PowerDisconnected' + +export type DevicePhoneStateEvent = { + date: number + phoneId: string + type: DevicePhoneStateEventType +} + +export type DevicePackage = { + category: string | null + iconUrl: string | null + installDate: number | null + name: string | null + packageName: string + version: number | null + versionName: string | null +} + +export type GetPhonePackagesData = { + getPhonePackages: DevicePackage[] +} + +export type GetPhonePackagesVariables = { + phoneId: string +} + +export type DevicePackageUseEventType = + | 'ResumeActivity' + | 'PauseActivity' + | 'StopActivity' + | string + +export type DevicePackageUseEvent = { + date: number + packageName: string + type: DevicePackageUseEventType +} + +export type DevicePackageUseEventsGroup = { + events: DevicePackageUseEvent[] + phonePackage: DevicePackage | null +} + +export type GetTelemetryData = { + getTelemetry: DeviceTelemetryItem[] + getPhoneStateEvents: DevicePhoneStateEvent[] + getPhonePackagesUseEvents: DevicePackageUseEventsGroup[] +} + +export type GetTelemetryVariables = { + phoneId: number + packagesPhoneId: string + startDate: number + endDate?: number +} + +export type DeviceGpsTrackPoint = { + alt: number + date: number + lat: number + lng: number +} + +export type GetPhoneGpsTrackData = { + getPhoneGpsTrack: DeviceGpsTrackPoint[] +} + +export type GetPhoneGpsTrackVariables = { + phoneId: string + startDate: number + endDate?: number +} + +export type GetDevicePageData = { + getPhone: Device | null + getTelemetry: DeviceTelemetryItem[] + getPhoneGpsTrack: DeviceGpsTrackPoint[] +} + +export type GetDevicePageVariables = { + id: number + phoneId: string + telemetryStartDate: number + telemetryEndDate?: number + gpsStartDate: number + gpsEndDate?: number +} + +export type ChangePhonePolicyData = { + changePhonePolicy: DevicePolicy +} + +export type ChangePhonePolicyVariables = { + id: string + bluetooth: ServiceUseOption + camera: ComponentUseOption + GPS: ServiceUseOption + sim: ServiceUseOption + locked: boolean +} + +export type CreatePhoneRegistrationTokenData = { + createPhoneRegistrationToken: { + address: string + expiresIn: number + token: string + } +} + +export type CreatePhoneRegistrationTokenVariables = Record diff --git a/frontend/src/entities/employee/api/employee.graphql.ts b/frontend/src/entities/employee/api/employee.graphql.ts new file mode 100644 index 0000000..890ba25 --- /dev/null +++ b/frontend/src/entities/employee/api/employee.graphql.ts @@ -0,0 +1,325 @@ +import { gql } from '@apollo/client' + +export const GET_USERS_QUERY = gql` + query GetUsers( + $page: Int! + $query: String + $orgs: [ID!] + $roles: [Role!] + $sortDirection: SortDirection! + $sortField: UserSortField! + ) { + getUsers( + page: $page + query: $query + orgs: $orgs + roles: $roles + sortDirection: $sortDirection + sortField: $sortField + ) { + totalPages + totalElements + page { + avatarUrl + firstName + id + lastName + middleName + org { + creationDate + id + logoUrl + name + } + orgId + role + username + } + } + } +` + +export const GET_ORGANISATION_QUERY = gql` + query GetOrganisation($id: ID!) { + getOrganisation(id: $id) { + creationDate + id + name + logoUrl + policy { + bluetooth + bluetoothEditable + camera + cameraEditable + GPS + gpsEditable + sim + simEditable + offlineTimeThreshold + } + } + } +` + +export const DELETE_ORGANISATION_MUTATION = gql` + mutation DeleteOrganisation($id: ID!) { + deleteOrganisation(id: $id) + } +` + +export const GET_ORGANISATIONS_QUERY = gql` + query GetOrganisations( + $page: Int! + $query: String + $sortDirection: SortDirection! + $sortField: OrganisationSortField! + ) { + getOrganisations( + page: $page + query: $query + sortDirection: $sortDirection + sortField: $sortField + ) { + totalPages + totalElements + page { + creationDate + id + name + logoUrl + } + } + } +` + +export const CREATE_ORGANISATION_MUTATION = gql` + mutation CreateOrganisation( + $name: String! + $bluetooth: ServiceUseOption! + $bluetoothEditable: Boolean! + $camera: ComponentUseOption! + $cameraEditable: Boolean! + $GPS: ServiceUseOption! + $gpsEditable: Boolean! + $sim: ServiceUseOption! + $simEditable: Boolean! + $offlineTimeThreshold: Float! + ) { + createOrganisation( + name: $name + policy: { + bluetooth: $bluetooth + bluetoothEditable: $bluetoothEditable + camera: $camera + cameraEditable: $cameraEditable + GPS: $GPS + gpsEditable: $gpsEditable + sim: $sim + simEditable: $simEditable + offlineTimeThreshold: $offlineTimeThreshold + } + ) { + id + name + } + } +` + +export const CHANGE_ORGANISATION_MUTATION = gql` + mutation ChangeOrganisation( + $id: ID! + $name: String! + $bluetooth: ServiceUseOption! + $bluetoothEditable: Boolean! + $camera: ComponentUseOption! + $cameraEditable: Boolean! + $GPS: ServiceUseOption! + $gpsEditable: Boolean! + $sim: ServiceUseOption! + $simEditable: Boolean! + $offlineTimeThreshold: Float! + ) { + changeOrganisation( + id: $id + name: $name + policy: { + bluetooth: $bluetooth + bluetoothEditable: $bluetoothEditable + camera: $camera + cameraEditable: $cameraEditable + GPS: $GPS + gpsEditable: $gpsEditable + sim: $sim + simEditable: $simEditable + offlineTimeThreshold: $offlineTimeThreshold + } + ) { + creationDate + id + name + } + } +` + +export const CHANGE_ORGANISATION_POLICY_MUTATION = gql` + mutation ChangeOrganisationPolicy( + $id: ID! + $name: String! + $bluetooth: ServiceUseOption! + $bluetoothEditable: Boolean! + $camera: ComponentUseOption! + $cameraEditable: Boolean! + $GPS: ServiceUseOption! + $gpsEditable: Boolean! + $sim: ServiceUseOption! + $simEditable: Boolean! + $offlineTimeThreshold: Float! + ) { + changeOrganisation( + id: $id + name: $name + policy: { + bluetooth: $bluetooth + bluetoothEditable: $bluetoothEditable + camera: $camera + cameraEditable: $cameraEditable + GPS: $GPS + gpsEditable: $gpsEditable + sim: $sim + simEditable: $simEditable + offlineTimeThreshold: $offlineTimeThreshold + } + ) { + creationDate + id + name + } + } +` + +export const CREATE_USER_MUTATION = gql` + mutation createUser( + $orgId: ID! + $firstName: String! + $lastName: String! + $middleName: String! + $username: String! + $password: String! + $role: Role! + ) { + createUser( + payload: { + orgId: $orgId + firstName: $firstName + lastName: $lastName + middleName: $middleName + username: $username + password: $password + role: $role + } + ) { + id + firstName + lastName + middleName + orgId + role + org { + id + name + } + } + } +` + +export const CHANGE_USER_MUTATION = gql` + mutation ChangeUser( + $userId: ID! + $orgId: ID! + $firstName: String! + $lastName: String! + $middleName: String! + $username: String! + $role: Role! + ) { + changeUser( + userId: $userId + form: { + orgId: $orgId + firstName: $firstName + lastName: $lastName + middleName: $middleName + username: $username + role: $role + } + ) { + avatarUrl + firstName + id + lastName + middleName + org { + creationDate + id + logoUrl + name + } + orgId + role + username + } + } +` + +export const CHANGE_USER_WITH_PASSWORD_MUTATION = gql` + mutation ChangeUserWithPassword( + $userId: ID! + $orgId: ID! + $firstName: String! + $lastName: String! + $middleName: String! + $username: String! + $password: String! + $role: Role! + ) { + changeUser( + userId: $userId + form: { + orgId: $orgId + firstName: $firstName + lastName: $lastName + middleName: $middleName + username: $username + password: $password + role: $role + } + ) { + avatarUrl + firstName + id + lastName + middleName + org { + creationDate + id + logoUrl + name + } + orgId + role + username + } + } +` + +export const CREATE_UPLOAD_USER_AVATAR_URL_MUTATION = gql` + mutation CreateUploadUserAvatarUrl($userId: ID!) { + createUploadUserAvatarUrl(userId: $userId) + } +` + +export const CREATE_UPLOAD_ORGANISATION_LOGO_URL_MUTATION = gql` + mutation CreateUploadOrganisationLogoUrl($orgId: ID!) { + createUploadOrganisationLogoUrl(orgId: $orgId) + } +` diff --git a/frontend/src/entities/employee/api/usersService.ts b/frontend/src/entities/employee/api/usersService.ts new file mode 100644 index 0000000..3aff740 --- /dev/null +++ b/frontend/src/entities/employee/api/usersService.ts @@ -0,0 +1,322 @@ +import { apolloClient } from '../../../shared/api/apolloClient' +import { + clearAuthStorage, + CURRENT_USER_STORAGE_KEY, +} from '../../../shared/api/authStorage' +import type { + CreateUserPayload as ApiCreateUserPayload, + SortDirection as ApiSortDirection, + UpdateUserPayload as ApiUpdateUserPayload, + UserFieldsFragment, + UserRole as ApiUserRole, + UserSortField as ApiUserSortField, +} from '../../../shared/api/graphql/generated/graphql' +import { + CREATE_USER_MUTATION, + DELETE_USER_MUTATION, + GET_USER_QUERY, + GET_USERS_QUERY, + UPDATE_USER_MUTATION, +} from '../../../shared/api/graphql/operations/users' +import type { + Employee, + EmployeeRole, + UserSortDirection, + UserSortField, +} from '../model/types' + +const LEGACY_USERS_STORAGE_KEY = 'fleet-ble-monitor.users' + +export type UsersQueryParams = { + page?: number + pageSize?: number + query?: string + roles?: EmployeeRole[] + sortDirection?: UserSortDirection + sortField?: UserSortField +} + +export type UsersPage = { + totalPages: number + totalElements: number + page: Employee[] +} + +export type CreateUserPayload = { + lastName: string + firstName: string + middleName: string + email: string + login: string + password: string + role: EmployeeRole + avatarUrl?: string | null +} + +export type UpdateUserPayload = Partial + +function emitUsersChange() { + if (typeof window === 'undefined') return + + window.dispatchEvent(new Event('users:change')) +} + +function cleanupLegacyUsersStorage() { + if (typeof window === 'undefined') return + + window.localStorage.removeItem(LEGACY_USERS_STORAGE_KEY) +} + +function mapUser(user: UserFieldsFragment): Employee { + return { + id: user.id, + lastName: user.lastName, + firstName: user.firstName, + middleName: user.middleName ?? '', + email: user.email, + login: user.login, + username: user.login, + role: user.role, + createdAt: user.createdAt, + avatarUrl: null, + orgId: 0, + org: null, + } +} + +function normalizeRole(role: EmployeeRole): ApiUserRole | null { + if (role === 'ADMIN' || role === 'Admin') return 'ADMIN' + if (role === 'USER' || role === 'User') return 'USER' + + return null +} + +function mapRoles(roles?: EmployeeRole[]): ApiUserRole[] | undefined { + const normalizedRoles = roles + ?.map(normalizeRole) + .filter((role): role is ApiUserRole => Boolean(role)) + + return normalizedRoles?.length ? normalizedRoles : undefined +} + +function mapSortDirection(sortDirection: UserSortDirection): ApiSortDirection { + return sortDirection === 'ASC' ? 'ASC' : 'DESC' +} + +function mapSortField(sortField: UserSortField): ApiUserSortField { + if (sortField === 'ID') return 'ID' + if (sortField === 'Name') return 'NAME' + + return 'DATE' +} + +function toCreateUserPayload(payload: CreateUserPayload): ApiCreateUserPayload { + const role = normalizeRole(payload.role) ?? 'USER' + + return { + lastName: payload.lastName.trim(), + firstName: payload.firstName.trim(), + middleName: payload.middleName.trim() || null, + email: payload.email.trim(), + login: payload.login.trim(), + password: payload.password, + role, + } +} + +function toUpdateUserPayload(payload: UpdateUserPayload): ApiUpdateUserPayload { + const nextPayload: ApiUpdateUserPayload = {} + + if (payload.lastName !== undefined) { + nextPayload.lastName = payload.lastName.trim() + } + + if (payload.firstName !== undefined) { + nextPayload.firstName = payload.firstName.trim() + } + + if (payload.middleName !== undefined) { + nextPayload.middleName = payload.middleName.trim() || null + } + + if (payload.email !== undefined) { + nextPayload.email = payload.email.trim() + } + + if (payload.login !== undefined) { + nextPayload.login = payload.login.trim() + } + + if (payload.password !== undefined) { + nextPayload.password = payload.password + } + + if (payload.role !== undefined) { + nextPayload.role = normalizeRole(payload.role) + } + + return nextPayload +} + +function logoutIfCurrentUserDeleted(deletedUserId: number) { + if (typeof window === 'undefined') return + + const storedCurrentUser = window.localStorage.getItem(CURRENT_USER_STORAGE_KEY) + + if (!storedCurrentUser) return + + try { + const currentUser = JSON.parse(storedCurrentUser) as Pick + + if (currentUser.id !== deletedUserId) return + } catch { + return + } + + clearAuthStorage() + void apolloClient.clearStore() + window.dispatchEvent(new Event('auth:logout')) + window.dispatchEvent(new Event('auth:change')) +} + +export const usersService = { + async getUsers({ + page = 0, + pageSize = 10, + query, + roles, + sortDirection = 'DESC', + sortField = 'Date', + }: UsersQueryParams = {}): Promise { + cleanupLegacyUsersStorage() + + const { data } = await apolloClient.query({ + query: GET_USERS_QUERY, + variables: { + page, + pageSize, + query: query?.trim() || undefined, + roles: mapRoles(roles), + sortDirection: mapSortDirection(sortDirection), + sortField: mapSortField(sortField), + }, + fetchPolicy: 'no-cache', + }) + + if (!data?.getUsers) { + throw new Error('Не удалось загрузить пользователей') + } + + return { + totalPages: data.getUsers.totalPages, + totalElements: data.getUsers.totalElements, + page: data.getUsers.page.map(mapUser), + } + }, + + async getUserById(id: number | string): Promise { + cleanupLegacyUsersStorage() + + const { data } = await apolloClient.query({ + query: GET_USER_QUERY, + variables: { + id: Number(id), + }, + fetchPolicy: 'no-cache', + }) + + if (!data) { + throw new Error('Не удалось загрузить пользователя') + } + + return data.getUser ? mapUser(data.getUser) : null + }, + + async findUserByLoginOrEmail(loginOrEmail: string): Promise { + const response = await usersService.getUsers({ + page: 0, + pageSize: 1, + query: loginOrEmail.trim(), + sortDirection: 'ASC', + sortField: 'ID', + }) + + const normalizedLoginOrEmail = loginOrEmail.trim().toLowerCase() + + return response.page.find((user) => { + return ( + user.email?.trim().toLowerCase() === normalizedLoginOrEmail || + user.login?.trim().toLowerCase() === normalizedLoginOrEmail || + user.username?.trim().toLowerCase() === normalizedLoginOrEmail + ) + }) ?? null + }, + + async createUser(payload: CreateUserPayload): Promise { + cleanupLegacyUsersStorage() + + const { data } = await apolloClient.mutate({ + mutation: CREATE_USER_MUTATION, + variables: { + payload: toCreateUserPayload(payload), + }, + fetchPolicy: 'no-cache', + }) + + if (!data?.createUser) { + throw new Error('Не удалось создать пользователя') + } + + emitUsersChange() + + return mapUser(data.createUser) + }, + + async updateUser( + id: number | string, + payload: UpdateUserPayload, + ): Promise { + cleanupLegacyUsersStorage() + + const { data } = await apolloClient.mutate({ + mutation: UPDATE_USER_MUTATION, + variables: { + id: Number(id), + payload: toUpdateUserPayload(payload), + }, + fetchPolicy: 'no-cache', + }) + + if (!data?.updateUser) { + throw new Error('Не удалось обновить пользователя') + } + + emitUsersChange() + + return mapUser(data.updateUser) + }, + + async deleteUser(id: number | string): Promise { + cleanupLegacyUsersStorage() + + const numericId = Number(id) + const { data } = await apolloClient.mutate({ + mutation: DELETE_USER_MUTATION, + variables: { + id: numericId, + }, + fetchPolicy: 'no-cache', + }) + + const isDeleted = Boolean(data?.deleteUser) + + if (!isDeleted) { + throw new Error('Пользователь не найден') + } + + logoutIfCurrentUserDeleted(numericId) + emitUsersChange() + + return true + }, +} diff --git a/frontend/src/entities/employee/mock/mockUsers.ts b/frontend/src/entities/employee/mock/mockUsers.ts new file mode 100644 index 0000000..67bcb2a --- /dev/null +++ b/frontend/src/entities/employee/mock/mockUsers.ts @@ -0,0 +1,79 @@ +import type { Employee } from '../model/types' + +export const mockUsers: Employee[] = [ + { + id: 1, + lastName: 'Админов', + firstName: 'Алексей', + middleName: 'Сергеевич', + email: 'admin@fleet.local', + login: 'admin', + username: 'admin', + password: '123456', + role: 'ADMIN', + createdAt: '2026-07-01T09:00:00.000Z', + avatarUrl: null, + orgId: 0, + org: null, + }, + { + id: 2, + lastName: 'Иванова', + firstName: 'Мария', + middleName: 'Петровна', + email: 'user@fleet.local', + login: 'user', + username: 'user', + password: '123456', + role: 'USER', + createdAt: '2026-07-02T10:30:00.000Z', + avatarUrl: null, + orgId: 0, + org: null, + }, + { + id: 3, + lastName: 'Смирнов', + firstName: 'Дмитрий', + middleName: 'Олегович', + email: 'dispatcher@fleet.local', + login: 'dispatcher', + username: 'dispatcher', + password: '123456', + role: 'USER', + createdAt: '2026-07-03T12:15:00.000Z', + avatarUrl: null, + orgId: 0, + org: null, + }, + { + id: 4, + lastName: 'Кузнецова', + firstName: 'Елена', + middleName: 'Андреевна', + email: 'manager@fleet.local', + login: 'manager', + username: 'manager', + password: '123456', + role: 'ADMIN', + createdAt: '2026-07-04T08:45:00.000Z', + avatarUrl: null, + orgId: 0, + org: null, + }, + { + id: 5, + lastName: 'Павлов', + firstName: 'Никита', + middleName: 'Игоревич', + email: 'mechanic@fleet.local', + login: 'mechanic', + username: 'mechanic', + password: '123456', + role: 'USER', + createdAt: '2026-07-05T14:20:00.000Z', + avatarUrl: null, + orgId: 0, + org: null, + }, +] diff --git a/frontend/src/entities/employee/model/types.ts b/frontend/src/entities/employee/model/types.ts new file mode 100644 index 0000000..06ba2f4 --- /dev/null +++ b/frontend/src/entities/employee/model/types.ts @@ -0,0 +1,241 @@ +export type EmployeeRole = 'USER' | 'ADMIN' | 'User' | 'Admin' | string + +export type Employee = { + avatarUrl?: string | null + id: number + firstName: string + lastName: string + middleName: string + email?: string + login?: string + password?: string + createdAt?: string + username?: string + orgId: number + role: EmployeeRole + org: { + creationDate?: number + id: number + logoUrl?: string | null + name: string + } | null +} + +export type UserSortDirection = 'ASC' | 'DESC' + +export type UserSortField = 'ID' | 'Name' | 'Date' + +export type ServiceUseOption = + | 'Disabled' + | 'Enabled' + | 'Unspecified' + +export type ComponentUseOption = + | 'Allowed' + | 'Disallowed' + +export type GroupUsePolicyOption = + | 'Allowed' + | 'Disallowed' + | 'Changeable' + +export type GetUsersData = { + getUsers: { + totalPages: number + totalElements: number + page: Employee[] + } +} + +export type GetUsersVariables = { + page: number + query?: string + orgs?: string[] + roles?: EmployeeRole[] + sortDirection: UserSortDirection + sortField: UserSortField +} + +export type OrganisationPolicy = { + bluetooth?: ServiceUseOption | GroupUsePolicyOption + bluetoothEditable?: boolean + camera?: ComponentUseOption | GroupUsePolicyOption + cameraEditable?: boolean + GPS?: ServiceUseOption | GroupUsePolicyOption + gpsEditable?: boolean + sim?: ServiceUseOption | GroupUsePolicyOption + simEditable?: boolean + canUseBluetooth?: boolean + canUseCamera?: boolean + canUseGPS?: boolean + canUseSim?: boolean + offlineTimeThreshold: number + date?: number +} + +export type Organisation = { + creationDate?: number + id: number + name: string + policy?: OrganisationPolicy | null + logoUrl?: string | null +} + +export type GetOrganisationData = { + getOrganisation: Organisation | null +} + +export type GetOrganisationVariables = { + id: string +} + +export type ChangeOrganisationData = { + changeOrganisation: { + id: number + name: string + } +} + +export type ChangeOrganisationVariables = { + id: string + name: string + bluetooth: ServiceUseOption + bluetoothEditable: boolean + camera: ComponentUseOption + cameraEditable: boolean + GPS: ServiceUseOption + gpsEditable: boolean + sim: ServiceUseOption + simEditable: boolean + offlineTimeThreshold: number +} + +export type ChangeOrganisationPolicyVariables = { + id: string + name: string + bluetooth: ServiceUseOption + bluetoothEditable: boolean + camera: ComponentUseOption + cameraEditable: boolean + GPS: ServiceUseOption + gpsEditable: boolean + sim: ServiceUseOption + simEditable: boolean + offlineTimeThreshold: number +} + +export type GetUsersPageData = { + getUsersPage: { + page: Employee[] + nextKey: string | null + } +} + +export type GetUsersPageVariables = { + key?: string +} + +export type GetOrganisationsData = { + getOrganisations: { + totalPages: number + totalElements: number + page: Organisation[] + } +} + +export type GetOrganisationsVariables = { + page: number + query?: string + sortDirection: OrganisationSortDirection + sortField: OrganisationSortField +} + +export type DeleteOrganisationData = { + deleteOrganisation: boolean +} + +export type DeleteOrganisationVariables = { + id: string +} + +export type CreateUserData = { + createUser: Employee +} + +export type CreateUserVariables = { + orgId: string + firstName: string + lastName: string + middleName: string + username: string + password: string + role: EmployeeRole +} + +export type ChangeUserData = { + changeUser: Employee +} + +export type ChangeUserVariables = { + userId: string + orgId: string + firstName: string + lastName: string + middleName: string + username: string + role: EmployeeRole +} + +export type ChangeUserWithPasswordVariables = ChangeUserVariables & { + password: string +} + +export type SignUpVariables = { + orgId: string + firstName: string + lastName: string + middleName: string + username: string + password: string + role: EmployeeRole +} + +export type CreateOrganisationData = { + createOrganisation: { + id: number + name: string + } +} + +export type CreateOrganisationVariables = { + name: string + bluetooth: ServiceUseOption + bluetoothEditable: boolean + camera: ComponentUseOption + cameraEditable: boolean + GPS: ServiceUseOption + gpsEditable: boolean + sim: ServiceUseOption + simEditable: boolean + offlineTimeThreshold: number +} + +export type OrganisationSortDirection = 'ASC' | 'DESC' + +export type OrganisationSortField = 'ID' | 'Name' | 'Date' + +export type CreateUploadUserAvatarUrlData = { + createUploadUserAvatarUrl: string +} + +export type CreateUploadUserAvatarUrlVariables = { + userId: string +} + +export type CreateUploadOrganisationLogoUrlData = { + createUploadOrganisationLogoUrl: string +} + +export type CreateUploadOrganisationLogoUrlVariables = { + orgId: string +} diff --git a/frontend/src/entities/machine/api/machineAnalyticsService.ts b/frontend/src/entities/machine/api/machineAnalyticsService.ts new file mode 100644 index 0000000..a0fcd47 --- /dev/null +++ b/frontend/src/entities/machine/api/machineAnalyticsService.ts @@ -0,0 +1,257 @@ +import { mockMachineDailyUsageStats } from '../mock/mockMachineDailyUsageStats' +import { mockMachineTelemetryIntervals } from '../mock/mockMachineTelemetryIntervals' +import type { + MachineAnalyticsDateRange, + MachineAnalyticsPeriod, + MachineDailyUsageStat, + MachineTelemetryInterval, + MachineUsageSummary, +} from '../model/types' + +type PeriodRange = { + start: number + end: number +} + +const hourMs = 60 * 60 * 1000 +const dayMs = 24 * hourMs +const fallbackNow = Date.UTC(2026, 6, 9, 12, 0, 0) +const shiftStartHourUtc = 1 +const shiftDurationMs = 12 * hourMs + +function cloneTelemetryInterval( + interval: MachineTelemetryInterval, +): MachineTelemetryInterval { + return { ...interval } +} + +function cloneDailyUsageStat(stat: MachineDailyUsageStat): MachineDailyUsageStat { + return { ...stat } +} + +function getDayStart(timestamp: number) { + const date = new Date(timestamp) + + return Date.UTC( + date.getUTCFullYear(), + date.getUTCMonth(), + date.getUTCDate(), + ) +} + +function getIntervalEnd(interval: MachineTelemetryInterval) { + return new Date(interval.endedAt).getTime() +} + +function getLatestMachineTimestamp(machineId: number) { + const timestamps = mockMachineTelemetryIntervals + .filter((interval) => interval.machineId === machineId) + .map(getIntervalEnd) + + return Math.max(0, ...timestamps) || fallbackNow +} + +function getDefaultPeriodRange( + machineId: number, + period: MachineAnalyticsPeriod, +): PeriodRange { + const latestTimestamp = getLatestMachineTimestamp(machineId) + const dayStart = getDayStart(latestTimestamp) + + if (period === 'shift') { + const shiftStart = dayStart + shiftStartHourUtc * hourMs + + return { + start: shiftStart, + end: shiftStart + shiftDurationMs, + } + } + + if (period === 'week') { + return { + start: dayStart - 6 * dayMs, + end: dayStart + dayMs, + } + } + + if (period === 'month') { + return { + start: dayStart - 29 * dayMs, + end: dayStart + dayMs, + } + } + + return { + start: dayStart, + end: dayStart + dayMs, + } +} + +function getPeriodRange( + machineId: number, + period: MachineAnalyticsPeriod, + dateRange?: MachineAnalyticsDateRange, +): PeriodRange { + const defaultRange = getDefaultPeriodRange(machineId, period) + const start = dateRange?.dateFrom + ? new Date(dateRange.dateFrom).getTime() + : defaultRange.start + const end = dateRange?.dateTo + ? new Date(dateRange.dateTo).getTime() + : defaultRange.end + + return { + start, + end, + } +} + +function clipIntervalToRange( + interval: MachineTelemetryInterval, + range: PeriodRange, +): MachineTelemetryInterval | null { + const startedAt = new Date(interval.startedAt).getTime() + const endedAt = new Date(interval.endedAt).getTime() + const clippedStart = Math.max(startedAt, range.start) + const clippedEnd = Math.min(endedAt, range.end) + + if (clippedEnd <= clippedStart) return null + + return { + ...interval, + startedAt: new Date(clippedStart).toISOString(), + endedAt: new Date(clippedEnd).toISOString(), + durationSeconds: Math.floor((clippedEnd - clippedStart) / 1000), + } +} + +function getTelemetryIntervalsInRange( + machineId: number, + range: PeriodRange, +) { + return mockMachineTelemetryIntervals + .filter((interval) => interval.machineId === machineId) + .map((interval) => clipIntervalToRange(interval, range)) + .filter((interval): interval is MachineTelemetryInterval => Boolean(interval)) + .sort((first, second) => ( + new Date(first.startedAt).getTime() - + new Date(second.startedAt).getTime() + )) +} + +function buildSummary( + machineId: number, + period: MachineAnalyticsPeriod, + intervals: MachineTelemetryInterval[], +): MachineUsageSummary { + const totals = intervals.reduce( + (result, interval) => { + if (interval.state === 'MOVING') { + result.movingSeconds += interval.durationSeconds + } + + if (interval.state === 'ENGINE_ON') { + result.engineOnSeconds += interval.durationSeconds + } + + if (interval.state === 'IDLE') { + result.idleSeconds += interval.durationSeconds + } + + if (interval.state === 'NO_DATA') { + result.noDataSeconds += interval.durationSeconds + } + + return result + }, + { + movingSeconds: 0, + engineOnSeconds: 0, + idleSeconds: 0, + noDataSeconds: 0, + }, + ) + const totalKnownSeconds = + totals.movingSeconds + totals.engineOnSeconds + totals.idleSeconds + const utilizationPercent = totalKnownSeconds > 0 + ? Math.round((totals.movingSeconds / totalKnownSeconds) * 100) + : 0 + + return { + machineId, + period, + ...totals, + totalKnownSeconds, + utilizationPercent, + } +} + +function buildDailyStatFromIntervals( + machineId: number, + range: PeriodRange, + intervals: MachineTelemetryInterval[], +): MachineDailyUsageStat { + const summary = buildSummary(machineId, 'today', intervals) + + return { + machineId, + date: new Date(range.start).toISOString().slice(0, 10), + movingSeconds: summary.movingSeconds, + engineOnSeconds: summary.engineOnSeconds, + idleSeconds: summary.idleSeconds, + noDataSeconds: summary.noDataSeconds, + utilizationPercent: summary.utilizationPercent, + } +} + +export const machineAnalyticsService = { + async getMachineTelemetryIntervals( + machineId: number | string, + period: MachineAnalyticsPeriod, + dateRange?: MachineAnalyticsDateRange, + ): Promise { + const numericMachineId = Number(machineId) + const range = getPeriodRange(numericMachineId, period, dateRange) + + return getTelemetryIntervalsInRange(numericMachineId, range) + .map(cloneTelemetryInterval) + }, + + async getMachineUsageSummary( + machineId: number | string, + period: MachineAnalyticsPeriod, + dateRange?: MachineAnalyticsDateRange, + ): Promise { + const numericMachineId = Number(machineId) + const range = getPeriodRange(numericMachineId, period, dateRange) + const intervals = getTelemetryIntervalsInRange(numericMachineId, range) + + return buildSummary(numericMachineId, period, intervals) + }, + + async getMachineDailyUsageStats( + machineId: number | string, + period: MachineAnalyticsPeriod, + dateRange?: MachineAnalyticsDateRange, + ): Promise { + const numericMachineId = Number(machineId) + const range = getPeriodRange(numericMachineId, period, dateRange) + + if (period === 'shift') { + const intervals = getTelemetryIntervalsInRange(numericMachineId, range) + + return [buildDailyStatFromIntervals(numericMachineId, range, intervals)] + } + + return mockMachineDailyUsageStats + .filter((stat) => { + if (stat.machineId !== numericMachineId) return false + + const dateStart = new Date(`${stat.date}T00:00:00.000Z`).getTime() + + return dateStart >= range.start && dateStart < range.end + }) + .sort((first, second) => first.date.localeCompare(second.date)) + .map(cloneDailyUsageStat) + }, +} diff --git a/frontend/src/entities/machine/api/machineCalibrationService.ts b/frontend/src/entities/machine/api/machineCalibrationService.ts new file mode 100644 index 0000000..34af572 --- /dev/null +++ b/frontend/src/entities/machine/api/machineCalibrationService.ts @@ -0,0 +1,701 @@ +import { readBeacons } from '../../beacon/api/beaconsService' +import type { BeaconVibrationSample } from '../../beacon/model/types' +import { mockBeaconVibrationSamples } from '../../beacon/mock/mockBeaconVibrationSamples' +import { mockMachineCalibrationRules } from '../mock/mockMachineCalibrationRules' +import { mockMachineStateDefinitions } from '../mock/mockMachineStateDefinitions' +import type { + MachineCalibrationPeriod, + MachineCalibrationRule, + MachineStateDefinition, + RecognizedMachineStateInterval, +} from '../model/types' + +export type MachineStateDefinitionPayload = { + name: string + icon: string + color: string + description: string +} + +export type MachineCalibrationRulePayload = { + stateDefinitionId: number + vibrationMin: number + vibrationMax: number + minDurationSeconds?: number + priority?: number +} + +type PeriodRange = { + start: number + end: number +} + +type DraftRecognizedInterval = Omit + +const STATE_DEFINITIONS_STORAGE_KEY = + 'fleet-ble-monitor.machineStateDefinitions' +const CALIBRATION_RULES_STORAGE_KEY = + 'fleet-ble-monitor.machineCalibrationRules' +const aggregateRuleGap = 0.02 +const noDataDefinitionId = 4 +const noDataGapMs = 30 * 60 * 1000 +const mockMachineVibrationMacByMachineId: Record = { + 11: 'E4:5F:01:AA:10:10', +} + +function cloneStateDefinition( + definition: MachineStateDefinition, +): MachineStateDefinition { + return { ...definition } +} + +function cloneCalibrationRule( + rule: MachineCalibrationRule, +): MachineCalibrationRule { + return { ...rule } +} + +function cloneVibrationSample( + sample: BeaconVibrationSample, +): BeaconVibrationSample { + return { ...sample } +} + +function cloneRecognizedInterval( + interval: RecognizedMachineStateInterval, +): RecognizedMachineStateInterval { + return { ...interval } +} + +function readStateDefinitions(): MachineStateDefinition[] { + if (typeof window === 'undefined') { + return mockMachineStateDefinitions.map(cloneStateDefinition) + } + + const storedDefinitions = window.localStorage.getItem( + STATE_DEFINITIONS_STORAGE_KEY, + ) + + if (!storedDefinitions) { + const initialDefinitions = mockMachineStateDefinitions.map(cloneStateDefinition) + window.localStorage.setItem( + STATE_DEFINITIONS_STORAGE_KEY, + JSON.stringify(initialDefinitions), + ) + + return initialDefinitions + } + + try { + return (JSON.parse(storedDefinitions) as MachineStateDefinition[]) + .map(cloneStateDefinition) + } catch { + const initialDefinitions = mockMachineStateDefinitions.map(cloneStateDefinition) + window.localStorage.setItem( + STATE_DEFINITIONS_STORAGE_KEY, + JSON.stringify(initialDefinitions), + ) + + return initialDefinitions + } +} + +function writeStateDefinitions(definitions: MachineStateDefinition[]) { + if (typeof window === 'undefined') return + + window.localStorage.setItem( + STATE_DEFINITIONS_STORAGE_KEY, + JSON.stringify(definitions), + ) + window.dispatchEvent(new Event('machine-calibration:change')) +} + +function readCalibrationRules(): MachineCalibrationRule[] { + if (typeof window === 'undefined') { + return cloneCalibrationRulesWithAggregation(mockMachineCalibrationRules) + } + + const storedRules = window.localStorage.getItem(CALIBRATION_RULES_STORAGE_KEY) + + if (!storedRules) { + const initialRules = mockMachineCalibrationRules.map(cloneCalibrationRule) + window.localStorage.setItem( + CALIBRATION_RULES_STORAGE_KEY, + JSON.stringify(initialRules), + ) + + return cloneCalibrationRulesWithAggregation(initialRules) + } + + try { + return cloneCalibrationRulesWithAggregation( + JSON.parse(storedRules) as MachineCalibrationRule[], + ) + } catch { + const initialRules = mockMachineCalibrationRules.map(cloneCalibrationRule) + window.localStorage.setItem( + CALIBRATION_RULES_STORAGE_KEY, + JSON.stringify(initialRules), + ) + + return cloneCalibrationRulesWithAggregation(initialRules) + } +} + +function writeCalibrationRules(rules: MachineCalibrationRule[]) { + if (typeof window === 'undefined') return + + window.localStorage.setItem( + CALIBRATION_RULES_STORAGE_KEY, + JSON.stringify(rules), + ) + window.dispatchEvent(new Event('machine-calibration:change')) +} + +function normalizeStateDefinitionPayload(payload: MachineStateDefinitionPayload) { + return { + name: payload.name.trim(), + icon: payload.icon.trim() || 'Activity', + color: payload.color.trim() || '#2f80ed', + description: payload.description.trim(), + } +} + +function normalizeCalibrationRulePayload( + payload: MachineCalibrationRulePayload, + fallback?: Pick, +) { + const vibrationMin = Number(payload.vibrationMin) + const vibrationMax = Number(payload.vibrationMax) + + return { + stateDefinitionId: Number(payload.stateDefinitionId), + vibrationMin: Math.min(vibrationMin, vibrationMax), + vibrationMax: Math.max(vibrationMin, vibrationMax), + minDurationSeconds: Math.max( + 0, + Number(payload.minDurationSeconds ?? fallback?.minDurationSeconds ?? 0), + ), + priority: Math.max(0, Number(payload.priority ?? fallback?.priority ?? 0)), + } +} + +function canAggregateRules( + first: Pick, + second: Pick, +) { + return ( + first.vibrationMin <= second.vibrationMax + aggregateRuleGap && + second.vibrationMin <= first.vibrationMax + aggregateRuleGap + ) +} + +function hasRuleRangeIntersection( + first: Pick, + second: Pick, +) { + return ( + first.vibrationMin <= second.vibrationMax && + second.vibrationMin <= first.vibrationMax + ) +} + +function findConflictingCalibrationRule( + rule: MachineCalibrationRule, + rules: MachineCalibrationRule[], +) { + return rules.find((item) => ( + item.id !== rule.id && + item.machineId === rule.machineId && + item.stateDefinitionId !== rule.stateDefinitionId && + hasRuleRangeIntersection(item, rule) + )) ?? null +} + +function assertCalibrationRuleCanBeSaved( + rule: MachineCalibrationRule, + rules: MachineCalibrationRule[], +) { + if (rule.stateDefinitionId === noDataDefinitionId) { + throw new Error('Состояние "Нет данных" назначается автоматически') + } + + const conflictRule = findConflictingCalibrationRule(rule, rules) + + if (conflictRule) { + throw new Error( + `Диапазон пересекается с другим состоянием: ${conflictRule.vibrationMin.toFixed(3)} — ${conflictRule.vibrationMax.toFixed(3)}`, + ) + } +} + +function aggregateCalibrationRule( + baseRule: MachineCalibrationRule, + rules: MachineCalibrationRule[], +) { + let aggregatedRule = { ...baseRule } + let restRules = rules.filter((rule) => rule.id !== aggregatedRule.id) + let hasAggregatedRule = true + + while (hasAggregatedRule) { + hasAggregatedRule = false + + restRules = restRules.filter((rule) => { + if ( + rule.machineId !== aggregatedRule.machineId || + rule.stateDefinitionId !== aggregatedRule.stateDefinitionId || + !canAggregateRules(rule, aggregatedRule) + ) { + return true + } + + aggregatedRule = { + ...aggregatedRule, + createdAt: rule.createdAt < aggregatedRule.createdAt + ? rule.createdAt + : aggregatedRule.createdAt, + minDurationSeconds: Math.min( + aggregatedRule.minDurationSeconds, + rule.minDurationSeconds, + ), + priority: Math.min(aggregatedRule.priority, rule.priority), + updatedAt: new Date().toISOString(), + vibrationMax: Math.max(aggregatedRule.vibrationMax, rule.vibrationMax), + vibrationMin: Math.min(aggregatedRule.vibrationMin, rule.vibrationMin), + } + hasAggregatedRule = true + + return false + }) + } + + return { + rule: aggregatedRule, + rules: [...restRules, aggregatedRule], + } +} + +function aggregateCalibrationRulesList(rules: MachineCalibrationRule[]) { + return [...rules] + .sort((first, second) => ( + first.machineId - second.machineId || + first.stateDefinitionId - second.stateDefinitionId || + first.vibrationMin - second.vibrationMin || + first.priority - second.priority + )) + .reduce((result, rule) => { + const aggregateIndex = result.findIndex((item) => ( + item.machineId === rule.machineId && + item.stateDefinitionId === rule.stateDefinitionId && + canAggregateRules(item, rule) + )) + + if (aggregateIndex === -1) { + result.push({ ...rule }) + return result + } + + const aggregateRule = result[aggregateIndex] + + result[aggregateIndex] = { + ...aggregateRule, + createdAt: rule.createdAt < aggregateRule.createdAt + ? rule.createdAt + : aggregateRule.createdAt, + minDurationSeconds: Math.min( + aggregateRule.minDurationSeconds, + rule.minDurationSeconds, + ), + priority: Math.min(aggregateRule.priority, rule.priority), + updatedAt: rule.updatedAt > aggregateRule.updatedAt + ? rule.updatedAt + : aggregateRule.updatedAt, + vibrationMax: Math.max(aggregateRule.vibrationMax, rule.vibrationMax), + vibrationMin: Math.min(aggregateRule.vibrationMin, rule.vibrationMin), + } + + return result + }, []) +} + +function cloneCalibrationRulesWithAggregation(rules: MachineCalibrationRule[]) { + return aggregateCalibrationRulesList(rules).map(cloneCalibrationRule) +} + +function getMachineMacAddress(machineId: number) { + return readBeacons().find((beacon) => beacon.boundMachineId === machineId) + ?.macAddress ?? mockMachineVibrationMacByMachineId[machineId] ?? null +} + +function getPeriodRange( + period: MachineCalibrationPeriod, +): PeriodRange { + return { + start: period.periodStart.getTime(), + end: period.periodEnd.getTime(), + } +} + +function getSamplesForMachine( + machineId: number, + period: MachineCalibrationPeriod, +) { + const macAddress = getMachineMacAddress(machineId) + + if (!macAddress) return [] + + const range = getPeriodRange(period) + + return mockBeaconVibrationSamples + .filter((sample) => ( + sample.mac === macAddress && + sample.timeMillis >= range.start && + sample.timeMillis <= range.end + )) + .sort((first, second) => first.timeMillis - second.timeMillis) +} + +function findMatchingRule( + sample: BeaconVibrationSample, + rules: MachineCalibrationRule[], +) { + return [...rules] + .sort((first, second) => first.priority - second.priority) + .find((rule) => ( + sample.vibration >= rule.vibrationMin && + sample.vibration <= rule.vibrationMax + )) ?? null +} + +function createSampleInterval( + machineId: number, + sample: BeaconVibrationSample, + rule: MachineCalibrationRule | null, +): DraftRecognizedInterval { + return { + machineId, + stateDefinitionId: rule?.stateDefinitionId ?? null, + startedAt: new Date(sample.timeMillis).toISOString(), + endedAt: new Date(sample.timeMillis + sample.duration * 1000).toISOString(), + durationSeconds: sample.duration, + vibrationMin: sample.vibration, + vibrationMax: sample.vibration, + vibrationAvg: sample.vibration, + sampleCount: 1, + isNoData: false, + } +} + +function createNoDataInterval( + machineId: number, + startedAt: number, + endedAt: number, +): DraftRecognizedInterval { + return { + machineId, + stateDefinitionId: noDataDefinitionId, + startedAt: new Date(startedAt).toISOString(), + endedAt: new Date(endedAt).toISOString(), + durationSeconds: Math.floor((endedAt - startedAt) / 1000), + vibrationMin: null, + vibrationMax: null, + vibrationAvg: null, + sampleCount: 0, + isNoData: true, + } +} + +function canMergeIntervals( + current: DraftRecognizedInterval, + next: DraftRecognizedInterval, +) { + const currentEnd = new Date(current.endedAt).getTime() + const nextStart = new Date(next.startedAt).getTime() + + return ( + current.stateDefinitionId === next.stateDefinitionId && + current.isNoData === next.isNoData && + nextStart - currentEnd <= noDataGapMs + ) +} + +function mergeIntervals( + current: DraftRecognizedInterval, + next: DraftRecognizedInterval, +): DraftRecognizedInterval { + const totalSamples = current.sampleCount + next.sampleCount + const currentWeighted = (current.vibrationAvg ?? 0) * current.sampleCount + const nextWeighted = (next.vibrationAvg ?? 0) * next.sampleCount + + return { + ...current, + endedAt: next.endedAt, + durationSeconds: Math.floor(( + new Date(next.endedAt).getTime() - + new Date(current.startedAt).getTime() + ) / 1000), + vibrationMin: + current.vibrationMin === null || next.vibrationMin === null + ? current.vibrationMin ?? next.vibrationMin + : Math.min(current.vibrationMin, next.vibrationMin), + vibrationMax: + current.vibrationMax === null || next.vibrationMax === null + ? current.vibrationMax ?? next.vibrationMax + : Math.max(current.vibrationMax, next.vibrationMax), + vibrationAvg: totalSamples > 0 + ? Number(((currentWeighted + nextWeighted) / totalSamples).toFixed(3)) + : null, + sampleCount: totalSamples, + } +} + +function buildRecognizedIntervals( + machineId: number, + samples: BeaconVibrationSample[], + rules: MachineCalibrationRule[], +) { + const intervals: DraftRecognizedInterval[] = [] + + samples.forEach((sample, index) => { + if (index > 0) { + const previousSample = samples[index - 1] + const previousEnd = previousSample.timeMillis + previousSample.duration * 1000 + const gap = sample.timeMillis - previousEnd + + if (gap > noDataGapMs) { + intervals.push(createNoDataInterval(machineId, previousEnd, sample.timeMillis)) + } + } + + intervals.push(createSampleInterval( + machineId, + sample, + findMatchingRule(sample, rules), + )) + }) + + return intervals.reduce( + (result, interval) => { + const previous = result.at(-1) + + if (previous && canMergeIntervals(previous, interval)) { + result[result.length - 1] = { + ...mergeIntervals(previous, interval), + id: previous.id, + } + return result + } + + result.push({ + ...interval, + id: result.length + 1, + }) + + return result + }, + [], + ) +} + +export const machineCalibrationService = { + async getMachineStateDefinitions(): Promise { + return readStateDefinitions().map(cloneStateDefinition) + }, + + async getMachineStateDefinitionsSnapshot(): Promise { + return readStateDefinitions().map(cloneStateDefinition) + }, + + async restoreMachineStateDefinitions( + definitions: MachineStateDefinition[], + ): Promise { + const nextDefinitions = definitions.map(cloneStateDefinition) + + writeStateDefinitions(nextDefinitions) + + return nextDefinitions.map(cloneStateDefinition) + }, + + async createMachineStateDefinition( + payload: MachineStateDefinitionPayload, + ): Promise { + const definitions = readStateDefinitions() + const now = new Date().toISOString() + const normalizedPayload = normalizeStateDefinitionPayload(payload) + + if (!normalizedPayload.name) { + throw new Error('Название состояния обязательно') + } + + const definition: MachineStateDefinition = { + id: Math.max(0, ...definitions.map((item) => item.id)) + 1, + ...normalizedPayload, + isSystem: false, + createdAt: now, + updatedAt: now, + } + + writeStateDefinitions([...definitions, definition]) + + return cloneStateDefinition(definition) + }, + + async updateMachineStateDefinition( + id: number | string, + payload: MachineStateDefinitionPayload, + ): Promise { + const numericId = Number(id) + const definitions = readStateDefinitions() + const definitionIndex = definitions.findIndex((item) => item.id === numericId) + const normalizedPayload = normalizeStateDefinitionPayload(payload) + + if (!normalizedPayload.name) { + throw new Error('Название состояния обязательно') + } + + if (definitionIndex === -1) { + throw new Error('Состояние не найдено') + } + + if (numericId === noDataDefinitionId) { + throw new Error('Системное состояние "Нет данных" нельзя изменить') + } + + const nextDefinition: MachineStateDefinition = { + ...definitions[definitionIndex], + ...normalizedPayload, + updatedAt: new Date().toISOString(), + } + const nextDefinitions = [...definitions] + nextDefinitions[definitionIndex] = nextDefinition + + writeStateDefinitions(nextDefinitions) + + return cloneStateDefinition(nextDefinition) + }, + + async getMachineCalibrationRules( + machineId: number | string, + ): Promise { + const numericMachineId = Number(machineId) + + return readCalibrationRules() + .filter((rule) => rule.machineId === numericMachineId) + .sort((first, second) => first.priority - second.priority) + .map(cloneCalibrationRule) + }, + + async getCalibrationRulesSnapshot(): Promise { + return readCalibrationRules().map(cloneCalibrationRule) + }, + + async restoreCalibrationRules( + rules: MachineCalibrationRule[], + ): Promise { + const nextRules = rules.map(cloneCalibrationRule) + + writeCalibrationRules(nextRules) + + return nextRules.map(cloneCalibrationRule) + }, + + async createMachineCalibrationRule( + machineId: number | string, + payload: MachineCalibrationRulePayload, + ): Promise { + const numericMachineId = Number(machineId) + const rules = readCalibrationRules() + const nextPriority = rules + .filter((rule) => rule.machineId === numericMachineId) + .reduce((maxPriority, rule) => Math.max(maxPriority, rule.priority), 10) + 10 + const normalizedPayload = normalizeCalibrationRulePayload(payload, { + minDurationSeconds: 0, + priority: nextPriority, + }) + const now = new Date().toISOString() + + const rule: MachineCalibrationRule = { + id: Math.max(0, ...rules.map((item) => item.id)) + 1, + machineId: numericMachineId, + ...normalizedPayload, + createdAt: now, + updatedAt: now, + } + const aggregation = aggregateCalibrationRule(rule, rules) + + assertCalibrationRuleCanBeSaved(aggregation.rule, aggregation.rules) + + writeCalibrationRules(aggregation.rules) + + return cloneCalibrationRule(aggregation.rule) + }, + + async updateMachineCalibrationRule( + id: number | string, + payload: MachineCalibrationRulePayload, + ): Promise { + const numericId = Number(id) + const rules = readCalibrationRules() + const ruleIndex = rules.findIndex((item) => item.id === numericId) + + if (ruleIndex === -1) { + throw new Error('Правило калибровки не найдено') + } + + const normalizedPayload = normalizeCalibrationRulePayload( + payload, + rules[ruleIndex], + ) + + const nextRule: MachineCalibrationRule = { + ...rules[ruleIndex], + ...normalizedPayload, + updatedAt: new Date().toISOString(), + } + const nextRules = [...rules] + nextRules[ruleIndex] = nextRule + const aggregation = aggregateCalibrationRule(nextRule, nextRules) + + assertCalibrationRuleCanBeSaved(aggregation.rule, aggregation.rules) + + writeCalibrationRules(aggregation.rules) + + return cloneCalibrationRule(aggregation.rule) + }, + + async deleteMachineCalibrationRule(id: number | string): Promise { + const numericId = Number(id) + const rules = readCalibrationRules() + const nextRules = rules.filter((rule) => rule.id !== numericId) + + if (nextRules.length === rules.length) { + throw new Error('Правило калибровки не найдено') + } + + writeCalibrationRules(nextRules) + + return true + }, + + async getMachineVibrationSamples( + machineId: number | string, + period: MachineCalibrationPeriod, + ): Promise { + return getSamplesForMachine(Number(machineId), period) + .map(cloneVibrationSample) + }, + + async getRecognizedStateIntervals( + machineId: number | string, + period: MachineCalibrationPeriod, + ): Promise { + const numericMachineId = Number(machineId) + const [samples, rules] = await Promise.all([ + this.getMachineVibrationSamples(numericMachineId, period), + this.getMachineCalibrationRules(numericMachineId), + ]) + + return buildRecognizedIntervals(numericMachineId, samples, rules) + .map(cloneRecognizedInterval) + }, +} diff --git a/frontend/src/entities/machine/api/machineDictionariesService.ts b/frontend/src/entities/machine/api/machineDictionariesService.ts new file mode 100644 index 0000000..4ae0f6b --- /dev/null +++ b/frontend/src/entities/machine/api/machineDictionariesService.ts @@ -0,0 +1,19 @@ +import { + mockMachineDepartments, + mockMachineTypes, +} from '../mock/mockMachineDictionaries' +import type { MachineDictionaryOption } from '../model/types' + +function cloneOption(option: MachineDictionaryOption): MachineDictionaryOption { + return { ...option } +} + +export const machineDictionariesService = { + async getMachineTypes(): Promise { + return mockMachineTypes.map(cloneOption) + }, + + async getMachineDepartments(): Promise { + return mockMachineDepartments.map(cloneOption) + }, +} diff --git a/frontend/src/entities/machine/api/machinesService.ts b/frontend/src/entities/machine/api/machinesService.ts new file mode 100644 index 0000000..8d4fa84 --- /dev/null +++ b/frontend/src/entities/machine/api/machinesService.ts @@ -0,0 +1,362 @@ +import { readBeacons, writeBeacons } from '../../beacon/api/beaconsService' +import type { Beacon } from '../../beacon/model/types' +import { mockMachineStateHistory } from '../mock/mockMachineStateHistory' +import { mockMachines } from '../mock/mockMachines' +import type { + Machine, + MachineStateHistoryItem, + MachineSortDirection, + MachineSortField, +} from '../model/types' + +const MACHINES_STORAGE_KEY = 'fleet-ble-monitor.machines' + +export type MachinesQueryParams = { + page?: number + pageSize?: number + query?: string + sortDirection?: MachineSortDirection + sortField?: MachineSortField +} + +export type MachinesPage = { + totalPages: number + totalElements: number + page: Machine[] +} + +export type MachinePayload = { + name: string + licensePlate: string + type: string + department: string + description: string +} + +type StoredMachine = Machine & Record + +function cloneMachine(machine: Machine | StoredMachine): Machine { + const normalizedMachine = { ...machine } as StoredMachine + const legacyInventoryKey = 'inventory' + 'Number' + + delete normalizedMachine[legacyInventoryKey] + + return normalizedMachine as Machine +} + +function readMachines(): Machine[] { + if (typeof window === 'undefined') { + return mockMachines.map(cloneMachine) + } + + const storedMachines = window.localStorage.getItem(MACHINES_STORAGE_KEY) + + if (!storedMachines) { + const initialMachines = mockMachines.map(cloneMachine) + window.localStorage.setItem(MACHINES_STORAGE_KEY, JSON.stringify(initialMachines)) + + return initialMachines + } + + try { + return (JSON.parse(storedMachines) as StoredMachine[]).map(cloneMachine) + } catch { + const initialMachines = mockMachines.map(cloneMachine) + window.localStorage.setItem(MACHINES_STORAGE_KEY, JSON.stringify(initialMachines)) + + return initialMachines + } +} + +function writeMachines(machines: Machine[]) { + if (typeof window === 'undefined') return + + window.localStorage.setItem(MACHINES_STORAGE_KEY, JSON.stringify(machines)) + window.dispatchEvent(new Event('machines:change')) +} + +function assertBeaconCanBeBound( + beacons: Beacon[], + beaconId: number, + machineId: number, +) { + const beacon = beacons.find((item) => item.id === beaconId) + + if (!beacon) { + throw new Error('Маяк не найден') + } + + if ( + beacon.status === 'BOUND' && + beacon.boundMachineId !== null && + beacon.boundMachineId !== machineId + ) { + throw new Error('Маяк уже привязан к другой АТТ') + } +} + +function updateBeaconBinding( + beacons: Beacon[], + machineId: number, + nextBeaconId: number | null, +) { + return beacons.map((beacon) => { + if (beacon.boundMachineId === machineId) { + return { + ...beacon, + status: 'FREE', + boundMachineId: null, + } satisfies Beacon + } + + if (nextBeaconId !== null && beacon.id === nextBeaconId) { + return { + ...beacon, + status: 'BOUND', + boundMachineId: machineId, + } satisfies Beacon + } + + return beacon + }) +} + +function normalizeMachinePayload(payload: MachinePayload) { + return { + name: payload.name.trim(), + licensePlate: payload.licensePlate.trim(), + type: payload.type.trim(), + department: payload.department.trim(), + description: payload.description.trim(), + } +} + +function sortMachines( + machines: Machine[], + sortField: MachineSortField, + sortDirection: MachineSortDirection, +) { + const direction = sortDirection === 'ASC' ? 1 : -1 + + return [...machines].sort((first, second) => { + if (sortField === 'ID') { + return (first.id - second.id) * direction + } + + if (sortField === 'Date') { + return ( + (new Date(first.createdAt).getTime() - + new Date(second.createdAt).getTime()) * + direction + ) + } + + return first.name.localeCompare(second.name, 'ru') * direction + }) +} + +function cloneHistoryItem( + item: MachineStateHistoryItem, +): MachineStateHistoryItem { + return { ...item } +} + +export const machinesService = { + async getMachines({ + page = 0, + pageSize = 10, + query, + sortDirection = 'DESC', + sortField = 'Date', + }: MachinesQueryParams = {}): Promise { + const normalizedQuery = query?.trim().toLowerCase() ?? '' + + const filteredMachines = readMachines().filter((machine) => { + if (!normalizedQuery) return true + + return [ + machine.name, + machine.licensePlate, + machine.type, + machine.department, + ] + .filter(Boolean) + .join(' ') + .toLowerCase() + .includes(normalizedQuery) + }) + + const sortedMachines = sortMachines(filteredMachines, sortField, sortDirection) + const totalPages = Math.ceil(sortedMachines.length / pageSize) + const safePage = Math.min(Math.max(page, 0), Math.max(totalPages - 1, 0)) + const pageStart = safePage * pageSize + + return { + totalPages, + totalElements: sortedMachines.length, + page: sortedMachines.slice(pageStart, pageStart + pageSize).map(cloneMachine), + } + }, + + async getMachineById(id: number | string): Promise { + const numericId = Number(id) + const machine = readMachines().find((item) => item.id === numericId) + + return machine ? cloneMachine(machine) : null + }, + + async getMachineBeacon(id: number | string): Promise { + const numericId = Number(id) + const machine = readMachines().find((item) => item.id === numericId) + + if (!machine?.beaconId) return null + + const beacon = readBeacons().find((item) => ( + item.id === machine.beaconId || + item.boundMachineId === numericId + )) + + return beacon ? { ...beacon } : null + }, + + async getMachineStateHistory( + machineId: number | string, + ): Promise { + const numericMachineId = Number(machineId) + + return mockMachineStateHistory + .filter((item) => item.machineId === numericMachineId) + .sort((first, second) => ( + new Date(second.startedAt).getTime() - + new Date(first.startedAt).getTime() + )) + .map(cloneHistoryItem) + }, + + async createMachine(payload: MachinePayload): Promise { + const machines = readMachines() + const nextId = Math.max(0, ...machines.map((machine) => machine.id)) + 1 + const normalizedPayload = normalizeMachinePayload(payload) + const now = new Date().toISOString() + + const machine: Machine = { + id: nextId, + ...normalizedPayload, + beaconId: null, + lastKnownState: 'NO_DATA', + lastDataReceivedAt: null, + createdAt: now, + updatedAt: now, + } + + writeMachines([...machines, machine]) + + return cloneMachine(machine) + }, + + async updateMachine( + id: number | string, + payload: MachinePayload, + ): Promise { + const numericId = Number(id) + const machines = readMachines() + const machineIndex = machines.findIndex((machine) => machine.id === numericId) + + if (machineIndex === -1) { + throw new Error('АТТ не найдена') + } + + const normalizedPayload = normalizeMachinePayload(payload) + + const currentMachine = machines[machineIndex] + const nextMachine: Machine = { + ...currentMachine, + ...normalizedPayload, + updatedAt: new Date().toISOString(), + } + const nextMachines = [...machines] + nextMachines[machineIndex] = nextMachine + + writeMachines(nextMachines) + + return cloneMachine(nextMachine) + }, + + async deleteMachine(id: number | string): Promise { + const numericId = Number(id) + const machines = readMachines() + const nextMachines = machines.filter((machine) => machine.id !== numericId) + + if (nextMachines.length === machines.length) { + throw new Error('АТТ не найдена') + } + + writeMachines(nextMachines) + writeBeacons(updateBeaconBinding(readBeacons(), numericId, null)) + + return true + }, + + async bindBeacon( + machineId: number | string, + beaconId: number | string, + ): Promise { + const numericMachineId = Number(machineId) + const numericBeaconId = Number(beaconId) + const machines = readMachines() + const beacons = readBeacons() + const machineIndex = machines.findIndex((machine) => machine.id === numericMachineId) + + if (machineIndex === -1) { + throw new Error('АТТ не найдена') + } + + assertBeaconCanBeBound(beacons, numericBeaconId, numericMachineId) + + const currentMachine = machines[machineIndex] + const now = new Date().toISOString() + const nextMachine: Machine = { + ...currentMachine, + beaconId: numericBeaconId, + lastKnownState: + currentMachine.lastKnownState === 'NO_DATA' + ? 'IDLE' + : currentMachine.lastKnownState, + lastDataReceivedAt: currentMachine.lastDataReceivedAt ?? now, + updatedAt: now, + } + const nextMachines = [...machines] + nextMachines[machineIndex] = nextMachine + + writeMachines(nextMachines) + writeBeacons(updateBeaconBinding(beacons, numericMachineId, numericBeaconId)) + + return cloneMachine(nextMachine) + }, + + async unbindBeacon(machineId: number | string): Promise { + const numericMachineId = Number(machineId) + const machines = readMachines() + const machineIndex = machines.findIndex((machine) => machine.id === numericMachineId) + + if (machineIndex === -1) { + throw new Error('АТТ не найдена') + } + + const currentMachine = machines[machineIndex] + const nextMachine: Machine = { + ...currentMachine, + beaconId: null, + lastKnownState: 'NO_DATA', + lastDataReceivedAt: null, + updatedAt: new Date().toISOString(), + } + const nextMachines = [...machines] + nextMachines[machineIndex] = nextMachine + + writeMachines(nextMachines) + writeBeacons(updateBeaconBinding(readBeacons(), numericMachineId, null)) + + return cloneMachine(nextMachine) + }, +} diff --git a/frontend/src/entities/machine/lib/machineFormatters.ts b/frontend/src/entities/machine/lib/machineFormatters.ts new file mode 100644 index 0000000..b2e9b73 --- /dev/null +++ b/frontend/src/entities/machine/lib/machineFormatters.ts @@ -0,0 +1,49 @@ +import type { + BeaconBindingStatus, + MachineStateCode, +} from '../model/types' + +export function getMachineStateLabel(state: MachineStateCode) { + if (state === 'IDLE') return 'Стоит' + if (state === 'ENGINE_ON') return 'Заведена' + if (state === 'MOVING') return 'В движении' + if (state === 'NO_DATA') return 'Нет данных' + + return state +} + +export function getMachineStateClass(state: MachineStateCode) { + if (state === 'MOVING') return 'machines-status--blue' + if (state === 'ENGINE_ON') return 'machines-status--green' + if (state === 'NO_DATA') return 'machines-status--red' + + return 'machines-status--gray' +} + +export function getMachineBindingStatus(beaconId?: number | null): BeaconBindingStatus { + return beaconId ? 'BOUND' : 'UNBOUND' +} + +export function getMachineBindingLabel(status: BeaconBindingStatus) { + if (status === 'BOUND') return 'Маяк привязан' + + return 'Маяк не привязан' +} + +export function getMachineBindingClass(status: BeaconBindingStatus) { + return status === 'BOUND' + ? 'machines-status--green' + : 'machines-status--gray' +} + +export function formatMachineDateTime(date?: string | null) { + if (!date) return 'Нет данных' + + return new Intl.DateTimeFormat('ru-RU', { + day: '2-digit', + month: '2-digit', + year: 'numeric', + hour: '2-digit', + minute: '2-digit', + }).format(new Date(date)) +} diff --git a/frontend/src/entities/machine/mock/mockMachineCalibrationRules.ts b/frontend/src/entities/machine/mock/mockMachineCalibrationRules.ts new file mode 100644 index 0000000..ea63c60 --- /dev/null +++ b/frontend/src/entities/machine/mock/mockMachineCalibrationRules.ts @@ -0,0 +1,70 @@ +import type { MachineCalibrationRule } from '../model/types' + +export const mockMachineCalibrationRules: MachineCalibrationRule[] = [ + { + id: 1, + machineId: 1, + stateDefinitionId: 1, + vibrationMin: 0, + vibrationMax: 0.07, + minDurationSeconds: 60, + priority: 30, + createdAt: '2026-07-05T09:00:00.000Z', + updatedAt: '2026-07-05T09:00:00.000Z', + }, + { + id: 2, + machineId: 1, + stateDefinitionId: 2, + vibrationMin: 0.071, + vibrationMax: 0.28, + minDurationSeconds: 60, + priority: 20, + createdAt: '2026-07-05T09:05:00.000Z', + updatedAt: '2026-07-05T09:05:00.000Z', + }, + { + id: 3, + machineId: 1, + stateDefinitionId: 3, + vibrationMin: 0.281, + vibrationMax: 1.2, + minDurationSeconds: 60, + priority: 10, + createdAt: '2026-07-05T09:10:00.000Z', + updatedAt: '2026-07-05T09:10:00.000Z', + }, + { + id: 4, + machineId: 12, + stateDefinitionId: 1, + vibrationMin: 0, + vibrationMax: 0.09, + minDurationSeconds: 60, + priority: 30, + createdAt: '2026-07-05T10:00:00.000Z', + updatedAt: '2026-07-05T10:00:00.000Z', + }, + { + id: 5, + machineId: 12, + stateDefinitionId: 2, + vibrationMin: 0.091, + vibrationMax: 0.42, + minDurationSeconds: 60, + priority: 20, + createdAt: '2026-07-05T10:05:00.000Z', + updatedAt: '2026-07-05T10:05:00.000Z', + }, + { + id: 6, + machineId: 12, + stateDefinitionId: 5, + vibrationMin: 0.421, + vibrationMax: 1.8, + minDurationSeconds: 60, + priority: 10, + createdAt: '2026-07-05T10:10:00.000Z', + updatedAt: '2026-07-05T10:10:00.000Z', + }, +] diff --git a/frontend/src/entities/machine/mock/mockMachineDailyUsageStats.ts b/frontend/src/entities/machine/mock/mockMachineDailyUsageStats.ts new file mode 100644 index 0000000..72aec8c --- /dev/null +++ b/frontend/src/entities/machine/mock/mockMachineDailyUsageStats.ts @@ -0,0 +1,65 @@ +import type { + MachineDailyUsageStat, + MachineStateCode, + MachineTelemetryInterval, +} from '../model/types' +import { mockMachineTelemetryIntervals } from './mockMachineTelemetryIntervals' + +type DailyTotals = Omit + +const emptyStateTotals: Record> = { + MOVING: 'movingSeconds', + ENGINE_ON: 'engineOnSeconds', + IDLE: 'idleSeconds', + NO_DATA: 'noDataSeconds', +} + +function getIntervalDate(interval: MachineTelemetryInterval) { + return interval.startedAt.slice(0, 10) +} + +function getUtilizationPercent(total: DailyTotals) { + const knownSeconds = total.movingSeconds + total.engineOnSeconds + total.idleSeconds + + if (knownSeconds <= 0) return 0 + + return Math.round((total.movingSeconds / knownSeconds) * 100) +} + +function buildDailyUsageStats() { + const statsByMachineAndDate = new Map() + + mockMachineTelemetryIntervals.forEach((interval) => { + const date = getIntervalDate(interval) + const key = `${interval.machineId}-${date}` + const current = statsByMachineAndDate.get(key) ?? { + machineId: interval.machineId, + date, + movingSeconds: 0, + engineOnSeconds: 0, + idleSeconds: 0, + noDataSeconds: 0, + } + + current[emptyStateTotals[interval.state]] += interval.durationSeconds + statsByMachineAndDate.set(key, current) + }) + + return Array.from(statsByMachineAndDate.values()) + .map((total) => ({ + ...total, + utilizationPercent: getUtilizationPercent(total), + })) + .sort((first, second) => { + if (first.machineId !== second.machineId) { + return first.machineId - second.machineId + } + + return first.date.localeCompare(second.date) + }) +} + +export const mockMachineDailyUsageStats: MachineDailyUsageStat[] = buildDailyUsageStats() diff --git a/frontend/src/entities/machine/mock/mockMachineDictionaries.ts b/frontend/src/entities/machine/mock/mockMachineDictionaries.ts new file mode 100644 index 0000000..1830d0c --- /dev/null +++ b/frontend/src/entities/machine/mock/mockMachineDictionaries.ts @@ -0,0 +1,102 @@ +import type { MachineDictionaryOption } from '../model/types' + +export const mockMachineTypes: MachineDictionaryOption[] = [ + { + value: 'Самосвал', + label: 'Самосвал', + description: 'Перевозка породы, грунта и сыпучих материалов', + }, + { + value: 'Погрузчик', + label: 'Погрузчик', + description: 'Погрузка и перемещение материалов на площадке', + }, + { + value: 'Экскаватор', + label: 'Экскаватор', + description: 'Разработка, погрузка и вскрышные работы', + }, + { + value: 'Бульдозер', + label: 'Бульдозер', + description: 'Планировка и подготовка технологических дорог', + }, + { + value: 'Топливозаправщик', + label: 'Топливозаправщик', + description: 'Заправка техники на объектах', + }, + { + value: 'Автокран', + label: 'Автокран', + description: 'Монтажные и ремонтные работы', + }, + { + value: 'Грейдер', + label: 'Грейдер', + description: 'Профилирование и обслуживание дорог', + }, + { + value: 'Автобус', + label: 'Автобус', + description: 'Перевозка персонала', + }, + { + value: 'Пикап', + label: 'Пикап', + description: 'Оперативные выезды и сервисные задачи', + }, + { + value: 'Каток', + label: 'Каток', + description: 'Уплотнение дорожного полотна', + }, +] + +export const mockMachineDepartments: MachineDictionaryOption[] = [ + { + value: 'Карьер Северный', + label: 'Карьер Северный', + description: 'Основной северный участок добычи', + }, + { + value: 'Карьер Южный', + label: 'Карьер Южный', + description: 'Южный участок добычи и отгрузки', + }, + { + value: 'Склад инертных материалов', + label: 'Склад инертных материалов', + description: 'Площадка хранения и отгрузки', + }, + { + value: 'Участок вскрышных работ', + label: 'Участок вскрышных работ', + description: 'Линия вскрыши и подготовки горизонтов', + }, + { + value: 'Дорожный участок', + label: 'Дорожный участок', + description: 'Технологические дороги и проезды', + }, + { + value: 'Сервисная зона', + label: 'Сервисная зона', + description: 'Заправка, осмотр и обслуживание техники', + }, + { + value: 'Ремонтная база', + label: 'Ремонтная база', + description: 'Ремонтные и монтажные работы', + }, + { + value: 'Транспортный участок', + label: 'Транспортный участок', + description: 'Перевозка персонала и грузов', + }, + { + value: 'Служба механиков', + label: 'Служба механиков', + description: 'Оперативное обслуживание парка', + }, +] diff --git a/frontend/src/entities/machine/mock/mockMachineStateDefinitions.ts b/frontend/src/entities/machine/mock/mockMachineStateDefinitions.ts new file mode 100644 index 0000000..0b2a1d3 --- /dev/null +++ b/frontend/src/entities/machine/mock/mockMachineStateDefinitions.ts @@ -0,0 +1,54 @@ +import type { MachineStateDefinition } from '../model/types' + +export const mockMachineStateDefinitions: MachineStateDefinition[] = [ + { + id: 1, + name: 'Стоит', + icon: 'Timer', + color: '#8c96aa', + description: 'АТТ не движется, двигатель не даёт заметной вибрации.', + isSystem: true, + createdAt: '2026-07-01T00:00:00.000Z', + updatedAt: '2026-07-01T00:00:00.000Z', + }, + { + id: 2, + name: 'Заведена', + icon: 'Power', + color: '#ff9f43', + description: 'Двигатель включён, но активного движения нет.', + isSystem: true, + createdAt: '2026-07-01T00:00:00.000Z', + updatedAt: '2026-07-01T00:00:00.000Z', + }, + { + id: 3, + name: 'В движении', + icon: 'Route', + color: '#33b343', + description: 'АТТ движется или выполняет активный рабочий цикл.', + isSystem: true, + createdAt: '2026-07-01T00:00:00.000Z', + updatedAt: '2026-07-01T00:00:00.000Z', + }, + { + id: 4, + name: 'Нет данных', + icon: 'Radio', + color: '#e04f5f', + description: 'Маяк не передавал данные дольше допустимого интервала.', + isSystem: true, + createdAt: '2026-07-01T00:00:00.000Z', + updatedAt: '2026-07-01T00:00:00.000Z', + }, + { + id: 5, + name: 'Работа с нагрузкой', + icon: 'Activity', + color: '#2f80ed', + description: 'Повышенная вибрация при рабочей операции или нагрузке.', + isSystem: false, + createdAt: '2026-07-02T00:00:00.000Z', + updatedAt: '2026-07-02T00:00:00.000Z', + }, +] diff --git a/frontend/src/entities/machine/mock/mockMachineStateHistory.ts b/frontend/src/entities/machine/mock/mockMachineStateHistory.ts new file mode 100644 index 0000000..250865c --- /dev/null +++ b/frontend/src/entities/machine/mock/mockMachineStateHistory.ts @@ -0,0 +1,76 @@ +import type { MachineStateHistoryItem } from '../model/types' + +export const mockMachineStateHistory: MachineStateHistoryItem[] = [ + { + id: 1, + machineId: 1, + state: 'IDLE', + startedAt: '2026-07-09T02:10:00.000Z', + endedAt: '2026-07-09T03:05:00.000Z', + durationSeconds: 3300, + }, + { + id: 2, + machineId: 1, + state: 'ENGINE_ON', + startedAt: '2026-07-09T03:05:00.000Z', + endedAt: '2026-07-09T03:18:00.000Z', + durationSeconds: 780, + }, + { + id: 3, + machineId: 1, + state: 'MOVING', + startedAt: '2026-07-09T03:18:00.000Z', + endedAt: null, + durationSeconds: null, + }, + { + id: 4, + machineId: 2, + state: 'IDLE', + startedAt: '2026-07-09T01:40:00.000Z', + endedAt: '2026-07-09T04:20:00.000Z', + durationSeconds: 9600, + }, + { + id: 5, + machineId: 2, + state: 'ENGINE_ON', + startedAt: '2026-07-09T04:20:00.000Z', + endedAt: null, + durationSeconds: null, + }, + { + id: 6, + machineId: 5, + state: 'ENGINE_ON', + startedAt: '2026-07-09T04:55:00.000Z', + endedAt: '2026-07-09T05:08:00.000Z', + durationSeconds: 780, + }, + { + id: 7, + machineId: 5, + state: 'MOVING', + startedAt: '2026-07-09T05:08:00.000Z', + endedAt: null, + durationSeconds: null, + }, + { + id: 8, + machineId: 9, + state: 'MOVING', + startedAt: '2026-07-07T10:10:00.000Z', + endedAt: '2026-07-07T12:25:00.000Z', + durationSeconds: 8100, + }, + { + id: 9, + machineId: 9, + state: 'NO_DATA', + startedAt: '2026-07-07T12:25:00.000Z', + endedAt: null, + durationSeconds: null, + }, +] diff --git a/frontend/src/entities/machine/mock/mockMachineStates.ts b/frontend/src/entities/machine/mock/mockMachineStates.ts new file mode 100644 index 0000000..a9c4b7d --- /dev/null +++ b/frontend/src/entities/machine/mock/mockMachineStates.ts @@ -0,0 +1,28 @@ +import type { MachineState } from '../model/types' + +export const mockMachineStates: MachineState[] = [ + { + id: 1, + code: 'IDLE', + name: 'Стоит', + description: 'Машина находится без движения, двигатель не активен.', + }, + { + id: 2, + code: 'ENGINE_ON', + name: 'Заведена', + description: 'Двигатель включен, движение не зафиксировано.', + }, + { + id: 3, + code: 'MOVING', + name: 'В движении', + description: 'По данным маяка машина перемещается.', + }, + { + id: 4, + code: 'NO_DATA', + name: 'Нет данных', + description: 'По машине давно не поступали данные.', + }, +] diff --git a/frontend/src/entities/machine/mock/mockMachineTelemetryIntervals.ts b/frontend/src/entities/machine/mock/mockMachineTelemetryIntervals.ts new file mode 100644 index 0000000..4609037 --- /dev/null +++ b/frontend/src/entities/machine/mock/mockMachineTelemetryIntervals.ts @@ -0,0 +1,115 @@ +import type { + MachineStateCode, + MachineTelemetryInterval, +} from '../model/types' + +type TelemetryProfile = 'haul' | 'loader' | 'service' | 'no-data' + +type ScheduleItem = { + state: MachineStateCode + startMinute: number + endMinute: number +} + +const baseDayUtc = Date.UTC(2026, 6, 9) +const dayMs = 24 * 60 * 60 * 1000 +const minuteMs = 60 * 1000 + +const profileSchedules: Record = { + haul: [ + { state: 'NO_DATA', startMinute: 0, endMinute: 35 }, + { state: 'IDLE', startMinute: 35, endMinute: 70 }, + { state: 'ENGINE_ON', startMinute: 70, endMinute: 92 }, + { state: 'MOVING', startMinute: 92, endMinute: 255 }, + { state: 'IDLE', startMinute: 255, endMinute: 305 }, + { state: 'ENGINE_ON', startMinute: 305, endMinute: 326 }, + { state: 'MOVING', startMinute: 326, endMinute: 514 }, + { state: 'IDLE', startMinute: 514, endMinute: 560 }, + { state: 'MOVING', startMinute: 560, endMinute: 670 }, + { state: 'ENGINE_ON', startMinute: 670, endMinute: 692 }, + { state: 'IDLE', startMinute: 692, endMinute: 730 }, + ], + loader: [ + { state: 'NO_DATA', startMinute: 0, endMinute: 25 }, + { state: 'IDLE', startMinute: 25, endMinute: 86 }, + { state: 'ENGINE_ON', startMinute: 86, endMinute: 128 }, + { state: 'MOVING', startMinute: 128, endMinute: 238 }, + { state: 'ENGINE_ON', startMinute: 238, endMinute: 286 }, + { state: 'MOVING', startMinute: 286, endMinute: 390 }, + { state: 'IDLE', startMinute: 390, endMinute: 452 }, + { state: 'ENGINE_ON', startMinute: 452, endMinute: 512 }, + { state: 'MOVING', startMinute: 512, endMinute: 645 }, + { state: 'IDLE', startMinute: 645, endMinute: 720 }, + ], + service: [ + { state: 'NO_DATA', startMinute: 0, endMinute: 45 }, + { state: 'IDLE', startMinute: 45, endMinute: 170 }, + { state: 'ENGINE_ON', startMinute: 170, endMinute: 198 }, + { state: 'MOVING', startMinute: 198, endMinute: 305 }, + { state: 'IDLE', startMinute: 305, endMinute: 438 }, + { state: 'ENGINE_ON', startMinute: 438, endMinute: 476 }, + { state: 'MOVING', startMinute: 476, endMinute: 552 }, + { state: 'IDLE', startMinute: 552, endMinute: 710 }, + ], + 'no-data': [ + { state: 'NO_DATA', startMinute: 0, endMinute: 720 }, + ], +} + +const machineProfiles: Record = { + 1: 'haul', + 2: 'loader', + 3: 'service', + 4: 'no-data', + 5: 'service', + 6: 'service', + 7: 'loader', + 8: 'service', + 9: 'no-data', + 10: 'haul', + 11: 'service', + 12: 'loader', +} + +function toIso(dayOffset: number, minute: number) { + return new Date(baseDayUtc + dayOffset * dayMs + minute * minuteMs).toISOString() +} + +function getMinuteVariation(machineId: number, dayOffset: number) { + return ((machineId * 17 + Math.abs(dayOffset) * 13) % 25) - 12 +} + +function buildIntervals() { + let nextId = 1 + const intervals: MachineTelemetryInterval[] = [] + + Object.entries(machineProfiles).forEach(([machineIdValue, profile]) => { + const machineId = Number(machineIdValue) + + for (let dayOffset = -6; dayOffset <= 0; dayOffset += 1) { + const variation = getMinuteVariation(machineId, dayOffset) + + profileSchedules[profile].forEach((item) => { + const startMinute = Math.max(0, item.startMinute + variation) + const endMinute = Math.min(24 * 60, item.endMinute + variation) + + if (endMinute <= startMinute) return + + intervals.push({ + id: nextId, + machineId, + state: item.state, + startedAt: toIso(dayOffset, startMinute), + endedAt: toIso(dayOffset, endMinute), + durationSeconds: (endMinute - startMinute) * 60, + }) + + nextId += 1 + }) + } + }) + + return intervals +} + +export const mockMachineTelemetryIntervals: MachineTelemetryInterval[] = buildIntervals() diff --git a/frontend/src/entities/machine/mock/mockMachines.ts b/frontend/src/entities/machine/mock/mockMachines.ts new file mode 100644 index 0000000..1196560 --- /dev/null +++ b/frontend/src/entities/machine/mock/mockMachines.ts @@ -0,0 +1,160 @@ +import type { Machine } from '../model/types' + +export const mockMachines: Machine[] = [ + { + id: 1, + name: 'Самосвал БелАЗ 7555', + licensePlate: 'А421ТН 154', + type: 'Самосвал', + department: 'Карьер Северный', + description: 'Основная машина для вывоза породы с северного участка.', + beaconId: 1, + lastKnownState: 'MOVING', + lastDataReceivedAt: '2026-07-09T06:14:00.000Z', + createdAt: '2026-06-01T08:00:00.000Z', + updatedAt: '2026-07-09T06:14:00.000Z', + }, + { + id: 2, + name: 'Погрузчик XCMG LW500', + licensePlate: 'В098КМ 154', + type: 'Погрузчик', + department: 'Склад инертных материалов', + description: 'Работает на площадке отгрузки щебня.', + beaconId: 2, + lastKnownState: 'ENGINE_ON', + lastDataReceivedAt: '2026-07-09T06:06:00.000Z', + createdAt: '2026-06-03T08:30:00.000Z', + updatedAt: '2026-07-09T06:06:00.000Z', + }, + { + id: 3, + name: 'Экскаватор Komatsu PC400', + licensePlate: 'С734ОР 154', + type: 'Экскаватор', + department: 'Участок вскрышных работ', + description: 'Экскаватор на линии вскрыши.', + beaconId: 3, + lastKnownState: 'IDLE', + lastDataReceivedAt: '2026-07-09T05:47:00.000Z', + createdAt: '2026-06-04T09:00:00.000Z', + updatedAt: '2026-07-09T05:47:00.000Z', + }, + { + id: 4, + name: 'Бульдозер ЧТЗ Б10', + licensePlate: 'К512АА 154', + type: 'Бульдозер', + department: 'Дорожный участок', + description: 'Подготовка технологических дорог.', + beaconId: null, + lastKnownState: 'NO_DATA', + lastDataReceivedAt: null, + createdAt: '2026-06-06T10:15:00.000Z', + updatedAt: '2026-06-06T10:15:00.000Z', + }, + { + id: 5, + name: 'Топливозаправщик Урал NEXT', + licensePlate: 'М201ЕР 154', + type: 'Топливозаправщик', + department: 'Сервисная зона', + description: 'Заправка техники на удалённых участках.', + beaconId: 4, + lastKnownState: 'MOVING', + lastDataReceivedAt: '2026-07-09T06:18:00.000Z', + createdAt: '2026-06-08T11:30:00.000Z', + updatedAt: '2026-07-09T06:18:00.000Z', + }, + { + id: 6, + name: 'Автокран КС-55713', + licensePlate: 'Н884ВВ 154', + type: 'Автокран', + department: 'Ремонтная база', + description: 'Кран для монтажных и ремонтных работ.', + beaconId: 5, + lastKnownState: 'IDLE', + lastDataReceivedAt: '2026-07-09T04:50:00.000Z', + createdAt: '2026-06-10T07:45:00.000Z', + updatedAt: '2026-07-09T04:50:00.000Z', + }, + { + id: 7, + name: 'Грейдер ДЗ-98', + licensePlate: 'О337НС 154', + type: 'Грейдер', + department: 'Дорожный участок', + description: 'Планировка и обслуживание карьерных дорог.', + beaconId: 6, + lastKnownState: 'ENGINE_ON', + lastDataReceivedAt: '2026-07-09T06:01:00.000Z', + createdAt: '2026-06-12T08:20:00.000Z', + updatedAt: '2026-07-09T06:01:00.000Z', + }, + { + id: 8, + name: 'Вахтовый автобус НЕФАЗ', + licensePlate: 'Р619ХК 154', + type: 'Автобус', + department: 'Транспортный участок', + description: 'Перевозка сменного персонала.', + beaconId: null, + lastKnownState: 'IDLE', + lastDataReceivedAt: '2026-07-08T18:40:00.000Z', + createdAt: '2026-06-14T13:10:00.000Z', + updatedAt: '2026-07-08T18:40:00.000Z', + }, + { + id: 9, + name: 'Самосвал HOWO ZZ3407', + licensePlate: 'Т054КВ 154', + type: 'Самосвал', + department: 'Карьер Южный', + description: 'Резервная машина южного борта.', + beaconId: 7, + lastKnownState: 'NO_DATA', + lastDataReceivedAt: '2026-07-07T12:25:00.000Z', + createdAt: '2026-06-16T09:25:00.000Z', + updatedAt: '2026-07-07T12:25:00.000Z', + }, + { + id: 10, + name: 'Экскаватор Hitachi ZX470', + licensePlate: 'У771МХ 154', + type: 'Экскаватор', + department: 'Карьер Южный', + description: 'Работает на погрузке породы.', + beaconId: 8, + lastKnownState: 'MOVING', + lastDataReceivedAt: '2026-07-09T06:11:00.000Z', + createdAt: '2026-06-18T10:00:00.000Z', + updatedAt: '2026-07-09T06:11:00.000Z', + }, + { + id: 11, + name: 'Пикап УАЗ Профи', + licensePlate: 'Х315АМ 154', + type: 'Пикап', + department: 'Служба механиков', + description: 'Оперативные выезды механиков по территории.', + beaconId: 10, + lastKnownState: 'IDLE', + lastDataReceivedAt: '2026-07-09T11:40:00.000Z', + createdAt: '2026-06-20T12:30:00.000Z', + updatedAt: '2026-07-09T11:40:00.000Z', + }, + { + id: 12, + name: 'Каток Hamm 3412', + licensePlate: 'Е402РВ 154', + type: 'Каток', + department: 'Дорожный участок', + description: 'Уплотнение технологических дорог после отсыпки.', + beaconId: 9, + lastKnownState: 'ENGINE_ON', + lastDataReceivedAt: '2026-07-09T05:58:00.000Z', + createdAt: '2026-06-22T09:40:00.000Z', + updatedAt: '2026-07-09T05:58:00.000Z', + }, +] diff --git a/frontend/src/entities/machine/model/types.ts b/frontend/src/entities/machine/model/types.ts new file mode 100644 index 0000000..5900661 --- /dev/null +++ b/frontend/src/entities/machine/model/types.ts @@ -0,0 +1,126 @@ +export type MachineStateCode = 'IDLE' | 'ENGINE_ON' | 'MOVING' | 'NO_DATA' + +export type BeaconBindingStatus = 'BOUND' | 'UNBOUND' + +export type Machine = { + id: number + name: string + licensePlate: string + type: string + department: string + description: string + beaconId: number | null + lastKnownState: MachineStateCode + lastDataReceivedAt: string | null + createdAt: string + updatedAt: string +} + +export type MachineState = { + id: number + code: MachineStateCode + name: string + description: string +} + +export type MachineStateHistoryItem = { + id: number + machineId: number + state: MachineStateCode + startedAt: string + endedAt: string | null + durationSeconds: number | null +} + +export type MachineSortField = 'ID' | 'Name' | 'Date' + +export type MachineSortDirection = 'ASC' | 'DESC' + +export type MachineDictionaryOption = { + value: string + label: string + description?: string +} + +export type MachineAnalyticsPeriod = 'today' | 'shift' | 'week' | 'month' + +export type MachineAnalyticsDateRange = { + dateFrom?: string + dateTo?: string +} + +export type MachineTelemetryInterval = { + id: number + machineId: number + state: MachineStateCode + startedAt: string + endedAt: string + durationSeconds: number +} + +export type MachineDailyUsageStat = { + machineId: number + date: string + movingSeconds: number + engineOnSeconds: number + idleSeconds: number + noDataSeconds: number + utilizationPercent: number +} + +export type MachineUsageSummary = { + machineId: number + period: MachineAnalyticsPeriod + movingSeconds: number + engineOnSeconds: number + idleSeconds: number + noDataSeconds: number + totalKnownSeconds: number + utilizationPercent: number +} + +export type MachineCalibrationPeriodPreset = + 'today' | 'yesterday' | 'week' | 'month' | 'custom' + +export type MachineCalibrationPeriod = { + preset: MachineCalibrationPeriodPreset + periodStart: Date + periodEnd: Date +} + +export type MachineStateDefinition = { + id: number + name: string + icon: string + color: string + description: string + isSystem: boolean + createdAt: string + updatedAt: string +} + +export type MachineCalibrationRule = { + id: number + machineId: number + stateDefinitionId: number + vibrationMin: number + vibrationMax: number + minDurationSeconds: number + priority: number + createdAt: string + updatedAt: string +} + +export type RecognizedMachineStateInterval = { + id: number + machineId: number + stateDefinitionId: number | null + startedAt: string + endedAt: string + durationSeconds: number + vibrationMin: number | null + vibrationMax: number | null + vibrationAvg: number | null + sampleCount: number + isNoData: boolean +} diff --git a/frontend/src/entities/report/api/fleetReportSchedulesService.ts b/frontend/src/entities/report/api/fleetReportSchedulesService.ts new file mode 100644 index 0000000..a47aa6d --- /dev/null +++ b/frontend/src/entities/report/api/fleetReportSchedulesService.ts @@ -0,0 +1,178 @@ +import { mockFleetReportSchedules } from '../mock/mockFleetReportSchedules' +import type { + FleetReportFormat, + FleetReportPeriod, + FleetReportSchedule, +} from '../model/types' + +const FLEET_REPORT_SCHEDULES_STORAGE_KEY = 'fleet-ble-monitor.fleetReportSchedules' +const defaultTimezone = 'Asia/Novosibirsk' +const defaultPeriod: FleetReportPeriod = 'PREVIOUS_DAY' + +export type CreateFleetReportSchedulePayload = { + recipientUserIds: number[] + reportFormat: FleetReportFormat + sendTime: string + enabled: boolean +} + +function cloneSchedule(schedule: FleetReportSchedule): FleetReportSchedule { + return { + ...schedule, + recipientUserIds: [...schedule.recipientUserIds], + } +} + +function readSchedules(): FleetReportSchedule[] { + if (typeof window === 'undefined') { + return mockFleetReportSchedules.map(cloneSchedule) + } + + const storedSchedules = window.localStorage.getItem( + FLEET_REPORT_SCHEDULES_STORAGE_KEY, + ) + + if (!storedSchedules) { + const initialSchedules = mockFleetReportSchedules.map(cloneSchedule) + window.localStorage.setItem( + FLEET_REPORT_SCHEDULES_STORAGE_KEY, + JSON.stringify(initialSchedules), + ) + + return initialSchedules + } + + try { + const parsedSchedules = JSON.parse(storedSchedules) as FleetReportSchedule[] + + return parsedSchedules.map(cloneSchedule) + } catch { + const initialSchedules = mockFleetReportSchedules.map(cloneSchedule) + window.localStorage.setItem( + FLEET_REPORT_SCHEDULES_STORAGE_KEY, + JSON.stringify(initialSchedules), + ) + + return initialSchedules + } +} + +function writeSchedules(schedules: FleetReportSchedule[]) { + if (typeof window === 'undefined') return + + window.localStorage.setItem( + FLEET_REPORT_SCHEDULES_STORAGE_KEY, + JSON.stringify(schedules), + ) + window.dispatchEvent(new Event('fleet-report-schedules:change')) +} + +function assertValidSendTime(sendTime: string) { + if (!/^\d{2}:\d{2}$/.test(sendTime)) { + throw new Error('Укажите время отправки') + } + + const [hours, minutes] = sendTime.split(':').map(Number) + + if (hours > 23 || minutes > 59) { + throw new Error('Укажите корректное время отправки') + } +} + +export const fleetReportSchedulesService = { + async getSchedules(): Promise { + return readSchedules().map(cloneSchedule) + }, + + async createSchedule( + payload: CreateFleetReportSchedulePayload, + ): Promise { + const recipientUserIds = Array.from(new Set(payload.recipientUserIds)) + .filter((userId) => Number.isFinite(userId)) + + if (recipientUserIds.length === 0) { + throw new Error('Выберите хотя бы одного получателя') + } + + assertValidSendTime(payload.sendTime) + + const schedules = readSchedules() + const now = new Date().toISOString() + const nextId = Math.max(0, ...schedules.map((schedule) => schedule.id)) + 1 + const schedule: FleetReportSchedule = { + id: nextId, + name: 'Ежедневный отчет по парку АТТ', + recipientUserIds, + reportFormat: payload.reportFormat, + sendTime: payload.sendTime, + period: defaultPeriod, + timezone: defaultTimezone, + enabled: payload.enabled, + createdAt: now, + updatedAt: now, + } + + writeSchedules([...schedules, schedule]) + + return cloneSchedule(schedule) + }, + + async updateSchedule( + id: number | string, + payload: Partial, + ): Promise { + const numericId = Number(id) + const schedules = readSchedules() + const scheduleIndex = schedules.findIndex((schedule) => schedule.id === numericId) + + if (scheduleIndex === -1) { + throw new Error('Рассылка отчета не найдена') + } + + if (payload.sendTime) { + assertValidSendTime(payload.sendTime) + } + + const currentSchedule = schedules[scheduleIndex] + const recipientUserIds = payload.recipientUserIds + ? Array.from(new Set(payload.recipientUserIds)) + .filter((userId) => Number.isFinite(userId)) + : currentSchedule.recipientUserIds + + if (recipientUserIds.length === 0) { + throw new Error('Выберите хотя бы одного получателя') + } + + const nextSchedule: FleetReportSchedule = { + ...currentSchedule, + ...payload, + id: currentSchedule.id, + name: currentSchedule.name, + recipientUserIds, + period: currentSchedule.period, + timezone: currentSchedule.timezone, + createdAt: currentSchedule.createdAt, + updatedAt: new Date().toISOString(), + } + const nextSchedules = [...schedules] + nextSchedules[scheduleIndex] = nextSchedule + writeSchedules(nextSchedules) + + return cloneSchedule(nextSchedule) + }, + + async deleteSchedule(id: number | string): Promise { + const numericId = Number(id) + const schedules = readSchedules() + const nextSchedules = schedules.filter((schedule) => schedule.id !== numericId) + + if (nextSchedules.length === schedules.length) { + throw new Error('Рассылка отчета не найдена') + } + + writeSchedules(nextSchedules) + + return true + }, +} + diff --git a/frontend/src/entities/report/api/fleetReportService.ts b/frontend/src/entities/report/api/fleetReportService.ts new file mode 100644 index 0000000..5e5a078 --- /dev/null +++ b/frontend/src/entities/report/api/fleetReportService.ts @@ -0,0 +1,449 @@ +import { machineAnalyticsService } from '../../machine/api/machineAnalyticsService' +import { machinesService } from '../../machine/api/machinesService' +import type { + Machine, + MachineStateCode, + MachineTelemetryInterval, + MachineUsageSummary, +} from '../../machine/model/types' +import type { + FleetDailyReport, + FleetDailyReportHistoryRow, + FleetDailyReportMachineRow, + FleetReportFormat, + GeneratedFleetReport, +} from '../model/types' + +const dayMs = 24 * 60 * 60 * 1000 + +function getStateLabel(state: MachineStateCode) { + if (state === 'IDLE') return 'Стоит' + if (state === 'ENGINE_ON') return 'Заведена' + if (state === 'MOVING') return 'В движении' + if (state === 'NO_DATA') return 'Нет данных' + + return state +} + +function formatDate(date: string | number | Date) { + return new Intl.DateTimeFormat('ru-RU', { + day: '2-digit', + month: '2-digit', + year: 'numeric', + }).format(new Date(date)) +} + +function formatDateTime(date?: string | number | null) { + if (!date) return 'Нет данных' + + return new Intl.DateTimeFormat('ru-RU', { + day: '2-digit', + month: '2-digit', + year: 'numeric', + hour: '2-digit', + minute: '2-digit', + }).format(new Date(date)) +} + +function formatDuration(totalSeconds: number) { + const normalizedSeconds = Math.max(0, Math.floor(totalSeconds)) + const totalMinutes = Math.floor(normalizedSeconds / 60) + const hours = Math.floor(totalMinutes / 60) + const minutes = totalMinutes % 60 + + if (hours > 0) return `${hours} ч ${minutes} мин` + if (totalMinutes > 0) return `${totalMinutes} мин` + + return `${normalizedSeconds} сек` +} + +function formatPercent(value: number) { + return `${Math.round(value)}%` +} + +function escapeHtml(value: string | number | null | undefined) { + return String(value ?? '') + .replaceAll('&', '&') + .replaceAll('<', '<') + .replaceAll('>', '>') + .replaceAll('"', '"') + .replaceAll("'", ''') +} + +function normalizeDateValue(date: Date) { + return date.toISOString().slice(0, 10) +} + +function getDayRange(dateValue: string) { + const start = new Date(`${dateValue}T00:00:00.000Z`).getTime() + + return { + startIso: new Date(start).toISOString(), + endIso: new Date(start + dayMs).toISOString(), + } +} + +async function getAllMachines() { + const response = await machinesService.getMachines({ + page: 0, + pageSize: 1000, + sortDirection: 'ASC', + sortField: 'Name', + }) + + return response.page +} + +function getFallbackReportDate(machines: Machine[]) { + const latestDataTimestamp = Math.max( + 0, + ...machines + .map((machine) => ( + machine.lastDataReceivedAt + ? new Date(machine.lastDataReceivedAt).getTime() + : 0 + )), + ) + + if (latestDataTimestamp > 0) { + return normalizeDateValue(new Date(latestDataTimestamp)) + } + + return normalizeDateValue(new Date(Date.now() - dayMs)) +} + +function getMachineRow( + machine: Machine, + summary: MachineUsageSummary, + intervals: MachineTelemetryInterval[], +): FleetDailyReportMachineRow { + return { + machineId: machine.id, + name: machine.name, + licensePlate: machine.licensePlate, + type: machine.type, + department: machine.department, + beaconBound: Boolean(machine.beaconId), + lastKnownState: getStateLabel(machine.lastKnownState), + lastDataReceivedAt: formatDateTime(machine.lastDataReceivedAt), + movingSeconds: summary.movingSeconds, + engineOnSeconds: summary.engineOnSeconds, + idleSeconds: summary.idleSeconds, + noDataSeconds: summary.noDataSeconds, + stateChangesCount: intervals.length, + utilizationPercent: summary.utilizationPercent, + } +} + +function getHistoryRows( + machine: Machine, + intervals: MachineTelemetryInterval[], +): FleetDailyReportHistoryRow[] { + return intervals.map((interval) => ({ + machineId: machine.id, + machineName: machine.name, + licensePlate: machine.licensePlate, + startedAt: formatDateTime(interval.startedAt), + endedAt: formatDateTime(interval.endedAt), + state: getStateLabel(interval.state), + durationSeconds: interval.durationSeconds, + })) +} + +function getReportSummary( + machines: FleetDailyReportMachineRow[], +): FleetDailyReport['summary'] { + return machines.reduce( + (summary, machine) => ({ + totalMachines: summary.totalMachines + 1, + boundMachines: summary.boundMachines + (machine.beaconBound ? 1 : 0), + unboundMachines: summary.unboundMachines + (machine.beaconBound ? 0 : 1), + machinesWithMovement: + summary.machinesWithMovement + (machine.movingSeconds > 0 ? 1 : 0), + machinesWithoutData: + summary.machinesWithoutData + + ( + machine.movingSeconds + + machine.engineOnSeconds + + machine.idleSeconds === 0 + ? 1 + : 0 + ), + movingSeconds: summary.movingSeconds + machine.movingSeconds, + engineOnSeconds: summary.engineOnSeconds + machine.engineOnSeconds, + idleSeconds: summary.idleSeconds + machine.idleSeconds, + noDataSeconds: summary.noDataSeconds + machine.noDataSeconds, + stateChangesCount: summary.stateChangesCount + machine.stateChangesCount, + }), + { + totalMachines: 0, + boundMachines: 0, + unboundMachines: 0, + machinesWithMovement: 0, + machinesWithoutData: 0, + movingSeconds: 0, + engineOnSeconds: 0, + idleSeconds: 0, + noDataSeconds: 0, + stateChangesCount: 0, + }, + ) +} + +function renderSummaryTable(report: FleetDailyReport) { + const rows = [ + ['Дата отчета', formatDate(`${report.date}T00:00:00.000Z`)], + ['Сформирован', formatDateTime(report.generatedAt)], + ['Всего АТТ', report.summary.totalMachines], + ['С маяками', report.summary.boundMachines], + ['Без маяков', report.summary.unboundMachines], + ['АТТ в движении', report.summary.machinesWithMovement], + ['АТТ без данных', report.summary.machinesWithoutData], + ['В движении', formatDuration(report.summary.movingSeconds)], + ['Заведена', formatDuration(report.summary.engineOnSeconds)], + ['Стояла', formatDuration(report.summary.idleSeconds)], + ['Без данных', formatDuration(report.summary.noDataSeconds)], + ['Смен состояний', report.summary.stateChangesCount], + ] + + return ` + + + ${rows.map((row) => ` + + + + + `).join('')} + +
${escapeHtml(row[0])}${escapeHtml(row[1])}
+ ` +} + +function renderMachineTable(report: FleetDailyReport) { + return ` + + + + + + + + + + + + + + + + + + + + ${report.machines.map((machine) => ` + + + + + + + + + + + + + + + + `).join('')} + +
АТТГосномерТипПодразделениеМаякПоследний статусПоследние данныеВ движенииЗаведенаСтоялаБез данныхСмен состоянийКПИ
${escapeHtml(machine.name)}${escapeHtml(machine.licensePlate)}${escapeHtml(machine.type)}${escapeHtml(machine.department)}${machine.beaconBound ? 'Привязан' : 'Не привязан'}${escapeHtml(machine.lastKnownState)}${escapeHtml(machine.lastDataReceivedAt)}${escapeHtml(formatDuration(machine.movingSeconds))}${escapeHtml(formatDuration(machine.engineOnSeconds))}${escapeHtml(formatDuration(machine.idleSeconds))}${escapeHtml(formatDuration(machine.noDataSeconds))}${machine.stateChangesCount}${escapeHtml(formatPercent(machine.utilizationPercent))}
+ ` +} + +function renderHistoryTable(report: FleetDailyReport) { + return ` + + + + + + + + + + + + + ${report.history.map((item) => ` + + + + + + + + + `).join('')} + +
АТТГосномерНачалоКонецСостояниеДлительность
${escapeHtml(item.machineName)}${escapeHtml(item.licensePlate)}${escapeHtml(item.startedAt)}${escapeHtml(item.endedAt)}${escapeHtml(item.state)}${escapeHtml(formatDuration(item.durationSeconds))}
+ ` +} + +function renderReportHtml(report: FleetDailyReport, mode: 'excel' | 'print') { + return ` + + + + Отчет по парку АТТ за ${escapeHtml(formatDate(`${report.date}T00:00:00.000Z`))} + + + +

Отчет по парку АТТ

+

Период: ${escapeHtml(formatDate(`${report.date}T00:00:00.000Z`))}. Сформирован: ${escapeHtml(formatDateTime(report.generatedAt))}.

+ +

Сводка

+ ${renderSummaryTable(report)} + +

АТТ

+ ${renderMachineTable(report)} + +

История состояний

+ ${renderHistoryTable(report)} + + + ` +} + +function getExcelBlob(report: FleetDailyReport) { + const html = renderReportHtml(report, 'excel') + + return new Blob([html], { + type: 'application/vnd.ms-excel;charset=utf-8', + }) +} + +export const fleetReportService = { + async getDefaultDailyReportDate(): Promise { + const machines = await getAllMachines() + + return getFallbackReportDate(machines) + }, + + async buildDailyReport(date?: string): Promise { + const machines = await getAllMachines() + const reportDate = date ?? getFallbackReportDate(machines) + const range = getDayRange(reportDate) + const machineRows: FleetDailyReportMachineRow[] = [] + const historyRows: FleetDailyReportHistoryRow[] = [] + + for (const machine of machines) { + const [summary, intervals] = await Promise.all([ + machineAnalyticsService.getMachineUsageSummary(machine.id, 'today', { + dateFrom: range.startIso, + dateTo: range.endIso, + }), + machineAnalyticsService.getMachineTelemetryIntervals(machine.id, 'today', { + dateFrom: range.startIso, + dateTo: range.endIso, + }), + ]) + + machineRows.push(getMachineRow(machine, summary, intervals)) + historyRows.push(...getHistoryRows(machine, intervals)) + } + + return { + date: reportDate, + generatedAt: new Date().toISOString(), + summary: getReportSummary(machineRows), + machines: machineRows, + history: historyRows, + } + }, + + async generateDailyReport( + format: FleetReportFormat, + date?: string, + ): Promise { + const report = await this.buildDailyReport(date) + + if (format === 'PDF') { + return { + fileName: `fleet-att-daily-report-${report.date}.pdf`, + mimeType: 'text/html;charset=utf-8', + delivery: 'print', + html: renderReportHtml(report, 'print'), + } + } + + return { + fileName: `fleet-att-daily-report-${report.date}.xls`, + mimeType: 'application/vnd.ms-excel;charset=utf-8', + delivery: 'download', + blob: getExcelBlob(report), + } + }, +} + diff --git a/frontend/src/entities/report/mock/mockFleetReportSchedules.ts b/frontend/src/entities/report/mock/mockFleetReportSchedules.ts new file mode 100644 index 0000000..17e55c2 --- /dev/null +++ b/frontend/src/entities/report/mock/mockFleetReportSchedules.ts @@ -0,0 +1,4 @@ +import type { FleetReportSchedule } from '../model/types' + +export const mockFleetReportSchedules: FleetReportSchedule[] = [] + diff --git a/frontend/src/entities/report/model/types.ts b/frontend/src/entities/report/model/types.ts new file mode 100644 index 0000000..edb5ca4 --- /dev/null +++ b/frontend/src/entities/report/model/types.ts @@ -0,0 +1,70 @@ +export type FleetReportFormat = 'PDF' | 'XLSX' + +export type FleetReportPeriod = 'PREVIOUS_DAY' + +export type FleetReportSchedule = { + id: number + name: string + recipientUserIds: number[] + reportFormat: FleetReportFormat + sendTime: string + period: FleetReportPeriod + timezone: string + enabled: boolean + createdAt: string + updatedAt: string +} + +export type FleetDailyReportMachineRow = { + machineId: number + name: string + licensePlate: string + type: string + department: string + beaconBound: boolean + lastKnownState: string + lastDataReceivedAt: string + movingSeconds: number + engineOnSeconds: number + idleSeconds: number + noDataSeconds: number + stateChangesCount: number + utilizationPercent: number +} + +export type FleetDailyReportHistoryRow = { + machineId: number + machineName: string + licensePlate: string + startedAt: string + endedAt: string + state: string + durationSeconds: number +} + +export type FleetDailyReport = { + date: string + generatedAt: string + summary: { + totalMachines: number + boundMachines: number + unboundMachines: number + machinesWithMovement: number + machinesWithoutData: number + movingSeconds: number + engineOnSeconds: number + idleSeconds: number + noDataSeconds: number + stateChangesCount: number + } + machines: FleetDailyReportMachineRow[] + history: FleetDailyReportHistoryRow[] +} + +export type GeneratedFleetReport = { + fileName: string + mimeType: string + delivery: 'download' | 'print' + blob?: Blob + html?: string +} diff --git a/frontend/src/features/auth/api/auth.graphql.ts b/frontend/src/features/auth/api/auth.graphql.ts new file mode 100644 index 0000000..c76f24a --- /dev/null +++ b/frontend/src/features/auth/api/auth.graphql.ts @@ -0,0 +1,45 @@ +import { gql } from '@apollo/client' + +export const SIGN_IN_MUTATION = gql` + mutation SignIn($username: String!, $password: String!) { + signIn(username: $username, password: $password) { + id + role + } + } +` + +export const REFRESH_SESSION_MUTATION = gql` + mutation RefreshSession { + refreshSession { + id + firstName + lastName + middleName + orgId + role + org { + id + name + } + } + } +` + +export const CURRENT_USER_QUERY = gql` + query CurrentUser { + currentUser { + avatarUrl + id + role + firstName + middleName + lastName + username + org { + id + name + } + } + } +` \ No newline at end of file diff --git a/frontend/src/features/auth/api/authService.ts b/frontend/src/features/auth/api/authService.ts new file mode 100644 index 0000000..fa08ecc --- /dev/null +++ b/frontend/src/features/auth/api/authService.ts @@ -0,0 +1,181 @@ +import { apolloClient } from '../../../shared/api/apolloClient' +import { + clearAuthStorage, + CURRENT_USER_STORAGE_KEY, + getStoredAccessToken, + getStoredRefreshToken, + saveAuthTokens, +} from '../../../shared/api/authStorage' +import { + CURRENT_USER_QUERY, + LOGIN_MUTATION, + LOGOUT_MUTATION, + REFRESH_SESSION_MUTATION, +} from '../../../shared/api/graphql/operations/auth' +import type { Employee } from '../../../entities/employee/model/types' +import type { + CurrentUserQuery, + LoginMutation, + RefreshSessionMutation, +} from '../../../shared/api/graphql/generated/graphql' + +type AuthUser = + | LoginMutation['login']['user'] + | RefreshSessionMutation['refreshSession']['user'] + | NonNullable + +function toCurrentUser(user: AuthUser): Employee { + return { + id: user.id, + firstName: user.firstName, + lastName: user.lastName, + middleName: user.middleName ?? '', + email: user.email, + login: user.login, + username: user.login, + createdAt: user.createdAt, + avatarUrl: null, + orgId: 0, + role: user.role, + org: null, + } +} + +function saveCurrentUser(user: Employee) { + if (typeof window === 'undefined') return + + window.localStorage.setItem(CURRENT_USER_STORAGE_KEY, JSON.stringify(user)) +} + +function emitAuthChange() { + if (typeof window === 'undefined') return + + window.dispatchEvent(new Event('auth:change')) +} + +function emitLogout() { + if (typeof window === 'undefined') return + + window.dispatchEvent(new Event('auth:logout')) +} + +async function refreshCurrentSession(): Promise { + const refreshToken = getStoredRefreshToken() + + if (!refreshToken) return null + + const { data } = await apolloClient.mutate({ + mutation: REFRESH_SESSION_MUTATION, + variables: { + payload: { + refreshToken, + }, + }, + fetchPolicy: 'no-cache', + }) + + if (!data?.refreshSession) return null + + saveAuthTokens( + data.refreshSession.accessToken, + data.refreshSession.refreshToken, + ) + + const user = toCurrentUser(data.refreshSession.user) + saveCurrentUser(user) + + return user +} + +export const authService = { + async login(loginOrEmail: string, password: string): Promise { + const { data } = await apolloClient.mutate({ + mutation: LOGIN_MUTATION, + variables: { + payload: { + loginOrEmail, + password, + }, + }, + fetchPolicy: 'no-cache', + }) + + if (!data?.login) { + throw new Error('Не удалось войти') + } + + saveAuthTokens(data.login.accessToken, data.login.refreshToken) + + const user = toCurrentUser(data.login.user) + saveCurrentUser(user) + emitAuthChange() + + return user + }, + + logout() { + const accessToken = getStoredAccessToken() + + if (accessToken) { + void apolloClient.mutate({ + mutation: LOGOUT_MUTATION, + context: { + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }, + fetchPolicy: 'no-cache', + }).catch(() => undefined) + } + + clearAuthStorage() + void apolloClient.clearStore() + emitLogout() + emitAuthChange() + }, + + async getCurrentUser(): Promise { + if (typeof window === 'undefined') return null + + if (!getStoredAccessToken() && !getStoredRefreshToken()) { + clearAuthStorage() + + return null + } + + try { + const { data } = await apolloClient.query({ + query: CURRENT_USER_QUERY, + fetchPolicy: 'no-cache', + }) + + if (data?.currentUser) { + const user = toCurrentUser(data.currentUser) + saveCurrentUser(user) + + return user + } + + const refreshedUser = await refreshCurrentSession() + + if (refreshedUser) { + emitAuthChange() + + return refreshedUser + } + + clearAuthStorage() + + return null + } catch { + clearAuthStorage() + emitLogout() + + return null + } + }, + + isAdmin(user: Employee | null) { + return user?.role === 'ADMIN' || user?.role === 'Admin' + }, +} diff --git a/frontend/src/features/auth/ui/AuthGate.tsx b/frontend/src/features/auth/ui/AuthGate.tsx new file mode 100644 index 0000000..64f89c5 --- /dev/null +++ b/frontend/src/features/auth/ui/AuthGate.tsx @@ -0,0 +1,67 @@ +import { useEffect, useState } from 'react' +import type { ReactNode } from 'react' + +import type { Employee } from '../../../entities/employee/model/types' +import { LoginPage } from '../../../pages/LoginPage/LoginPage' +import { authService } from '../api/authService' + +type AuthGateProps = { + children: ReactNode +} + +export function AuthGate({ children }: AuthGateProps) { + const [currentUser, setCurrentUser] = useState(null) + const [isCheckingAuth, setIsCheckingAuth] = useState(true) + + useEffect(() => { + let isMounted = true + + async function syncCurrentUser() { + const user = await authService.getCurrentUser() + + if (!isMounted) return + + setCurrentUser(user) + setIsCheckingAuth(false) + } + + syncCurrentUser() + + function handleAuthChange() { + setIsCheckingAuth(true) + syncCurrentUser() + } + + function handleLogout() { + setCurrentUser(null) + setIsCheckingAuth(false) + } + + window.addEventListener('auth:change', handleAuthChange) + window.addEventListener('auth:logout', handleLogout) + window.addEventListener('users:change', handleAuthChange) + + return () => { + isMounted = false + window.removeEventListener('auth:change', handleAuthChange) + window.removeEventListener('auth:logout', handleLogout) + window.removeEventListener('users:change', handleAuthChange) + } + }, []) + + if (isCheckingAuth) { + return
Проверка авторизации...
+ } + + if (!currentUser) { + return ( + { + setCurrentUser(await authService.getCurrentUser()) + }} + /> + ) + } + + return children +} diff --git a/frontend/src/index.scss b/frontend/src/index.scss new file mode 100644 index 0000000..134f995 --- /dev/null +++ b/frontend/src/index.scss @@ -0,0 +1,116 @@ +@use './shared/styles/variables' as *; +@use './shared/styles/themes'; +@use './shared/styles/table-surfaces'; + +@font-face { + font-family: 'Montserrat'; + src: url('./assets/fonts/Montserrat-VariableFont_wght.ttf') format('truetype'); + font-weight: 100 900; + font-style: normal; + font-display: swap; +} + +:root { + --sans: 'Montserrat', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;; + --heading: 'Montserrat', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;; + --mono: 'Montserrat', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;; + + font: var(--font-size-18) / 145% var(--sans); + letter-spacing: 0.18px; + color: var(--text); + background: $color-bg; + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + @media (max-width: 1024px) { + font-size: $font-size-16; + } +} + +#root { + //width: 1126px; + max-width: 100%; + margin: 0 auto; + text-align: center; + border-inline: 1px solid var(--border); + min-height: 100svh; + display: flex; + flex-direction: column; + box-sizing: border-box; +} + +body { + margin: 0; + background: $color-bg; +} +html{ + background: $color-bg; +} + +::view-transition-old(root), +::view-transition-new(root) { + animation: none; + mix-blend-mode: normal; +} + +html.theme-transition-no-css-transitions *, +html.theme-transition-no-css-transitions *::before, +html.theme-transition-no-css-transitions *::after { + transition: none !important; +} + +button{ + font-family: inherit; +} +a{ + text-decoration: none; +} + +.simplebar-content{ + height: 100%; +} + +h1, +h2 { + font-family: var(--heading); + font-weight: 500; + color: $color-text-strong; +} + +h1 { + font-size: $font-size-32; + margin: 0; + @media (max-width: 1024px) { + font-size: $font-size-36; + margin: 20px 0; + } +} +h2 { + font-size: $font-size-24; + line-height: 118%; + letter-spacing: -0.24px; + margin: 0 0 8px; + @media (max-width: 1024px) { + font-size: $font-size-20; + } +} +p { + margin: 0; +} + +code, +.counter { + font-family: var(--mono); + display: inline-flex; + border-radius: 4px; + color: var(--text-h); +} + +code { + font-size: $font-size-15; + line-height: 135%; + padding: 4px 8px; + background: var(--code-bg); +} diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx new file mode 100644 index 0000000..d132382 --- /dev/null +++ b/frontend/src/main.tsx @@ -0,0 +1,34 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.scss' +import 'react-day-picker/style.css' +import 'leaflet/dist/leaflet.css' +import { RouterProvider } from 'react-router-dom' +import { ApolloProvider } from '@apollo/client/react' +import { LazyMotion, domAnimation } from 'framer-motion' +import { apolloClient } from './shared/api/apolloClient' +import { router } from './app/router/router.tsx' +import { AuthGate } from './features/auth/ui/AuthGate' +import { initTheme } from './shared/theme/theme' + +const isAuthEnabled = import.meta.env.VITE_AUTH_ENABLED === 'true' + +initTheme() + +const app = isAuthEnabled ? ( + + + +) : ( + +) + +createRoot(document.getElementById('root')!).render( + + + + {app} + + + , +) diff --git a/frontend/src/pages/DevicePage/DevicePage.scss b/frontend/src/pages/DevicePage/DevicePage.scss new file mode 100644 index 0000000..10e7f05 --- /dev/null +++ b/frontend/src/pages/DevicePage/DevicePage.scss @@ -0,0 +1,871 @@ +@use '../../shared/styles/variables' as *; + +.device-page { + display: flex; + flex: 1; + min-height: calc(80% - 40px); + max-height: calc(100% - 40px); + height: auto; + flex-direction: column; + gap: 18px; + overflow: visible; + padding: 20px 20px 36px 20px; +} + +.device-page--apps { + flex: 1 1 0; + box-sizing: border-box; + min-width: 0; + min-height: 0; + height: 100%; + max-height: 100%; + overflow: visible; + + .device-page__motion-view { + overflow: visible; + } + + .device-page__apps-motion { + display: flex; + flex: 1 1 0; + min-width: 0; + min-height: 0; + height: 100%; + max-height: 100%; + flex-direction: column; + } + + .device-apps-view { + min-height: 0; + height: 100%; + } +} + +.device-page__grid { + display: grid; + grid-template-columns: 340px 340px minmax(360px, 1fr); + gap: 20px; + align-items: start; + width: 100%; + //min-height: 100%; +} + +.device-page__motion-view { + display: flex; + flex: 1 0 auto; + min-height: 0; + flex-direction: column; +} + +.device-card { + border-radius: 20px; + background: $color-surface; + backdrop-filter: blur(22px); + padding: 20px; + box-shadow: $shadow-card; +} + +.device-card--main { + grid-column: span 2; +} + +.device-page__details-row { + grid-column: 1 / -1; + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 20px; + align-items: start; + + >.device-card, + >.device-card-stats { + min-width: 0; + } +} + +.device-main { + display: flex; + flex-direction: row; + gap: 20px; +} + +.device-main__image { + height: calc(50% - 40px); + width: 27.1%; + padding: 20px; + border-radius: 14px; + background: $color-surface-subtle; + + display: flex; + align-items: center; + justify-content: center; + + background-color: $color-bg; + + img { + max-width: 100%; + max-height: 100%; + height: 100%; + width: auto; + object-fit: contain; + } +} + +.device-main__info { + display: flex; + flex-direction: column; + flex: 1; + text-align: left; + + h2 { + margin: 0 0 6px; + color: $color-text-strong; + font-size: $font-size-30; + font-weight: 600; + line-height: 1.1; + } + + p { + margin: 0; + color: $gray50; + font-size: $font-size-17; + font-weight: 500; + line-height: 1.3; + } +} + +.device-main__divider { + height: 1px; + margin: 12px 0 14px; + background: $gray20; +} + +.device-main__statuses { + display: flex; + flex-direction: column; + gap: 4px; +} + +.device-status { + display: inline-flex; + align-items: center; + gap: 9px; + + color: $color-text-strong; + font-size: $font-size-18; + font-weight: 500; + + svg { + padding: 4px; + width: 24px; + height: 24px; + border-radius: 8px; + background: $color-bg; + } + + &.is-success svg { + color: $green; + background: $color-success-bg; + } + + &.is-danger svg { + color: $red; + background: $color-danger-bg; + } + + &.is-muted svg { + color: $gray50; + } +} + +.device-main__bottom { + margin-top: 18px; +} + +.device-registered { + width: 100%; + padding: 0; + + display: inline-flex; + align-items: center; + gap: 10px; + + color: $color-text-strong; + font-size: $font-size-18; + font-weight: 500; + + .device-registered-info { + display: flex; + flex: 1; + align-items: center; + padding: 10px 0; + height: inherit; + justify-content: space-between; + border-bottom: 1px solid $gray20; + + a { + display: flex; + flex-direction: row; + align-items: center; + gap: 6px; + color: $gray50; + font-weight: 500; + text-decoration: none; + transition: color 0.2s ease; + + &:hover { + color: $color-primary-hover; + + svg { + color: $color-primary-hover; + } + } + + svg { + padding: 0; + background-color: transparent; + height: 20px; + width: auto; + margin-bottom: 2px; + transition: .2s ease; + } + } + } + + svg { + padding: 4px; + width: 24px; + height: 24px; + border-radius: 8px; + color: $gray50; + background: $color-bg; + } + + b { + color: $gray50; + font-weight: 500; + } + +} + +.device-card__actions { + margin-top: 20px; + + display: flex; + align-items: center; + justify-content: space-between; + gap: 20px; +} + +.device-history-btn { + + padding: 12px; + + border: none; + border-radius: 12px; + background: $color-primary-soft; + + color: $blue; + font-size: $font-size-18; + font-weight: 500; + cursor: pointer; + transition: .2s ease; + line-height: 1; + + &:hover { + background-color: $blue; + color: $color-text-inverse; + box-shadow: var(--shadow-primary); + } +} + +.device-delete-btn { + padding: 12px; + + border: none; + border-radius: 12px; + background: $color-danger-bg-strong; + + display: inline-flex; + align-items: center; + justify-content: center; + color: $red; + cursor: pointer; + transition: .2s ease; + + svg { + width: 18px; + height: 18px; + } + + &:hover { + background-color: $red; + color: $color-text-inverse; + box-shadow: var(--shadow-danger); + } +} + +.device-card__header { + margin-bottom: 14px; + + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + + p { + margin: 0; + color: $color-text-muted; + font-size: $font-size-15; + font-weight: 500; + } +} + +.device-card__title { + display: flex; + align-items: center; + gap: 10px; + + h3 { + margin: 0; + color: $color-text-heading; + font-size: $font-size-18; + font-weight: 600; + } + + svg { + padding: 4px; + width: 24px; + height: 24px; + border-radius: 9px; + background: $color-surface-hover; + color: $color-text-heading; + } +} + +.device-map { + display: flex; + flex-direction: column; + grid-column: span 1; + min-height: 272px; + height: calc(100% - 40px); +} + + +.device-permissions { + padding: 10px 20px; + display: flex; + flex: 1; + flex-direction: column; + justify-content: space-between; + height: calc(100% - 20px); +} + +.device-permission { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + + color: $color-text-heading; + font-size: $font-size-18; + font-weight: 500; + + &:nth-child(1) { + .device-permission__label { + border-top: none; + } + } + + svg { + padding: 4px; + width: 24px; + height: 24px; + border-radius: 8px; + color: $blue; + background: $color-surface-hover; + } +} + +.device-permission__label { + display: flex; + align-items: center; + justify-content: space-between; + flex: 1; + gap: 10px; + padding: 10px 0; + border-top: 1px solid $gray20; +} + +.device-card-stats { + display: flex; + flex-direction: column; + gap: 20px; +} + +.device-battery { + --device-battery-progress-empty: #cfd5df; + --device-battery-progress-danger: #e00000; + --device-battery-progress-warning: #ff8a34; + --device-battery-progress-strong: #031d9a; + + h3 { + text-align: left; + line-height: 1; + margin: 0 0 12px; + padding-bottom: 12px; + border-bottom: 1px solid $gray20; + + color: $color-text-heading; + font-size: $font-size-18; + font-weight: 600; + } + + .device-stats-card { + display: flex; + flex-direction: row; + align-items: center; + gap: 8px; + + &:nth-child(2) { + .device-stats-text { + border-top: 1px solid $gray20; + border-bottom: 1px solid $gray20; + padding: 8px 0; + } + } + + svg { + width: 24px; + height: 24px; + padding: 4px; + border-radius: 8px; + } + } + + .device-stats-text { + display: flex; + flex: 1; + flex-direction: row; + align-items: center; + justify-content: space-between; + } +} + +.device-battery__content { + display: grid; + grid-template-columns: 120px 1fr; + gap: 20px; + align-items: center; +} + +.device-battery__circle { + position: relative; + + width: 120px; + height: 120px; + flex: 0 0 120px; + + display: flex; + align-items: center; + justify-content: center; + + overflow: visible; + + span { + position: absolute; + inset: 0; + + display: flex; + align-items: center; + justify-content: center; + + color: $color-text; + font-size: $font-size-26; + font-weight: 650; + line-height: 1; + } +} + +.device-battery__circle-svg { + width: 120px; + height: 120px; + display: block; +} + +.device-battery__circle-track, +.device-battery__circle-progress { + fill: none; +} + +.device-battery__circle-track { + stroke: $gray20; + stroke-linecap: round; +} + +.device-battery__circle-progress { + stroke-linecap: round; + transition: + stroke-dashoffset 0.35s ease, + stroke 0.25s ease; +} + +.device-stats { + display: flex; + flex-direction: column; + gap: 10px; + + div { + display: grid; + grid-template-columns: 30px 1fr auto; + align-items: center; + gap: 10px; + + color: $color-text-heading; + font-size: $font-size-16; + font-weight: 500; + } + + svg { + padding: 5px; + width: 30px; + height: 30px; + border-radius: 9px; + color: $color-success-strong; + background: $color-success-bg; + } + + b { + color: $color-text-heading; + font-weight: 600; + } +} + +.device-impacts { + display: flex; + flex-direction: row; + align-items: center; + gap: 10px; + + color: $color-text-heading; + font-size: $font-size-18; + font-weight: 500; + + .device-stats-text { + display: flex; + flex: 1; + flex-direction: row; + align-items: center; + justify-content: space-between; + gap: 20px; + } + + svg { + padding: 4px; + width: 24px; + height: 24px; + border-radius: 9px; + color: $green; + background: $color-success-bg; + } + + b { + font-weight: 600; + } +} + +.device-page__empty { + min-height: 260px; + border-radius: 18px; + background: $color-surface; + + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 16px; + + h2 { + margin: 0; + } + + button { + height: 40px; + padding: 0 16px; + border: none; + border-radius: 12px; + background: $blue; + color: $color-text-inverse; + cursor: pointer; + } +} + +[data-theme='dark'] { + .device-battery { + --device-battery-progress-empty: #36414f; + --device-battery-progress-danger: #ff4f5e; + --device-battery-progress-warning: #ff9f43; + --device-battery-progress-strong: #2d8cff; + } +} + + +@include desktop-down { + .device-page__grid { + display: grid; + grid-template-columns: 280px 280px minmax(380px, 1fr); + gap: 14px; + align-items: start; + + .device-page__details-row { + gap: 14px; + grid-template-columns: 1.25fr 1fr 1.25fr; + + .device-card-stats { + gap: 14px; + } + } + + .device-actions { + button { + font-size: var(--font-size-16); + padding: 12px; + gap: 12px; + + svg { + width: 28px; + height: 28px; + } + } + + .future-label { + font-size: var(--font-size-12); + padding: 8px 12px; + } + } + } + + .device-permission { + font-size: var(--font-size-16) !important; + + svg { + width: 20px; + height: 20px; + } + + &__label { + padding: 8px 0; + } + } + + .device-permissions__icon-btn { + width: 32px; + height: 32px; + border-radius: 10px; + } + + .device-battery__content { + grid-template-columns: 100px 1fr; + } + + .device-battery__circle { + width: 100px; + height: 100px; + + span { + font-size: var(--font-size-22); + } + } + + .device-stats { + gap: 8px; + + div { + font-size: var(--font-size-15); + } + + .device-stats-card { + svg { + width: 20px; + height: 20px; + } + } + } + + .device-impacts { + font-size: var(--font-size-16); + + svg { + width: 20px; + height: 20px; + } + } + + .device-main { + &__info { + h2 { + font-size: var(--font-size-28); + } + + p { + font-size: var(--font-size-15); + } + } + } + + .device-main__image { + width: 26.5%; + } + + .device-status { + font-size: var(--font-size-16); + + svg { + width: 20px; + height: 20px; + } + } + + .device-registered { + font-size: var(--font-size-16); + + svg { + height: 20px; + width: 20px; + } + + .device-registered-info { + padding: 8px 0; + + a { + svg { + width: 18px; + height: 18px; + } + } + } + } + + .device-card__actions { + margin-top: 18px; + } + + .device-history-btn { + font-size: var(--font-size-16); + } + + .device-delete-btn { + svg { + width: 16px; + height: 16px; + } + } + + .history-period-tabs__item { + font-size: var(--font-size-12); + height: 30px; + } + +} + +@include laptop-down { + .device-page { + gap: 14px; + } + + .device-page__grid { + grid-template-columns: 540px minmax(360px, 1fr);; + } + + .device-card--main { + grid-column: span 1; + } + + .device-page__grid, + .device-page__details-row { + gap: $layout-card-gap; + } + + .device-card { + padding: 18px; + height: calc(100% - 36px); + border-radius: 16px; + } + .device-card-stats{ + height: calc(100%); + } + .device-impacts{ + flex: 0; + } + .device-battery{ + display: flex; + flex-direction: column; + justify-content: space-between; + flex: 1; + } + .device-permissions{ + height: calc(100% - 12px); + padding: 8px 8px 4px 18px; + } + + .device-main { + gap: 16px; + } + + .device-main__image { + padding: 16px; + } + + .device-map { + min-height: 252px; + } + .history-period-tabs{ + display: none; + } + .device-card__title{ + gap: 8px; + svg{ + width: 22px; + height: 22px; + } + h3{ + font-size: var(--font-size-16); + } + } + .device-card__header{ + p{ + font-size: var(--font-size-14); + } + } +} + +@include tablet-down { + .device-main { + flex-direction: column; + } + + .device-main__image { + width: 100%; + height: 178px; + box-sizing: border-box; + } + + .device-main__info { + h2 { + font-size: $font-size-26; + } + } + + .device-map { + grid-column: span 1; + min-height: 300px; + height: auto; + } + + .device-page__details-row { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .device-card__actions { + gap: 10px; + } +} diff --git a/frontend/src/pages/DevicePage/DevicePage.tsx b/frontend/src/pages/DevicePage/DevicePage.tsx new file mode 100644 index 0000000..465d893 --- /dev/null +++ b/frontend/src/pages/DevicePage/DevicePage.tsx @@ -0,0 +1,438 @@ +import { + lazy, + Suspense, + useCallback, + useEffect, + useMemo, + useState, +} from 'react' +import { + useNavigate, + useOutletContext, + useParams, + useSearchParams, +} from 'react-router-dom' +import { AnimatePresence, m } from 'framer-motion' +import { useQuery } from '@apollo/client/react' + +import type { Device as PageDevice } from './types' + +import { GET_DEVICE_PAGE_QUERY } from '../../entities/device/api/device.graphql' +import type { + Device as ApiDevice, + DeviceNetworkStatus, + GetPhoneGpsTrackData, + GetTelemetryData, + GetDevicePageData, + GetDevicePageVariables, +} from '../../entities/device/model/types' + +import { DeviceMainCard } from './components/DeviceMainCard/DeviceMainCard' +import { DeviceMapCard } from './components/DeviceMapCard/DeviceMapCard' +import { DeviceActionsCard } from './components/DeviceActionsCard/DeviceActionsCard' +import { DevicePermissionsCard } from './components/DevicePermissionsCard/DevicePermissionsCard' +import { DeviceStatsCards } from './components/DeviceStatsCards/DeviceStatsCards' +import { DeviceAppsView } from './components/DeviceAppsView/DeviceAppsView' +import { pageSwapVariants, uiFadeTransition } from '../../shared/lib/motion' +import { isPhonePolicyOptionEnabled } from '../../entities/device/lib/phonePolicy' +import { EmptyState } from '../../shared/ui/EmptyState/EmptyState' + +import './DevicePage.scss' +import { DevicePageSkeleton } from './components/DevicePageSkeleton/DevicePageSkeleton' +import type { AppLayoutOutletContext } from '../../app/layouts/AppLayout' +import { + preloadOnIdle, + useLazyMount, +} from '../../shared/lib/lazyMount' + +const loadDeviceHistoryModal = () => + import('./components/DeviceHistoryModal/DeviceHistoryModal').then( + (module) => ({ + default: module.DeviceHistoryModal, + }), + ) + +const DeviceHistoryModal = lazy(loadDeviceHistoryModal) + +function formatLocationDate(timestamp: number) { + if (!timestamp) return 'Нет данных' + + return new Intl.DateTimeFormat('ru-RU', { + day: '2-digit', + month: '2-digit', + year: 'numeric', + hour: '2-digit', + minute: '2-digit', + }).format(new Date(timestamp)) +} + +function formatTechValue(value?: number | null) { + return typeof value === 'number' ? String(value) : undefined +} + +function getLatestTelemetryItem(telemetry: GetTelemetryData['getTelemetry']) { + if (!telemetry.length) return null + + return [...telemetry].sort((a, b) => b.date - a.date)[0] +} + +function getSortedGpsTrack(track: GetPhoneGpsTrackData['getPhoneGpsTrack']) { + return [...track].sort((a, b) => a.date - b.date) +} + +function getDeviceNetworkConnection(status?: DeviceNetworkStatus) { + if (status === 'Online') return 'online' + if (status === 'Lost') return 'offlineDanger' + + return 'offline' +} + +function getDeviceNetworkLabel(status?: DeviceNetworkStatus) { + if (status === 'Online') return 'В сети' + if (status === 'Lost') return 'Потерян' + + return 'Не в сети' +} + +function mapApiDeviceToPageDevice( + device: ApiDevice, + batteryLevel?: number, + gpsTrack: GetPhoneGpsTrackData['getPhoneGpsTrack'] = [], + telemetry: GetTelemetryData['getTelemetry'] = [], +): PageDevice { + const sortedGpsTrack = getSortedGpsTrack(gpsTrack) + const policy = device.policy + const techState = device.techState + const needMaintenance = techState?.needMaintenance ?? false + const bluetoothEnabled = isPhonePolicyOptionEnabled( + policy?.bluetooth ?? policy?.canUseBluetooth, + ) + const gpsEnabled = isPhonePolicyOptionEnabled(policy?.GPS ?? policy?.canUseGPS) + const cameraEnabled = isPhonePolicyOptionEnabled( + policy?.camera ?? policy?.canUseCamera, + ) + const simEnabled = isPhonePolicyOptionEnabled(policy?.sim ?? policy?.canUseSim) + const isLocked = policy?.locked ?? false + + const currentGpsPoint = + sortedGpsTrack.length > 0 + ? sortedGpsTrack[sortedGpsTrack.length - 1] + : null + + const routeGpsPoints = + sortedGpsTrack.length > 1 + ? sortedGpsTrack.slice(0, -1) + : [] + + const location = currentGpsPoint + ? { + lat: currentGpsPoint.lat, + lng: currentGpsPoint.lng, + } + : device.lastLocation + ? { + lat: device.lastLocation.lat, + lng: device.lastLocation.lng, + } + : undefined + + const lastLocationAt = currentGpsPoint + ? formatLocationDate(currentGpsPoint.date) + : device.lastLocation + ? formatLocationDate(device.lastLocation.date) + : 'Нет данных' + + return { + id: device.id, + + model: 'АРМАФОН S3.3+', + factoryNumber: device.serial || 'Заводской номер не указан', + imei: device.imei || 'IMEI не указан', + imei2: device.imei2 || 'IMEI 2 не указан', + serialNumber: device.serial || undefined, + + employee: device.org?.name ?? null, + organisation: device.org?.name, + organisationId: device.org?.id ?? device.orgId, + policy, + organisationPolicy: device.org?.policy ?? null, + + condition: needMaintenance ? 'inspection' : 'ok', + connection: getDeviceNetworkConnection(device.networkStatus), + connectionText: getDeviceNetworkLabel(device.networkStatus), + + workTime: null, + registeredAt: device.registerDate + ? formatLocationDate(device.registerDate) + : undefined, + + image: undefined, + + location, + lastLocationAt, + lastLocationDate: device.lastLocation?.date, + + route: routeGpsPoints.map((point) => ({ + lat: point.lat, + lng: point.lng, + time: formatLocationDate(point.date), + })), + + permissions: { + wifi: false, + bluetooth: bluetoothEnabled, + gps: gpsEnabled, + camera: cameraEnabled, + sim: simEnabled, + speaker: false, + locked: isLocked, + }, + + statusIcons: { + gps: gpsEnabled, + wifi: false, + bluetooth: bluetoothEnabled, + lock: isLocked, + camera: cameraEnabled, + sim: simEnabled, + sound: false, + kiosk: false, + }, + + battery: techState?.batteryLevel ?? batteryLevel, + batteryMaxCapacity: techState?.batteryRemainingCapacity ?? undefined, + telemetry, + chargeCycles: formatTechValue(techState?.batteryCycles), + totalWorkTime: techState?.worktime ?? null, + mediumImpacts: formatTechValue(techState?.hits), + overheats: formatTechValue(techState?.overheats), + } +} + +export function DevicePage() { + const { deviceId } = useParams() + const navigate = useNavigate() + const { setNavbarBreadcrumbs } = + useOutletContext() + const [searchParams, setSearchParams] = useSearchParams() + const [isHistoryOpen, setIsHistoryOpen] = useState(false) + const shouldMountHistoryModal = useLazyMount(isHistoryOpen) + + const numericDeviceId = Number(deviceId) + const isAppsView = searchParams.get('view') === 'apps' + + useEffect(() => { + return preloadOnIdle([loadDeviceHistoryModal]) + }, []) + + const { + data, + loading, + error, + refetch, + startPolling, + stopPolling, + } = useQuery< + GetDevicePageData, + GetDevicePageVariables + >(GET_DEVICE_PAGE_QUERY, { + variables: { + id: numericDeviceId, + phoneId: String(numericDeviceId), + telemetryStartDate: 0, + gpsStartDate: 0, + }, + skip: !numericDeviceId, + fetchPolicy: 'network-only', + pollInterval: 15000, + }) + + const handlePermissionsEditingChange = useCallback( + (isEditing: boolean) => { + if (isEditing) { + stopPolling() + return + } + + if (numericDeviceId) { + startPolling(15000) + } + }, + [numericDeviceId, startPolling, stopPolling], + ) + + const latestTelemetryItem = useMemo(() => { + return getLatestTelemetryItem(data?.getTelemetry ?? []) + }, [data]) + + const device = useMemo(() => { + if (!data?.getPhone) return null + + return mapApiDeviceToPageDevice( + data.getPhone, + latestTelemetryItem?.batteryLevel ?? undefined, + data.getPhoneGpsTrack ?? [], + data.getTelemetry ?? [], + ) + }, [data, latestTelemetryItem]) + + useEffect(() => { + if (!device) { + setNavbarBreadcrumbs([]) + return + } + + setNavbarBreadcrumbs([ + { + label: device.factoryNumber, + to: isAppsView ? `/devices/${device.id}` : undefined, + }, + ...(isAppsView ? [{ label: 'Приложения' }] : []), + ]) + + return () => { + setNavbarBreadcrumbs([]) + } + }, [device, isAppsView, setNavbarBreadcrumbs]) + + const handleOpenApps = useCallback(() => { + const nextParams = new URLSearchParams(searchParams) + nextParams.set('view', 'apps') + + setSearchParams(nextParams) + }, [searchParams, setSearchParams]) + + const handleCloseApps = useCallback(() => { + const nextParams = new URLSearchParams(searchParams) + nextParams.delete('view') + + setSearchParams(nextParams, { + replace: true, + }) + }, [searchParams, setSearchParams]) + + const handleOpenHistory = useCallback(() => { + setIsHistoryOpen(true) + }, []) + + const handleRefetchPolicy = useCallback(async () => { + const result = await refetch() + + return result.data?.getPhone?.policy + }, [refetch]) + + const handleLockStateChange = useCallback(async () => { + const result = await refetch() + + return result.data?.getPhone?.policy?.locked + }, [refetch]) + + if (!numericDeviceId) { + return ( +
+ + + +
+ ) + } + + if (loading && !device) { + return + } + + if (error || !device) { + return ( +
+ + + +
+ ) + } + + return ( +
+ + {isAppsView ? ( + + + + ) : ( + +
+ + + +
+ + + +
+
+
+ )} +
+ {shouldMountHistoryModal && ( + + + + )} +
+ ) +} diff --git a/frontend/src/pages/DevicePage/components/BatteryCircle/BatteryCircle.scss b/frontend/src/pages/DevicePage/components/BatteryCircle/BatteryCircle.scss new file mode 100644 index 0000000..c209ea7 --- /dev/null +++ b/frontend/src/pages/DevicePage/components/BatteryCircle/BatteryCircle.scss @@ -0,0 +1,44 @@ +@use '../../../../shared/styles/variables' as *; + +.battery-circle { + position: relative; + width: 180px; + height: 180px; + display: flex; + align-items: center; + justify-content: center; +} + +.battery-circle__svg { + width: 100%; + height: 100%; +} + +.battery-circle__track, +.battery-circle__progress { + fill: none; +} + +.battery-circle__track { + stroke: $color-border-accent; +} + +.battery-circle__progress { + stroke-linecap: round; + transition: + stroke-dashoffset 0.35s ease, + stroke 0.25s ease; +} + +.battery-circle__value { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + + font-size: $font-size-44; + font-weight: 500; + line-height: 1; + color: $black; +} diff --git a/frontend/src/pages/DevicePage/components/BatteryCircle/BatteryCircle.tsx b/frontend/src/pages/DevicePage/components/BatteryCircle/BatteryCircle.tsx new file mode 100644 index 0000000..3efb5ec --- /dev/null +++ b/frontend/src/pages/DevicePage/components/BatteryCircle/BatteryCircle.tsx @@ -0,0 +1,57 @@ +type BatteryCircleProps = { + value?: number | null +} + +function getBatteryColor(value: number) { + if (value <= 20) return '#E53935' + if (value <= 50) return '#F59E0B' + return '#0B28B8' +} + +export function BatteryCircle({ value }: BatteryCircleProps) { + const battery = typeof value === 'number' + ? Math.max(0, Math.min(100, value)) + : 0 + + const size = 180 + const strokeWidth = 14 + const radius = (size - strokeWidth) / 2 + const circumference = 2 * Math.PI * radius + + const dashOffset = circumference * (1 - battery / 100) + + return ( +
+ + + + + + + + {battery}% +
+ ) +} \ No newline at end of file diff --git a/frontend/src/pages/DevicePage/components/DeviceActionsCard/DeviceActionsCard.scss b/frontend/src/pages/DevicePage/components/DeviceActionsCard/DeviceActionsCard.scss new file mode 100644 index 0000000..f268ceb --- /dev/null +++ b/frontend/src/pages/DevicePage/components/DeviceActionsCard/DeviceActionsCard.scss @@ -0,0 +1,235 @@ +@use '../../../../shared/styles/variables' as *; + + +.device-actions { + display: flex; + flex-direction: column; + justify-content: space-between; + height: calc(100% - 40px); + + h3 { + line-height: 1; + margin: 0 0 12px; + padding-bottom: 12px; + border-bottom: 1px solid $color-border; + text-align: left; + color: $color-text-heading; + font-size: $font-size-18; + font-weight: 600; + } + + .actions-button-container { + display: flex; + flex-direction: column; + } + + button { + display: flex; + flex-direction: row; + gap: 14px; + align-items: center; + justify-content: flex-start; + width: 100%; + padding: 14px; + border: none; + border-radius: 12px; + background: $color-bg; + + display: flex; + align-items: center; + + color: $gray50; + font-size: $font-size-18; + font-weight: 550; + cursor: pointer; + transition: .2s ease; + small{ + font-weight: 500; + opacity: .8; + } + .actions-button-text{ + display: flex; + flex-direction: column; + align-items: flex-start; + } + + svg { + height: 32px; + width: 32px; + } + + &:not(:disabled):hover { + background-color: rgba($gray20-rgb, .9); + //color: $blue; + box-shadow: inset 0 0 0 1.5px rgba($gray50-rgb, .1); + } + + &:disabled { + opacity: .74; + cursor: not-allowed; + + &:hover { + background: $color-bg; + color: $gray50; + } + } + + &+button { + margin-top: 8px; + } + } + + .device-actions__lock-button { + overflow: hidden; + + .device-actions__lock-content { + position: relative; + display: grid; + width: 100%; + min-height: 40px; + min-width: 0; + overflow: hidden; + } + + .device-actions__lock-state { + grid-area: 1 / 1; + display: flex; + align-items: center; + gap: 14px; + width: 100%; + min-height: 40px; + min-width: 0; + } + + .device-actions__lock-icon { + flex: 0 0 32px; + transition: + color 0.2s ease, + transform 0.24s cubic-bezier(0.34, 1.42, 0.64, 1); + } + + &.is-loading { + opacity: 1; + cursor: wait; + + .device-actions__loading-icon { + color: $blue; + transform: none; + transform-box: fill-box; + transform-origin: center; + backface-visibility: hidden; + transition: color 0.2s ease; + will-change: transform; + animation: device-actions-loading-spin 0.85s linear infinite; + } + + &:disabled:hover { + background: $color-bg; + color: $gray50; + } + } + + &.is-lock:not(.is-loading) { + &:not(:disabled):hover { + .device-actions__lock-icon { + color: $red; + transform: translateY(-1px) scale(1.06); + } + } + } + + &.is-unlock:not(.is-loading) { + &:not(:disabled):hover { + .device-actions__lock-icon { + color: $blue; + transform: rotate(-8deg) translateY(-1px) scale(1.06); + } + } + } + } + + .device-actions__error { + margin-top: 10px; + padding: 7px 10px; + border-radius: 10px; + background: $color-danger-tint; + + color: $red; + font-size: $font-size-13; + font-weight: 600; + line-height: 1.25; + } + + .future-label{ + display: flex; + flex-direction: row; + align-items: center; + font-size: $font-size-14; + font-weight: 550; + padding: 10px 14px; + margin-top: 20px; + gap: 14px; + color: $blue; + background-color: $blue20; + border-radius: 14px; + svg{ + height: 20px; + width: auto; + } + } +} + +.device-actions__apps-icon { + transition: color 0.2s ease; + + rect { + transform-box: fill-box; + transform-origin: center; + transition: transform 0.22s ease; + } +} + +.device-actions__apps-button:not(:disabled):hover { + .device-actions__apps-icon { + color: $blue; + + rect:nth-child(2) { + --tile-pop-x: 1.7px; + --tile-pop-y: -1.7px; + --tile-rest-x: 0.8px; + --tile-rest-y: -0.8px; + animation: device-actions-app-tile 0.48s cubic-bezier(0.34, 1.42, 0.64, 1); + transform: translate(var(--tile-rest-x), var(--tile-rest-y)) scale(1); + } + } +} + +@keyframes device-actions-app-tile { + 0% { + transform: translate(0, 0) scale(1); + } + + 45% { + transform: translate(var(--tile-pop-x), var(--tile-pop-y)) scale(0.86); + } + + 100% { + transform: translate(var(--tile-rest-x, 0), var(--tile-rest-y, 0)) scale(1); + } +} + +@keyframes device-actions-loading-spin { + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: reduce) { + .device-actions { + .device-actions__lock-button.is-loading { + .device-actions__loading-icon { + animation: none; + } + } + } +} diff --git a/frontend/src/pages/DevicePage/components/DeviceActionsCard/DeviceActionsCard.tsx b/frontend/src/pages/DevicePage/components/DeviceActionsCard/DeviceActionsCard.tsx new file mode 100644 index 0000000..c24926c --- /dev/null +++ b/frontend/src/pages/DevicePage/components/DeviceActionsCard/DeviceActionsCard.tsx @@ -0,0 +1,272 @@ +import { memo, useEffect, useState } from 'react' +import { AnimatePresence, m, useReducedMotion } from 'framer-motion' +import { useMutation } from '@apollo/client/react' +import { CircleAlert, Unlock } from 'lucide-react' + +import { Apps } from '../../../../assets/icons/Apps' +import { BlockIcon } from '../../../../assets/icons/Block' +import { LoadingTwotoneLoopIcon } from '../../../../assets/icons/LoadingTwotoneLoop' +import type { Device } from '../../types' +import { + CHANGE_PHONE_POLICY_MUTATION, +} from '../../../../entities/device/api/device.graphql' +import type { + ChangePhonePolicyData, + ChangePhonePolicyVariables, +} from '../../../../entities/device/model/types' +import { + normalizeComponentUseOption, + normalizeServiceUseOption, +} from '../../../../entities/device/lib/phonePolicy' + +import './DeviceActionsCard.scss' + +type DeviceActionsCardProps = { + device: Device + onOpenApps: () => void + onLockStateChange?: () => Promise | boolean | null | void +} + +function getChangeLockVariables( + device: Device, + locked: boolean, +): ChangePhonePolicyVariables { + const policy = device.policy + const permissions = device.permissions + + return { + id: String(device.id), + bluetooth: normalizeServiceUseOption( + policy?.bluetooth ?? policy?.canUseBluetooth, + permissions?.bluetooth, + ), + camera: normalizeComponentUseOption( + policy?.camera ?? policy?.canUseCamera, + permissions?.camera, + ), + GPS: normalizeServiceUseOption( + policy?.GPS ?? policy?.canUseGPS, + permissions?.gps, + ), + sim: normalizeServiceUseOption( + policy?.sim ?? policy?.canUseSim, + permissions?.sim, + ), + locked, + } +} + +function areDeviceActionsCardPropsEqual( + prev: DeviceActionsCardProps, + next: DeviceActionsCardProps, +) { + const prevPolicy = prev.device.policy + const nextPolicy = next.device.policy + const prevPermissions = prev.device.permissions + const nextPermissions = next.device.permissions + + return ( + prev.onOpenApps === next.onOpenApps && + prev.onLockStateChange === next.onLockStateChange && + prev.device.id === next.device.id && + prev.device.connection === next.device.connection && + prevPolicy?.bluetooth === nextPolicy?.bluetooth && + prevPolicy?.camera === nextPolicy?.camera && + prevPolicy?.GPS === nextPolicy?.GPS && + prevPolicy?.sim === nextPolicy?.sim && + prevPolicy?.locked === nextPolicy?.locked && + prevPermissions?.bluetooth === nextPermissions?.bluetooth && + prevPermissions?.camera === nextPermissions?.camera && + prevPermissions?.gps === nextPermissions?.gps && + prevPermissions?.sim === nextPermissions?.sim && + prevPermissions?.locked === nextPermissions?.locked + ) +} + +export const DeviceActionsCard = memo(function DeviceActionsCard({ + device, + onOpenApps, + onLockStateChange, +}: DeviceActionsCardProps) { + const deviceLocked = device.permissions?.locked ?? device.policy?.locked ?? false + const isLost = device.connection === 'offlineDanger' + const [displayLocked, setDisplayLocked] = useState(deviceLocked) + const [pendingLockTarget, setPendingLockTarget] = useState(null) + const [lockError, setLockError] = useState(false) + const [changePhonePolicy] = useMutation< + ChangePhonePolicyData, + ChangePhonePolicyVariables + >(CHANGE_PHONE_POLICY_MUTATION) + const shouldReduceMotion = useReducedMotion() + const isLockLoading = pendingLockTarget !== null + const lockStateTransition = shouldReduceMotion + ? { duration: 0 } + : { + duration: 0.18, + ease: [0.34, 1.42, 0.64, 1] as [number, number, number, number], + } + const lockLoadingTarget = pendingLockTarget ?? !displayLocked + const lockButtonView = isLockLoading + ? { + key: 'loading', + icon: ( +