@oneuptime/common 12.0.2 → 12.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/CephCluster.ts +14 -0
- package/Models/DatabaseModels/CodeRepository.ts +14 -6
- package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +14 -0
- package/Models/DatabaseModels/DockerHost.ts +14 -0
- package/Models/DatabaseModels/GlobalOidcProject.ts +18 -0
- package/Models/DatabaseModels/GlobalSsoProject.ts +18 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/IoTFleet.ts +14 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +14 -0
- package/Models/DatabaseModels/LogDropFilter.ts +9 -20
- package/Models/DatabaseModels/NetworkDevice.ts +14 -0
- package/Models/DatabaseModels/NetworkInterface.ts +18 -0
- package/Models/DatabaseModels/Project.ts +16 -2
- package/Models/DatabaseModels/ProxmoxCluster.ts +14 -0
- package/Models/DatabaseModels/Service.ts +30 -0
- package/Models/DatabaseModels/StatusPageMonitorRule.ts +911 -0
- package/Models/DatabaseModels/StatusPagePrivateUser.ts +30 -0
- package/Models/DatabaseModels/StatusPageResource.ts +73 -0
- package/Models/DatabaseModels/TraceDropFilter.ts +9 -20
- package/Models/DatabaseModels/User.ts +30 -0
- package/Server/API/AIAgentDataAPI.ts +31 -0
- package/Server/API/BaseAPI.ts +13 -2
- package/Server/API/DashboardAPI.ts +458 -12
- package/Server/API/GitHubAPI.ts +119 -283
- package/Server/API/UserAPI.ts +263 -1
- package/Server/EnvironmentConfig.ts +38 -4
- package/Server/Infrastructure/GlobalCache.ts +152 -0
- package/Server/Infrastructure/Postgres/DataSourceOptions.ts +16 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.ts +123 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.ts +21 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.ts +68 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.ts +100 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.ts +214 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.ts +69 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Services/AlertStateTimelineService.ts +20 -0
- package/Server/Services/AnalyticsDatabaseService.ts +72 -1
- package/Server/Services/CephClusterService.ts +26 -86
- package/Server/Services/CloudResourceService.ts +23 -83
- package/Server/Services/CodeRepositoryService.ts +105 -2
- package/Server/Services/DatabaseService.ts +296 -2
- package/Server/Services/DockerHostService.ts +19 -79
- package/Server/Services/DockerSwarmClusterService.ts +27 -88
- package/Server/Services/HostService.ts +46 -99
- package/Server/Services/IncidentStateTimelineService.ts +20 -0
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/IoTFleetService.ts +19 -79
- package/Server/Services/KubernetesClusterService.ts +17 -78
- package/Server/Services/LabelService.ts +57 -10
- package/Server/Services/MetricTypeService.ts +84 -0
- package/Server/Services/MonitorService.ts +89 -14
- package/Server/Services/MonitorStatusTimelineService.ts +29 -0
- package/Server/Services/MonitorTemplateService.ts +65 -0
- package/Server/Services/OpenTelemetryIngestService.ts +230 -26
- package/Server/Services/PodmanHostService.ts +19 -79
- package/Server/Services/ProxmoxClusterService.ts +23 -83
- package/Server/Services/RumApplicationService.ts +19 -80
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +21 -0
- package/Server/Services/ServerlessFunctionService.ts +24 -85
- package/Server/Services/ServiceService.ts +299 -73
- package/Server/Services/StatusPageMonitorRuleEngineService.ts +752 -0
- package/Server/Services/StatusPageMonitorRuleService.ts +471 -0
- package/Server/Services/TelemetryEntityRelationshipService.ts +1 -0
- package/Server/Services/TelemetryEntityService.ts +1 -0
- package/Server/Services/UserService.ts +184 -0
- package/Server/Utils/AI/Toolbox/CodeTools.ts +45 -4
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +13 -0
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +157 -4
- package/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.ts +130 -0
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +170 -39
- package/Server/Utils/Monitor/MonitorResource.ts +63 -36
- package/Server/Utils/Monitor/MonitorStatusTimeline.ts +36 -0
- package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +148 -127
- package/Server/Utils/Monitor/MonitorStepsReferenceExtractor.ts +434 -0
- package/Server/Utils/PasswordHash.ts +306 -0
- package/Server/Utils/SingleFlight.ts +83 -0
- package/Server/Utils/StatusPage/MonitorRulePatternValidator.ts +46 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +107 -26
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +314 -0
- package/Server/Utils/Telemetry/Telemetry.ts +351 -122
- package/Tests/App/Dashboard/OverviewCustomFields.test.tsx +333 -0
- package/Tests/App/Dashboard/UserCustomFields.test.tsx +392 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +2 -0
- package/Tests/Models/DatabaseModels/ColumnTransformerInvariants.test.ts +306 -0
- package/Tests/Models/DatabaseModels/NumberColumnDeserialization.test.ts +333 -0
- package/Tests/Models/DatabaseModels/StatusPageMonitorRuleModel.test.ts +190 -0
- package/Tests/Server/API/AIAgentDataRepositoryToken.test.ts +381 -0
- package/Tests/Server/API/DashboardPublicAttributeValuesAPI.test.ts +943 -0
- package/Tests/Server/API/DashboardPublicMetricsAggregateAPI.test.ts +1296 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +26 -0
- package/Tests/Server/API/DashboardPublicTemplatePayloads.test.ts +598 -0
- package/Tests/Server/API/GitHubAppInstallationBindingAPI.test.ts +539 -0
- package/Tests/Server/API/Helpers.ts +6 -1
- package/Tests/Server/API/UserProjectsAPI.test.ts +852 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +354 -0
- package/Tests/Server/Infrastructure/PostgresLockTimeoutOptions.test.ts +181 -0
- package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +215 -0
- package/Tests/Server/Services/AddPerUserPasswordSaltMigration.test.ts +178 -0
- package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +582 -0
- package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +5 -0
- package/Tests/Server/Services/CodeRepositoryInstallationBinding.test.ts +305 -0
- package/Tests/Server/Services/CodeRepositoryResolutionBinding.test.ts +147 -0
- package/Tests/Server/Services/DatabaseServicePerUserPasswordSalt.test.ts +870 -0
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlocked.test.ts +342 -0
- package/Tests/Server/Services/DropFilterSaveValidation.test.ts +245 -0
- package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +163 -15
- package/Tests/Server/Services/MetricTypeAttachServices.test.ts +222 -0
- package/Tests/Server/Services/MissingReferenceWriteGuard.test.ts +614 -0
- package/Tests/Server/Services/MonitorStatusTimelineFastPath.test.ts +23 -0
- package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +568 -0
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +305 -56
- package/Tests/Server/Services/RestoreDroppedUniqueIndexesMigration.test.ts +386 -0
- package/Tests/Server/Services/RestoreServiceLowerNameIndexMigration.test.ts +240 -0
- package/Tests/Server/Services/ServiceUpdateLastSeenSplitGates.test.ts +705 -0
- package/Tests/Server/Services/StatusPageMonitorRuleEngineService.test.ts +1719 -0
- package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +1212 -0
- package/Tests/Server/Services/StatusPageMonitorRuleMonitorCreateHook.test.ts +228 -0
- package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +885 -0
- package/Tests/Server/Services/WidenHashedStringColumnsForScryptMigration.test.ts +220 -0
- package/Tests/Server/Utils/AI/CodeTools.test.ts +47 -1
- package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +10 -0
- package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +267 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +120 -0
- package/Tests/Server/Utils/CodeRepository/GitHubInstallationBinding.test.ts +292 -0
- package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +260 -13
- package/Tests/Server/Utils/EntityRegistryRowFence.test.ts +302 -0
- package/Tests/Server/Utils/GitHubInstallationOwnershipVerification.test.ts +340 -0
- package/Tests/Server/Utils/GitHubWebhookAndTreeCacheIsolation.test.ts +250 -0
- package/Tests/Server/Utils/MetricTypeIndexConvergence.test.ts +598 -0
- package/Tests/Server/Utils/Monitor/MonitorStatusTimelineUnusableStatus.test.ts +154 -0
- package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +638 -92
- package/Tests/Server/Utils/Monitor/MonitorStepsReferenceExtractor.test.ts +724 -0
- package/Tests/Server/Utils/PasswordHash.test.ts +555 -0
- package/Tests/Server/Utils/SingleFlight.test.ts +221 -0
- package/Tests/Types/Dashboard/NetworkDashboardTemplate.test.ts +793 -0
- package/Tests/Types/Database/BigIntColumnTransformer.test.ts +147 -0
- package/Tests/Types/Database/ColumnLength.test.ts +7 -1
- package/Tests/Types/Database/DatabasePropertyTransformer.test.ts +140 -0
- package/Tests/Types/Database/NumericColumnValue.test.ts +127 -0
- package/Tests/Types/Decimal.test.ts +37 -0
- package/Tests/Types/HashedStringPerUserSalt.test.ts +476 -0
- package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +293 -0
- package/Tests/Types/Monitor/HostAlertTemplates.test.ts +249 -0
- package/Tests/Types/Monitor/IotAlertTemplates.test.ts +320 -0
- package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +271 -0
- package/Tests/Types/Monitor/SnmpVersionParsing.test.ts +152 -0
- package/Tests/Types/Port.test.ts +38 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +696 -0
- package/Tests/UI/Components/LogsHistogram.test.tsx +276 -0
- package/Tests/UI/Components/UseLiveLogsRefresh.test.tsx +489 -0
- package/Tests/UI/Components/UseLogsHistogram.test.tsx +500 -0
- package/Tests/UI/Utils/UserProjectsModelAPI.test.ts +714 -0
- package/Tests/Utils/Dashboard/Components/DashboardComponentsUtil.test.ts +120 -0
- package/Tests/Utils/Dashboard/DashboardNetworkMapComponent.test.ts +327 -0
- package/Tests/Utils/TeamMembersByProject.test.ts +655 -0
- package/Types/Dashboard/DashboardComponentType.ts +1 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.ts +40 -0
- package/Types/Dashboard/DashboardTemplates.ts +397 -0
- package/Types/Database/BigIntColumnTransformer.ts +74 -0
- package/Types/Database/ColumnLength.ts +9 -1
- package/Types/Database/DatabaseProperty.ts +26 -0
- package/Types/Database/NumericColumnValue.ts +128 -0
- package/Types/Database/TableColumn.ts +11 -0
- package/Types/Database/UnsynchronizedIndex.ts +48 -0
- package/Types/Decimal.ts +16 -4
- package/Types/HashedString.ts +139 -4
- package/Types/Permission.ts +48 -0
- package/Types/Port.ts +16 -4
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +85 -11
- package/UI/Components/LogsViewer/useLiveLogsRefresh.ts +86 -0
- package/UI/Components/LogsViewer/useLogsHistogram.ts +113 -0
- package/UI/Components/Navbar/NavBar.tsx +12 -2
- package/UI/Components/Navbar/NavBarMenuModal.tsx +19 -7
- package/UI/Utils/ModelAPI/UserProjectsModelAPI.ts +257 -0
- package/Utils/Dashboard/Components/DashboardNetworkMapComponent.ts +136 -0
- package/Utils/Dashboard/Components/Index.ts +7 -0
- package/Utils/TeamMembersByProject.ts +237 -0
- package/build/dist/Models/DatabaseModels/CephCluster.js +16 -1
- package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CodeRepository.js +14 -6
- package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +12 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js +16 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +16 -1
- package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +16 -1
- package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleet.js +16 -1
- package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +16 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogDropFilter.js +9 -20
- package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +16 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkInterface.js +16 -1
- package/build/dist/Models/DatabaseModels/NetworkInterface.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +16 -2
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +16 -1
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Service.js +28 -1
- package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js +925 -0
- package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +32 -0
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageResource.js +72 -0
- package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js +9 -20
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +32 -0
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +21 -2
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +11 -1
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +343 -10
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GitHubAPI.js +94 -167
- package/build/dist/Server/API/GitHubAPI.js.map +1 -1
- package/build/dist/Server/API/UserAPI.js +187 -2
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +34 -4
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/GlobalCache.js +120 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js +5 -3
- package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.js +48 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.js +59 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js +93 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.js +101 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.js +66 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AlertStateTimelineService.js +19 -0
- package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +57 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +26 -76
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceService.js +23 -73
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
- package/build/dist/Server/Services/CodeRepositoryService.js +90 -2
- package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +246 -2
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +19 -69
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +27 -78
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +58 -102
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +19 -0
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetService.js +19 -69
- package/build/dist/Server/Services/IoTFleetService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +17 -68
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LabelService.js +42 -7
- package/build/dist/Server/Services/LabelService.js.map +1 -1
- package/build/dist/Server/Services/MetricTypeService.js +74 -0
- package/build/dist/Server/Services/MetricTypeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +81 -9
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +28 -0
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +60 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +155 -25
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +19 -69
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +23 -73
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationService.js +19 -70
- package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +20 -0
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionService.js +24 -75
- package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +236 -61
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +603 -0
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/StatusPageMonitorRuleService.js +401 -0
- package/build/dist/Server/Services/StatusPageMonitorRuleService.js.map +1 -0
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +1 -0
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryEntityService.js +1 -0
- package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +165 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js +31 -1
- package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +13 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +126 -4
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.js +136 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.js.map +1 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +105 -29
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +56 -32
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js +30 -3
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +110 -98
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js +312 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js.map +1 -0
- package/build/dist/Server/Utils/PasswordHash.js +237 -0
- package/build/dist/Server/Utils/PasswordHash.js.map +1 -0
- package/build/dist/Server/Utils/SingleFlight.js +76 -0
- package/build/dist/Server/Utils/SingleFlight.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js +29 -0
- package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +78 -19
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +160 -0
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +279 -104
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +368 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Database/BigIntColumnTransformer.js +66 -0
- package/build/dist/Types/Database/BigIntColumnTransformer.js.map +1 -0
- package/build/dist/Types/Database/ColumnLength.js +9 -1
- package/build/dist/Types/Database/ColumnLength.js.map +1 -1
- package/build/dist/Types/Database/DatabaseProperty.js +25 -0
- package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
- package/build/dist/Types/Database/NumericColumnValue.js +97 -0
- package/build/dist/Types/Database/NumericColumnValue.js.map +1 -0
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/Database/UnsynchronizedIndex.js +46 -0
- package/build/dist/Types/Database/UnsynchronizedIndex.js.map +1 -0
- package/build/dist/Types/Decimal.js +14 -3
- package/build/dist/Types/Decimal.js.map +1 -1
- package/build/dist/Types/HashedString.js +95 -5
- package/build/dist/Types/HashedString.js.map +1 -1
- package/build/dist/Types/Permission.js +42 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Port.js +15 -5
- package/build/dist/Types/Port.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +51 -10
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/useLiveLogsRefresh.js +44 -0
- package/build/dist/UI/Components/LogsViewer/useLiveLogsRefresh.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js +75 -0
- package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js.map +1 -0
- package/build/dist/UI/Components/Navbar/NavBar.js +3 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +19 -7
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/UserProjectsModelAPI.js +156 -0
- package/build/dist/UI/Utils/ModelAPI/UserProjectsModelAPI.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardNetworkMapComponent.js +114 -0
- package/build/dist/Utils/Dashboard/Components/DashboardNetworkMapComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/TeamMembersByProject.js +145 -0
- package/build/dist/Utils/TeamMembersByProject.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,158 +1,179 @@
|
|
|
1
1
|
import AlertSeverityService from "../../Services/AlertSeverityService";
|
|
2
|
+
import DatabaseService from "../../Services/DatabaseService";
|
|
3
|
+
import IncidentRoleService from "../../Services/IncidentRoleService";
|
|
2
4
|
import IncidentSeverityService from "../../Services/IncidentSeverityService";
|
|
5
|
+
import LabelService from "../../Services/LabelService";
|
|
3
6
|
import MonitorStatusService from "../../Services/MonitorStatusService";
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
+
import NetworkDeviceService from "../../Services/NetworkDeviceService";
|
|
8
|
+
import OnCallDutyPolicyService from "../../Services/OnCallDutyPolicyService";
|
|
9
|
+
import ServiceService from "../../Services/ServiceService";
|
|
10
|
+
import TeamService from "../../Services/TeamService";
|
|
11
|
+
import UserService from "../../Services/UserService";
|
|
12
|
+
import ProjectScopedReferenceValidator, {
|
|
13
|
+
ProjectScopedReference,
|
|
14
|
+
} from "../Database/ProjectScopedReferenceValidator";
|
|
15
|
+
import MonitorStepsReferenceExtractor, {
|
|
16
|
+
MonitorStepsReference,
|
|
17
|
+
MonitorStepsReferenceModel,
|
|
18
|
+
} from "./MonitorStepsReferenceExtractor";
|
|
7
19
|
import { JSONObject } from "../../../Types/JSON";
|
|
8
20
|
import MonitorSteps from "../../../Types/Monitor/MonitorSteps";
|
|
9
21
|
import ObjectID from "../../../Types/ObjectID";
|
|
10
|
-
import
|
|
11
|
-
import IncidentSeverity from "../../../Models/DatabaseModels/IncidentSeverity";
|
|
12
|
-
import MonitorStatus from "../../../Models/DatabaseModels/MonitorStatus";
|
|
13
|
-
|
|
14
|
-
const UUID_REGEX: RegExp =
|
|
15
|
-
/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/g;
|
|
16
|
-
|
|
17
|
-
interface ForeignReference {
|
|
18
|
-
modelName: string;
|
|
19
|
-
name: string;
|
|
20
|
-
}
|
|
22
|
+
import DatabaseBaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
21
23
|
|
|
22
24
|
/*
|
|
23
|
-
* `monitorSteps` is a JSON blob that embeds ids of other
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* together and leaves the referenced project undeletable.
|
|
25
|
+
* `monitorSteps` is a JSON blob that embeds ids of other records — the default
|
|
26
|
+
* monitor status, the status each criteria switches to, the severities used to
|
|
27
|
+
* open incidents and alerts, and the on-call policies, labels, teams and users
|
|
28
|
+
* stamped on what those incidents and alerts create.
|
|
29
|
+
*
|
|
30
|
+
* Two things can be wrong with one of those ids, and both used to be accepted:
|
|
30
31
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
32
|
+
* 1. It belongs to ANOTHER project. That silently ties two projects together
|
|
33
|
+
* and leaves the referenced project undeletable, because the row the id ends
|
|
34
|
+
* up on (a MonitorStatusTimeline, an Incident) has an ON DELETE NO ACTION
|
|
35
|
+
* foreign key pointing back at it.
|
|
36
|
+
*
|
|
37
|
+
* 2. It exists nowhere at all (issue #3039). The monitor saved fine and then
|
|
38
|
+
* failed every time it ran, deep inside the probe worker, with
|
|
39
|
+
* insert or update on table "MonitorStatusTimeline" violates foreign key
|
|
40
|
+
* constraint
|
|
41
|
+
* and nothing surfaced to whoever supplied the id — which is easy to do over
|
|
42
|
+
* the REST API or Terraform, where these are just uuids in a JSON body.
|
|
43
|
+
*
|
|
44
|
+
* Telling a real reference apart from the many uuids in monitorSteps that are
|
|
45
|
+
* NOT references (step ids, criteria ids, incident/alert template ids) is what
|
|
46
|
+
* makes check 2 possible, and that is MonitorStepsReferenceExtractor's job: it
|
|
47
|
+
* walks the structure instead of scraping the text, so every id it hands back
|
|
48
|
+
* is known to point at a specific model.
|
|
37
49
|
*/
|
|
50
|
+
|
|
51
|
+
const SERVICE_BY_MODEL: Record<
|
|
52
|
+
MonitorStepsReferenceModel,
|
|
53
|
+
DatabaseService<DatabaseBaseModel>
|
|
54
|
+
> = {
|
|
55
|
+
[MonitorStepsReferenceModel.MonitorStatus]:
|
|
56
|
+
MonitorStatusService as unknown as DatabaseService<DatabaseBaseModel>,
|
|
57
|
+
[MonitorStepsReferenceModel.IncidentSeverity]:
|
|
58
|
+
IncidentSeverityService as unknown as DatabaseService<DatabaseBaseModel>,
|
|
59
|
+
[MonitorStepsReferenceModel.AlertSeverity]:
|
|
60
|
+
AlertSeverityService as unknown as DatabaseService<DatabaseBaseModel>,
|
|
61
|
+
[MonitorStepsReferenceModel.OnCallDutyPolicy]:
|
|
62
|
+
OnCallDutyPolicyService as unknown as DatabaseService<DatabaseBaseModel>,
|
|
63
|
+
[MonitorStepsReferenceModel.Label]:
|
|
64
|
+
LabelService as unknown as DatabaseService<DatabaseBaseModel>,
|
|
65
|
+
[MonitorStepsReferenceModel.Team]:
|
|
66
|
+
TeamService as unknown as DatabaseService<DatabaseBaseModel>,
|
|
67
|
+
[MonitorStepsReferenceModel.User]:
|
|
68
|
+
UserService as unknown as DatabaseService<DatabaseBaseModel>,
|
|
69
|
+
[MonitorStepsReferenceModel.IncidentRole]:
|
|
70
|
+
IncidentRoleService as unknown as DatabaseService<DatabaseBaseModel>,
|
|
71
|
+
[MonitorStepsReferenceModel.TelemetryService]:
|
|
72
|
+
ServiceService as unknown as DatabaseService<DatabaseBaseModel>,
|
|
73
|
+
[MonitorStepsReferenceModel.NetworkDevice]:
|
|
74
|
+
NetworkDeviceService as unknown as DatabaseService<DatabaseBaseModel>,
|
|
75
|
+
};
|
|
76
|
+
|
|
38
77
|
export default class MonitorStepsProjectValidator {
|
|
39
78
|
public static async validateMonitorStepsBelongToProject(data: {
|
|
40
79
|
monitorSteps: MonitorSteps | JSONObject | undefined;
|
|
41
80
|
projectId: ObjectID | undefined;
|
|
81
|
+
/*
|
|
82
|
+
* What is stored on the record RIGHT NOW, on an update. Any reference id
|
|
83
|
+
* that is already in there is not required to exist — see
|
|
84
|
+
* `grandfatheredIds` below. Omit on create: a create introduces every id it
|
|
85
|
+
* carries, so all of them must exist.
|
|
86
|
+
*/
|
|
87
|
+
alreadyStoredMonitorSteps?: MonitorSteps | JSONObject | undefined | null;
|
|
42
88
|
}): Promise<void> {
|
|
43
89
|
if (!data.monitorSteps || !data.projectId) {
|
|
44
90
|
return;
|
|
45
91
|
}
|
|
46
92
|
|
|
47
|
-
const
|
|
93
|
+
const references: Array<MonitorStepsReference> =
|
|
94
|
+
MonitorStepsReferenceExtractor.extract(data.monitorSteps);
|
|
48
95
|
|
|
49
|
-
if (
|
|
96
|
+
if (references.length === 0) {
|
|
50
97
|
return;
|
|
51
98
|
}
|
|
52
99
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
100
|
+
/*
|
|
101
|
+
* An id the record ALREADY holds is this write's inheritance, not its
|
|
102
|
+
* doing, and is left alone entirely — neither checked for existence nor for
|
|
103
|
+
* belonging to another project.
|
|
104
|
+
*
|
|
105
|
+
* None of these ids has a foreign key behind it, so one really can end up
|
|
106
|
+
* wrong through no fault of the person now saving: deleting a monitor
|
|
107
|
+
* status, label, team or on-call policy does not rewrite the criteria that
|
|
108
|
+
* name it, and the 1785240000000 repair migration deliberately left behind
|
|
109
|
+
* the cross-project ids it could not map to a local equivalent. The
|
|
110
|
+
* dashboard re-submits the whole blob on every save and renders an
|
|
111
|
+
* unresolvable id as an empty dropdown, so checking them would refuse EVERY
|
|
112
|
+
* edit of such a monitor — including renaming it — over a field the user
|
|
113
|
+
* never touched and cannot see is wrong, with no migration to get them out.
|
|
114
|
+
*
|
|
115
|
+
* Letting a stale id ride costs less than it used to. The status and
|
|
116
|
+
* severity ids — the ones that reach a foreign-key column and made the
|
|
117
|
+
* referenced project undeletable — are now screened where they are written:
|
|
118
|
+
* MonitorStatusTimelineService rejects a status that does not resolve, and
|
|
119
|
+
* the probe worker skips one it cannot use rather than writing it, as
|
|
120
|
+
* MonitorIncident and MonitorAlert already did for severities.
|
|
121
|
+
*
|
|
122
|
+
* That screening does NOT extend to the ids that land on join rows
|
|
123
|
+
* (IncidentLabel, IncidentOnCallDutyPolicy and friends). A stale label or
|
|
124
|
+
* on-call policy carried forward here can still fail when the criteria
|
|
125
|
+
* fires. That is a pre-existing gap in MonitorIncident/MonitorAlert rather
|
|
126
|
+
* than something this exemption opens up — those ids were not validated at
|
|
127
|
+
* all before — and refusing the SAVE would not close it, because the
|
|
128
|
+
* monitor that never gets edited again fails just the same.
|
|
129
|
+
*
|
|
130
|
+
* What this write INTRODUCES is checked in full. That is issue #3039.
|
|
131
|
+
*
|
|
132
|
+
* Compared case-insensitively: ObjectID keeps whatever case it was given,
|
|
133
|
+
* so the same id can be stored as Postgres rendered it (lower) and re-sent
|
|
134
|
+
* by a caller in upper.
|
|
135
|
+
*/
|
|
136
|
+
const grandfatheredIds: Set<string> = new Set(
|
|
137
|
+
MonitorStepsReferenceExtractor.extract(
|
|
138
|
+
data.alreadyStoredMonitorSteps,
|
|
139
|
+
).map((reference: MonitorStepsReference) => {
|
|
140
|
+
return reference.id.toLowerCase();
|
|
141
|
+
}),
|
|
142
|
+
);
|
|
74
143
|
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
select: { _id: true, name: true, projectId: true },
|
|
81
|
-
limit: LIMIT_PER_PROJECT,
|
|
82
|
-
skip: 0,
|
|
83
|
-
props: { isRoot: true },
|
|
84
|
-
});
|
|
144
|
+
const introduced: Array<MonitorStepsReference> = references.filter(
|
|
145
|
+
(reference: MonitorStepsReference) => {
|
|
146
|
+
return !grandfatheredIds.has(reference.id.toLowerCase());
|
|
147
|
+
},
|
|
148
|
+
);
|
|
85
149
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
incidentSeverity.projectId?.toString() !== data.projectId.toString()
|
|
89
|
-
) {
|
|
90
|
-
foreignReferences.push({
|
|
91
|
-
modelName: "Incident Severity",
|
|
92
|
-
name: incidentSeverity.name || incidentSeverity.id?.toString() || "",
|
|
93
|
-
});
|
|
94
|
-
}
|
|
150
|
+
if (introduced.length === 0) {
|
|
151
|
+
return;
|
|
95
152
|
}
|
|
96
153
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
154
|
+
await ProjectScopedReferenceValidator.validateReferencesBelongToProject({
|
|
155
|
+
projectId: data.projectId,
|
|
156
|
+
subject: "monitor's criteria",
|
|
157
|
+
references: introduced.map(
|
|
158
|
+
(reference: MonitorStepsReference): ProjectScopedReference => {
|
|
159
|
+
return {
|
|
160
|
+
/*
|
|
161
|
+
* The path — `criteria "Monitor is offline" incident severity` —
|
|
162
|
+
* rather than the bare model name, so the message points at the
|
|
163
|
+
* field to fix. monitorSteps can hold a dozen of these.
|
|
164
|
+
*/
|
|
165
|
+
modelName: `${reference.model} (${reference.path})`,
|
|
166
|
+
id: reference.id,
|
|
167
|
+
service: SERVICE_BY_MODEL[reference.model],
|
|
168
|
+
/*
|
|
169
|
+
* Only ids the monitor actually reads at run time are required to
|
|
170
|
+
* exist — see MonitorStepsReference.isOperative. The rest are still
|
|
171
|
+
* checked for belonging to this project.
|
|
172
|
+
*/
|
|
173
|
+
mustExist: reference.isOperative,
|
|
174
|
+
};
|
|
101
175
|
},
|
|
102
|
-
select: { _id: true, name: true, projectId: true },
|
|
103
|
-
limit: LIMIT_PER_PROJECT,
|
|
104
|
-
skip: 0,
|
|
105
|
-
props: { isRoot: true },
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
for (const alertSeverity of alertSeverities) {
|
|
109
|
-
if (alertSeverity.projectId?.toString() !== data.projectId.toString()) {
|
|
110
|
-
foreignReferences.push({
|
|
111
|
-
modelName: "Alert Severity",
|
|
112
|
-
name: alertSeverity.name || alertSeverity.id?.toString() || "",
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
if (foreignReferences.length > 0) {
|
|
118
|
-
const described: string = foreignReferences
|
|
119
|
-
.map((reference: ForeignReference) => {
|
|
120
|
-
return `${reference.modelName} "${reference.name}"`;
|
|
121
|
-
})
|
|
122
|
-
.join(", ");
|
|
123
|
-
|
|
124
|
-
throw new BadDataException(
|
|
125
|
-
`Monitor criteria reference records that belong to a different project: ${described}. Please pick values from this project and try again.`,
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
private static extractUuids(
|
|
131
|
-
monitorSteps: MonitorSteps | JSONObject,
|
|
132
|
-
): Array<string> {
|
|
133
|
-
let serialized: string = "";
|
|
134
|
-
|
|
135
|
-
try {
|
|
136
|
-
serialized =
|
|
137
|
-
monitorSteps instanceof MonitorSteps
|
|
138
|
-
? JSON.stringify(monitorSteps.toJSON())
|
|
139
|
-
: JSON.stringify(monitorSteps);
|
|
140
|
-
} catch {
|
|
141
|
-
/*
|
|
142
|
-
* Unserializable monitorSteps is a different problem and is reported by
|
|
143
|
-
* MonitorSteps' own validation. Nothing to check here.
|
|
144
|
-
*/
|
|
145
|
-
return [];
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
const matches: Array<string> = serialized.match(UUID_REGEX) || [];
|
|
149
|
-
|
|
150
|
-
return Array.from(
|
|
151
|
-
new Set(
|
|
152
|
-
matches.map((match: string) => {
|
|
153
|
-
return match.toLowerCase();
|
|
154
|
-
}),
|
|
155
176
|
),
|
|
156
|
-
);
|
|
177
|
+
});
|
|
157
178
|
}
|
|
158
179
|
}
|